From efed1d095df0c8260230f70315c1a7ea6729ae08 Mon Sep 17 00:00:00 2001 From: Thomas Thron Date: Tue, 17 Feb 2026 02:04:19 +0100 Subject: [PATCH 1/8] calendar_handler: add field strings_in_summary_excluded --- src/chronos/calendar_handler.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/chronos/calendar_handler.py b/src/chronos/calendar_handler.py index 3c4f027..3543482 100644 --- a/src/chronos/calendar_handler.py +++ b/src/chronos/calendar_handler.py @@ -54,6 +54,7 @@ def __init__(self, app_config: Config): self.default_location = None self.tags_excluded = [] + self.strings_in_summary_excluded = [] self.sanitize = {"stati": True, "source_icons": True, "target_icons": True} From 9da5494467de72ae31a60f7da8e3cfaa389e4432 Mon Sep 17 00:00:00 2001 From: Thomas Thron Date: Tue, 17 Feb 2026 02:05:14 +0100 Subject: [PATCH 2/8] chronos_event.populate_from_vcal_object: change return type to bool --- src/chronos/chronos_event.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/chronos/chronos_event.py b/src/chronos/chronos_event.py index 82cb85d..e4716e3 100644 --- a/src/chronos/chronos_event.py +++ b/src/chronos/chronos_event.py @@ -260,13 +260,13 @@ def key(self): return self.source_uid.encode("utf-8") return f"{self.uid}".encode("utf-8") - def populate_from_vcal_object(self) -> None: + def populate_from_vcal_object(self) -> bool: # TODO: ensure UID exists (at least it should ) try: self.uid = str(self.ical.get("uid")) if self.is_confidential or self.is_excluded: logger.info(f"Skipping further ical parsing on confidential or excluded event: {self.uid} | Source: {self.source.cal_name}") - return + return False raw_dtstamp = self.ical.get("dtstamp") raw_dtstart = self.ical.get("dtstart") @@ -284,6 +284,8 @@ def populate_from_vcal_object(self) -> None: logger.error(f"Could not process Event UID: {self.uid} | Source: {self.source.cal_name} | Reason: - {ex}") raise ex + return True + def _get_ical_start_date(self) -> dt.date: _date = self.ical.get("dtstart").dt if isinstance(_date, dt.datetime): From f50bd59f2b7af6f5d47f121859e818c91d804cd5 Mon Sep 17 00:00:00 2001 From: Thomas Thron Date: Tue, 17 Feb 2026 02:06:02 +0100 Subject: [PATCH 3/8] chronos_event: small refactor --- src/chronos/chronos_event.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/chronos/chronos_event.py b/src/chronos/chronos_event.py index e4716e3..cf1a24f 100644 --- a/src/chronos/chronos_event.py +++ b/src/chronos/chronos_event.py @@ -185,9 +185,9 @@ def is_confidential(self) -> bool: @property def is_excluded(self) -> bool: - setEventCats = set(map(lambda x: x.lower(), self.categories)) - setExclude = set(map(lambda x: x.lower(), self.source.tags_excluded)) - do_exclude = not (setExclude.isdisjoint(setEventCats)) + set_of_event_categories = set(map(lambda x: x.lower(), self.categories)) + set_of_excluded_tags = set(map(lambda x: x.lower(), self.source.tags_excluded)) + do_exclude = not (set_of_excluded_tags.isdisjoint(set_of_event_categories)) return do_exclude @property From 6f8683e2a4f8435555475ba60d0e3c45cfb7d236 Mon Sep 17 00:00:00 2001 From: Thomas Thron Date: Tue, 17 Feb 2026 02:06:33 +0100 Subject: [PATCH 4/8] chronos_event.is_excluded: use strings_in_summary_excluded also --- src/chronos/chronos_event.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/chronos/chronos_event.py b/src/chronos/chronos_event.py index cf1a24f..78b00c3 100644 --- a/src/chronos/chronos_event.py +++ b/src/chronos/chronos_event.py @@ -187,7 +187,14 @@ def is_confidential(self) -> bool: def is_excluded(self) -> bool: set_of_event_categories = set(map(lambda x: x.lower(), self.categories)) set_of_excluded_tags = set(map(lambda x: x.lower(), self.source.tags_excluded)) - do_exclude = not (set_of_excluded_tags.isdisjoint(set_of_event_categories)) + do_exclude_by_tag = not (set_of_excluded_tags.isdisjoint(set_of_event_categories)) + + do_exclude_by_string_in_summary = False + for the_string in self.source.strings_in_summary_excluded: + if the_string.lower() in self.title.lower(): + do_exclude_by_string_in_summary = True + + do_exclude = do_exclude_by_tag or do_exclude_by_string_in_summary return do_exclude @property From c3799066aef5c7fbd45bde395aa105cd8d306d7e Mon Sep 17 00:00:00 2001 From: Thomas Thron Date: Tue, 17 Feb 2026 02:11:01 +0100 Subject: [PATCH 5/8] calendar_handler: log info if event is excluded or confidential --- src/chronos/calendar_handler.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/chronos/calendar_handler.py b/src/chronos/calendar_handler.py index 3543482..caa1d85 100644 --- a/src/chronos/calendar_handler.py +++ b/src/chronos/calendar_handler.py @@ -137,6 +137,7 @@ def read_ics_from_url(self): # Only handle public events and those not containing exclude tags is_viable_event = not new_chronos_event.is_confidential and not new_chronos_event.is_excluded and not new_chronos_event.date_out_of_range if not is_viable_event: + logger.info(f"Skipping further ical parsing on confidential or excluded event: {new_chronos_event.uid} | Source: {self.cal_name}") continue new_chronos_event.populate_from_vcal_object() @@ -277,8 +278,11 @@ def read_event(self, calEvent: caldav.Event) -> None: # Only handle public events and those not conataining exclude tags if not chronos_event.is_confidential and not chronos_event.is_excluded and not chronos_event.date_out_of_range: - chronos_event.populate_from_vcal_object() - self.events_data[chronos_event.key] = chronos_event + logger.info(f"Skipping further ical parsing on confidential or excluded event: {chronos_event.uid} | Source: {self.cal_name}") + continue + + chronos_event.populate_from_vcal_object() + self.events_data[chronos_event.key] = chronos_event def search_events_by_tags(self, tags: list) -> dict: """search read events created by chronos with given tags From c409f3f81b71eb47838b514e6f3deee2d435360a Mon Sep 17 00:00:00 2001 From: Thomas Thron Date: Tue, 17 Feb 2026 02:11:08 +0100 Subject: [PATCH 6/8] Revert "chronos_event.populate_from_vcal_object: change return type to bool" This reverts commit 9da5494467de72ae31a60f7da8e3cfaa389e4432. --- src/chronos/chronos_event.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/chronos/chronos_event.py b/src/chronos/chronos_event.py index 78b00c3..6b8d445 100644 --- a/src/chronos/chronos_event.py +++ b/src/chronos/chronos_event.py @@ -267,13 +267,13 @@ def key(self): return self.source_uid.encode("utf-8") return f"{self.uid}".encode("utf-8") - def populate_from_vcal_object(self) -> bool: + def populate_from_vcal_object(self) -> None: # TODO: ensure UID exists (at least it should ) try: self.uid = str(self.ical.get("uid")) if self.is_confidential or self.is_excluded: logger.info(f"Skipping further ical parsing on confidential or excluded event: {self.uid} | Source: {self.source.cal_name}") - return False + return raw_dtstamp = self.ical.get("dtstamp") raw_dtstart = self.ical.get("dtstart") @@ -291,8 +291,6 @@ def populate_from_vcal_object(self) -> bool: logger.error(f"Could not process Event UID: {self.uid} | Source: {self.source.cal_name} | Reason: - {ex}") raise ex - return True - def _get_ical_start_date(self) -> dt.date: _date = self.ical.get("dtstart").dt if isinstance(_date, dt.datetime): From e7451cdad21d331faf2e3600246da4359390a57f Mon Sep 17 00:00:00 2001 From: Thomas Thron Date: Tue, 17 Feb 2026 02:15:18 +0100 Subject: [PATCH 7/8] calendar_handler: turn around logic --- src/chronos/calendar_handler.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/chronos/calendar_handler.py b/src/chronos/calendar_handler.py index caa1d85..a5d7ca5 100644 --- a/src/chronos/calendar_handler.py +++ b/src/chronos/calendar_handler.py @@ -135,8 +135,8 @@ def read_ics_from_url(self): new_chronos_event._ics_event = event.copy() # Only handle public events and those not containing exclude tags - is_viable_event = not new_chronos_event.is_confidential and not new_chronos_event.is_excluded and not new_chronos_event.date_out_of_range - if not is_viable_event: + is_invalid_event = new_chronos_event.is_confidential or new_chronos_event.is_excluded or new_chronos_event.date_out_of_range + if is_invalid_event: logger.info(f"Skipping further ical parsing on confidential or excluded event: {new_chronos_event.uid} | Source: {self.cal_name}") continue @@ -277,7 +277,8 @@ def read_event(self, calEvent: caldav.Event) -> None: chronos_event.calDAV = calEvent # Only handle public events and those not conataining exclude tags - if not chronos_event.is_confidential and not chronos_event.is_excluded and not chronos_event.date_out_of_range: + is_invalid_event = chronos_event.is_confidential or chronos_event.is_excluded or chronos_event.date_out_of_range + if is_invalid_event: logger.info(f"Skipping further ical parsing on confidential or excluded event: {chronos_event.uid} | Source: {self.cal_name}") continue From c941c99fe4b57f8e90638d47533a43aa92fc89bf Mon Sep 17 00:00:00 2001 From: Thomas Thron Date: Tue, 17 Feb 2026 10:03:03 +0100 Subject: [PATCH 8/8] rename new field to exclude_event_by_strings_in_summary --- src/chronos/calendar_handler.py | 2 +- src/chronos/chronos_event.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chronos/calendar_handler.py b/src/chronos/calendar_handler.py index a5d7ca5..4455104 100644 --- a/src/chronos/calendar_handler.py +++ b/src/chronos/calendar_handler.py @@ -54,7 +54,7 @@ def __init__(self, app_config: Config): self.default_location = None self.tags_excluded = [] - self.strings_in_summary_excluded = [] + self.exclude_event_by_strings_in_summary = [] self.sanitize = {"stati": True, "source_icons": True, "target_icons": True} diff --git a/src/chronos/chronos_event.py b/src/chronos/chronos_event.py index 6b8d445..5ca3aa8 100644 --- a/src/chronos/chronos_event.py +++ b/src/chronos/chronos_event.py @@ -190,7 +190,7 @@ def is_excluded(self) -> bool: do_exclude_by_tag = not (set_of_excluded_tags.isdisjoint(set_of_event_categories)) do_exclude_by_string_in_summary = False - for the_string in self.source.strings_in_summary_excluded: + for the_string in self.source.exclude_event_by_strings_in_summary: if the_string.lower() in self.title.lower(): do_exclude_by_string_in_summary = True