from datetime import date, timedelta from colloscope.models import Etudiant, Critere, Classe, Rotation, Periode, Creneau from fpdf import FPDF from fpdf.fonts import FontFace from fpdf.enums import TableCellFillMode """ etudiants = [ ['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 = [ ["Mathématiques", "vendredi", "17:00", "M. OUBAHA", "C382"], ["Anglais", "mercredi", "14:00", "Mme LE GOURIELLEC", "C393"], ["Mathématiques", "mercredi", "15:00", "M. BOULLY", "R004"], ["Physique", "mardi", "14:00", "Mme CHEVALIER", "R103"], ["Mathématiques", "mardi", "18:00", "M. RAPIN", "V152"], ["Anglais", "mardi", "14:00", "Mme BELAGGOUNE", "C4??"], ["pas de colle", "", "", "", ""], ["Physique", "mardi", "17:00", "M. COLIN", "C386"], ["Mathématiques", "mercredi", "13:30", "M. BOUVEROT", "??"], ["Anglais", "lundi", "13:00", "M. HERBAUT", "V052"], ] semaines = list(range(24, 34)) rotations = [ # [semaine, groupe, creneau] (24, 1, 1), (24, 2, 2), (24, 3, 3), (27, 3, 3), (28, 3, 3), (31, 3, 3), ] class PDF(FPDF): def liste_eleves(self, periode): classe = periode.classe etudiants = Etudiant.objects.filter(classe=classe) with self.table( align="RIGHT", col_widths=(4, 3, 1, 1, 1, 1), width=80, line_height=3) as table: header = table.row() for th in ("Nom", "Prénom", "Grp.", "TD", "LV1", "LV2"): header.cell(th) for etu in etudiants: row = table.row() row.cell(etu.nom.upper()) # Nom row.cell(etu.prenom) # Prénom row.cell(etu.groupe_de_colle(periode).libelle) # Groupe row.cell("??") #row.cell(etu.groupe_du_critere(periode, "TD")) # TD row.cell("??") # LV1 row.cell("??") # LV2 def table_colloscope(self, periode): semaines = periode.range_semaines() lundis = [ periode.date_debut_sem(n) for n in semaines ] creneaux = Creneau.objects.filter(periode=periode) jours = ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"] with self.table( align="LEFT", width=190, line_height=3, col_widths=(2, 1, 1, 3, 1, *(1,)*len(semaines)), num_heading_rows=2) as table: header = table.row() for th in ("Matière", "Jour", "Heure", "Colleur", "Salle"): header.cell(th, align="CENTER", rowspan=2) for sem in semaines: header.cell(str(sem), align="CENTER") header2 = table.row() for lundi in lundis: header2.cell(lundi.strftime("%d/%m/%y"), align="CENTER") for i, c in enumerate(creneaux): matiere = c.matiere jour = c.jour heure = c.heure colleur = c.colleur salle = c.salle row = table.row() row.cell(matiere.libelle) row.cell(jours[jour]) row.cell(heure.strftime("%H:%M")) row.cell("{} {}".format("M." if colleur.civilite=="M" else "Mme", colleur.nom.upper())) row.cell(salle) for s in semaines: if Rotation.objects.filter(creneau=c, semaine=s).exists(): rot = Rotation.objects.get(creneau=c, semaine=s) groupes = rot.groupes row.cell(", ".join(g.libelle for g in groupes.all()), align="CENTER") 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(periode): classe = periode.classe pdf = PDF(orientation="landscape", format="a4") pdf.set_font("helvetica", size=6) titre = f"Colloscope {classe.libelle} {periode.libelle}" pdf.set_title(titre) pdf.set_author("projet colloscope") pdf.set_author("projet colloscope") pdf.add_page() pdf.cell(text=titre, center=True, border=1, h=5) base_y = pdf.t_margin + 10 pdf.set_y(base_y) pdf.liste_eleves(periode) pdf.set_y(base_y) pdf.table_colloscope(periode) #pdf.y += 3 #pdf.table_travaux() pdf.output("test.pdf") if __name__ == "__main__": classe = Classe.objects.get(id=1) periode = Periode.objects.get(classe=classe, libelle="Semestre 5/2") generate(periode)