ajout de system impression team_pdf

This commit is contained in:
Ambulance Clerc
2022-09-22 18:33:57 +02:00
parent cbb4c6c862
commit 708c1a5bc5
9 changed files with 259 additions and 28 deletions

112
mycaldav/export_team_pdf.py Normal file
View File

@@ -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')

View File

@@ -13,6 +13,7 @@ import ssl
from icalendar import Calendar, Event from icalendar import Calendar, Event
import recurring_ical_events import recurring_ical_events
import caldav import caldav
from mycaldav.settings import *
# Create your models here. # Create your models here.
class cls_caldav(): class cls_caldav():
@@ -35,7 +36,13 @@ class cls_caldav():
def sort_array(self): def sort_array(self):
self.items.sort(key=lambda x: x.dtstamp, reverse=False) 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 = ssl.create_default_context()
ctx.check_hostname = False ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE ctx.verify_mode = ssl.CERT_NONE
@@ -46,15 +53,24 @@ class cls_caldav():
self.data = o_url.read() self.data = o_url.read()
o_url.close() o_url.close()
now = f"{datetime.now().day}.{datetime.now().month}.{datetime.now().year}" if date is None:
tomorow = datetime.now() + timedelta(days=1) date = datetime.now()
today = (datetime.now().year,datetime.now().month,datetime.now().day)
today = (date.year,date.month,date.day)
events = None events = None
if periode == 1: if periode == 1:
events = recurring_ical_events.of(Calendar.from_ical(self.data)).at(today) events = recurring_ical_events.of(Calendar.from_ical(self.data)).at(today)
elif periode == 2: elif periode == 2:
tomorow = date + timedelta(days=1)
events = recurring_ical_events.of(Calendar.from_ical(self.data)).between(today,tomorow) 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: for event in events:
item = _caldav_item() item = _caldav_item()
@@ -63,7 +79,20 @@ class cls_caldav():
if "-" in item.name: if "-" in item.name:
arr = item.name.split("-") arr = item.name.split("-")
item.key = arr[0] item.key = arr[0]
if "$" in item.key:
item.team_transfert = True
item.key = item.key.replace("$","")
item.name = arr[1] 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(): if "DESCRIPTION" in event.keys():
item.desc = event["DESCRIPTION"] item.desc = event["DESCRIPTION"]
@@ -90,9 +119,9 @@ class cls_caldav():
start = datetime.combine(start, datetime.min.time()) start = datetime.combine(start, datetime.min.time())
print("convert Date to datetime") print("convert Date to datetime")
print(start) print(start)
if start < datetime.combine(datetime.today(), time(19,0)): if int(start.strftime("%H")) < 19:
self.day.append(item) self.day.append(item)
if start >= datetime.combine(datetime.today(), time(19,0)): if int(start.strftime("%H")) >= 19:
self.night.append(item) self.night.append(item)
@@ -107,7 +136,7 @@ class cls_caldav_client():
caldav_user = 'AA01593' #agenda@ambulance-clerc.ch caldav_user = 'AA01593' #agenda@ambulance-clerc.ch
caldav_password = "Agendamc144" 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})") print(f"name: {cal.name}({cal.url})")
self.a_task = self.data.calendar(name="Tâche") 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: if datetime.today().day == 1 and datetime.today().hour == 1:
try: try:
with open(os.path.join("mycaldav", "last_sync_config.bin"), "rb") as file: 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: if array["year"] == datetime.now().year:
print("pas de copy, sync déjà fait") print("pas de copy, sync déjà fait")
else: else:
self.get_caldav_data(self.a_task) self.copy_caldav_data(self.a_task)
else: else:
self.get_caldav_data(self.a_task) self.copy_caldav_data(self.a_task)
self.clear_all_events_by_Date(self.a_task) self.clear_all_events_by_Date(self.a_task)
def add_event_in_calandar(self, calandar): def add_event_in_calandar(self, calandar):
my_event = calandar.save_event( my_event = calandar.save_event(
dtstart=datetime(2022, 6, 30, 12), 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 = ssl.create_default_context()
ctx.check_hostname = False ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE ctx.verify_mode = ssl.CERT_NONE
@@ -217,6 +240,11 @@ class _caldav_item():
done = False done = False
href = "" href = ""
uiid = "" uiid = ""
team_1 = ""
team_2 = ""
team_1_chef = False
team_2_chef = False
team_transfert = False
def format_str_date(self): def format_str_date(self):
self.str_start_date = datetime.strptime(self.dtstart,"%d.%m.%Y %H:%M").strftime("%d.%m") self.str_start_date = datetime.strptime(self.dtstart,"%d.%m.%Y %H:%M").strftime("%d.%m")

8
mycaldav/settings.py Normal file
View File

@@ -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"

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,30 @@
{% if latest_task_list %}
<table style="font-family: 'Source Sans Pro', sans-serif; font-size: 12pt;">
{% for task in latest_task_list %}
<tr style="{% if task.team_transfert %}background-color: orange;{% endif %}">
<td style="vertical-align: top;font-weight: bold;" width="150" >
{{task.key}}
</td>
<td style="{% if task.done %}text-decoration:line-through{% endif %}">
<span style="{% if task.team_1_chef %}background-color: yellow;{% endif %}">{{ task.team_1 }}</span>&nbsp;
<span style="{% if task.team_2_chef %}background-color: yellow;{% endif %}">{{ task.team_2 }}</span>
</td>
</tr>
{% endfor %}
<tr><td>&nbsp;</td></tr>
<tr>
<td style="border-top: 1px dashed black;font-weight: bold;padding: 5px; text-align: center;" colspan="2">Nuit</td>
</tr>
{% for task in night_task_list %}
<tr style="{% if task.team_transfert %}background-color: orange;{% endif %}"><td style="font-weight: bold;vertical-align: top;" width="150" >{{task.key}}</td>
<td style="{% if task.done %}text-decoration:line-through{% endif %}">
<span style="{% if task.team_1_chef %}background-color: yellow;{% endif %}">{{ task.team_1 }}</span>&nbsp;
<span style="{% if task.team_2_chef %}background-color: yellow;{% endif %}">{{ task.team_2 }}</span>
</td>
</tr>
{% endfor %}
</table>
{% else %}
<p>Aucune information opérationnelle</p>
{% endif %}

View File

@@ -0,0 +1,32 @@
{% if latest_task_list %}
<table style="font-family: 'Source Sans Pro', sans-serif; font-size: 12pt;">
{% for task in latest_task_list %}
<tr style="{% if task.team_transfert %}background-color: orange;{% endif %}">
<td style="vertical-align: top;font-weight: bold;" width="150" >
{{task.key}}
</td>
<td style="{% if task.done %}text-decoration:line-through{% endif %}">
<span style="{% if task.team_1_chef %}background-color: yellow;{% endif %}">{{ task.team_1 }}</span>&nbsp;
<span style="{% if task.team_2_chef %}background-color: yellow;{% endif %}">{{ task.team_2 }}</span>
</td>
</tr>
{% endfor %}
<tr><td>&nbsp;</td></tr>
<tr>
<td style="border-top: 1px dashed black;font-weight: bold;padding: 5px; text-align: center;" colspan="2">Nuit</td>
</tr>
{% for task in night_task_list %}
{% if task.str_start_date == today %}
<tr style="{% if task.team_transfert %}background-color: orange;{% endif %}"><td style="font-weight: bold;vertical-align: top;" width="150" >{{task.key}}</td>
<td style="{% if task.done %}text-decoration:line-through{% endif %}">
<span style="{% if task.team_1_chef %}background-color: yellow;{% endif %}">{{ task.team_1 }}</span>&nbsp;
<span style="{% if task.team_2_chef %}background-color: yellow;{% endif %}">{{ task.team_2 }}</span>
</td>
</tr>
{% endif %}
{% endfor %}
</table>
{% else %}
<p>Aucune information opérationnelle</p>
{% endif %}

View File

@@ -11,7 +11,8 @@ urlpatterns = [
path('rh', views.view_rh_caldav, name='view_rh_caldav'), path('rh', views.view_rh_caldav, name='view_rh_caldav'),
path('road', views.view_road_caldav, name='view_road_caldav'), path('road', views.view_road_caldav, name='view_road_caldav'),
path('op', views.view_op_caldav, name='view_op_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'),
] ]

View File

@@ -1,29 +1,35 @@
from django.http import HttpResponse from django.http import HttpResponse
from django.http import FileResponse
from django.shortcuts import render from django.shortcuts import render
from django.views import generic from django.views import generic
from django.template import loader from django.template import loader
from django.views.decorators.clickjacking import xframe_options_exempt from django.views.decorators.clickjacking import xframe_options_exempt
import caldav as cal import caldav as cal
from datetime import datetime, timedelta, time from datetime import datetime, timedelta, time
# Create your views here. # Create your views here.
from mycaldav.models import * from mycaldav.models import *
from mycaldav.settings import *
from mycaldav.export_team_pdf import *
@xframe_options_exempt @xframe_options_exempt
def view_task_caldav(request): 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() o_caldav.get_caldav_data()
template = loader.get_template("task/task.html") template = loader.get_template("task/task.html")
context = {'latest_task_list':o_caldav.day, 'night_task_list': o_caldav.night} context = {'latest_task_list':o_caldav.day, 'night_task_list': o_caldav.night}
if datetime.today().day == 1 and datetime.today().hour == 1: if datetime.today().day == 1 and datetime.today().hour == 1:
myClient = cls_caldav_client() myClient = cls_caldav_client()
myClient.init_task_management()
return HttpResponse(template.render(context,request)) return HttpResponse(template.render(context,request))
@xframe_options_exempt @xframe_options_exempt
def view_vhc_caldav(request): 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) o_caldav.get_caldav_data(periode=2)
template = loader.get_template("vhc/vhc_view.html") template = loader.get_template("vhc/vhc_view.html")
context = {'latest_task_list': o_caldav.items} context = {'latest_task_list': o_caldav.items}
@@ -31,7 +37,7 @@ def view_vhc_caldav(request):
@xframe_options_exempt @xframe_options_exempt
def view_rh_caldav(request): 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) o_caldav.get_caldav_data(periode=2)
template = loader.get_template("rh/rh_view.html") template = loader.get_template("rh/rh_view.html")
context = {'latest_task_list': o_caldav.items} context = {'latest_task_list': o_caldav.items}
@@ -39,24 +45,37 @@ def view_rh_caldav(request):
@xframe_options_exempt @xframe_options_exempt
def view_road_caldav(request): 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) o_caldav.get_caldav_data(periode=2)
template = loader.get_template("road/road_view.html") template = loader.get_template("road/road_view.html")
context = {'latest_task_list': o_caldav.items} context = {'latest_task_list': o_caldav.items}
return HttpResponse(template.render(context, request)) return HttpResponse(template.render(context, request))
@xframe_options_exempt @xframe_options_exempt
def view_op_caldav(request): 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) o_caldav.get_caldav_data(periode=1)
template = loader.get_template("op/op_view.html") template = loader.get_template("op/op_view.html")
context = {'latest_task_list': o_caldav.items} context = {'latest_task_list': o_caldav.items}
return HttpResponse(template.render(context, request)) return HttpResponse(template.render(context, request))
@xframe_options_exempt @xframe_options_exempt
def view_dayly_caldav(request): def view_team_caldav(request):
ret = "" 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() 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)

View File

@@ -23,6 +23,7 @@ idna==3.3
lxml==4.8.0 lxml==4.8.0
mysqlclient==2.1.0 mysqlclient==2.1.0
oscrypto==1.3.0 oscrypto==1.3.0
pdfkit==1.0.0
Pillow==9.0.1 Pillow==9.0.1
pycparser==2.21 pycparser==2.21
pydyf==0.1.2 pydyf==0.1.2