Skip to content

Instantly share code, notes, and snippets.

@maplethorpej
Created April 3, 2018 16:56
Show Gist options
  • Save maplethorpej/70b4866865698a14250cbf0052945b35 to your computer and use it in GitHub Desktop.
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.
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