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)