ajout de system impression team_pdf
This commit is contained in:
112
mycaldav/export_team_pdf.py
Normal file
112
mycaldav/export_team_pdf.py
Normal 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')
|
@@ -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")
|
||||
|
8
mycaldav/settings.py
Normal file
8
mycaldav/settings.py
Normal 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"
|
BIN
mycaldav/templates/team/logo_clerc_200.png
Normal file
BIN
mycaldav/templates/team/logo_clerc_200.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 17 KiB |
30
mycaldav/templates/team/team_pdf.html
Normal file
30
mycaldav/templates/team/team_pdf.html
Normal 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>
|
||||
<span style="{% if task.team_2_chef %}background-color: yellow;{% endif %}">{{ task.team_2 }}</span>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
<tr><td> </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>
|
||||
<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 %}
|
32
mycaldav/templates/team/team_view.html
Normal file
32
mycaldav/templates/team/team_view.html
Normal 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>
|
||||
<span style="{% if task.team_2_chef %}background-color: yellow;{% endif %}">{{ task.team_2 }}</span>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
<tr><td> </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>
|
||||
<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 %}
|
@@ -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'),
|
||||
|
||||
|
||||
]
|
||||
|
@@ -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)
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user