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)
## 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
- 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 :
```
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 :

View File

@ -196,14 +196,14 @@ class GymnastReportDocument(PDFDocument):
self.add_gymnast_best_scores(gymnast)
self.add_gymnast_active_routine(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_next_events(gymnast)
self.add_gymnast_week_notes(gymnast)
if planned_skill:
if plan_list:
self.new_page()
self.add_planned_skills_details(planned_skill)
self.add_planned_skills_details(plan_list)
def add_gymnast_personnal_information(self, 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.
# qui lui même ne fonctionne que sur un champ présent dans le `order_by` (que le premier champ ?)
#
planned_skills = (
Skill.objects.filter(plan__gymnast=gymnast.id)
print(gymnast)
# 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(
Q(plan__is_done=False)
| Q(plan__date__gte=date.today())
Q(is_done=False)
| Q(date__gte=date.today())
)
# .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]
.order_by('educative', '-date').distinct()[:6]
)
if planned_skills:
for planned_skill in planned_skills:
if plan_list:
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(
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:
self.add_new_line(
X,
"No next skill to learn plannified.",
)
return planned_skills
print()
print()
return plan_list
def add_gymnast_next_events(self, gymnast):
""" Ajoute les évènements futurs du gymnaste """
@ -690,7 +704,7 @@ class GymnastReportDocument(PDFDocument):
"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.add_new_line(
@ -700,20 +714,23 @@ class GymnastReportDocument(PDFDocument):
)
self.add_vspace(-0.5*cm)
for planned_skill in planned_skills:
plan = Plan.objects.get(pk=planned_skill.plan_id)
for plan in plan_list:
if plan.informations:
print(plan)
planned_skill = Skill.objects.get(pk=plan.educative)
print(planned_skill)
# Titre du skill
html_text = "<u>" + planned_skill.short_label + " (" + planned_skill.notation + ") :</u>"
paragraph = Paragraph(html_text, self.style)
width, height = paragraph.wrap(18*cm, 10*cm)
paragraph.drawOn(self.document, INDENTED_X, self.y)
self.add_vspace(- height - 0.5*cm)
# Titre du skill
html_text = "<u>" + planned_skill.short_label + " (" + planned_skill.notation + ") :</u>"
paragraph = Paragraph(html_text, self.style)
width, height = paragraph.wrap(18*cm, 10*cm)
paragraph.drawOn(self.document, INDENTED_X, self.y)
self.add_vspace(- height - 0.5*cm)
# Informations du skill pour le gymnaste
paragraph = Paragraph(plan.informations, self.style)
width, height = paragraph.wrap(18*cm, 10*cm)
paragraph.drawOn(self.document, INDENTED_X, self.y)
self.add_vspace(- height)
# Informations du skill pour le gymnaste
paragraph = Paragraph(plan.informations, self.style)
width, height = paragraph.wrap(18*cm, 10*cm)
paragraph.drawOn(self.document, INDENTED_X, self.y)
self.add_vspace(- height)
self.add_vspace(-0.4*cm)
self.add_vspace(-0.4*cm)