ajout d'un détecteur de collisions
This commit is contained in:
parent
db5f6e318a
commit
78675c72c2
|
@ -0,0 +1,106 @@
|
||||||
|
"""
|
||||||
|
Objectif: déterminer les collisions dans un fichier .ics généré, afin de pouvoir
|
||||||
|
'valider' un colloscope. Pour cela, ce programme génère les colloscopes associés
|
||||||
|
à chaque groupe de colle puis regarde s'il y a collision entre les évènements
|
||||||
|
en faisant partie.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from typing import List
|
||||||
|
|
||||||
|
from attr import dataclass
|
||||||
|
import icalendar
|
||||||
|
import datetime
|
||||||
|
from dateutil import rrule # https://dateutil.readthedocs.io/en/stable/rrule.html
|
||||||
|
import recurring_ical_events
|
||||||
|
from io import BytesIO
|
||||||
|
|
||||||
|
import create_calendar
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class DatesEvent:
|
||||||
|
nom: str
|
||||||
|
start: datetime.date
|
||||||
|
end: datetime.date
|
||||||
|
|
||||||
|
|
||||||
|
def recurring_events_to_events(cal: icalendar.Calendar) -> DatesEvent:
|
||||||
|
at_date = 2024
|
||||||
|
events = recurring_ical_events.of(cal).at(at_date)
|
||||||
|
return events
|
||||||
|
|
||||||
|
def ical_to_dates(events: List[icalendar.Event]) -> DatesEvent:
|
||||||
|
"""
|
||||||
|
Renvoie la liste de dates et de durées de l'ensemble des évènements (SANS EVENEMENTS RECURSIFS, ecurring_events_to_events s'en étant déjà occupé !)
|
||||||
|
"""
|
||||||
|
output = []
|
||||||
|
|
||||||
|
for event in events:
|
||||||
|
if not event.get("RRULE"):
|
||||||
|
new_event = DatesEvent(
|
||||||
|
nom=str(event.get("SUMMARY")) + " - " + str(event.get("DESCRIPTION")),
|
||||||
|
start=event.get("DTSTART").dt,
|
||||||
|
end=event.get("DTEND").dt
|
||||||
|
)
|
||||||
|
|
||||||
|
output.append(new_event)
|
||||||
|
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
def check_dates_collision(start1: datetime.date, start2: datetime.date, end1: datetime.timedelta, end2: datetime.timedelta):
|
||||||
|
if start1 <= start2:
|
||||||
|
if start2 < end1:
|
||||||
|
return True
|
||||||
|
elif start1 <= start2:
|
||||||
|
# cas où dt1 commence après dt2 mais avant dt2+td2
|
||||||
|
if end2 > end2:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
def check_collisions(dates: DatesEvent):
|
||||||
|
"""
|
||||||
|
Fonction qui réalise réellement le check.
|
||||||
|
Itère brutalement sur toutes les dates, par souci d'efficacité d'écriture de code,
|
||||||
|
et surtout parce que ça marche !
|
||||||
|
"""
|
||||||
|
for date_event1 in dates:
|
||||||
|
for date_event2 in dates:
|
||||||
|
if date_event1.nom != date_event2.nom:
|
||||||
|
if check_dates_collision(date_event1.start, date_event2.start, date_event1.end, date_event2.end):
|
||||||
|
print(
|
||||||
|
f"""
|
||||||
|
----
|
||||||
|
Colision entre {date_event1.nom} et {date_event2.nom}
|
||||||
|
{date_event1.nom}: {date_event1.start.strftime('%d-%m-%Y: %H:%M')} à {date_event1.end.strftime('%d-%m-%Y: %H:%M')}
|
||||||
|
{date_event2.nom}: {date_event2.start.strftime('%d-%m-%Y: %H:%M')} à {date_event2.end.strftime('%d-%m-%Y: %H:%M')}""")
|
||||||
|
|
||||||
|
|
||||||
|
def generate_calendars():
|
||||||
|
for groupe in range(1, 16):
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"""
|
||||||
|
┌──────────────────────────
|
||||||
|
│
|
||||||
|
│ GROUPE {groupe}
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
generated_ical = create_calendar.get_calendar(str(groupe), "EN")[0]
|
||||||
|
|
||||||
|
generated_ical = icalendar.Calendar.from_ical(generated_ical)
|
||||||
|
|
||||||
|
|
||||||
|
events = list(generated_ical.walk("VEVENT"))
|
||||||
|
events += recurring_events_to_events(generated_ical)
|
||||||
|
|
||||||
|
check_collisions(ical_to_dates(events))
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"""
|
||||||
|
│
|
||||||
|
└──────────────────────────
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
generate_calendars()
|
Loading…
Reference in New Issue