From 80d41c0561c46b20e3fc1c4ca6257d5ed9562905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20Mogu=C3=A9rou?= Date: Sun, 14 Apr 2024 17:00:03 +0200 Subject: [PATCH] =?UTF-8?q?base=20de=20donn=C3=A9es=20+=20pdf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- colloscope/migrations/0001_initial.py | 97 +++++++++++++- ...teur_colleur_alter_utilisateur_etudiant.py | 24 ++++ colloscope/models.py | 72 +++++++++-- colloscope/pdfexport.py | 118 ++++++++++-------- 4 files changed, 244 insertions(+), 67 deletions(-) create mode 100644 colloscope/migrations/0002_alter_utilisateur_colleur_alter_utilisateur_etudiant.py diff --git a/colloscope/migrations/0001_initial.py b/colloscope/migrations/0001_initial.py index 1e6583e..3ac3ff1 100644 --- a/colloscope/migrations/0001_initial.py +++ b/colloscope/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.0.4 on 2024-04-12 22:38 +# Generated by Django 5.0.4 on 2024-04-14 13:40 import django.db.models.deletion from django.db import migrations, models @@ -12,29 +12,116 @@ class Migration(migrations.Migration): ] operations = [ + migrations.CreateModel( + name='Classe', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('libelle', models.CharField(max_length=20)), + ('annee', models.IntegerField()), + ('jour_zero', models.DateField()), + ], + ), migrations.CreateModel( name='Colleur', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('civilite', models.CharField(max_length=1)), ('nom', models.CharField(max_length=100)), ], ), + migrations.CreateModel( + name='Lycee', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uai', models.CharField(max_length=10)), + ('libelle', models.CharField(max_length=100)), + ('vacances', models.CharField(max_length=1)), + ], + ), + migrations.CreateModel( + name='Matiere', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('libelle', models.CharField(max_length=100)), + ('code', models.CharField(max_length=20)), + ], + ), + migrations.CreateModel( + name='Groupe', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('libelle', models.CharField(max_length=100)), + ('classe', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.classe')), + ], + ), migrations.CreateModel( name='Etudiant', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('prenom', models.CharField(max_length=100)), ('nom', models.CharField(max_length=100)), - ('groupe', models.IntegerField()), + ('classe', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.classe')), + ('groupes', models.ManyToManyField(to='colloscope.groupe')), + ], + ), + migrations.AddField( + model_name='classe', + name='lycee', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.lycee'), + ), + migrations.CreateModel( + name='Periode', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('libelle', models.CharField(max_length=100)), + ('debut', models.DateField()), + ('fin', models.DateField()), + ('classe', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.classe')), ], ), migrations.CreateModel( - name='Colle', + name='Creneau', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('groupe', models.IntegerField()), - ('date', models.DateTimeField()), + ('jour', models.IntegerField()), + ('heure', models.TimeField()), + ('duree', models.DurationField()), + ('salle', models.CharField(max_length=20)), + ('est_colle', models.BooleanField()), + ('capacite', models.IntegerField()), + ('classe', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.classe')), ('colleur', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.colleur')), + ('matiere', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.matiere')), + ('periode', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.periode')), + ], + ), + migrations.CreateModel( + name='Rotation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('semaine', models.IntegerField()), + ('creneau', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.creneau')), + ('groupes', models.ManyToManyField(to='colloscope.groupe')), + ], + ), + migrations.CreateModel( + name='Amendement', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('est_positif', models.BooleanField()), + ('etudiant', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.etudiant')), + ('rotation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.rotation')), + ], + ), + migrations.CreateModel( + name='Utilisateur', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('username', models.CharField(max_length=100)), + ('password', models.CharField(max_length=300)), + ('timestamp', models.DateTimeField(auto_now_add=True)), + ('colleur', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.colleur')), + ('etudiant', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.etudiant')), ], ), ] diff --git a/colloscope/migrations/0002_alter_utilisateur_colleur_alter_utilisateur_etudiant.py b/colloscope/migrations/0002_alter_utilisateur_colleur_alter_utilisateur_etudiant.py new file mode 100644 index 0000000..9ad315f --- /dev/null +++ b/colloscope/migrations/0002_alter_utilisateur_colleur_alter_utilisateur_etudiant.py @@ -0,0 +1,24 @@ +# Generated by Django 5.0.4 on 2024-04-14 13:51 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('colloscope', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='utilisateur', + name='colleur', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='colloscope.colleur'), + ), + migrations.AlterField( + model_name='utilisateur', + name='etudiant', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='colloscope.etudiant'), + ), + ] diff --git a/colloscope/models.py b/colloscope/models.py index 3c2c89f..4fa259f 100644 --- a/colloscope/models.py +++ b/colloscope/models.py @@ -1,15 +1,69 @@ from django.db import models -class Colleur(models.Model): - nom=models.CharField(max_length=100) +class Lycee(models.Model): + uai = models.CharField(max_length=10) + libelle = models.CharField(max_length=100) + vacances = models.CharField(max_length=1) + +class Classe(models.Model): + lycee = models.ForeignKey(Lycee, on_delete=models.CASCADE) + libelle = models.CharField(max_length=20) + annee = models.IntegerField() + jour_zero = models.DateField() + +class Periode(models.Model): + classe = models.ForeignKey(Classe, on_delete=models.CASCADE) + libelle = models.CharField(max_length=100) + debut = models.DateField() + fin = models.DateField() + +class Matiere(models.Model): + libelle = models.CharField(max_length=100) + code = models.CharField(max_length=20) + +class Groupe(models.Model): + classe = models.ForeignKey(Classe, on_delete=models.CASCADE) + libelle = models.CharField(max_length=100) class Etudiant(models.Model): - prenom=models.CharField(max_length=100) - nom=models.CharField(max_length=100) - groupe=models.IntegerField() + classe = models.ForeignKey(Classe, on_delete=models.CASCADE) + prenom = models.CharField(max_length=100) + nom = models.CharField(max_length=100) + #lv1 = models.ForeignKey(Matiere, on_delete=models.CASCADE) + #lv2 = models.ForeignKey(Matiere, on_delete=models.CASCADE) + groupes = models.ManyToManyField(Groupe) -class Colle(models.Model): - colleur=models.ForeignKey(Colleur, on_delete=models.CASCADE) - groupe=models.IntegerField() - date=models.DateTimeField() +class Colleur(models.Model): + civilite = models.CharField(max_length=1) + nom = models.CharField(max_length=100) + +class Creneau(models.Model): + classe = models.ForeignKey(Classe, on_delete=models.CASCADE) + jour = models.IntegerField() + heure = models.TimeField() + duree = models.DurationField() + salle = models.CharField(max_length=20) + periode = models.ForeignKey(Periode, on_delete=models.CASCADE) + matiere = models.ForeignKey(Matiere, on_delete=models.CASCADE) + colleur = models.ForeignKey(Colleur, on_delete=models.CASCADE) + est_colle = models.BooleanField() + capacite = models.IntegerField() + +class Rotation(models.Model): + creneau = models.ForeignKey(Creneau, on_delete=models.CASCADE) + groupes = models.ManyToManyField(Groupe) + semaine = models.IntegerField() + +class Amendement(models.Model): + est_positif = models.BooleanField() + rotation = models.ForeignKey(Rotation, on_delete=models.CASCADE) + etudiant = models.ForeignKey(Etudiant, on_delete=models.CASCADE) + + +class Utilisateur(models.Model): + username = models.CharField(max_length=100) + password = models.CharField(max_length=300) + timestamp = models.DateTimeField(auto_now_add=True) + etudiant = models.ForeignKey(Etudiant, on_delete=models.DO_NOTHING, null=True) + colleur = models.ForeignKey(Colleur, on_delete=models.DO_NOTHING, null=True) diff --git a/colloscope/pdfexport.py b/colloscope/pdfexport.py index 29e87ec..b286c46 100644 --- a/colloscope/pdfexport.py +++ b/colloscope/pdfexport.py @@ -23,50 +23,51 @@ def jour_of_sem(n, cal): return jour etudiants = [ - ["Aboujaib", "Alexandre", 4, "A", "Angl.", "All."], - ["Ajan", "George", 4, "A", "Angl.", ""], - ["Akrad", "Lina", 1, "SI", "Angl.", ""], - ["Aubert", "Nicolas", 1, "SI", "Angl.", ""], - ["Badr", "Roman", 4, "A", "Angl.", ""], - ["Bazire", "Aurélien", 5, "A", "Angl.", ""], - ["Boit", "Arthur", 1, "SI", "Angl.", ""], - ["Boubker", "Youssef", 1, "SI", "Angl.", ""], - ["Boudjema", "Dylan", 1, "SI", "Angl.", ""], - ["Chiriac", "Mihnea", 1, "SI", "Angl.", ""], - ["Courier", "Marine", 1, "SI", "Angl.", ""], - ["Daguin", "Joseph", 1, "SI", "Angl.", ""], - ["De Weer", "Matthias", 1, "SI", "Angl.", ""], - ["Desbouis", "Katell", 1, "SI", "Angl.", ""], - ["Dupouy", "Jérémie", 1, "SI", "Angl.", ""], - ["Hariri--Gautier-Picard", "Grégoire", 1, "SI", "Angl.", ""], - ["Juricevic", "Matteo", 1, "SI", "Angl.", ""], - ["Knanoua", "Anas", 1, "SI", "Angl.", ""], - ["Lesenne", "Pierrick", 1, "SI", "Angl.", ""], - ["Lin", "Hao", 1, "SI", "Angl.", ""], - ["Masbatin", "Lucas", 1, "SI", "Angl.", ""], - ["Mayuran", "Mithushan", 1, "SI", "Angl.", ""], - ["Messahli", "Yassine", 1, "SI", "Angl.", ""], - ["Moguérou", "Valentin", 10, "B", "Angl.", "All."], - ["Mohellebi", "Mathéo", 10, "B", "Angl.", "All."], - ["Mouisset--Ferrara", "Maël", 10, "B", "Angl.", "All."], - ["Ottavi", "Corentin", 10, "B", "Angl.", "All."], - ["Ponce", "Alexian", 10, "B", "Angl.", "All."], - ["Pujol", "Raphaël", 10, "B", "Angl.", "All."], - ["Pustetto", "Mathis", 10, "B", "Angl.", "All."], - ["Radice", "Roman", 10, "B", "Angl.", "All."], - ["Rat", "Evelyn", 10, "B", "Angl.", "All."], - ["Rousse", "Louis", 10, "B", "Angl.", "All."], - ["Roux", "Gaëtan", 10, "B", "Angl.", "All."], - ["Rouyre--Cros", "Célian", 10, "B", "Angl.", "All."], - ["Sourbé", "François-Gabriel", 10, "B", "Angl.", "All."], - ["Stourbe", "Simon", 10, "B", "Angl.", "All."], - ["Thai", "Dany", 10, "B", "Angl.", "All."], - ["Théodore", "Jonathan", 10, "B", "Angl.", "All."], - ["Vandroux", "Benoît", 10, "B", "Angl.", "All."], - ["Veyssière", "Thibaud", 10, "B", "Angl.", "All."], - ["Vié", "Adrien", 10, "B", "Angl.", "All."], - ["Ye", "Luan", 10, "B", "Angl.", "All."], - ["Zarka", "Amélie", 10, "B", "Angl.", "All."], + ['Aboujaib', 'Alexandre', 4, 'A', '', ''], + ['Ajan', 'George', 4, 'A', '', ''], + ['Akrad', 'Lina', 1, 'SI', '', ''], + ['Aubert', 'Nicolas', 1, 'SI', '', ''], + ['Badr', 'Roman', 4, 'A', '', ''], + ['Bazire', 'Aurélien', 5, 'A', '', ''], + ['Boit', 'Arthur', 5, 'A', '', ''], + ['Boubker', 'Youssef', 5, 'A', '', ''], + ['Boudjema', 'Dylan', 1, 'SI', '', ''], + ['Chiriac', 'Mihnea', 6, 'A', '', ''], + ['Courier', 'Marine', 6, 'A', '', ''], + ['Daguin', 'Joseph', 6, 'A', '', ''], + ['Dauguen', 'Gabriel', 7, 'A', '', ''], + ['De Weer', 'Matthias', 7, 'A', '', ''], + ['Desbouis', 'Katell', 2, 'SI', '', ''], + ['Dupouy', 'Jérémie', 7, 'A', '', ''], + ['Hariri--Gautier-Picard', 'Grégoire', 8, 'A', '', ''], + ['Juricevic', 'Matteo', 8, 'A', '', ''], + ['Knanoua', 'Anas', 8, 'A', '', ''], + ['Lesenne', 'Pierrick', 9, 'A', '', ''], + ['Lin', 'Hao', 2, 'SI', '', ''], + ['Masbatin', 'Lucas', 2, 'SI', '', ''], + ['Mayuran', 'Mithushan', 9, 'A', '', ''], + ['Messahli', 'Yassine', 9, 'A', '', ''], + ['Moguérou', 'Valentin', 10, 'B', '', ''], + ['Mohellebi', 'Mathéo', 10, 'B', '', ''], + ['Mouisset--Ferrara', 'Maël', 10, 'B', '', ''], + ['Ottavi', 'Corentin', 11, 'B', '', ''], + ['Ponce', 'Alexian', 11, 'B', '', ''], + ['Pujol', 'Raphaël', 11, 'B', '', ''], + ['Pustetto', 'Mathis', 12, 'B', '', ''], + ['Radice', 'Roman', 12, 'B', '', ''], + ['Rat', 'Evelyn', 12, 'B', '', ''], + ['Rousse', 'Louis', 3, 'SI', '', ''], + ['Roux', 'Gaëtan', 3, 'SI', '', ''], + ['Rouyre--Cros', 'Célian', 3, 'SI', '', ''], + ['Sourbé', 'François-Gabriel', 13, 'B', '', ''], + ['Stourbe', 'Simon', 13, 'B', '', ''], + ['Thai', 'Dany', 13, 'B', '', ''], + ['Théodore', 'Jonathan', 14, 'B', '', ''], + ['Vandroux', 'Benoît', 14, 'B', '', ''], + ['Veyssière', 'Thibaud', 14, 'B', '', ''], + ['Vié', 'Adrien', 15, 'B', '', ''], + ['Ye', 'Luan', 15, 'B', '', ''], + ['Zarka', 'Amélie', 15, 'B', '', ''], ] creneaux = [ @@ -98,7 +99,7 @@ class PDF(FPDF): def liste_eleves(self, etudiants): with self.table( align="RIGHT", - col_widths=(50, 35, 12, 12, 12, 12), + col_widths=(4, 3, 1, 1, 1, 1), width=80, line_height=3) as table: header = table.row() @@ -120,7 +121,7 @@ class PDF(FPDF): align="LEFT", width=190, line_height=3, - col_widths=(25, 12, 10, 25, 12, *(10,)*len(semaines)), + col_widths=(2, 1, 1, 3, 1, *(1,)*len(semaines)), num_heading_rows=2) as table: header = table.row() @@ -152,7 +153,22 @@ class PDF(FPDF): else: row.cell() - + def table_travaux(self): + with self.table( + align="LEFT", + width=190, + line_height=3, + col_widths=(2, 1, 1, 4, *(1,)*len(semaines)), + first_row_as_headings=False) as table: + + row = table.row() + row.cell("TP Physique") + row.cell("lundi") + row.cell("8:30") + row.cell() + + for _ in range(len(semaines)): + row.cell("9 à 15", align="CENTER") def generate(): pdf = PDF(orientation="landscape", format="a4") @@ -163,18 +179,14 @@ def generate(): pdf.set_author("projet colloscope") pdf.add_page() - pdf.cell(text="Colloscope MP2I Semestre 5/2", center=True, border=1, h=5) - base_y = pdf.t_margin + 10 - pdf.set_y(base_y) - pdf.liste_eleves(etudiants) - pdf.set_y(base_y) - pdf.table_colloscope(creneaux, semaines, rotations) + pdf.y += 3 + pdf.table_travaux() pdf.output("test.pdf")