Commit 9a6e3424bee6359a5806b66edde0406ee40e57f3

Authored by Rohan Rangray
1 parent 67b19d6d94
Exists in master

Wrote the MaskField serializer field.

Showing 1 changed file with 14 additions and 9 deletions Side-by-side Diff

flashcards/serializers.py View file @ 9a6e342
1 1 from django.utils.datetime_safe import datetime
2 2 from flashcards.models import Section, LecturePeriod, User, Flashcard
  3 +from flashcards.validators import FlashcardMask, OverlapIntervalException
3 4 from rest_framework import serializers
4 5 from rest_framework.fields import EmailField, BooleanField, CharField, IntegerField
5 6 from rest_framework.relations import HyperlinkedRelatedField
6 7  
7 8  
8 9  
... ... @@ -90,19 +91,23 @@
90 91 }
91 92  
92 93 def to_representation(self, value):
93   - if not isinstance(value, set) or not all([isinstance(i, tuple) for i in value]):
94   - raise serializers.ValidationError("Invalid MaskField.")
95   - return dumps(list(value))
  94 + return dumps(list(self._make_mask(value)))
96 95  
97   - def to_internal_value(self, data):
  96 + def to_internal_value(self, value):
  97 + return self._make_mask(value)
  98 +
  99 + def _make_mask(self, data):
98 100 try:
99   - intervals = loads(data)
100   - if not isinstance(intervals, list) or len(intervals) > 32 \
101   - or not all([isinstance(i, list) and len(i) == 2 for i in intervals]):
102   - raise ValueError
  101 + mask = FlashcardMask(loads(data))
103 102 except ValueError:
104 103 raise serializers.ValidationError("Invalid JSON for MaskField")
105   - return set([tuple(i) for i in intervals])
  104 + except TypeError:
  105 + raise serializers.ValidationError("Invalid data for MaskField.")
  106 + except OverlapIntervalException:
  107 + raise serializers.ValidationError("Invalid intervals for MaskField data.")
  108 + if len(mask) > 32:
  109 + raise serializers.ValidationError("Too many intervals in the mask.")
  110 + return mask
106 111  
107 112  
108 113 class FlashcardSerializer(ModelSerializer):