diff --git a/mycaldav/export_team_pdf.py b/mycaldav/export_team_pdf.py new file mode 100644 index 0000000..881577c --- /dev/null +++ b/mycaldav/export_team_pdf.py @@ -0,0 +1,112 @@ +from fpdf import FPDF + +import caldav as cal +from datetime import datetime, timedelta, time, date + +# Create your views here. + +from mycaldav.models import * +from mycaldav.settings import * + +RED = (220, 50, 50) +BLACK = (0, 0, 0) + + + + +class PDF(FPDF): + o_caldav = None + start = None + end = None + def init_date(self,date): + self.today = date.date() # dt = datetime.strptime(day, '%d/%m/%Y') + self.start = self.today - timedelta(days=self.today.weekday()) + self.end = self.start + timedelta(days=6) + + def lines(self): + self.rect(5.0, 5.0, 200.0,287.0) + self.rect(8.0, 8.0, 194.0,282.0) + + def header(self): + self.set_xy(0, 10) + #self.image('logo_clerc_200.png', 10, 6, 200) + self.set_font('Arial', 'B', 8) + self.set_text_color(*BLACK) + self.cell(w=0, align='R', txt="Ambulance Clerc SA", border=0) + self.set_xy(0, 10) + self.set_font('Arial', 'B', 16) + self.set_text_color(*RED) + self.cell(w=0,h=5, align='C', txt="Planning hebdomadaire", border=0, ln=1) + self.set_font('Arial', 'B', 12) + self.set_text_color(*BLACK) + self.cell(w=0,h=5, align='C', txt=f"du {self.start.strftime('%d.%m.%Y')} au {self.end.strftime('%d.%m.%Y')}", border=0) + self.ln() + tmp_x = self.get_x() + tmp_y = self.get_y() + self.line(tmp_x,tmp_y,tmp_x + 210,tmp_y) + def draw_week(self): + self.set_font('Arial', '', 10) + + + self.ln() + days_fr = ["Lundi","Mardi","Mercredi","Jeudi", "Vendredi", "Samedi", "Dimanche"] + for d in range(7): + tmp_x = self.get_x() + tmp_y = self.get_y() + max_y = tmp_y + dt = self.start + timedelta(days=d) + self.o_caldav.get_caldav_data(periode=1, date=dt) + self.o_caldav.sort_array_by_key(reverse=True) + self.cell(w=50, h=5, align="L", txt=f"{days_fr[d]} {dt.strftime('%d.%m.%Y')}", ln=0) + self.cell(w=60, h=5, align="L", txt=f"Jour", ln=1, border="B") + for item in self.o_caldav.day: + self.set_fill_color(255,143,0) + if item.team_transfert: + item.key += " Transfert" + self.cell(w=50, h=5, align="R", txt=f"{item.key}", ln=0, fill=item.team_transfert) + self.set_fill_color(255, 241, 118) + self.cell(w=30, h=5, align="L", txt=f"{item.team_1}", ln=0, fill=item.team_1_chef) + self.cell(w=30, h=5, align="L", txt=f"{item.team_2}", ln=0, fill=item.team_2_chef) + self.ln() + max_y = self.get_y() + self.set_xy(tmp_x, tmp_y) + self.cell(w=115, h=5, align="L", txt=f"", ln=0) + self.cell(w=75, h=5, align="L", txt=f"Nuit", ln=1, border="B") + for item in self.o_caldav.night: + print(f"If NUIT [{item.str_start_date}]<> [{dt.strftime('%d.%m')}]") + if item.str_start_date != dt.strftime('%d.%m'): + print("pass") + continue + + self.set_fill_color(255,143,0) + if item.team_transfert: + item.key += " Transfert" + self.cell(w=115, h=5, align="L", txt=f"", ln=0) + self.cell(w=15, h=5, align="R", txt=f"{item.key}", ln=0, fill=item.team_transfert) + self.set_fill_color(255, 241, 118) + self.cell(w=30, h=5, align="L", txt=f"{item.team_1}", ln=0, fill=item.team_1_chef) + self.cell(w=30, h=5, align="L", txt=f"{item.team_2}", ln=0, fill=item.team_2_chef) + self.ln() + tmp_y = self.get_y() + if tmp_y > max_y: + max_y = tmp_y + self.set_xy(tmp_x,max_y) + self.ln() + + + + + + + +def render_pdf(caldav_object, date=None): + pdf = PDF(orientation='P', unit='mm', format='A4') + pdf.o_caldav = caldav_object + pdf.init_date(date) + pdf.set_margins(4,2,4) + pdf.add_page() + pdf.set_font('Arial', 'B', 12) + pdf.draw_week() + + + return pdf.output('test.pdf', 'F') \ No newline at end of file diff --git a/mycaldav/models.py b/mycaldav/models.py index cdf39cd..4b5e3e5 100644 --- a/mycaldav/models.py +++ b/mycaldav/models.py @@ -13,6 +13,7 @@ import ssl from icalendar import Calendar, Event import recurring_ical_events import caldav +from mycaldav.settings import * # Create your models here. class cls_caldav(): @@ -35,7 +36,13 @@ class cls_caldav(): def sort_array(self): self.items.sort(key=lambda x: x.dtstamp, reverse=False) - def get_caldav_data(self,periode=1,calendar=None): + def sort_array_by_key(self,reverse=False): + self.items.sort(key=lambda x: x.key, reverse=reverse) + 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): ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE @@ -46,15 +53,24 @@ class cls_caldav(): 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) + if date is None: + date = datetime.now() + + today = (date.year,date.month,date.day) + events = None if periode == 1: events = recurring_ical_events.of(Calendar.from_ical(self.data)).at(today) elif periode == 2: + tomorow = date + timedelta(days=1) events = recurring_ical_events.of(Calendar.from_ical(self.data)).between(today,tomorow) + elif periode == 7: + endweek = date + timedelta(days=6) + events = recurring_ical_events.of(Calendar.from_ical(self.data)).between(today,endweek) + + self.parse_data(events) + def parse_data(self, events): for event in events: item = _caldav_item() @@ -63,7 +79,20 @@ class cls_caldav(): if "-" in item.name: arr = item.name.split("-") item.key = arr[0] + if "$" in item.key: + item.team_transfert = True + item.key = item.key.replace("$","") item.name = arr[1] + if "&" in item.name: + arr = item.name.split("&") + item.team_1 = arr[0] + if "#" in item.team_1: + item.team_1_chef = True + item.team_1 = item.team_1.replace("#","") + item.team_2 = arr[1] + if "#" in item.team_2: + item.team_2_chef = True + item.team_2 = item.team_2.replace("#", "") if "DESCRIPTION" in event.keys(): item.desc = event["DESCRIPTION"] @@ -90,9 +119,9 @@ class cls_caldav(): start = datetime.combine(start, datetime.min.time()) print("convert Date to datetime") print(start) - if start < datetime.combine(datetime.today(), time(19,0)): + if int(start.strftime("%H")) < 19: self.day.append(item) - if start >= datetime.combine(datetime.today(), time(19,0)): + if int(start.strftime("%H")) >= 19: self.night.append(item) @@ -107,7 +136,7 @@ class cls_caldav_client(): 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" + caldav_agenda_config_url = caldav_cfg["task_config"] @@ -119,8 +148,9 @@ class cls_caldav_client(): print(f"name: {cal.name}({cal.url})") self.a_task = self.data.calendar(name="Tâche") + self.a_team = self.data.calendar(name="Équipage_test") - + def init_task_management(self): if datetime.today().day == 1 and datetime.today().hour == 1: try: with open(os.path.join("mycaldav", "last_sync_config.bin"), "rb") as file: @@ -133,19 +163,12 @@ class cls_caldav_client(): if array["year"] == datetime.now().year: print("pas de copy, sync déjà fait") else: - self.get_caldav_data(self.a_task) + self.copy_caldav_data(self.a_task) else: - self.get_caldav_data(self.a_task) + 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), @@ -154,7 +177,7 @@ class cls_caldav_client(): ) - def get_caldav_data(self, calandar=None): + def copy_caldav_data(self, calandar=None): ctx = ssl.create_default_context() ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE @@ -217,6 +240,11 @@ class _caldav_item(): done = False href = "" uiid = "" + team_1 = "" + team_2 = "" + team_1_chef = False + team_2_chef = False + team_transfert = False def format_str_date(self): self.str_start_date = datetime.strptime(self.dtstart,"%d.%m.%Y %H:%M").strftime("%d.%m") diff --git a/mycaldav/settings.py b/mycaldav/settings.py new file mode 100644 index 0000000..3645758 --- /dev/null +++ b/mycaldav/settings.py @@ -0,0 +1,8 @@ +caldav_cfg = {} #définition du dictionnaire de donnée avec URL des agendas +caldav_cfg["task"] = "https://sync.infomaniak.com/calendars/AA01593/a4835de4-b3cd-46ca-8f48-3dacd3a2b46e?export" +caldav_cfg["task_config"] = "https://sync.infomaniak.com/calendars/AA01593/29d5c8d0-9b86-4d45-bc2b-13585a2e78f8?export" +caldav_cfg["vhc"] = "https://sync.infomaniak.com/calendars/AA01593/4f7b4591-a4c4-4443-9f78-01df068f58b8?export" +caldav_cfg["rh"] = "https://sync.infomaniak.com/calendars/AA01593/c9916d31-c25b-4b0b-8673-81e2164b6f10?export" +caldav_cfg["road"] = "https://sync.infomaniak.com/calendars/AA01593/d608fcce-2f30-42f0-816c-b5524a0672fe?export" +caldav_cfg["raod"] = "https://sync.infomaniak.com/calendars/AA01593/73f3c787-abe1-4cd0-bf2a-c44dbc7015b9?export" +caldav_cfg["team"] = "https://sync.infomaniak.com/calendars/AA01593/2d61a30c-16b9-4e4a-aab4-aabcbca6961f?export" diff --git a/mycaldav/templates/team/logo_clerc_200.png b/mycaldav/templates/team/logo_clerc_200.png new file mode 100644 index 0000000..990b17a Binary files /dev/null and b/mycaldav/templates/team/logo_clerc_200.png differ diff --git a/mycaldav/templates/team/team_pdf.html b/mycaldav/templates/team/team_pdf.html new file mode 100644 index 0000000..2ae13e4 --- /dev/null +++ b/mycaldav/templates/team/team_pdf.html @@ -0,0 +1,30 @@ +{% if latest_task_list %} + + {% for task in latest_task_list %} + + + + + + {% endfor %} + + + + + {% for task in night_task_list %} + + + + {% endfor %} +
+ {{task.key}} + + {{ task.team_1 }}  + {{ task.team_2 }} +
 
Nuit
{{task.key}} + {{ task.team_1 }}  + {{ task.team_2 }} +
+{% else %} +

Aucune information opérationnelle

+{% endif %} \ No newline at end of file diff --git a/mycaldav/templates/team/team_view.html b/mycaldav/templates/team/team_view.html new file mode 100644 index 0000000..d90f83d --- /dev/null +++ b/mycaldav/templates/team/team_view.html @@ -0,0 +1,32 @@ +{% if latest_task_list %} + + {% for task in latest_task_list %} + + + + + + {% endfor %} + + + + + {% for task in night_task_list %} + {% if task.str_start_date == today %} + + + + {% endif %} + {% endfor %} +
+ {{task.key}} + + {{ task.team_1 }}  + {{ task.team_2 }} +
 
Nuit
{{task.key}} + {{ task.team_1 }}  + {{ task.team_2 }} +
+{% else %} +

Aucune information opérationnelle

+{% endif %} \ No newline at end of file diff --git a/mycaldav/urls.py b/mycaldav/urls.py index 6a72b94..77d2d98 100644 --- a/mycaldav/urls.py +++ b/mycaldav/urls.py @@ -11,7 +11,8 @@ urlpatterns = [ path('rh', views.view_rh_caldav, name='view_rh_caldav'), path('road', views.view_road_caldav, name='view_road_caldav'), path('op', views.view_op_caldav, name='view_op_caldav'), - path('dayly', views.view_dayly_caldav, name='view_dayly_caldav'), + path('team', views.view_team_caldav, name='view_team_caldav'), + path('team_pdf', views.view_team_pdf_caldav, name='view_team_pdf_caldav'), ] diff --git a/mycaldav/views.py b/mycaldav/views.py index 0203ee5..408a453 100644 --- a/mycaldav/views.py +++ b/mycaldav/views.py @@ -1,29 +1,35 @@ from django.http import HttpResponse +from django.http import FileResponse from django.shortcuts import render from django.views import generic from django.template import loader from django.views.decorators.clickjacking import xframe_options_exempt import caldav as cal + from datetime import datetime, timedelta, time # Create your views here. from mycaldav.models import * +from mycaldav.settings import * +from mycaldav.export_team_pdf import * + @xframe_options_exempt def view_task_caldav(request): - o_caldav = cls_caldav(url="https://sync.infomaniak.com/calendars/AA01593/a4835de4-b3cd-46ca-8f48-3dacd3a2b46e?export") + o_caldav = cls_caldav(url=caldav_cfg["task"]) o_caldav.get_caldav_data() template = loader.get_template("task/task.html") context = {'latest_task_list':o_caldav.day, 'night_task_list': o_caldav.night} if datetime.today().day == 1 and datetime.today().hour == 1: myClient = cls_caldav_client() + myClient.init_task_management() return HttpResponse(template.render(context,request)) @xframe_options_exempt def view_vhc_caldav(request): - o_caldav = cls_caldav(url="https://sync.infomaniak.com/calendars/AA01593/4f7b4591-a4c4-4443-9f78-01df068f58b8?export") + o_caldav = cls_caldav(url=caldav_cfg["vhc"]) o_caldav.get_caldav_data(periode=2) template = loader.get_template("vhc/vhc_view.html") context = {'latest_task_list': o_caldav.items} @@ -31,7 +37,7 @@ def view_vhc_caldav(request): @xframe_options_exempt def view_rh_caldav(request): - o_caldav = cls_caldav(url="https://sync.infomaniak.com/calendars/AA01593/c9916d31-c25b-4b0b-8673-81e2164b6f10?export") + o_caldav = cls_caldav(url=caldav_cfg["rh"]) o_caldav.get_caldav_data(periode=2) template = loader.get_template("rh/rh_view.html") context = {'latest_task_list': o_caldav.items} @@ -39,24 +45,37 @@ def view_rh_caldav(request): @xframe_options_exempt def view_road_caldav(request): - o_caldav = cls_caldav(url="https://sync.infomaniak.com/calendars/AA01593/d608fcce-2f30-42f0-816c-b5524a0672fe?export") + o_caldav = cls_caldav(url=caldav_cfg["road"]) o_caldav.get_caldav_data(periode=2) template = loader.get_template("road/road_view.html") context = {'latest_task_list': o_caldav.items} return HttpResponse(template.render(context, request)) @xframe_options_exempt def view_op_caldav(request): - o_caldav = cls_caldav(url="https://sync.infomaniak.com/calendars/AA01593/73f3c787-abe1-4cd0-bf2a-c44dbc7015b9?export") + o_caldav = cls_caldav(url=caldav_cfg["op"]) o_caldav.get_caldav_data(periode=1) template = loader.get_template("op/op_view.html") context = {'latest_task_list': o_caldav.items} return HttpResponse(template.render(context, request)) @xframe_options_exempt -def view_dayly_caldav(request): - ret = "" +def view_team_caldav(request): + o_caldav = cls_caldav(url=caldav_cfg["team"]) + o_caldav.get_caldav_data(periode=1) + template = loader.get_template("team/team_view.html") + o_caldav.sort_array_by_key(True) + context = {'latest_task_list': o_caldav.day, 'night_task_list': o_caldav.night, 'today': datetime.today().strftime('%d.%m')} + return HttpResponse(template.render(context, request)) + +def view_team_pdf_caldav(request): + o_caldav = cls_caldav(url=caldav_cfg["team"]) + if not "dt" in request.GET.keys(): + start = datetime.today() + else: + start = datetime.strptime(request.GET['dt'], "%d.%m.%Y") + myClient = cls_caldav_client() + #render_pdf(o_caldav, start) + return FileResponse(open('test.pdf', 'rb'), as_attachment=False, content_type='application/pdf') - - return HttpResponse(ret) diff --git a/requirements.txt b/requirements.txt index ba2c237..420119f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -23,6 +23,7 @@ idna==3.3 lxml==4.8.0 mysqlclient==2.1.0 oscrypto==1.3.0 +pdfkit==1.0.0 Pillow==9.0.1 pycparser==2.21 pydyf==0.1.2