ajout de caldav_sync_manager et refactoring du copy de tache

This commit is contained in:
2024-04-08 00:42:06 +02:00
parent 827ba67228
commit 46aa09995b
5 changed files with 101 additions and 145 deletions

View File

@@ -135,7 +135,9 @@ MIDDLEWARE = [
] ]
CORS_ALLOWED_ORIGINS = [ CORS_ALLOWED_ORIGINS = [
"http://33.144.144.13", # Ajoutez ici l'URL de votre application frontend , "http://33.144.144.13:4173",
"http://33.144.144.13:5173",
"http://33.144.144.13:3000",
] ]

View File

@@ -1,3 +1,7 @@
from django.contrib import admin from django.contrib import admin
from mycaldav.models import caldav_sync_manager
admin.site.register(caldav_sync_manager)
# Register your models here. # Register your models here.

View File

@@ -1,3 +1,4 @@
from django.db import models
from datetime import datetime, timedelta, time from datetime import datetime, timedelta, time
from django.contrib.auth.models import User from django.contrib.auth.models import User
import datetime as Datetime import datetime as Datetime
@@ -22,6 +23,74 @@ from dateutil.parser import parse
Key_separator = "--" 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 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.bDone=True
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() or o_caldav_sync_management.first().bDone is False:
self.copy_caldav_data()
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))
b_copy_done = False
for event in events:
b_copy_done = True
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,
)
if b_copy_done:
self.set_today_as_synced()
# Create your models here. # Create your models here.
class cls_caldav(): class cls_caldav():
url = "" url = ""
@@ -60,10 +129,7 @@ class cls_caldav():
print(f"ICS CALL URL = {modified_url}") print(f"ICS CALL URL = {modified_url}")
with urllib.request.urlopen(modified_url, context=ctx) as o_url: with urllib.request.urlopen(modified_url, context=ctx) as o_url:
self.data = o_url.read() self.data = o_url.read()
#o_url.close()
print(self.data)
return self.data return self.data
def get_caldav_data(self,periode=1,calendar=None, date=None): def get_caldav_data(self,periode=1,calendar=None, date=None):
@@ -191,13 +257,17 @@ class cls_caldav_client():
caldav_password = "Agendamc144" caldav_password = "Agendamc144"
caldav_agenda_config_url = caldav_cfg["task_config"] caldav_agenda_config_url = caldav_cfg["task_config"]
events = None events = None
def __init__(self):
self.client = caldav.DAVClient(url=self.caldav_url, username=self.caldav_user, password=self.caldav_password)
def init_caldav(self, caldav_url, caldav_user, caldav_password):
client = caldav.DAVClient(url=caldav_url, username=caldav_user, password=caldav_password)
self.data = self.client.principal() self.data = self.client.principal()
for cal in self.data.calendars(): for cal in self.data.calendars():
@@ -212,7 +282,6 @@ class cls_caldav_client():
self.a_rh = self.data.calendar(cal_id=caldav_id["rh"]) self.a_rh = self.data.calendar(cal_id=caldav_id["rh"])
self.a_manif = self.data.calendar(cal_id=caldav_id["manif"]) 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): def get_event_by_uuid(self,calandar,uuid):
event = calandar.object_by_uid(uid=uuid) event = calandar.object_by_uid(uid=uuid)
return event return event
@@ -235,36 +304,9 @@ class cls_caldav_client():
summary=event.vobject_instance.vevent.summary.value, summary=event.vobject_instance.vevent.summary.value,
description=_desc, description=_desc,
) )
event.delete() 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",
)
def get_events_by_date(self,calandar,date=None ): def get_events_by_date(self,calandar,date=None ):
if date is None: if date is None:
date = datetime.now() date = datetime.now()
@@ -330,104 +372,6 @@ 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(): class _caldav_item():

View File

@@ -13,3 +13,8 @@ for key,value in caldav_id.items():
caldav_cfg[key] = f"https://sync.infomaniak.com/calendars/AA01593/{value}?export" caldav_cfg[key] = f"https://sync.infomaniak.com/calendars/AA01593/{value}?export"
CALDAV_URL = "https://sync.infomaniak.com"
CALDAV_USER = 'AA01593' #agenda@ambulance-clerc.ch
CALDAV_PASSWORD = "Agendamc144"

View File

@@ -27,6 +27,7 @@ from rest_framework import status
from rest_framework.decorators import api_view from rest_framework.decorators import api_view
from mycaldav.models import CalDavItemSerializer, _caldav_item from mycaldav.models import CalDavItemSerializer, _caldav_item
from mycaldav.settings import CALDAV_URL,CALDAV_USER,CALDAV_PASSWORD
import logging import logging
@@ -34,7 +35,7 @@ logger = logging.getLogger(__name__)
def formatResponseArray(o_caldav, inverted=False): def formatResponseArray(o_caldav, inverted=False):
print(o_caldav.items)
try: try:
if inverted: if inverted:
o_caldav.items.reverse() o_caldav.items.reverse()
@@ -72,9 +73,10 @@ def view_task_caldav(request):
o_caldav = cls_caldav(url=caldav_cfg["task"]) o_caldav = cls_caldav(url=caldav_cfg["task"])
o_caldav.get_caldav_data() o_caldav.get_caldav_data()
if (datetime.today().day == 1) or 2==1: o_caldav_sync_management = caldav_sync_manager()
myClient = cls_caldav_client() o_caldav_sync_management.init_caldav(caldav_url=CALDAV_URL, caldav_user=CALDAV_USER, caldav_password=CALDAV_PASSWORD)
myClient.init_task_management() o_caldav_sync_management.init_task_management()
response = formatResponseArray(o_caldav) response = formatResponseArray(o_caldav)
return Response(response["data"], status=response["status"]) return Response(response["data"], status=response["status"])
@@ -88,6 +90,7 @@ def view_task_edit_caldav(request):
return JsonResponse({'error': 'UUID non fourni dans les données JSON'}, status=400) return JsonResponse({'error': 'UUID non fourni dans les données JSON'}, status=400)
myClient = cls_caldav_client() myClient = cls_caldav_client()
myClient.init_caldav(caldav_url=CALDAV_URL, caldav_user=CALDAV_USER, caldav_password=CALDAV_PASSWORD)
myClient.mark_as_done_task(calandar=myClient.a_task,uuid=uuid) myClient.mark_as_done_task(calandar=myClient.a_task,uuid=uuid)
return JsonResponse({'sucsess': 'UUID marqué à done'}, status=200) return JsonResponse({'sucsess': 'UUID marqué à done'}, status=200)
@@ -114,6 +117,7 @@ def view_vhc_edit_caldav(request):
# Gérer le cas où l'UUID n'est pas fourni dans les données JSON # Gérer le cas où l'UUID n'est pas fourni dans les données JSON
return JsonResponse({'error': 'UUID non fourni dans les données JSON'}, status=400) return JsonResponse({'error': 'UUID non fourni dans les données JSON'}, status=400)
myClient = cls_caldav_client() myClient = cls_caldav_client()
myClient.init_caldav(caldav_url=CALDAV_URL, caldav_user=CALDAV_USER, caldav_password=CALDAV_PASSWORD)
myClient.mark_as_done_task(calandar=myClient.a_vhc,uuid=uuid) myClient.mark_as_done_task(calandar=myClient.a_vhc,uuid=uuid)
return JsonResponse({'sucsess': 'UUID marqué à done'}, status=200) return JsonResponse({'sucsess': 'UUID marqué à done'}, status=200)
@@ -185,11 +189,7 @@ def view_op_caldav(request):
@api_view(['GET']) @api_view(['GET'])
def view_team_caldav(request): def view_team_caldav(request):
#Change timezone #Change timezone
myclient = cls_caldav_client()
#myclient.reformat_all_events(myclient.a_team)
#myclient.change_utc_to_zurich_all_events(myclient.a_team)
#myclient.reformat_all_events(myclient.a_task_config)
#myclient.change_utc_to_zurich_all_events(myclient.a_task)
o_caldav = cls_caldav(url=caldav_cfg["team"]) o_caldav = cls_caldav(url=caldav_cfg["team"])
o_caldav.get_caldav_data(periode=3) o_caldav.get_caldav_data(periode=3)
@@ -225,6 +225,7 @@ def view_team_pdf_caldav(request):
start = datetime.strptime(request.GET['dt'], "%d.%m.%Y") start = datetime.strptime(request.GET['dt'], "%d.%m.%Y")
myClient = cls_caldav_client() myClient = cls_caldav_client()
myClient.init_caldav(caldav_url=CALDAV_URL, caldav_user=CALDAV_USER, caldav_password=CALDAV_PASSWORD)
render_pdf(o_caldav, caldavClient=myClient, date=start) render_pdf(o_caldav, caldavClient=myClient, date=start)
return FileResponse(open('mycaldav/export.pdf', 'rb'), as_attachment=False, content_type='application/pdf') return FileResponse(open('mycaldav/export.pdf', 'rb'), as_attachment=False, content_type='application/pdf')