Skip to content

Commit

Permalink
Adds serialization methods for datetime/time/dates
Browse files Browse the repository at this point in the history
  • Loading branch information
fredkingham committed Jun 13, 2019
1 parent a0b25e5 commit 28c6a7f
Show file tree
Hide file tree
Showing 4 changed files with 79 additions and 9 deletions.
5 changes: 5 additions & 0 deletions changelog.md
@@ -1,3 +1,8 @@
### 0.16.0 (Major Release)

Adds serialize_date, serialize_datetime, serialize_time methods to serialize date/datetime/time to
strings.

### 0.15.0 (Major Release)

Adds an optional setting OPAL_DEFAULT_SEARCH_FIELDS that specifies the fields used to
Expand Down
24 changes: 24 additions & 0 deletions doc/docs/reference/core_serialization.md
Expand Up @@ -2,6 +2,30 @@

Helpers for serializing and deserializing data

## `serialize_date(value)`
Given a date, serialize it to a string using the
`settings.DATE_FORMAT`

```python
as_date_str = serialize_date(datetime.date(2019, 4, 1))
```

## `serialize_datetime(value)`
Given a datetime, serialize it to a string using the
`settings.DATETIME_FORMAT`

```python
as_datetime_str = serialize_datetime(datetime.datetime(2019, 4, 1, 10, 30))
```

## `serialize_time(value)`
Given a time, serialize it to a string using the
`settings.TIME_FORMAT`

```python
as_datetime_str = serialize_time(datetime.time(10, 30))
```

## `deserialize_datetime(value)`

Given a string which represents a date time, deserialize it to a Python datetime
Expand Down
37 changes: 29 additions & 8 deletions opal/core/serialization.py
Expand Up @@ -7,7 +7,7 @@
from django.conf import settings
from django.core.serializers.json import DjangoJSONEncoder
from django.utils import timezone
from django.utils.dateformat import format
from django.utils.dateformat import format as dt_format
import six


Expand Down Expand Up @@ -56,21 +56,42 @@ def deserialize_date(value):
return dt.date()


def serialize_date(some_date):
"""
Returns the string representation of a date
"""
return dt_format(
datetime.datetime.combine(
some_date, datetime.datetime.min.time()
), settings.DATE_FORMAT
)


def serialize_datetime(some_datetime):
"""
Returns the string representation of a datetime
"""
return dt_format(some_datetime, settings.DATETIME_FORMAT)


def serialize_time(some_time):
"""
Returns the string representation of a time
"""
return dt_format(some_time, settings.TIME_FORMAT)


def _temporal_thing_to_string(thing):
"""
If THING is a time, date, or datetime, return a string representation of it
otherwise, return THING unchanged.
"""
if isinstance(thing, datetime.time):
return format(thing, settings.TIME_FORMAT)
return serialize_time(thing)
elif isinstance(thing, datetime.datetime):
return format(thing, settings.DATETIME_FORMAT)
return serialize_datetime(thing)
elif isinstance(thing, datetime.date):
return format(
datetime.datetime.combine(
thing, datetime.datetime.min.time()
), settings.DATE_FORMAT
)
return serialize_date(thing)
else:
return thing

Expand Down
22 changes: 21 additions & 1 deletion opal/tests/test_core_serialization.py
Expand Up @@ -100,7 +100,7 @@ def test_binaries_become_utf_8(self):
serialized = s.default(binary)
self.assertIsInstance(serialized, six.text_type)

def test_time_serialisation(self):
def test_serializer_time_serialisation(self):
s = serialization.OpalSerializer()
serialised = s.default(datetime.time(20))
self.assertEqual(serialised, "20:00:00")
Expand All @@ -124,3 +124,23 @@ def test_serialize_date_in_list(self):
expected = ['22/04/1959', 11, 33]
serialised = s.default(data)
self.assertEqual(expected, serialised)

def test_time_serialization(self):
self.assertEqual(
serialization.serialize_time(datetime.time(10, 30)),
'10:30:00'
)

def test_date_serialization(self):
self.assertEqual(
serialization.serialize_date(datetime.date(2019, 4, 1)),
'01/04/2019'
)

def test_datetime_serialization(self):
self.assertEqual(
serialization.serialize_datetime(
datetime.datetime(2019, 4, 1, 10, 30)
),
'01/04/2019 10:30:00'
)

0 comments on commit 28c6a7f

Please sign in to comment.