from datetime import datetime, timedelta, time import datetime as Datetime import pickle import os from dateutil.relativedelta import relativedelta from django.db import models import urllib.request import ssl from icalendar import Calendar, Event import recurring_ical_events import caldav # Create your models here. class cls_caldav(): url = "" data = None items = [] day = [] night = [] def __init__(self, url=""): self.url = url def clear_data(self): self.data = None self.items = [] self.day = [] self.night = [] #Trie les tableau par odre croissant sur la date de début de l'événement def sort_array(self): self.items.sort(key=lambda x: x.dtstamp, reverse=False) def get_caldav_data(self,periode=1,calendar=None): 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() now = f"{datetime.now().day}.{datetime.now().month}.{datetime.now().year}" tomorow = datetime.now() + timedelta(days=1) today = (datetime.now().year,datetime.now().month,datetime.now().day) events = None if periode == 1: events = recurring_ical_events.of(Calendar.from_ical(self.data)).at(today) elif periode == 2: events = recurring_ical_events.of(Calendar.from_ical(self.data)).between(today,tomorow) for event in events: item = _caldav_item() item.name = event["SUMMARY"] item.uiid = event["UID"] if "-" in item.name: arr = item.name.split("-") item.key = arr[0] item.name = arr[1] if "DESCRIPTION" in event.keys(): item.desc = event["DESCRIPTION"] if "#" in item.desc: item.done = True if '{href=' in item.desc: temp_str = item.desc.split('{href=')[1] temp_str = temp_str.split('}')[0] 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")) print(item.dtstamp) item.dtend = event["DTEND"].dt.strftime("%d.%m.%Y %H:%M") item.format_str_date() self.items.append(item) start = datetime.strptime(item.dtstart,"%d.%m.%Y %H:%M") if type(start) is Datetime.date: start = datetime.combine(start, datetime.min.time()) print("convert Date to datetime") print(start) if start < datetime.combine(datetime.today(), time(19,0)): self.day.append(item) if start >= datetime.combine(datetime.today(), time(19,0)): self.night.append(item) self.sort_array() return self.data class cls_caldav_client(): caldav_url = "https://sync.infomaniak.com" #caldav_user = 'SC01066' #ambulanciers@ambulance-clerc.ch #caldav_password = "mc144*1870CLERC" caldav_user = 'AA01593' #agenda@ambulance-clerc.ch caldav_password = "Agendamc144" caldav_agenda_config_url = "https://sync.infomaniak.com/calendars/AA01593/29d5c8d0-9b86-4d45-bc2b-13585a2e78f8?export" def __init__(self): self.client = caldav.DAVClient(url=self.caldav_url, username=self.caldav_user, password=self.caldav_password) self.data = self.client.principal() for cal in self.data.calendars(): print(f"name: {cal.name}({cal.url})") self.a_task = self.data.calendar(name="Tâche") if datetime.today().day == 1 and datetime.today().hour == 1: 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 débiteur") if array["month"] == datetime.now().month: if array["year"] == datetime.now().year: print("pas de copy, sync déjà fait") else: self.get_caldav_data(self.a_task) else: self.get_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", ) def get_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) - relativedelta(days=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']}") my_event = calandar.save_event( dtstart=event["DTSTART"].dt, dtend=event["DTEND"].dt, summary= event["SUMMARY"], description=event["DESCRIPTION"], ) 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) 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 = "" def format_str_date(self): self.str_start_date = datetime.strptime(self.dtstart,"%d.%m.%Y %H:%M").strftime("%d.%m") self.str_start_time = datetime.strptime(self.dtstart, "%d.%m.%Y %H:%M").strftime("%H:%M") self.str_end_date = datetime.strptime(self.dtend,"%d.%m.%Y %H:%M").strftime("%d.%m") self.str_end_time = datetime.strptime(self.dtend, "%d.%m.%Y %H:%M").strftime("%H:%M")