33"""
44
55from __future__ import unicode_literals
6-
7- import json
86import re
97
10- from django .conf import settings
118from django .contrib .auth .models import User
129from django .utils import timezone
1310from rest_framework import serializers
1411
1512from api import models
1613
17-
1814PROCTYPE_MATCH = re .compile (r'^(?P<type>[a-z]+)' )
1915MEMLIMIT_MATCH = re .compile (r'^(?P<mem>[0-9]+(MB|KB|GB|[BKMG]))$' , re .IGNORECASE )
2016CPUSHARE_MATCH = re .compile (r'^(?P<cpu>[0-9]+)$' )
2319CONFIGKEY_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
7945class 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`."""
0 commit comments