Update PDF generation to have plan comments
This commit is contained in:
parent
e515e12193
commit
d1c2a33c15
24
README.md
24
README.md
|
@ -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 :
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue