|
5 | 5 |
|
6 | 6 | from flask import request |
7 | 7 |
|
| 8 | + |
8 | 9 | from ._exceptions import ValidationFailedException |
9 | | -from .utils import days_in_range, weeks_in_range |
| 10 | +from .utils import days_in_range, weeks_in_range, guess_time_value_is_day |
10 | 11 |
|
11 | 12 |
|
12 | 13 | def _parse_common_multi_arg(key: str) -> List[Tuple[str, Union[bool, Sequence[str]]]]: |
@@ -109,6 +110,15 @@ class TimePair: |
109 | 110 | time_type: str |
110 | 111 | time_values: Union[bool, Sequence[Union[int, Tuple[int, int]]]] |
111 | 112 |
|
| 113 | + @property |
| 114 | + def is_week(self) -> bool: |
| 115 | + return self.time_type == 'week' |
| 116 | + |
| 117 | + @property |
| 118 | + def is_day(self) -> bool: |
| 119 | + return self.time_type != 'week' |
| 120 | + |
| 121 | + |
112 | 122 | def count(self) -> float: |
113 | 123 | """ |
114 | 124 | returns the count of items in this pair |
@@ -225,3 +235,45 @@ def parse_day_arg(key: str) -> int: |
225 | 235 | if not isinstance(r, int): |
226 | 236 | raise ValidationFailedException(f"{key} must match YYYYMMDD or YYYY-MM-DD") |
227 | 237 | return r |
| 238 | + |
| 239 | +def parse_week_arg(key: str) -> int: |
| 240 | + v = request.values.get(key) |
| 241 | + if not v: |
| 242 | + raise ValidationFailedException(f"{key} param is required") |
| 243 | + r = parse_week_value(v) |
| 244 | + if not isinstance(r, int): |
| 245 | + raise ValidationFailedException(f"{key} must match YYYYWW") |
| 246 | + return r |
| 247 | + |
| 248 | + |
| 249 | +def parse_week_range_arg(key: str) -> Tuple[int, int]: |
| 250 | + v = request.values.get(key) |
| 251 | + if not v: |
| 252 | + raise ValidationFailedException(f"{key} param is required") |
| 253 | + r = parse_week_value(v) |
| 254 | + if not isinstance(r, tuple): |
| 255 | + raise ValidationFailedException(f"{key} must match YYYYWW-YYYYWW") |
| 256 | + return r |
| 257 | + |
| 258 | +def parse_day_or_week_arg(key: str, default_value: Optional[int] = None) -> Tuple[int, bool]: |
| 259 | + v = request.values.get(key) |
| 260 | + if not v: |
| 261 | + if default_value is not None: |
| 262 | + return default_value, guess_time_value_is_day(default_value) |
| 263 | + raise ValidationFailedException(f"{key} param is required") |
| 264 | + # format is either YYYY-MM-DD or YYYYMMDD or YYYYMM |
| 265 | + is_week = len(v) == 6 |
| 266 | + if is_week: |
| 267 | + return parse_week_arg(key), False |
| 268 | + return parse_day_arg(key), True |
| 269 | + |
| 270 | +def parse_day_or_week_range_arg(key: str) -> Tuple[Tuple[int, int], bool]: |
| 271 | + v = request.values.get(key) |
| 272 | + if not v: |
| 273 | + raise ValidationFailedException(f"{key} param is required") |
| 274 | + # format is either YYYY-MM-DD--YYYY-MM-DD or YYYYMMDD-YYYYMMDD or YYYYMM-YYYYMM |
| 275 | + # so if the first before the - has length 6, it must be a week |
| 276 | + is_week = len(v.split('-', 2)[0]) == 6 |
| 277 | + if is_week: |
| 278 | + return parse_week_range_arg(key), False |
| 279 | + return parse_day_range_arg(key), True |
0 commit comments