ajout d'un détecteur de collisions

This commit is contained in:
joseph 2024-03-30 15:14:22 +01:00
parent db5f6e318a
commit 78675c72c2
1 changed files with 106 additions and 0 deletions

106
check_collisions.py Normal file
View File

@ -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()