55# -------------------------------------------------------------------------
66from datetime import datetime , timedelta
77from typing import List
8- from ._models import RecurrencePatternType , RecurrenceRangeType , Recurrence
8+ from ._models import RecurrencePatternType , RecurrenceRangeType , Recurrence , RecurrencePattern , RecurrenceRange
99
1010
1111DAYS_PER_WEEK = 7
@@ -27,102 +27,90 @@ def validate_settings(recurrence: Recurrence, start: datetime, end: datetime) ->
2727 :param TimeWindowFilterSettings settings: The settings for the time window filter.
2828 :raises ValueError: If the settings are invalid.
2929 """
30- _validate_recurrence_required_parameter (recurrence , start , end )
31- _validate_recurrence_pattern (recurrence , start , end )
32- _validate_recurrence_range (recurrence , start )
33-
34-
35- def _validate_recurrence_required_parameter (recurrence : Recurrence , start : datetime , end : datetime ) -> None :
36- param_name = ""
37- reason = ""
38- if recurrence .pattern is None :
39- param_name = f"{ RECURRENCE_PATTERN } "
40- reason = REQUIRED_PARAMETER
41- if recurrence .range is None :
42- param_name = f"{ RECURRENCE_RANGE } "
43- reason = REQUIRED_PARAMETER
44- if not end > start :
45- param_name = "end"
46- reason = OUT_OF_RANGE
47- if end > start + timedelta (days = TEN_YEARS ):
48- param_name = "end"
49- reason = TIME_WINDOW_DURATION_TEN_YEARS
30+ if not recurrence :
31+ raise ValueError ("Recurrence is required" )
32+
33+ _validate_start_end_parameter (start , end )
34+ _validate_recurrence_pattern (recurrence .pattern , start , end )
35+ _validate_recurrence_range (recurrence .range , start )
36+
5037
51- if param_name :
52- raise ValueError (reason % param_name )
38+ def _validate_start_end_parameter (start : datetime , end : datetime ) -> None :
39+ param_name = "end"
40+ if end > start + timedelta (days = TEN_YEARS ):
41+ raise ValueError (TIME_WINDOW_DURATION_TEN_YEARS % param_name )
5342
5443
55- def _validate_recurrence_pattern (recurrence : Recurrence , start : datetime , end : datetime ) -> None :
56- if recurrence is None :
57- raise ValueError (REQUIRED_PARAMETER % "Recurrence" )
58- pattern_type = recurrence .pattern .type
44+ def _validate_recurrence_pattern (pattern : RecurrencePattern , start : datetime , end : datetime ) -> None :
45+ pattern_type = pattern .type
5946
6047 if pattern_type == RecurrencePatternType .DAILY :
61- _validate_daily_recurrence_pattern (recurrence , start , end )
48+ _validate_daily_recurrence_pattern (pattern , start , end )
6249 else :
63- _validate_weekly_recurrence_pattern (recurrence , start , end )
50+ _validate_weekly_recurrence_pattern (pattern , start , end )
6451
6552
66- def _validate_recurrence_range (recurrence : Recurrence , start : datetime ) -> None :
67- range_type = recurrence . range .type
53+ def _validate_recurrence_range (recurrence_range : RecurrenceRange , start : datetime ) -> None :
54+ range_type = recurrence_range .type
6855 if range_type == RecurrenceRangeType .END_DATE :
69- _validate_end_date (recurrence , start )
56+ _validate_end_date (recurrence_range , start )
7057
7158
72- def _validate_daily_recurrence_pattern (recurrence : Recurrence , start : datetime , end : datetime ) -> None :
59+ def _validate_daily_recurrence_pattern (pattern : RecurrencePattern , start : datetime , end : datetime ) -> None :
7360 # "Start" is always a valid first occurrence for "Daily" pattern.
7461 # Only need to check if time window validated
75- _validate_time_window_duration (recurrence , start , end )
62+ _validate_time_window_duration (pattern , start , end )
7663
7764
78- def _validate_weekly_recurrence_pattern (recurrence : Recurrence , start : datetime , end : datetime ) -> None :
79- _validate_days_of_week (recurrence )
65+ def _validate_weekly_recurrence_pattern (pattern : RecurrencePattern , start : datetime , end : datetime ) -> None :
66+ _validate_days_of_week (pattern )
8067
8168 # Check whether "Start" is a valid first occurrence
82- pattern = recurrence .pattern
8369 if start .weekday () not in pattern .days_of_week :
8470 raise ValueError (NOT_MATCHED % "start" )
8571
8672 # Time window duration must be shorter than how frequently it occurs
87- _validate_time_window_duration (recurrence , start , end )
73+ _validate_time_window_duration (pattern , start , end )
8874
8975 # Check whether the time window duration is shorter than the minimum gap between days of week
90- if not _is_duration_compliant_with_days_of_week (recurrence , start , end ):
76+ if not _is_duration_compliant_with_days_of_week (pattern , start , end ):
9177 raise ValueError (TIME_WINDOW_DURATION_OUT_OF_RANGE % "Recurrence.Pattern.DaysOfWeek" )
9278
9379
94- def _validate_time_window_duration (recurrence : Recurrence , start : datetime , end : datetime ) -> None :
95- pattern = recurrence .pattern
80+ def _validate_time_window_duration (pattern : RecurrencePattern , start : datetime , end : datetime ) -> None :
9681 interval_duration = (
9782 timedelta (days = pattern .interval )
9883 if pattern .type == RecurrencePatternType .DAILY
9984 else timedelta (days = pattern .interval * DAYS_PER_WEEK )
10085 )
10186 time_window_duration = end - start
87+ if start > end :
88+ raise ValueError (OUT_OF_RANGE % "The filter start date Start needs to before the End date." )
89+
10290 if time_window_duration > interval_duration :
10391 raise ValueError (TIME_WINDOW_DURATION_OUT_OF_RANGE % "Recurrence.Pattern.Interval" )
10492
10593
106- def _validate_days_of_week (recurrence : Recurrence ) -> None :
107- days_of_week = recurrence . pattern .days_of_week
94+ def _validate_days_of_week (pattern : RecurrencePattern ) -> None :
95+ days_of_week = pattern .days_of_week
10896 if not days_of_week :
10997 raise ValueError (REQUIRED_PARAMETER % "Recurrence.Pattern.DaysOfWeek" )
11098
11199
112- def _validate_end_date (recurrence : Recurrence , start : datetime ) -> None :
113- end_date = recurrence . range .end_date
100+ def _validate_end_date (recurrence_range : RecurrenceRange , start : datetime ) -> None :
101+ end_date = recurrence_range .end_date
114102 if end_date and end_date < start :
115103 raise ValueError ("The Recurrence.Range.EndDate should be after the Start" )
116104
117105
118- def _is_duration_compliant_with_days_of_week (recurrence : Recurrence , start : datetime , end : datetime ) -> bool :
119- days_of_week = recurrence . pattern .days_of_week
106+ def _is_duration_compliant_with_days_of_week (pattern : RecurrencePattern , start : datetime , end : datetime ) -> bool :
107+ days_of_week = pattern .days_of_week
120108 if len (days_of_week ) == 1 :
121109 return True
122110
123111 # Get the date of first day of the week
124112 today = datetime .now ()
125- first_day_of_week = recurrence . pattern .first_day_of_week
113+ first_day_of_week = pattern .first_day_of_week
126114 offset = _get_passed_week_days (today .weekday (), first_day_of_week )
127115 first_date_of_week = today - timedelta (days = offset )
128116 sorted_days_of_week = _sort_days_of_week (days_of_week , first_day_of_week )
@@ -138,7 +126,7 @@ def _is_duration_compliant_with_days_of_week(recurrence: Recurrence, start: date
138126 min_gap = min (min_gap , current_gap )
139127 prev_occurrence = date
140128
141- if recurrence . pattern .interval == 1 :
129+ if pattern .interval == 1 :
142130 # It may cross weeks. Check the adjacent week
143131 date = first_date_of_week + timedelta (
144132 days = DAYS_PER_WEEK + _get_passed_week_days (sorted_days_of_week [0 ], first_day_of_week )
0 commit comments