Commit 9a6e3424bee6359a5806b66edde0406ee40e57f3
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): |