Merge branch 'API-rest'
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
from django.db import models
|
||||
from datetime import datetime, timedelta, time
|
||||
from django.contrib.auth.models import User
|
||||
import datetime as Datetime
|
||||
@@ -17,9 +18,82 @@ import recurring_ical_events
|
||||
import caldav
|
||||
|
||||
from mycaldav.settings import *
|
||||
import pytz
|
||||
from dateutil.parser import parse
|
||||
|
||||
Key_separator = "--"
|
||||
|
||||
|
||||
class caldav_sync_manager(models.Model):
|
||||
dtDate = models.DateField('Date_synchronized', auto_now_add=True, unique=True)
|
||||
bDone = models.BooleanField("Effectuée", default=False)
|
||||
dtUpdated = models.DateTimeField('date updated', auto_now=True)
|
||||
dtCreated = models.DateTimeField('date published', auto_now_add=True)
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.dtDate}"
|
||||
|
||||
def init_caldav(self, caldav_url, caldav_user, caldav_password):
|
||||
client = caldav.DAVClient(url=caldav_url, username=caldav_user, password=caldav_password)
|
||||
data = client.principal()
|
||||
|
||||
self.a_task = data.calendar(cal_id=caldav_id["task"])
|
||||
|
||||
def set_today_as_synced(self):
|
||||
o_new_manager = caldav_sync_manager()
|
||||
o_new_manager.save()
|
||||
|
||||
def init_task_management(self):
|
||||
today = datetime.now()
|
||||
o_caldav_sync_management = caldav_sync_manager.objects.filter(dtDate=today.date())
|
||||
if not o_caldav_sync_management.exists():
|
||||
self.copy_caldav_data()
|
||||
print(f"synced events")
|
||||
else:
|
||||
print("pas de copy, sync déjà fait")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def copy_caldav_data(self,):
|
||||
ctx = ssl.create_default_context()
|
||||
ctx.check_hostname = False
|
||||
ctx.verify_mode = ssl.CERT_NONE
|
||||
|
||||
today = datetime.now()
|
||||
seeked_date = today + relativedelta(months=1)
|
||||
sync_date = today + relativedelta(months=1, days=1)
|
||||
modified_url = caldav_cfg["task_config"] + f"&start={int(today.timestamp())}&end={int(sync_date.timestamp())}&expand=1"
|
||||
|
||||
with urllib.request.urlopen(modified_url, context=ctx) as o_url:
|
||||
sabre_data = o_url.read()
|
||||
|
||||
events = recurring_ical_events.of(Calendar.from_ical(sabre_data)).at((seeked_date.year,seeked_date.month,seeked_date.day))
|
||||
#print(f"events:{events}")
|
||||
|
||||
|
||||
for event in events:
|
||||
print(f"copy de l'événement: {event['SUMMARY']}")
|
||||
|
||||
|
||||
_title = event["SUMMARY"] if ("SUMMARY" in event) else "Sans Titre"
|
||||
_desc = event["DESCRIPTION"] if ("DESCRIPTION" in event) else ""
|
||||
|
||||
my_event = self.a_task.save_event(
|
||||
dtstart=event["DTSTART"].dt,
|
||||
dtend=event["DTEND"].dt,
|
||||
summary= _title,
|
||||
description= _desc,
|
||||
)
|
||||
self.set_today_as_synced()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Create your models here.
|
||||
class cls_caldav():
|
||||
url = ""
|
||||
@@ -46,21 +120,28 @@ class cls_caldav():
|
||||
self.day.sort(key=lambda x: x.key, reverse=reverse)
|
||||
self.night.sort(key=lambda x: x.key, reverse=reverse)
|
||||
|
||||
|
||||
|
||||
def get_caldav_data(self,periode=1,calendar=None, date=None):
|
||||
def caldav_open_url(self, days_delta, date):
|
||||
ctx = ssl.create_default_context()
|
||||
ctx.check_hostname = False
|
||||
ctx.verify_mode = ssl.CERT_NONE
|
||||
|
||||
self.clear_data()
|
||||
|
||||
o_url = urllib.request.urlopen(self.url, context=ctx)
|
||||
self.data = o_url.read()
|
||||
o_url.close()
|
||||
|
||||
modified_url = self.url + f"&start={int((date-timedelta(days=days_delta)).timestamp())}&end={int((date +timedelta(days=days_delta)).timestamp())}&expand=1"
|
||||
print(f"ICS CALL URL = {modified_url}")
|
||||
with urllib.request.urlopen(modified_url, context=ctx) as o_url:
|
||||
self.data = o_url.read()
|
||||
|
||||
return self.data
|
||||
|
||||
def get_caldav_data(self,periode=1,calendar=None, date=None):
|
||||
if date is None:
|
||||
date = datetime.now()
|
||||
date = datetime.now()
|
||||
|
||||
self.caldav_open_url(days_delta=periode,date=date)
|
||||
|
||||
|
||||
|
||||
today = (date.year,date.month,date.day)
|
||||
|
||||
@@ -81,11 +162,29 @@ class cls_caldav():
|
||||
events = recurring_ical_events.of(Calendar.from_ical(self.data)).between(today,endweek)
|
||||
|
||||
self.parse_data(events)
|
||||
|
||||
def convert_to_gmt1(self, dt):
|
||||
gmt1_tz = pytz.timezone('Europe/Paris')
|
||||
try:
|
||||
|
||||
if hasattr(dt,"tzinfo") and dt.tzinfo is not None:
|
||||
# Convertir l'objet datetime en GMT+1
|
||||
# Utilisez le nom de votre fuseau horaire GMT+1
|
||||
dt_gmt1 = dt.astimezone(gmt1_tz)
|
||||
else:
|
||||
# L'objet datetime est naïf, ajouter l'information de fuseau horaire GMT+1
|
||||
utc_tz = pytz.utc
|
||||
dt_utc = utc_tz.localize(dt)
|
||||
dt_gmt1 = dt_utc.astimezone(gmt1_tz)
|
||||
return dt_gmt1
|
||||
except:
|
||||
return dt
|
||||
def parse_data(self, events):
|
||||
desired_timezone = pytz.timezone('Europe/Paris')
|
||||
for event in events:
|
||||
item = _caldav_item()
|
||||
item.name = event["SUMMARY"]
|
||||
item.uiid = event["UID"]
|
||||
item.uuid = f"{event['UID']}"
|
||||
if Key_separator in item.name:
|
||||
arr = item.name.split(Key_separator)
|
||||
item.key = arr[0]
|
||||
@@ -107,12 +206,14 @@ class cls_caldav():
|
||||
item.team_2_chef = True
|
||||
item.team_2 = item.team_2.replace("#", "")
|
||||
|
||||
|
||||
if "DESCRIPTION" in event.keys():
|
||||
item.desc = event["DESCRIPTION"]
|
||||
if "#" in item.desc:
|
||||
item.desc = f"{event['DESCRIPTION']}"
|
||||
|
||||
if "#Fait" in item.desc:
|
||||
item.done = True
|
||||
if "#Fait" in item.desc:
|
||||
item.desc = item.desc.replace("#Fait", "")
|
||||
item.desc = item.desc.replace("#Fait", "")
|
||||
|
||||
|
||||
if '{href=' in item.desc:
|
||||
temp_str = item.desc.split('{href=')[1]
|
||||
@@ -120,10 +221,18 @@ class cls_caldav():
|
||||
item.href = temp_str
|
||||
item.desc = item.desc.replace("{href=" + item.href + "}","")
|
||||
|
||||
item.dtstart = event["DTSTART"].dt.strftime("%d.%m.%Y %H:%M")
|
||||
item.dtstamp = int(event["DTSTART"].dt.strftime("%Y%m%d%H%M"))
|
||||
|
||||
desired_timezone = pytz.timezone('Europe/Paris')
|
||||
datetime_obj = parse(event["DTSTART"].dt.strftime("%d.%m.%Y %H:%M"))
|
||||
gmt1_datetime = datetime_obj.astimezone(desired_timezone)
|
||||
|
||||
print(f"gmt= {self.convert_to_gmt1( event['DTSTART'].dt)}")
|
||||
|
||||
|
||||
item.dtstart = self.convert_to_gmt1( event['DTSTART'].dt).strftime("%d.%m.%Y %H:%M")
|
||||
item.dtstamp = int(self.convert_to_gmt1( event['DTSTART'].dt).strftime("%Y%m%d%H%M"))
|
||||
#print(item.dtstamp)
|
||||
item.dtend = event["DTEND"].dt.strftime("%d.%m.%Y %H:%M")
|
||||
item.dtend = self.convert_to_gmt1( event['DTEND'].dt).strftime("%d.%m.%Y %H:%M")
|
||||
|
||||
|
||||
item.format_str_date()
|
||||
@@ -155,14 +264,18 @@ class cls_caldav_client():
|
||||
caldav_password = "Agendamc144"
|
||||
|
||||
caldav_agenda_config_url = caldav_cfg["task_config"]
|
||||
|
||||
|
||||
events = None
|
||||
|
||||
|
||||
|
||||
def __init__(self):
|
||||
self.client = caldav.DAVClient(url=self.caldav_url, username=self.caldav_user, password=self.caldav_password)
|
||||
self.data = self.client.principal()
|
||||
|
||||
|
||||
|
||||
def init_caldav(self, caldav_url, caldav_user, caldav_password):
|
||||
client = caldav.DAVClient(url=caldav_url, username=caldav_user, password=caldav_password)
|
||||
self.data = client.principal()
|
||||
|
||||
for cal in self.data.calendars():
|
||||
print(f"name: {cal.name}({cal.url})")
|
||||
@@ -176,7 +289,6 @@ class cls_caldav_client():
|
||||
self.a_rh = self.data.calendar(cal_id=caldav_id["rh"])
|
||||
self.a_manif = self.data.calendar(cal_id=caldav_id["manif"])
|
||||
|
||||
#self.get_events_by_date(self.a_team)
|
||||
def get_event_by_uuid(self,calandar,uuid):
|
||||
event = calandar.object_by_uid(uid=uuid)
|
||||
return event
|
||||
@@ -199,36 +311,9 @@ class cls_caldav_client():
|
||||
summary=event.vobject_instance.vevent.summary.value,
|
||||
description=_desc,
|
||||
)
|
||||
event.delete()
|
||||
|
||||
|
||||
|
||||
def init_task_management(self):
|
||||
print("pass copy task process")
|
||||
try:
|
||||
with open(os.path.join("mycaldav", "last_sync_config.bin"), "rb") as file:
|
||||
array = pickle.load(file)
|
||||
except:
|
||||
array = {"year": 0, "month": 0}
|
||||
print("Erreur lecture fichier config")
|
||||
|
||||
if array["month"] == datetime.now().month:
|
||||
if array["year"] == datetime.now().year:
|
||||
print("pas de copy, sync déjà fait")
|
||||
else:
|
||||
self.copy_caldav_data(self.a_task)
|
||||
else:
|
||||
self.copy_caldav_data(self.a_task)
|
||||
self.clear_all_events_by_Date(self.a_task)
|
||||
|
||||
|
||||
def add_event_in_calandar(self, calandar):
|
||||
my_event = calandar.save_event(
|
||||
dtstart=datetime(2022, 6, 30, 12),
|
||||
dtend=datetime(2022, 6, 30, 13),
|
||||
summary="Do the needful",
|
||||
|
||||
)
|
||||
event.delete()
|
||||
|
||||
|
||||
def get_events_by_date(self,calandar,date=None ):
|
||||
if date is None:
|
||||
date = datetime.now()
|
||||
@@ -297,126 +382,33 @@ class cls_caldav_client():
|
||||
|
||||
|
||||
|
||||
def copy_caldav_data(self, calandar=None):
|
||||
ctx = ssl.create_default_context()
|
||||
ctx.check_hostname = False
|
||||
ctx.verify_mode = ssl.CERT_NONE
|
||||
|
||||
|
||||
|
||||
o_url = urllib.request.urlopen(self.caldav_agenda_config_url, context=ctx)
|
||||
data = o_url.read()
|
||||
o_url.close()
|
||||
|
||||
now = f"01.{datetime.now().month}.{datetime.now().year}"
|
||||
|
||||
|
||||
next_month = datetime.strptime(f"1.{datetime.today().month}.{datetime.today().year}","%d.%m.%Y") + relativedelta(months=1)
|
||||
next_month = (next_month.year, next_month.month, next_month.day)
|
||||
|
||||
today = (datetime.now().year, datetime.now().month, 1)
|
||||
print(f"today:{today}")
|
||||
print(f"next:{next_month}")
|
||||
events = None
|
||||
events = recurring_ical_events.of(Calendar.from_ical(data)).between(today, next_month)
|
||||
cur_events = calandar.date_search(start=datetime(today[0],today[1],today[2]), end=datetime(next_month[0],next_month[1],next_month[2]), expand=True)
|
||||
|
||||
for event in events:
|
||||
print(f"copy de l'événement: {event['SUMMARY']}")
|
||||
|
||||
|
||||
_title = event["SUMMARY"] if ("SUMMARY" in event) else "Sans Titre"
|
||||
_desc = event["DESCRIPTION"] if ("DESCRIPTION" in event) else ""
|
||||
|
||||
my_event = calandar.save_event(
|
||||
dtstart=event["DTSTART"].dt,
|
||||
dtend=event["DTEND"].dt,
|
||||
summary= _title,
|
||||
description= _desc,
|
||||
)
|
||||
|
||||
with open(os.path.join("mycaldav", "last_sync_config.bin"), "wb") as file:
|
||||
array = {"year":datetime.now().year, "month":datetime.now().month}
|
||||
pickle.dump(array, file)
|
||||
|
||||
|
||||
|
||||
|
||||
def clear_all_events_by_Date(self, calandar):
|
||||
events = calandar.date_search(start=datetime(2000, 1, 1), end=datetime.now() - relativedelta(years=1), expand=True)
|
||||
for e in events:
|
||||
e.delete()
|
||||
#print(events)
|
||||
|
||||
def reformat_all_events(self,calandar):
|
||||
events = calandar.date_search(start=datetime(2023, 1, 1), end=datetime.now() + relativedelta(years=1),
|
||||
expand=True)
|
||||
|
||||
for event in events:
|
||||
summary = event.vobject_instance.vevent.summary.value
|
||||
print(f"test summary {summary}")
|
||||
if "----" in summary:
|
||||
summary = summary.replace("----", Key_separator)
|
||||
print(f"reformat: [{summary}]")
|
||||
event.vobject_instance.vevent.summary.value = summary
|
||||
event.save()
|
||||
elif "--" in summary:
|
||||
pass
|
||||
elif "-" in summary:
|
||||
summary = summary.replace("-",Key_separator)
|
||||
print(f"reformat: [{summary}]")
|
||||
event.vobject_instance.vevent.summary.value = summary
|
||||
event.save()
|
||||
|
||||
def change_utc_to_zurich_all_events(self,calandar):
|
||||
events = calandar.date_search(start=datetime(2023, 4, 1), end=datetime.now() + relativedelta(years=1),
|
||||
expand=True)
|
||||
|
||||
for event in events:
|
||||
start = event.vobject_instance.vevent.dtstart.value
|
||||
end = start + relativedelta(day=1)
|
||||
|
||||
if start.hour < 12:
|
||||
new_start = datetime(start.year, start.month, start.day,7,0,0, tzinfo = pytz.timezone("Europe/Zurich"))
|
||||
new_end = datetime(start.year, start.month, start.day, 19, 0, 0, tzinfo=pytz.timezone("Europe/Zurich"))
|
||||
elif start.hour > 12:
|
||||
new_start = datetime(start.year, start.month, start.day,19,0,0, tzinfo = pytz.timezone("Europe/Zurich"))
|
||||
new_end = datetime(start.year, start.month,start.day, 23, 59, 0, tzinfo=pytz.timezone("Europe/Zurich"))
|
||||
|
||||
event.vobject_instance.vevent.dtstart.value = new_start
|
||||
event.vobject_instance.vevent.dtend.value = new_end
|
||||
|
||||
|
||||
if new_end<new_start :
|
||||
print(f"{new_start}>{new_end}")
|
||||
print("ERROR")
|
||||
event.vobject_instance.vevent.dtend.value = new_start
|
||||
|
||||
|
||||
event.save()
|
||||
|
||||
|
||||
|
||||
class _caldav_item():
|
||||
key = ""
|
||||
name = ""
|
||||
desc = ""
|
||||
dtstart = None
|
||||
str_start_date = ""
|
||||
str_start_time = ""
|
||||
dtend = None
|
||||
str_end_date = ""
|
||||
str_end_time = ""
|
||||
dtstamp = None
|
||||
done = False
|
||||
href = ""
|
||||
uiid = ""
|
||||
team_1 = ""
|
||||
team_2 = ""
|
||||
team_1_chef = False
|
||||
team_2_chef = False
|
||||
team_transfert = False
|
||||
team_manif = False
|
||||
def __init__(self, key="", name="", desc="", dtstart=None, str_start_date="",
|
||||
str_start_time="", dtend=None, str_end_date="", str_end_time="",
|
||||
dtstamp=None, done=False, href="", uuid="", team_1="",
|
||||
team_2="", team_1_chef=False, team_2_chef=False,
|
||||
team_transfert=False, team_manif=False):
|
||||
self.key = key
|
||||
self.name = name
|
||||
self.desc = desc
|
||||
self.dtstart = dtstart
|
||||
self.str_start_date = str_start_date
|
||||
self.str_start_time = str_start_time
|
||||
self.dtend = dtend
|
||||
self.str_end_date = str_end_date
|
||||
self.str_end_time = str_end_time
|
||||
self.dtstamp = dtstamp
|
||||
self.done = done
|
||||
self.href = href
|
||||
self.uuid = uuid
|
||||
self.team_1 = team_1
|
||||
self.team_2 = team_2
|
||||
self.team_1_chef = team_1_chef
|
||||
self.team_2_chef = team_2_chef
|
||||
self.team_transfert = team_transfert
|
||||
self.team_manif = team_manif
|
||||
|
||||
def format_str_date(self):
|
||||
self.str_start_date = datetime.strptime(self.dtstart,"%d.%m.%Y %H:%M").strftime("%d.%m")
|
||||
@@ -427,3 +419,24 @@ class _caldav_item():
|
||||
|
||||
|
||||
|
||||
from rest_framework import serializers
|
||||
|
||||
class CalDavItemSerializer(serializers.Serializer):
|
||||
key = serializers.CharField()
|
||||
name = serializers.CharField()
|
||||
desc = serializers.CharField(allow_blank=True)
|
||||
dtstart = serializers.CharField()
|
||||
str_start_date = serializers.CharField()
|
||||
str_start_time = serializers.CharField()
|
||||
dtend = serializers.CharField()
|
||||
str_end_date = serializers.CharField()
|
||||
str_end_time = serializers.CharField()
|
||||
done = serializers.BooleanField()
|
||||
href = serializers.CharField(allow_blank=True)
|
||||
uuid = serializers.CharField()
|
||||
team_1 = serializers.CharField(allow_blank=True)
|
||||
team_2 = serializers.CharField(allow_blank=True)
|
||||
team_1_chef = serializers.BooleanField()
|
||||
team_2_chef = serializers.BooleanField()
|
||||
team_transfert = serializers.BooleanField()
|
||||
team_manif = serializers.BooleanField()
|
||||
Reference in New Issue
Block a user