from datetime import date, timedelta from fpdf import FPDF from fpdf.fonts import FontFace from fpdf.enums import TableCellFillMode calendrier_zoneC = date(2023, 9, 18), [ ( date(2023, 10, 21), date(2023, 11, 6) ), ( date(2023, 12, 23), date(2024, 1, 8) ), ( date(2024, 2, 10), date(2024, 2, 26) ), ( date(2024, 4, 6), date(2024, 4, 22) ), ] def jour_of_sem(n, cal): sem_1, vac = cal jour = sem_1 + (n-1) * timedelta(weeks=1) for (debut, fin) in vac: if jour >= debut: jour += 2*timedelta(weeks=1) 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."], ] 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, etudiants): with self.table( align="RIGHT", col_widths=(50, 35, 12, 12, 12, 12), 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[0].upper()) # Nom row.cell(etu[1]) # Prénom row.cell(str(etu[2])) # Groupe row.cell(etu[3]) # TD row.cell(etu[4]) # LV1 row.cell(etu[5]) # LV2 def table_colloscope(self, creneaux, semaines, rotations): with self.table( align="LEFT", width=190, line_height=3, col_widths=(25, 12, 10, 25, 12, *(10,)*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 sem in semaines: header2.cell(jour_of_sem(sem, calendrier_zoneC).strftime("%d/%m/%y"), align="CENTER") for i, tr in enumerate(creneaux): matiere, jour, heure, colleur, salle = tr row = table.row() row.cell(matiere) row.cell(jour) row.cell(heure) row.cell(colleur) row.cell(salle) for s in semaines: for rot in rotations: if rot[2] == i and rot[0] == s: row.cell(str(rot[1]), align="CENTER") break else: row.cell() def generate(): pdf = PDF(orientation="landscape", format="a4") pdf.set_font("helvetica", size=6) pdf.set_title("colloscope mp2i semestre 5/2") pdf.set_author("projet colloscope") 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.output("test.pdf") if __name__ == "__main__": generate()