Compare commits
18 Commits
1df7753a66
...
d29d921222
Author | SHA1 | Date |
---|---|---|
|
d29d921222 | |
|
d230ed34bb | |
|
8105504980 | |
|
5c6a2f6105 | |
|
26555311f7 | |
|
bde601dd1a | |
|
f55af9e723 | |
|
adb15cabf7 | |
|
c2970d5867 | |
|
cf8ff838e9 | |
|
5664726fca | |
|
4e7e7348c3 | |
|
e8a68c54ab | |
|
1fe0b38af7 | |
|
f22f587542 | |
|
1b9dad1f9e | |
|
87e08f2b82 | |
|
46db162a26 |
|
@ -15,11 +15,10 @@ from discord import Webhook
|
||||||
|
|
||||||
calendar = {
|
calendar = {
|
||||||
"C": [
|
"C": [
|
||||||
(date(2023, 10, 21), date(2023, 11, 6)),
|
(date(2024, 10, 19), date(2024, 11, 4)),
|
||||||
(date(2023, 12, 23), date(2024, 1, 8)),
|
(date(2024, 12, 21), date(2025, 1, 6)),
|
||||||
(date(2024, 2, 10), date(2024, 2, 26)),
|
(date(2025, 2, 15), date(2025, 3, 3)),
|
||||||
(date(2024, 4, 6), date(2024, 4, 22)),
|
(date(2025, 4, 12), date(2025, 4, 28)),
|
||||||
(date(2024, 5, 6), date(2024, 5, 11)), # pont un peu gratté
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -213,7 +212,7 @@ class Group(models.Model):
|
||||||
members = models.ManyToManyField("Student", through="Member")
|
members = models.ManyToManyField("Student", through="Member")
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.description
|
return f"{self.description} ({self.type})"
|
||||||
|
|
||||||
"""def get_colles(self):
|
"""def get_colles(self):
|
||||||
return Rotation.objects.filter(slot__term=self.term,
|
return Rotation.objects.filter(slot__term=self.term,
|
||||||
|
@ -271,6 +270,9 @@ class Member(models.Model):
|
||||||
student = models.ForeignKey(Student, on_delete=models.CASCADE)
|
student = models.ForeignKey(Student, on_delete=models.CASCADE)
|
||||||
group = models.ForeignKey(Group, on_delete=models.CASCADE)
|
group = models.ForeignKey(Group, on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.student} of {self.group}"
|
||||||
|
|
||||||
|
|
||||||
class Colleur(models.Model):
|
class Colleur(models.Model):
|
||||||
gender = models.CharField(max_length=1)
|
gender = models.CharField(max_length=1)
|
||||||
|
|
|
@ -26,7 +26,7 @@ class PDF(FPDF):
|
||||||
row.cell(etu.last_name.upper()) # Nom
|
row.cell(etu.last_name.upper()) # Nom
|
||||||
row.cell(etu.first_name) # Prénom
|
row.cell(etu.first_name) # Prénom
|
||||||
row.cell(etu.colle_group(term).description) # Groupe
|
row.cell(etu.colle_group(term).description) # Groupe
|
||||||
row.cell(etu.group_of_type(term, "td").description)
|
#row.cell(etu.group_of_type(term, "td").description)
|
||||||
#row.cell("??") # LV1
|
#row.cell("??") # LV1
|
||||||
#row.cell("??") # LV2
|
#row.cell("??") # LV2
|
||||||
|
|
||||||
|
@ -39,9 +39,9 @@ class PDF(FPDF):
|
||||||
|
|
||||||
with self.table(
|
with self.table(
|
||||||
align="LEFT",
|
align="LEFT",
|
||||||
width=190,
|
width=270,
|
||||||
line_height=3,
|
line_height=3,
|
||||||
col_widths=(2, 1, 1, 3, 1, *(1,)*len(weeks)),
|
col_widths=(1.2, 1.2, 0.8, 2.4, 1, *(1,)*len(weeks)),
|
||||||
num_heading_rows=2 if heading else 0,
|
num_heading_rows=2 if heading else 0,
|
||||||
first_row_as_headings=heading) as table:
|
first_row_as_headings=heading) as table:
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ class PDF(FPDF):
|
||||||
|
|
||||||
header2 = table.row()
|
header2 = table.row()
|
||||||
for lundi in lundis:
|
for lundi in lundis:
|
||||||
header2.cell(lundi.strftime("%d/%m/%y"), align="CENTER")
|
header2.cell(lundi.strftime("%d/%m"), align="CENTER")
|
||||||
|
|
||||||
|
|
||||||
for i, c in enumerate(slots):
|
for i, c in enumerate(slots):
|
||||||
|
@ -99,7 +99,7 @@ def generate(term):
|
||||||
pdf.set_line_width(0.1)
|
pdf.set_line_width(0.1)
|
||||||
base_y = pdf.t_margin + 10
|
base_y = pdf.t_margin + 10
|
||||||
pdf.set_y(base_y)
|
pdf.set_y(base_y)
|
||||||
pdf.liste_eleves(term)
|
#pdf.liste_eleves(term)
|
||||||
pdf.set_y(base_y)
|
pdf.set_y(base_y)
|
||||||
pdf.table_colloscope(term)
|
pdf.table_colloscope(term)
|
||||||
pdf.y += 3
|
pdf.y += 3
|
||||||
|
|
105
scrape_csv.py
105
scrape_csv.py
|
@ -1,68 +1,91 @@
|
||||||
import csv
|
import csv
|
||||||
from datetime import date, time, timedelta
|
from datetime import date, time, timedelta
|
||||||
from colloscope.models import *
|
from colloscope.models import *
|
||||||
|
from zoneinfo import ZoneInfo
|
||||||
|
tz = ZoneInfo("Europe/Paris")
|
||||||
|
|
||||||
|
def digest_time(h1):
|
||||||
|
a = h1.split("h")
|
||||||
|
return time(hour=int(a[0]), minute=int(a[1]) if a[1] != '' else 0)
|
||||||
|
|
||||||
def scrape(periode, chemin):
|
def scrape(periode, chemin):
|
||||||
with open(chemin, "r") as file:
|
with open(chemin, "r") as file:
|
||||||
reader = csv.reader(file)
|
reader = csv.reader(file)
|
||||||
headers, *colloscope = list(reader)
|
header1, header2, *colloscope = list(reader)
|
||||||
|
|
||||||
for l in colloscope:
|
for l in colloscope:
|
||||||
print(l)
|
print(l)
|
||||||
|
|
||||||
for colleur, matiere, jour, heure, *(rotations) in colloscope:
|
for matiere, infos, *(rotations) in colloscope:
|
||||||
nom_colleur = colleur.lstrip("Mme.").title()
|
if len(infos.split()) == 5:
|
||||||
civilite = "M" if colleur.startswith("M.") else "F"
|
civ1, nom_colleur, j1, h1, salle = infos.split()
|
||||||
|
|
||||||
if not Colleur.objects.filter(nom=nom_colleur, civilite=civilite).exists():
|
|
||||||
c = Colleur(civilite=civilite, nom=nom_colleur)
|
|
||||||
c.save()
|
|
||||||
else:
|
else:
|
||||||
c = Colleur.objects.get(nom=nom_colleur, civilite=civilite)
|
civ1, nom_colleur, j1, h1, *_ = infos.split()
|
||||||
|
salle = "ns"
|
||||||
|
|
||||||
if not Subject.objects.filter(classe=periode.classe, libelle=matiere).exists():
|
civilite = "M" if civ1 == "M." else "F"
|
||||||
m = Subject(classe=periode.classe, libelle=matiere, code=matiere.upper())
|
|
||||||
m.save()
|
|
||||||
else:
|
|
||||||
m = Subject.objects.get(classe=periode.classe, libelle=matiere)
|
|
||||||
|
|
||||||
jours_dict = {"dimanche": 0, "lundi": 1, "mardi": 2, "mercredi": 3, "jeudi": 4, "vendredi": 5, "samedi": 6}
|
#print(civilite, nom_colleur, j1, h1, salle, rotations)
|
||||||
j = jours_dict[jour]
|
|
||||||
|
|
||||||
h = time(int(heure[:-1]), 0)
|
|
||||||
|
|
||||||
if matiere=="InfoTP":
|
colleur_obj, _ = Colleur.objects.get_or_create(
|
||||||
d = timedelta(hours=2)
|
name=nom_colleur,
|
||||||
c2 = 9
|
gender=civilite,
|
||||||
else:
|
)
|
||||||
d = timedelta(hours=1)
|
|
||||||
c2 = 3
|
|
||||||
|
|
||||||
print(f"--> Traitement de {c=}, {m=}, {j=}, {h=}, {d=}, {c2=}")
|
jours_dict = {"di": 0, "lu": 1, "ma": 2, "me": 3, "je": 4, "ve": 5, "sa": 6}
|
||||||
|
|
||||||
if not Slot.objects.filter(periode=periode, jour=j, heure=h, duree=d, matiere=m, colleur=c, est_colle=True, capacite=c2).exists():
|
subject_obj, _ = Subject.objects.get_or_create(
|
||||||
creneau = Slot(periode=periode, jour=j, heure=h, duree=d, salle="nc", matiere=m, colleur=c, est_colle=True, capacite=c2)
|
cls=periode.cls,
|
||||||
creneau.save()
|
description=matiere
|
||||||
else:
|
)
|
||||||
creneau = Slot.objects.get(periode=periode, jour=j, heure=h, duree=d, matiere=m, colleur=c, est_colle=True, capacite=c2)
|
|
||||||
|
|
||||||
for i, r in enumerate(rotations):
|
#print(repr(subject_obj))
|
||||||
sem = headers[4+i].split("/")
|
time_ = digest_time(h1)
|
||||||
sem[2] = "20"+sem[2]
|
|
||||||
sem.reverse()
|
|
||||||
|
|
||||||
s = date.fromisoformat("-".join(sem)) + (j-1) * timedelta(days=1)
|
slot_obj, _ = Slot.objects.get_or_create(
|
||||||
|
term=periode,
|
||||||
|
day=jours_dict[j1],
|
||||||
|
time=time_,
|
||||||
|
duration=timedelta(hours=1),
|
||||||
|
room=salle,
|
||||||
|
subject=subject_obj,
|
||||||
|
colleur=colleur_obj,
|
||||||
|
type=GroupType.objects.get_or_create(term=periode, description="colle")[0],
|
||||||
|
capacity=3
|
||||||
|
)
|
||||||
|
|
||||||
if not Colle.objects.filter(creneau=creneau, date=s):
|
print("----------------")
|
||||||
rot = Colle(creneau=creneau, date=s)
|
print(slot_obj)
|
||||||
rot.save()
|
|
||||||
else:
|
|
||||||
rot = Colle.objects.get(creneau=creneau, date=s)
|
for i, rot in enumerate(rotations):
|
||||||
|
if rot=="":
|
||||||
|
continue
|
||||||
|
groupe, _ = Group.objects.get_or_create(
|
||||||
|
term=periode,type=GroupType.objects.get_or_create(term=periode, description="colle")[0],
|
||||||
|
description=rot
|
||||||
|
)
|
||||||
|
|
||||||
|
date_raw = [int(a) for a in header2[i+2].split("/")]
|
||||||
|
#print(date_raw)
|
||||||
|
date_ = date(2025 if date_raw[1] < 9 else 2024, date_raw[1], date_raw[0]) + timedelta(days=jours_dict[j1] - 1)
|
||||||
|
time_processed = datetime(day=date_.day, month=date_.month, year=date_.year, hour=time_.hour, minute=time_.minute, second=time_.second, tzinfo=tz)
|
||||||
|
#print(time_processed)
|
||||||
|
#print(f"{i}) {rot}, {header2[i+2]}")
|
||||||
|
|
||||||
|
|
||||||
|
colle_obj, _ = Colle.objects.get_or_create(
|
||||||
|
slot = slot_obj,
|
||||||
|
datetime = time_processed
|
||||||
|
)
|
||||||
|
colle_obj.groups.add(groupe)
|
||||||
|
|
||||||
|
print(colle_obj)
|
||||||
|
|
||||||
rot.groupes.add(Group.objects.get(libelle=r))
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
periode = Term.objects.get(id=3)
|
periode = Term.objects.get(id=5)
|
||||||
scrape(periode, "colloscope.csv")
|
scrape(periode, "colloscope.csv")
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
Loading…
Reference in New Issue