diff --git a/README.md b/README.md
index 9629b1c763..258e28dfbb 100644
--- a/README.md
+++ b/README.md
@@ -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 :
diff --git a/ultron/tools/pdf_generator.py b/ultron/tools/pdf_generator.py
index 30eb7c3ef9..63a6c8b0c1 100644
--- a/ultron/tools/pdf_generator.py
+++ b/ultron/tools/pdf_generator.py
@@ -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 = "" + planned_skill.short_label + " (" + planned_skill.notation + ") :"
- 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 = "" + planned_skill.short_label + " (" + planned_skill.notation + ") :"
+ 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)