55# -------------------------------------------------------------------------
66from datetime import datetime , timedelta
77from typing import Optional
8- from ._models import RecurrencePatternType , RecurrenceRangeType , TimeWindowFilterSettings , OccurrenceInfo
8+ from ._models import RecurrencePatternType , RecurrenceRangeType , TimeWindowFilterSettings , OccurrenceInfo , Recurrence
99from ._recurrence_validator import validate_settings , _get_passed_week_days , _sort_days_of_week
1010
1111DAYS_PER_WEEK = 7
12+ REQUIRED_PARAMETER = "Required parameter: %s"
1213
1314
1415def is_match (settings : TimeWindowFilterSettings , now : datetime ) -> bool :
@@ -20,30 +21,38 @@ def is_match(settings: TimeWindowFilterSettings, now: datetime) -> bool:
2021 :return: True if the current time is within the time window filter settings, otherwise False.
2122 :rtype: bool
2223 """
23- validate_settings (settings )
24+ recurrence = settings .recurrence
25+ if recurrence is None :
26+ raise ValueError (REQUIRED_PARAMETER % "Recurrence" )
2427
25- previous_occurrence = _get_previous_occurrence (settings , now )
28+ start = settings .start
29+ end = settings .end
30+ if start is None or end is None :
31+ raise ValueError (REQUIRED_PARAMETER % "Start or End" )
32+
33+ validate_settings (recurrence , start , end )
34+
35+ previous_occurrence = _get_previous_occurrence (recurrence , start , now )
2636 if previous_occurrence is None :
2737 return False
2838
29- occurrence_end_date = previous_occurrence + (settings . end - settings . start )
39+ occurrence_end_date = previous_occurrence + (end - start )
3040 return now < occurrence_end_date
3141
3242
33- def _get_previous_occurrence (settings : TimeWindowFilterSettings , now : datetime ) -> Optional [datetime ]:
34- start = settings .start
43+ def _get_previous_occurrence (recurrence : Recurrence , start : datetime , now : datetime ) -> Optional [datetime ]:
3544 if now < start :
3645 return None
3746
38- pattern_type = settings . recurrence .pattern .type
47+ pattern_type = recurrence .pattern .type
3948 if pattern_type == RecurrencePatternType .DAILY :
40- occurrence_info = _get_daily_previous_occurrence (settings , now )
49+ occurrence_info = _get_daily_previous_occurrence (recurrence , start , now )
4150 elif pattern_type == RecurrencePatternType .WEEKLY :
42- occurrence_info = _get_weekly_previous_occurrence (settings , now )
51+ occurrence_info = _get_weekly_previous_occurrence (recurrence , start , now )
4352 else :
4453 raise ValueError (f"Invalid recurrence pattern type: { pattern_type } " )
4554
46- recurrence_range = settings . recurrence .range
55+ recurrence_range = recurrence .range
4756 range_type = recurrence_range .type
4857 previous_occurrence = occurrence_info .previous_occurrence
4958 end_date = recurrence_range .end_date
@@ -64,18 +73,16 @@ def _get_previous_occurrence(settings: TimeWindowFilterSettings, now: datetime)
6473 return occurrence_info .previous_occurrence
6574
6675
67- def _get_daily_previous_occurrence (settings : TimeWindowFilterSettings , now : datetime ) -> OccurrenceInfo :
68- start = settings .start
69- interval = settings .recurrence .pattern .interval
76+ def _get_daily_previous_occurrence (recurrence : Recurrence , start : datetime , now : datetime ) -> OccurrenceInfo :
77+ interval = recurrence .pattern .interval
7078 num_of_occurrences = (now - start ).days // interval
7179 previous_occurrence = start + timedelta (days = num_of_occurrences * interval )
7280 return OccurrenceInfo (previous_occurrence , num_of_occurrences + 1 )
7381
7482
75- def _get_weekly_previous_occurrence (settings : TimeWindowFilterSettings , now : datetime ) -> OccurrenceInfo :
76- pattern = settings . recurrence .pattern
83+ def _get_weekly_previous_occurrence (recurrence : Recurrence , start : datetime , now : datetime ) -> OccurrenceInfo :
84+ pattern = recurrence .pattern
7785 interval = pattern .interval
78- start = settings .start
7986 first_day_of_first_week = start - timedelta (days = _get_passed_week_days (start .weekday (), pattern .first_day_of_week ))
8087
8188 number_of_interval = (now - first_day_of_first_week ).days // (interval * DAYS_PER_WEEK )
0 commit comments