from datetime import date, timedelta from fpdf import FPDF from fpdf.fonts import FontFace from fpdf.enums import TableCellFillMode sem_1 = date(2023, 9, 18) vacances_zoneA = [ ( 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, vac): jour = sem_1 + (n-1) * timedelta(weeks=1) for (debut, fin) in vac: if jour >= debut: jour += 2*timedelta(weeks=1) return jour def generate(): pdf = FPDF(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") 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), ] 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) with pdf.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 pdf.set_y(base_y) with pdf.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, vacances_zoneA).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() pdf.output("test.pdf") if __name__ == "__main__": generate()