From 1367953339c68995b19b2d8576781bc3abfa8d59 Mon Sep 17 00:00:00 2001
From: David Trattnig <david.trattnig@o94.at>
Date: Wed, 10 Jun 2020 09:53:55 +0200
Subject: [PATCH] Delete schedules out of the scheduling window only

---
 modules/scheduling/calendar.py | 37 ++++++++++++++++++++++------------
 1 file changed, 24 insertions(+), 13 deletions(-)

diff --git a/modules/scheduling/calendar.py b/modules/scheduling/calendar.py
index da666066..52b99277 100644
--- a/modules/scheduling/calendar.py
+++ b/modules/scheduling/calendar.py
@@ -85,12 +85,15 @@ class AuraCalendarService(threading.Thread):
 
     def run(self):
         """
-        Fetch calendar data and store it in the database
+        Fetch calendar data and store it in the database. Also handles local deletion of remotely
+        deleted schedules.
 
         Returns
             Schedule ([]):  An arrar of retrieved schedules passed via `self.queue`
         """
         result = []
+        now_unix = SimpleUtil.timestamp()
+        scheduling_window_start = self.config.get("scheduling_window_start")
 
         try:
             fetched_schedule_data = self.calendar_fetcher.fetch()
@@ -103,21 +106,29 @@ class AuraCalendarService(threading.Thread):
             
             # Check if existing schedules have been deleted
             local_schedules = Schedule.select_programme(datetime.now())
-
             for local_schedule in local_schedules:
 
-                # Filter the local schedule from the fetched ones
-                existing_schedule = list(filter(lambda new_schedule: \
-                    new_schedule["schedule_id"] == local_schedule.schedule_id, fetched_schedule_data))
-                
-                if existing_schedule:
-                    self.logger.debug("Schedule (schedule_id: %s) is still existing remotely:" % \
-                        (local_schedule.schedule_id))
+                # Only allow deletion of schedules which are before the start of the scheduling window
+                if local_schedule.start_unix > now_unix and (local_schedule.start_unix - scheduling_window_start) > now_unix:
+
+                    # Filter the local schedule from the fetched ones
+                    existing_schedule = list(filter(lambda new_schedule: \
+                        new_schedule["schedule_id"] == local_schedule.schedule_id, fetched_schedule_data))
+                    
+                    if existing_schedule:
+                        # self.logger.debug("Schedule #%s is still existing remotely!" % (local_schedule.schedule_id))
+                        pass
+                    else:
+                        self.logger.info("Schedule #%s has been deleted remotely, hence also delete it locally [%s]" % \
+                            (local_schedule.schedule_id, str(local_schedule)))
+                        local_schedule.delete(commit=True)
+                        self.logger.info("Deleted local schedule #%s from database" % local_schedule.schedule_id)
+
                 else:
-                    self.logger.info("Schedule (schedule_id: %s) has been deleted remotely! [%s]" % \
-                        (local_schedule.schedule_id, str(local_schedule)))
-                    local_schedule.delete(commit=True)
-                    self.logger.info("Deleted local schedule from database (schedule_id: %s)" % local_schedule.schedule_id)
+                    msg = "Schedule #%s has been deleted remotely. Since the scheduling window already started, it won't be deleted locally." % local_schedule.schedule_id
+                    self.logger.warn(SimpleUtil.red(msg))
+
+                
 
 
             # Process fetched schedules    
-- 
GitLab