From f9f4d312fcf0d4f91fc8ac0a167fc47d2ec57700 Mon Sep 17 00:00:00 2001
From: marcantoinem <marc-antoine.m@outlook.com>
Date: Sun, 25 Aug 2024 22:55:31 -0400
Subject: [PATCH] Fix agenda compatibility by ditching reccurence as their
 implementation is dodgy most of the time

---
 aep-schedule-generator/src/bin/ics.rs         |   2 +-
 aep-schedule-generator/src/icalendar/dates.rs |  58 ++--
 aep-schedule-generator/test.ics               | 293 ++++++++++++++++++
 3 files changed, 314 insertions(+), 39 deletions(-)
 create mode 100644 aep-schedule-generator/test.ics

diff --git a/aep-schedule-generator/src/bin/ics.rs b/aep-schedule-generator/src/bin/ics.rs
index 07580c1..54f27e7 100644
--- a/aep-schedule-generator/src/bin/ics.rs
+++ b/aep-schedule-generator/src/bin/ics.rs
@@ -9,7 +9,7 @@ fn main() {
     let horsage = BufReader::new(File::open("horsage.csv").unwrap());
     let fermes = BufReader::new(File::open("fermes.csv").unwrap());
     let courses = Courses::from_csv(horsage, fermes);
-    let courses_to_take = vec!["INF2705", "LOG2990", "MTH2302D", "SSH3201", "SSH3501D"];
+    let courses_to_take = vec!["INF2705"];
     let mut courses_to_take: Vec<Course> = courses_to_take
         .into_iter()
         .map(|sigle| courses.get_course(sigle).unwrap())
diff --git a/aep-schedule-generator/src/icalendar/dates.rs b/aep-schedule-generator/src/icalendar/dates.rs
index f117495..f185326 100644
--- a/aep-schedule-generator/src/icalendar/dates.rs
+++ b/aep-schedule-generator/src/icalendar/dates.rs
@@ -1,4 +1,4 @@
-use chrono::{NaiveDate, NaiveDateTime};
+use chrono::NaiveDate;
 use icalendar::{Calendar, Component, Event, EventLike};
 use serde::{Deserialize, Serialize};
 
@@ -31,48 +31,31 @@ impl Dates {
         };
 
         let mut main = Event::new();
-
         main.summary(&format!("{} {}", labo, course.sigle))
             .description(p.room.as_str())
             .location(p.room.as_str());
 
         match self {
             Dates::Week(all_dates) => {
-                let session_start = all_dates[0];
-                let start = session_start
-                    .and_hms_opt(
-                        p.hours.starting_hour() as u32,
-                        p.hours.start_minutes() as u32,
-                        0,
-                    )
-                    .unwrap();
-                let end = session_start
-                    .and_hms_opt(p.hours.last_hour() as u32, p.hours.last_minutes() as u32, 0)
-                    .unwrap();
-
-                main.starts(start).ends(end);
+                for date in all_dates {
+                    let mut event = main.clone();
+                    let start = date
+                        .and_hms_opt(
+                            p.hours.starting_hour() as u32,
+                            p.hours.start_minutes() as u32,
+                            0,
+                        )
+                        .unwrap();
+                    let end = date
+                        .and_hms_opt(p.hours.last_hour() as u32, p.hours.last_minutes() as u32, 0)
+                        .unwrap();
 
-                if all_dates.len() > 1 {
-                    let start_dates: Vec<NaiveDateTime> = all_dates
-                        .into_iter()
-                        .map(|d| {
-                            d.and_hms_opt(
-                                p.hours.starting_hour() as u32,
-                                p.hours.start_minutes() as u32,
-                                0,
-                            )
-                            .unwrap()
-                        })
-                        .collect();
-
-                    let mut rdate = start_dates[0].format(NAIVE_DATE_TIME_FORMAT).to_string();
-                    for date in start_dates[1..].iter() {
-                        let date = date.format(NAIVE_DATE_TIME_FORMAT);
-                        rdate.push(',');
-                        rdate.push_str(&date.to_string());
-                    }
-
-                    main.add_property("RDATE", &rdate);
+                    event
+                        .starts(start)
+                        .ends(end)
+                        .add_property("CATEGORIES", &course.sigle)
+                        .add_property("RELATED-TO", &course.sigle);
+                    cal.push(event.done());
                 }
             }
             Dates::Weekend {
@@ -100,9 +83,8 @@ impl Dates {
                 let rrule = format!("FREQ=WEEKLY;UNTIL={}", last);
 
                 main.starts(start).ends(end).add_property("RRULE", &rrule);
+                cal.push(main.done());
             }
         }
-
-        cal.push(main.done());
     }
 }
diff --git a/aep-schedule-generator/test.ics b/aep-schedule-generator/test.ics
new file mode 100644
index 0000000..96812c4
--- /dev/null
+++ b/aep-schedule-generator/test.ics
@@ -0,0 +1,293 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:ICALENDAR-RS
+CALSCALE:GREGORIAN
+NAME:horaire
+X-WR-CALNAME:horaire
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-1710
+DTEND:20240827T113000
+DTSTART:20240827T083000
+LOCATION:L-1710
+RELATED-TO:INF2705
+SUMMARY:Théorie INF2705
+UID:da8ab001-8a1b-4cb0-9d87-0e9770636ec3
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-1710
+DTEND:20240903T113000
+DTSTART:20240903T083000
+LOCATION:L-1710
+RELATED-TO:INF2705
+SUMMARY:Théorie INF2705
+UID:801e67ee-7a32-4a50-a406-1da91556d624
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-1710
+DTEND:20240910T113000
+DTSTART:20240910T083000
+LOCATION:L-1710
+RELATED-TO:INF2705
+SUMMARY:Théorie INF2705
+UID:3c8d4fec-75e3-4610-a935-8720c117ac47
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-1710
+DTEND:20240917T113000
+DTSTART:20240917T083000
+LOCATION:L-1710
+RELATED-TO:INF2705
+SUMMARY:Théorie INF2705
+UID:5a9dd7d9-c8e6-43a0-aa33-29410b93b4ae
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-1710
+DTEND:20240924T113000
+DTSTART:20240924T083000
+LOCATION:L-1710
+RELATED-TO:INF2705
+SUMMARY:Théorie INF2705
+UID:3a86c023-6501-4125-b8f4-9b609ccc0223
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-1710
+DTEND:20241008T113000
+DTSTART:20241008T083000
+LOCATION:L-1710
+RELATED-TO:INF2705
+SUMMARY:Théorie INF2705
+UID:fcca977d-fc64-4f32-9089-220b90413c76
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-1710
+DTEND:20241022T113000
+DTSTART:20241022T083000
+LOCATION:L-1710
+RELATED-TO:INF2705
+SUMMARY:Théorie INF2705
+UID:de91a14d-61db-4699-8b20-c92a99a8375d
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-1710
+DTEND:20241029T113000
+DTSTART:20241029T083000
+LOCATION:L-1710
+RELATED-TO:INF2705
+SUMMARY:Théorie INF2705
+UID:c0655929-b204-4150-83f6-aff8cfe7cf7a
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-1710
+DTEND:20241105T113000
+DTSTART:20241105T083000
+LOCATION:L-1710
+RELATED-TO:INF2705
+SUMMARY:Théorie INF2705
+UID:cde12b7f-36ce-43a4-82cf-bdf04d219dc5
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-1710
+DTEND:20241112T113000
+DTSTART:20241112T083000
+LOCATION:L-1710
+RELATED-TO:INF2705
+SUMMARY:Théorie INF2705
+UID:8d04f033-f312-4a16-b8e2-868b3b4b528f
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-1710
+DTEND:20241119T113000
+DTSTART:20241119T083000
+LOCATION:L-1710
+RELATED-TO:INF2705
+SUMMARY:Théorie INF2705
+UID:e8102526-5117-4df5-b397-f650c8ecb262
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-1710
+DTEND:20241126T113000
+DTSTART:20241126T083000
+LOCATION:L-1710
+RELATED-TO:INF2705
+SUMMARY:Théorie INF2705
+UID:1fce4ddc-d04b-428d-b355-79de2c322d75
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-1710
+DTEND:20241203T113000
+DTSTART:20241203T083000
+LOCATION:L-1710
+RELATED-TO:INF2705
+SUMMARY:Théorie INF2705
+UID:a99f1356-5ac5-425d-9e81-934520ff0eeb
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-4712
+DTEND:20240829T164500
+DTSTART:20240829T134500
+LOCATION:L-4712
+RELATED-TO:INF2705
+SUMMARY:Laboratoire INF2705
+UID:e844b88e-e135-402c-9595-2e38a49e12b6
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-4712
+DTEND:20240905T164500
+DTSTART:20240905T134500
+LOCATION:L-4712
+RELATED-TO:INF2705
+SUMMARY:Laboratoire INF2705
+UID:8188fb8d-ba5a-4670-a1e7-783cd1dc7088
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-4712
+DTEND:20240912T164500
+DTSTART:20240912T134500
+LOCATION:L-4712
+RELATED-TO:INF2705
+SUMMARY:Laboratoire INF2705
+UID:db8e97ad-fe96-458a-bd3c-6fc2293ef51c
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-4712
+DTEND:20240919T164500
+DTSTART:20240919T134500
+LOCATION:L-4712
+RELATED-TO:INF2705
+SUMMARY:Laboratoire INF2705
+UID:8088c939-fed4-47fe-aa7c-0a9c94b2af3d
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-4712
+DTEND:20240926T164500
+DTSTART:20240926T134500
+LOCATION:L-4712
+RELATED-TO:INF2705
+SUMMARY:Laboratoire INF2705
+UID:4d2eb3f8-8a20-4c2c-b9c6-1719340eff9e
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-4712
+DTEND:20241003T164500
+DTSTART:20241003T134500
+LOCATION:L-4712
+RELATED-TO:INF2705
+SUMMARY:Laboratoire INF2705
+UID:315fdc8e-fda2-432b-bbfc-113b7c9bd047
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-4712
+DTEND:20241010T164500
+DTSTART:20241010T134500
+LOCATION:L-4712
+RELATED-TO:INF2705
+SUMMARY:Laboratoire INF2705
+UID:af72bdc5-aff4-4a58-a8e7-90cfffc5a45e
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-4712
+DTEND:20241024T164500
+DTSTART:20241024T134500
+LOCATION:L-4712
+RELATED-TO:INF2705
+SUMMARY:Laboratoire INF2705
+UID:eec8c638-fbf2-4003-b1cd-2d73c7ea2376
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-4712
+DTEND:20241031T164500
+DTSTART:20241031T134500
+LOCATION:L-4712
+RELATED-TO:INF2705
+SUMMARY:Laboratoire INF2705
+UID:00659c44-be66-4560-aaf9-4652f8506e98
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-4712
+DTEND:20241107T164500
+DTSTART:20241107T134500
+LOCATION:L-4712
+RELATED-TO:INF2705
+SUMMARY:Laboratoire INF2705
+UID:07cfe40b-9970-407d-8220-2b6037d44bcf
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-4712
+DTEND:20241114T164500
+DTSTART:20241114T134500
+LOCATION:L-4712
+RELATED-TO:INF2705
+SUMMARY:Laboratoire INF2705
+UID:c488af8e-e2da-4fbf-b798-28346306cdf8
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-4712
+DTEND:20241121T164500
+DTSTART:20241121T134500
+LOCATION:L-4712
+RELATED-TO:INF2705
+SUMMARY:Laboratoire INF2705
+UID:cca84986-085f-4570-aaef-1772d91d9c5f
+END:VEVENT
+BEGIN:VEVENT
+DTSTAMP:20240826T025202Z
+CATEGORIES:INF2705
+DESCRIPTION:L-4712
+DTEND:20241128T164500
+DTSTART:20241128T134500
+LOCATION:L-4712
+RELATED-TO:INF2705
+SUMMARY:Laboratoire INF2705
+UID:cc64cebb-21c7-46f3-8974-33c10f318952
+END:VEVENT
+END:VCALENDAR
-- 
GitLab