Update PDF generation to have plan comments

This commit is contained in:
Gregory Trullemans 2022-10-17 14:38:10 +02:00
parent e515e12193
commit d1c2a33c15
2 changed files with 69 additions and 30 deletions

View File

@ -2,6 +2,28 @@
[![Build Status](https://drone.grimbox.be/api/badges/Sulley/Ultron/status.svg)](https://drone.grimbox.be/Sulley/Ultron) [![Build Status](https://drone.grimbox.be/api/badges/Sulley/Ultron/status.svg)](https://drone.grimbox.be/Sulley/Ultron)
## Déploiement en local (Docker)
- installer Docker (+ driver PGSQL)
- créer un fichier `docker-compose.yml`
```
version: "3"
services:
db:
image: "postgres:14"
restart: always
container_name: "ultron_db"
environment:
POSTGRES_DB: "ultron"
POSTGRES_USER: "ironman"
POSTGRES_PASSWORD: "jarvis"
ports:
- "5432:5432"
volumes:
- ./data:/var/lib/postgresql/data
```
- tapez la commande `docker compose up`
## Déploiement sur Heroku ## Déploiement sur Heroku
- Créer l'application sur Heroku - Créer l'application sur Heroku
@ -36,7 +58,7 @@ Pour transferer des données d'un site à un autre, le plus simple est d'utilise
Pour ne pas récupérer les user, les authorisation et les content-type, utilisez la commande : Pour ne pas récupérer les user, les authorisation et les content-type, utilisez la commande :
``` ```
python manage.py dumpdata --exclude=auth --exclude=contenttypes --exclude=admin > save.json python manage.py dumpdata --natural-foreign --exclude contenttypes --exclude auth.permission --exclude admin.logentry --exclude sessions.session --indent 4 > save.json
``` ```
Pour charger les données, tapez ensuite : Pour charger les données, tapez ensuite :

View File

@ -196,14 +196,14 @@ class GymnastReportDocument(PDFDocument):
self.add_gymnast_best_scores(gymnast) self.add_gymnast_best_scores(gymnast)
self.add_gymnast_active_routine(gymnast) self.add_gymnast_active_routine(gymnast)
# self.add_gymnast_level_information(gymnast) # self.add_gymnast_level_information(gymnast)
planned_skill = self.add_gymnast_planned_skill(gymnast) plan_list = self.add_gymnast_planned_skill(gymnast)
self.add_gymnast_last_learned_skill(gymnast) self.add_gymnast_last_learned_skill(gymnast)
self.add_gymnast_next_events(gymnast) self.add_gymnast_next_events(gymnast)
self.add_gymnast_week_notes(gymnast) self.add_gymnast_week_notes(gymnast)
if planned_skill: if plan_list:
self.new_page() self.new_page()
self.add_planned_skills_details(planned_skill) self.add_planned_skills_details(plan_list)
def add_gymnast_personnal_information(self, gymnast): def add_gymnast_personnal_information(self, gymnast):
""" Ajoute les informations personnelles du gymnast. """ Ajoute les informations personnelles du gymnast.
@ -594,28 +594,42 @@ class GymnastReportDocument(PDFDocument):
# le double F ne fonctionne qu'en précisant le distinct, sinon ca dédouble les résultats. # le double F ne fonctionne qu'en précisant le distinct, sinon ca dédouble les résultats.
# qui lui même ne fonctionne que sur un champ présent dans le `order_by` (que le premier champ ?) # qui lui même ne fonctionne que sur un champ présent dans le `order_by` (que le premier champ ?)
# #
planned_skills = ( print(gymnast)
Skill.objects.filter(plan__gymnast=gymnast.id) # planned_skills = (
# Skill.objects.filter(plan__gymnast=gymnast.id)
# # .annotate(plan_date=F("plan__date"))
# .annotate(plan_date=F("plan__date"), learning_step=F("plan__learning_step"), plan_id=F("plan__id"))
# .order_by("id", "-plan__date").distinct('id')[:6]
# )
plan_list = (
Plan.objects.filter(gymnast=gymnast, educative__in=(Skill.objects.all()))
.filter( .filter(
Q(plan__is_done=False) Q(is_done=False)
| Q(plan__date__gte=date.today()) | Q(date__gte=date.today())
) )
# .annotate(plan_date=F("plan__date")) .order_by('educative', '-date').distinct()[:6]
.annotate(plan_date=F("plan__date"), learning_step=F("plan__learning_step"), plan_id=F("plan__id"))
.order_by("id", "-plan__date").distinct('id')[:6]
) )
if planned_skills: if plan_list:
for planned_skill in planned_skills: for plan in plan_list:
print(plan)
# self.add_new_line(
# X, plan.educative.short_label + " " + str(LEARNING_STEP_CHOICES[plan.learning_step][1]).lower() + " (" + plan.educative.notation + ") for " + plan.date.strftime("%d-%m-%Y")
# )
skill = Skill.objects.get(pk=plan.educative)
self.add_new_line( self.add_new_line(
X, planned_skill.short_label + " " + str(LEARNING_STEP_CHOICES[planned_skill.learning_step][1]).lower() + " (" + planned_skill.notation + ") for " + planned_skill.plan_date.strftime("%d-%m-%Y") X, plan.educative.short_label + " " + str(LEARNING_STEP_CHOICES[plan.learning_step][1]).lower() + " (" + skill.notation + ") for " + plan.date.strftime("%d-%m-%Y")
) )
else: else:
self.add_new_line( self.add_new_line(
X, X,
"No next skill to learn plannified.", "No next skill to learn plannified.",
) )
return planned_skills print()
print()
return plan_list
def add_gymnast_next_events(self, gymnast): def add_gymnast_next_events(self, gymnast):
""" Ajoute les évènements futurs du gymnaste """ """ Ajoute les évènements futurs du gymnaste """
@ -690,7 +704,7 @@ class GymnastReportDocument(PDFDocument):
"No note associated to this gymnast this week.", "No note associated to this gymnast this week.",
) )
def add_planned_skills_details(self, planned_skills): def add_planned_skills_details(self, plan_list):
""" """ """ """
# self.y = 20*cm # self.y = 20*cm
self.add_new_line( self.add_new_line(
@ -700,20 +714,23 @@ class GymnastReportDocument(PDFDocument):
) )
self.add_vspace(-0.5*cm) self.add_vspace(-0.5*cm)
for planned_skill in planned_skills: for plan in plan_list:
plan = Plan.objects.get(pk=planned_skill.plan_id) if plan.informations:
print(plan)
planned_skill = Skill.objects.get(pk=plan.educative)
print(planned_skill)
# Titre du skill # Titre du skill
html_text = "<u>" + planned_skill.short_label + " (" + planned_skill.notation + ") :</u>" html_text = "<u>" + planned_skill.short_label + " (" + planned_skill.notation + ") :</u>"
paragraph = Paragraph(html_text, self.style) paragraph = Paragraph(html_text, self.style)
width, height = paragraph.wrap(18*cm, 10*cm) width, height = paragraph.wrap(18*cm, 10*cm)
paragraph.drawOn(self.document, INDENTED_X, self.y) paragraph.drawOn(self.document, INDENTED_X, self.y)
self.add_vspace(- height - 0.5*cm) self.add_vspace(- height - 0.5*cm)
# Informations du skill pour le gymnaste # Informations du skill pour le gymnaste
paragraph = Paragraph(plan.informations, self.style) paragraph = Paragraph(plan.informations, self.style)
width, height = paragraph.wrap(18*cm, 10*cm) width, height = paragraph.wrap(18*cm, 10*cm)
paragraph.drawOn(self.document, INDENTED_X, self.y) paragraph.drawOn(self.document, INDENTED_X, self.y)
self.add_vspace(- height) self.add_vspace(- height)
self.add_vspace(-0.4*cm) self.add_vspace(-0.4*cm)