Skip to content

Commit

Permalink
Merge pull request #1748 from noirbizarre/daterange-parse-iso
Browse files Browse the repository at this point in the history
Can parse iso datetime in daterange
  • Loading branch information
noirbizarre committed Jun 13, 2018
2 parents ef7f05d + 85dd63b commit 0f0ac36
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 23 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -6,6 +6,7 @@
- Failsafe JS cache storage: use a custom in-memory storage as fallback when access to `sessionStorage` is not allowed [#1742](https://github.com/opendatateam/udata/pull/1742)
- Prevent errors when handling API errors without data/payload [#1743](https://github.com/opendatateam/udata/pull/1743)
- Improve/fix validation error formatting on harvesting [#1745](https://github.com/opendatateam/udata/pull/1745)
- Ensure daterange can be parsed from full iso datetime [#1748](https://github.com/opendatateam/udata/pull/1748)

## 1.4.0 (2018-06-06)

Expand Down
22 changes: 22 additions & 0 deletions udata/tests/test_utils.py
Expand Up @@ -51,6 +51,28 @@ def test_parse_daterange_end_empty(self):
assert daterange_end(None) is None
assert daterange_end('') is None

def test_parse_daterange_start_date(self):
today = date.today()
assert daterange_start(today) == today

def test_parse_daterange_end_date(self):
today = date.today()
assert daterange_end(today) == today

def test_parse_daterange_start_datetime(self):
now = datetime.now()
assert daterange_start(now) == now.date()

def test_parse_daterange_end_datetime(self):
now = datetime.now()
assert daterange_end(now) == now.date()

def test_parse_daterange_start_full_iso(self):
assert daterange_start('1984-06-07T00:00:00+00:00') == date(1984, 6, 7)

def test_parse_daterange_end_full_iso(self):
assert daterange_end('1984-06-07T00:00:00+00:00') == date(1984, 6, 7)

def test_parse_daterange_start_full(self):
assert daterange_start('1984-06-07') == date(1984, 6, 7)

Expand Down
62 changes: 39 additions & 23 deletions udata/utils.py
Expand Up @@ -7,15 +7,16 @@

import factory

from uuid import uuid4
from datetime import date, datetime
from calendar import monthrange
from math import ceil
from xml.sax.saxutils import escape
from dateutil.relativedelta import relativedelta
from dateutil.parser import parse as parse_dt
from faker import Faker
from faker.config import PROVIDERS
from faker.providers import BaseProvider
from faker.providers.lorem.la import Provider as LoremProvider
from math import ceil
from uuid import uuid4
from xml.sax.saxutils import escape


def get_by(lst, field, value):
Expand Down Expand Up @@ -96,34 +97,49 @@ def __init__(self, page, page_size, total):
self.total = total


def daterange_start(string):
def daterange_start(value):
'''Parse a date range start boundary'''
if not string:
if not value:
return None
parts = string.split('-')
elif isinstance(value, datetime):
return value.date()
elif isinstance(value, date):
return value

result = parse_dt(value).date()
dashes = value.count('-')

if len(parts) == 3:
return date(*(int(part) for part in parts))
elif len(parts) == 2:
return date(int(parts[0]), int(parts[1]), 1)
if dashes >= 2:
return result
elif dashes == 1:
# Year/Month only
return result.replace(day=1)
else:
return date(int(parts[0]), 1, 1)
# Year only
return result.replace(day=1, month=1)


def daterange_end(string):
def daterange_end(value):
'''Parse a date range end boundary'''
if not string:
if not value:
return None
parts = string.split('-')

if len(parts) == 3:
return date(*(int(part) for part in parts))
elif len(parts) == 2:
year, month = int(parts[0]), int(parts[1])
_, end_of_month = monthrange(year, month)
return date(year, month, end_of_month)
elif isinstance(value, datetime):
return value.date()
elif isinstance(value, date):
return value

result = parse_dt(value).date()
dashes = value.count('-')

if dashes >= 2:
# Full date
return result
elif dashes == 1:
# Year/Month
return result + relativedelta(months=+1, days=-1, day=1)
else:
return date(int(parts[0]), 12, 31)
# Year only
return result.replace(month=12, day=31)


def to_iso(dt):
Expand Down

0 comments on commit 0f0ac36

Please sign in to comment.