2016-04-02 12:13:26 +00:00
|
|
|
import datetime
|
|
|
|
import re
|
|
|
|
from szurubooru.errors import ValidationError
|
2016-03-28 20:53:56 +00:00
|
|
|
|
2016-04-03 16:00:38 +00:00
|
|
|
def is_valid_email(email):
|
|
|
|
''' Validates given email address. '''
|
2016-04-03 17:00:47 +00:00
|
|
|
return not email or re.match(r'^[^@]*@[^@]*\.[^@]*$', email)
|
2016-04-03 16:00:38 +00:00
|
|
|
|
2016-03-28 20:53:56 +00:00
|
|
|
class dotdict(dict): # pylint: disable=invalid-name
|
2016-04-03 16:00:38 +00:00
|
|
|
''' dot.notation access to dictionary attributes. '''
|
2016-03-28 20:53:56 +00:00
|
|
|
def __getattr__(self, attr):
|
|
|
|
return self.get(attr)
|
|
|
|
__setattr__ = dict.__setitem__
|
|
|
|
__delattr__ = dict.__delitem__
|
2016-04-02 12:13:26 +00:00
|
|
|
|
|
|
|
def parse_time_range(value, timezone=datetime.timezone(datetime.timedelta())):
|
|
|
|
''' Returns tuple containing min/max time for given text representation. '''
|
|
|
|
one_day = datetime.timedelta(days=1)
|
|
|
|
one_second = datetime.timedelta(seconds=1)
|
|
|
|
|
|
|
|
value = value.lower()
|
|
|
|
if not value:
|
|
|
|
raise ValidationError('Empty date format.')
|
|
|
|
|
|
|
|
if value == 'today':
|
|
|
|
now = datetime.datetime.now(tz=timezone)
|
|
|
|
return (
|
|
|
|
datetime.datetime(now.year, now.month, now.day, 0, 0, 0),
|
2016-04-03 17:00:47 +00:00
|
|
|
datetime.datetime(now.year, now.month, now.day, 0, 0, 0) \
|
2016-04-02 12:13:26 +00:00
|
|
|
+ one_day - one_second)
|
|
|
|
|
|
|
|
if value == 'yesterday':
|
|
|
|
now = datetime.datetime.now(tz=timezone)
|
|
|
|
return (
|
|
|
|
datetime.datetime(now.year, now.month, now.day, 0, 0, 0) - one_day,
|
2016-04-03 17:00:47 +00:00
|
|
|
datetime.datetime(now.year, now.month, now.day, 0, 0, 0) \
|
2016-04-02 12:13:26 +00:00
|
|
|
- one_second)
|
|
|
|
|
2016-04-03 17:00:47 +00:00
|
|
|
match = re.match(r'^(\d{4})$', value)
|
2016-04-02 12:13:26 +00:00
|
|
|
if match:
|
|
|
|
year = int(match.group(1))
|
|
|
|
return (
|
|
|
|
datetime.datetime(year, 1, 1),
|
|
|
|
datetime.datetime(year + 1, 1, 1) - one_second)
|
|
|
|
|
2016-04-03 17:00:47 +00:00
|
|
|
match = re.match(r'^(\d{4})-(\d{1,2})$', value)
|
2016-04-02 12:13:26 +00:00
|
|
|
if match:
|
|
|
|
year = int(match.group(1))
|
|
|
|
month = int(match.group(2))
|
|
|
|
return (
|
|
|
|
datetime.datetime(year, month, 1),
|
|
|
|
datetime.datetime(year, month + 1, 1) - one_second)
|
|
|
|
|
2016-04-03 17:00:47 +00:00
|
|
|
match = re.match(r'^(\d{4})-(\d{1,2})-(\d{1,2})$', value)
|
2016-04-02 12:13:26 +00:00
|
|
|
if match:
|
|
|
|
year = int(match.group(1))
|
|
|
|
month = int(match.group(2))
|
|
|
|
day = int(match.group(3))
|
|
|
|
return (
|
|
|
|
datetime.datetime(year, month, day),
|
|
|
|
datetime.datetime(year, month, day + 1) - one_second)
|
|
|
|
|
|
|
|
raise ValidationError('Invalid date format: %r.' % value)
|