Skip to content

Commit 8b84e17

Browse files
committed
ref(serializer): based json serializer on the DRF 3.3 JSONField and set global DRF DateTime
1 parent e6ab870 commit 8b84e17

2 files changed

Lines changed: 45 additions & 78 deletions

File tree

rootfs/api/serializers.py

Lines changed: 41 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,14 @@
33
"""
44

55
from __future__ import unicode_literals
6-
7-
import json
86
import re
97

10-
from django.conf import settings
118
from django.contrib.auth.models import User
129
from django.utils import timezone
1310
from rest_framework import serializers
1411

1512
from api import models
1613

17-
1814
PROCTYPE_MATCH = re.compile(r'^(?P<type>[a-z]+)')
1915
MEMLIMIT_MATCH = re.compile(r'^(?P<mem>[0-9]+(MB|KB|GB|[BKMG]))$', re.IGNORECASE)
2016
CPUSHARE_MATCH = re.compile(r'^(?P<cpu>[0-9]+)$')
@@ -23,57 +19,27 @@
2319
CONFIGKEY_MATCH = re.compile(r'^[a-z_]+[a-z0-9_]*$', re.IGNORECASE)
2420

2521

26-
class JSONFieldSerializer(serializers.Field):
27-
"""
28-
A Django REST framework serializer for JSON data.
29-
"""
22+
class JSONFieldSerializer(serializers.JSONField):
23+
def __init__(self, *args, **kwargs):
24+
self.type = kwargs.pop('type', 'string')
25+
super(JSONFieldSerializer, self).__init__(*args, **kwargs)
3026

3127
def to_representation(self, obj):
3228
"""Serialize the field's JSON data, for read operations."""
33-
return obj
34-
35-
def to_internal_value(self, data):
36-
"""Deserialize the field's JSON data, for write operations."""
37-
try:
38-
val = json.loads(data)
39-
except TypeError:
40-
val = data
41-
return val
42-
43-
44-
class JSONIntFieldSerializer(JSONFieldSerializer):
45-
"""
46-
A JSON serializer that coerces its data to integers.
47-
"""
48-
49-
def to_internal_value(self, data):
50-
"""Deserialize the field's JSON integer data."""
51-
field = super(JSONIntFieldSerializer, self).to_internal_value(data)
52-
53-
for k, v in field.viewitems():
54-
if v is not None: # NoneType is used to unset a value
55-
try:
56-
field[k] = int(v)
57-
except ValueError:
58-
field[k] = v
59-
# Do nothing, the validator will catch this later
60-
return field
61-
62-
63-
class JSONStringFieldSerializer(JSONFieldSerializer):
64-
"""
65-
A JSON serializer that coerces its data to strings.
66-
"""
67-
68-
def to_internal_value(self, data):
69-
"""Deserialize the field's JSON string data."""
70-
field = super(JSONStringFieldSerializer, self).to_internal_value(data)
29+
for k, v in obj.viewitems():
30+
if v is None: # NoneType is used to unset a value
31+
continue
7132

72-
for k, v in field.viewitems():
73-
if v is not None: # NoneType is used to unset a value
74-
field[k] = unicode(v)
33+
try:
34+
if self.type == 'int':
35+
obj[k] = int(v)
36+
else:
37+
obj[k] = str(v)
38+
except ValueError:
39+
obj[k] = v
40+
# Do nothing, the validator will catch this later
7541

76-
return field
42+
return obj
7743

7844

7945
class UserSerializer(serializers.ModelSerializer):
@@ -124,9 +90,9 @@ class AppSerializer(serializers.ModelSerializer):
12490
"""Serialize a :class:`~api.models.App` model."""
12591

12692
owner = serializers.ReadOnlyField(source='owner.username')
127-
structure = JSONFieldSerializer(required=False)
128-
created = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
129-
updated = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
93+
structure = serializers.JSONField(required=False)
94+
created = serializers.DateTimeField(read_only=True)
95+
updated = serializers.DateTimeField(read_only=True)
13096

13197
class Meta:
13298
"""Metadata options for a :class:`AppSerializer`."""
@@ -140,9 +106,9 @@ class BuildSerializer(serializers.ModelSerializer):
140106

141107
app = serializers.SlugRelatedField(slug_field='id', queryset=models.App.objects.all())
142108
owner = serializers.ReadOnlyField(source='owner.username')
143-
procfile = JSONFieldSerializer(required=False)
144-
created = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
145-
updated = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
109+
procfile = serializers.JSONField(required=False)
110+
created = serializers.DateTimeField(read_only=True)
111+
updated = serializers.DateTimeField(read_only=True)
146112

147113
class Meta:
148114
"""Metadata options for a :class:`BuildSerializer`."""
@@ -157,12 +123,12 @@ class ConfigSerializer(serializers.ModelSerializer):
157123

158124
app = serializers.SlugRelatedField(slug_field='id', queryset=models.App.objects.all())
159125
owner = serializers.ReadOnlyField(source='owner.username')
160-
values = JSONStringFieldSerializer(required=False)
161-
memory = JSONStringFieldSerializer(required=False)
162-
cpu = JSONIntFieldSerializer(required=False)
163-
tags = JSONStringFieldSerializer(required=False)
164-
created = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
165-
updated = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
126+
values = JSONFieldSerializer(required=False, binary=True)
127+
memory = JSONFieldSerializer(required=False, binary=True)
128+
cpu = JSONFieldSerializer(required=False, binary=True, type='int')
129+
tags = JSONFieldSerializer(required=False, binary=True)
130+
created = serializers.DateTimeField(read_only=True)
131+
updated = serializers.DateTimeField(read_only=True)
166132

167133
class Meta:
168134
"""Metadata options for a :class:`ConfigSerializer`."""
@@ -233,8 +199,8 @@ class ReleaseSerializer(serializers.ModelSerializer):
233199

234200
app = serializers.SlugRelatedField(slug_field='id', queryset=models.App.objects.all())
235201
owner = serializers.ReadOnlyField(source='owner.username')
236-
created = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
237-
updated = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
202+
created = serializers.DateTimeField(read_only=True)
203+
updated = serializers.DateTimeField(read_only=True)
238204

239205
class Meta:
240206
"""Metadata options for a :class:`ReleaseSerializer`."""
@@ -246,8 +212,8 @@ class ContainerSerializer(serializers.ModelSerializer):
246212

247213
app = serializers.SlugRelatedField(slug_field='id', queryset=models.App.objects.all())
248214
owner = serializers.ReadOnlyField(source='owner.username')
249-
created = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
250-
updated = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
215+
created = serializers.DateTimeField(read_only=True)
216+
updated = serializers.DateTimeField(read_only=True)
251217
release = serializers.SerializerMethodField()
252218

253219
class Meta:
@@ -264,8 +230,8 @@ class KeySerializer(serializers.ModelSerializer):
264230

265231
owner = serializers.ReadOnlyField(source='owner.username')
266232
fingerprint = serializers.CharField(read_only=True)
267-
created = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
268-
updated = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
233+
created = serializers.DateTimeField(read_only=True)
234+
updated = serializers.DateTimeField(read_only=True)
269235

270236
class Meta:
271237
"""Metadata options for a KeySerializer."""
@@ -277,8 +243,8 @@ class DomainSerializer(serializers.ModelSerializer):
277243

278244
app = serializers.SlugRelatedField(slug_field='id', queryset=models.App.objects.all())
279245
owner = serializers.ReadOnlyField(source='owner.username')
280-
created = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
281-
updated = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
246+
created = serializers.DateTimeField(read_only=True)
247+
updated = serializers.DateTimeField(read_only=True)
282248

283249
class Meta:
284250
"""Metadata options for a :class:`DomainSerializer`."""
@@ -321,9 +287,9 @@ class CertificateSerializer(serializers.ModelSerializer):
321287
"""Serialize a :class:`~api.models.Cert` model."""
322288

323289
owner = serializers.ReadOnlyField(source='owner.username')
324-
expires = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
325-
created = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
326-
updated = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
290+
expires = serializers.DateTimeField(read_only=True)
291+
created = serializers.DateTimeField(read_only=True)
292+
updated = serializers.DateTimeField(read_only=True)
327293

328294
class Meta:
329295
"""Metadata options for a DomainCertSerializer."""
@@ -339,8 +305,8 @@ class PushSerializer(serializers.ModelSerializer):
339305

340306
app = serializers.SlugRelatedField(slug_field='id', queryset=models.App.objects.all())
341307
owner = serializers.ReadOnlyField(source='owner.username')
342-
created = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
343-
updated = serializers.DateTimeField(format=settings.DEIS_DATETIME_FORMAT, read_only=True)
308+
created = serializers.DateTimeField(read_only=True)
309+
updated = serializers.DateTimeField(read_only=True)
344310

345311
class Meta:
346312
"""Metadata options for a :class:`PushSerializer`."""

rootfs/deis/settings.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,11 @@
168168
'Deis-Release',
169169
)
170170

171+
# standard datetime format used for logging, model timestamps, etc.
172+
DEIS_DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%S%Z'
173+
171174
REST_FRAMEWORK = {
175+
'DATETIME_FORMAT': DEIS_DATETIME_FORMAT,
172176
'DEFAULT_MODEL_SERIALIZER_CLASS': 'rest_framework.serializers.ModelSerializer',
173177
'DEFAULT_PERMISSION_CLASSES': (
174178
'rest_framework.permissions.IsAuthenticated',
@@ -275,9 +279,6 @@
275279
LOG_LINES = 1000
276280
TEMPDIR = tempfile.mkdtemp(prefix='deis')
277281

278-
# standard datetime format used for logging, model timestamps, etc.
279-
DEIS_DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%S%Z'
280-
281282
# names which apps cannot reserve for routing
282283
DEIS_RESERVED_NAMES = ['deis']
283284

0 commit comments

Comments
 (0)