1+ """
2+ Provides serialization for API responses.
3+
4+ See `DRF serializer documentation <http://www.django-rest-framework.org/api-guide/serializers/>`_
5+ Used by the View classes api/views.py to serialize API responses as JSON or HTML.
6+ See DEFAULT_RENDERER_CLASSES setting in core.settings.contrib for the enabled renderers.
7+ """
8+
9+ # -*- coding: utf-8 -*-
110import logging
211
312import django .core .exceptions
918 SavedFeatureSelection ,
1019 validate_aoi ,
1120 validate_mbtiles ,
12- normalize_not_in ,
1321 PartnerExportRegion ,
1422)
1523from rest_framework import serializers
1624from rest_framework_gis import serializers as geo_serializers
1725from tasks .models import ExportRun , ExportTask
1826
27+ # Get an instance of a logger
1928LOG = logging .getLogger (__name__ )
2029
2130
22- def _slice_dict (in_dict , wanted_keys ):
23- return {k : in_dict [k ] for k in wanted_keys if k in in_dict }
24-
25-
26- def _update_attrs (model , v_data , keys ):
27- for key in keys :
28- if key in v_data :
29- setattr (model , key , v_data [key ])
30-
31-
3231class UserSerializer (serializers .ModelSerializer ):
3332 class Meta :
3433 model = User
@@ -74,23 +73,11 @@ class Meta:
7473
7574class ConfigurationSerializer (serializers .ModelSerializer ):
7675 user = UserSerializer (read_only = True , default = serializers .CurrentUserDefault ())
77- # Override to bypass model-level validators; normalization + validation run in validate_yaml.
78- yaml = serializers .CharField (validators = [])
7976
8077 class Meta :
8178 model = SavedFeatureSelection
8279 fields = ("uid" , "name" , "description" , "yaml" , "public" , "user" , "pinned" )
8380
84- def validate_yaml (self , value ):
85- from django .core .exceptions import ValidationError as DjangoValidationError
86- from jobs .models import validate_feature_selection
87- normalized = normalize_not_in (value )
88- try :
89- validate_feature_selection (normalized )
90- except DjangoValidationError as e :
91- raise serializers .ValidationError (e .messages )
92- return normalized
93-
9481
9582class JobGeomSerializer (serializers .ModelSerializer ):
9683 """Since Job Geoms can be large, these are serialized separately,
@@ -102,8 +89,7 @@ class Meta:
10289
10390
10491class JobSerializer (serializers .ModelSerializer ):
105- user = UserSerializer (read_only = True )
106- feature_selection = serializers .CharField (validators = [])
92+ user = UserSerializer (default = serializers .CurrentUserDefault ())
10793
10894 class Meta :
10995 model = Job
@@ -135,9 +121,6 @@ class Meta:
135121 "simplified_geom" : {"read_only" : True },
136122 }
137123
138- def validate_feature_selection (self , value ):
139- return _validate_and_normalize_feature_selection (value )
140-
141124 def validate (self , data ):
142125 try :
143126 validate_aoi (data ["the_geom" ])
@@ -159,17 +142,6 @@ def validate_model(model):
159142 raise serializers .ValidationError (e .message_dict )
160143
161144
162- def _validate_and_normalize_feature_selection (value ):
163- from django .core .exceptions import ValidationError as DjangoValidationError
164- from jobs .models import validate_feature_selection as _validate_fs
165- normalized = normalize_not_in (value )
166- try :
167- _validate_fs (normalized )
168- except DjangoValidationError as e :
169- raise serializers .ValidationError (e .messages )
170- return normalized
171-
172-
173145class PartnerExportRegionListSerializer (serializers .ModelSerializer ):
174146 export_formats = serializers .ListField ()
175147 feature_selection = serializers .CharField ()
@@ -203,9 +175,6 @@ class PartnerExportRegionSerializer(serializers.ModelSerializer): # noqa
203175 event = serializers .CharField ()
204176 description = serializers .CharField ()
205177
206- def validate_feature_selection (self , value ):
207- return _validate_and_normalize_feature_selection (value )
208-
209178 class Meta : # noqa
210179 model = PartnerExportRegion
211180 fields = (
@@ -232,7 +201,10 @@ class Meta: # noqa
232201 }
233202
234203 def create (self , validated_data ): # noqa
235- job_dict = _slice_dict (
204+ def slice_dict (in_dict , wanted_keys ):
205+ return dict ((k , in_dict [k ]) for k in wanted_keys if k in in_dict )
206+
207+ job_dict = slice_dict (
236208 validated_data ,
237209 [
238210 "the_geom" ,
@@ -245,7 +217,7 @@ def create(self, validated_data): # noqa
245217 job_dict ["event" ] = validated_data .get ("event" ) or ""
246218 job_dict ["description" ] = validated_data .get ("description" ) or ""
247219
248- region_dict = _slice_dict (
220+ region_dict = slice_dict (
249221 validated_data ,
250222 [
251223 "schedule_period" ,
@@ -279,6 +251,12 @@ def create(self, validated_data): # noqa
279251 return region
280252
281253 def update (self , instance , validated_data ): # noqa
254+ def update_attrs (model , v_data , keys ):
255+ for key in keys :
256+ if key in v_data :
257+ setattr (model , key , v_data [key ])
258+
259+ # if re-assigning, check group membership
282260 if (
283261 not self .context ["request" ]
284262 .user .groups .filter (name = validated_data ["group" ].name )
@@ -289,15 +267,15 @@ def update(self, instance, validated_data): # noqa
289267 )
290268
291269 job = instance .job
292- _update_attrs (
270+ update_attrs (
293271 job , validated_data , ["the_geom" , "export_formats" , "feature_selection" ]
294272 )
295273 job .name = validated_data .get ("name" )
296274 job .event = validated_data .get ("event" ) or ""
297275 job .description = validated_data .get ("description" ) or ""
298276
299277 validate_model (job )
300- _update_attrs (
278+ update_attrs (
301279 instance ,
302280 validated_data ,
303281 [
@@ -363,9 +341,6 @@ class HDXExportRegionSerializer(serializers.ModelSerializer): # noqa
363341 name = serializers .CharField ()
364342 buffer_aoi = serializers .BooleanField ()
365343
366- def validate_feature_selection (self , value ):
367- return _validate_and_normalize_feature_selection (value )
368-
369344 def validate (self , data ):
370345 """
371346 Check for export formats for country exports.
@@ -407,15 +382,18 @@ class Meta: # noqa
407382 }
408383
409384 def create (self , validated_data ): # noqa
410- job_dict = _slice_dict (
385+ def slice_dict (in_dict , wanted_keys ):
386+ return dict ((k , in_dict [k ]) for k in wanted_keys if k in in_dict )
387+
388+ job_dict = slice_dict (
411389 validated_data ,
412390 ["the_geom" , "export_formats" , "feature_selection" , "buffer_aoi" ],
413391 )
414392 job_dict ["user" ] = self .context ["request" ].user
415393 job_dict ["name" ] = validated_data .get ("dataset_prefix" )
416394 job_dict ["description" ] = validated_data .get ("name" )
417395
418- region_dict = _slice_dict (
396+ region_dict = slice_dict (
419397 validated_data ,
420398 [
421399 "extra_notes" ,
@@ -441,8 +419,13 @@ def create(self, validated_data): # noqa
441419 return region
442420
443421 def update (self , instance , validated_data ): # noqa
422+ def update_attrs (model , v_data , keys ):
423+ for key in keys :
424+ if key in v_data :
425+ setattr (model , key , v_data [key ])
426+
444427 job = instance .job
445- _update_attrs (
428+ update_attrs (
446429 job ,
447430 validated_data ,
448431 ["the_geom" , "export_formats" , "feature_selection" , "buffer_aoi" ],
@@ -451,7 +434,7 @@ def update(self, instance, validated_data): # noqa
451434 job .description = validated_data .get ("name" )
452435
453436 validate_model (job )
454- _update_attrs (
437+ update_attrs (
455438 instance ,
456439 validated_data ,
457440 [
0 commit comments