Created
April 3, 2018 16:56
-
-
Save maplethorpej/70b4866865698a14250cbf0052945b35 to your computer and use it in GitHub Desktop.
Validate date parameters sent in a request object using either custom start/end dates or predefined periods. Raise exception if invalid. Python 3.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import datetime | |
import re | |
class Requester: | |
start = None | |
end = None | |
now = datetime.date.today() | |
default_period = { | |
"this_week": (0, 7), | |
"last_week": (7, 14), | |
"this_month": (0, 30), | |
"last_month": (30, 60), | |
"this_year": (0, 365), | |
"last_year": (365, 730), | |
"last_ninety": (0, 90) | |
} | |
def __init__(self, request): | |
self.start_date = request.args.get('start_date') | |
self.end_date = request.args.get('end_date') | |
self.period = request.args.get('period') | |
self.sort = request.args.get('sort') | |
if self.period: | |
self.start, self.end = self._get_period_dates(self.period) | |
if self.start_date: | |
self._validate_custom_dates(self.start_date, self.end_date) | |
self.start = self._str_to_date(self.start_date) | |
self.end = self._str_to_date(self.end_date) if self.end_date else self.now | |
def _get_period_dates(self, period): | |
""" | |
Set start/end date based on default time period | |
:param period: | |
""" | |
period = period.lower() | |
if period in self.default_period.keys(): | |
end, start = self.default_period[period] | |
start_date = self.now - datetime.timedelta(days=start) | |
end_date = self.now if not end else self.now - datetime.timedelta(days=end) | |
return start_date, end_date | |
# raise error and return valid options | |
options = ', '.join(['{}' for _ in range(len(self.default_period))]) | |
options = options.format(*self.default_period.keys()) | |
raise ValueError("Period parameter is invalid. Options: {}".format(options)) | |
@staticmethod | |
def _validate_custom_dates(start, end): | |
""" | |
Validate that the start/end date string formats are correct | |
:param start: | |
:param end: | |
""" | |
for date in [start, end]: | |
if not isinstance(date, str): | |
continue | |
valid_date = re.search("(.{4}-.{2}-.{2})+$", date) | |
if not valid_date: | |
raise ValueError("Start or end date parameter is invalid. Valid format: YYYY-MM-DD") | |
@staticmethod | |
def _str_to_date(date): | |
""" | |
Convert date string to datetime.date() object. | |
Format: 'YYYY-MM-DD' | |
:param date: | |
""" | |
try: | |
date_obj = datetime.datetime.strptime(date, '%Y-%m-%d').date() | |
except ValueError: | |
raise ValueError("Invalid date. Please check the start/end parameters.") | |
return date_obj |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment