colles.mp2i-vms.fr/scrape_csv.py

93 lines
2.8 KiB
Python

import csv
from datetime import date, time, timedelta
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):
with open(chemin, "r") as file:
reader = csv.reader(file)
header1, header2, *colloscope = list(reader)
for l in colloscope:
print(l)
for matiere, infos, *(rotations) in colloscope:
if len(infos.split()) == 5:
civ1, nom_colleur, j1, h1, salle = infos.split()
else:
civ1, nom_colleur, j1, h1, *_ = infos.split()
salle = "ns"
civilite = "M" if civ1 == "M." else "F"
#print(civilite, nom_colleur, j1, h1, salle, rotations)
colleur_obj, _ = Colleur.objects.get_or_create(
name=nom_colleur,
gender=civilite,
)
jours_dict = {"di": 0, "lu": 1, "ma": 2, "me": 3, "je": 4, "ve": 5, "sa": 6}
subject_obj, _ = Subject.objects.get_or_create(
cls=periode.cls,
description=matiere
)
#print(repr(subject_obj))
time_ = digest_time(h1)
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
)
print("----------------")
print(slot_obj)
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)
def main():
periode = Term.objects.get(id=5)
scrape(periode, "colloscope.csv")
if __name__ == "__main__":
main()