From 9a6e3424bee6359a5806b66edde0406ee40e57f3 Mon Sep 17 00:00:00 2001 From: Rohan Rangray Date: Tue, 12 May 2015 20:24:23 -0700 Subject: [PATCH] Wrote the MaskField serializer field. --- flashcards/serializers.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/flashcards/serializers.py b/flashcards/serializers.py index 4e5418e..4e2385d 100644 --- a/flashcards/serializers.py +++ b/flashcards/serializers.py @@ -1,5 +1,6 @@ from django.utils.datetime_safe import datetime from flashcards.models import Section, LecturePeriod, User, Flashcard +from flashcards.validators import FlashcardMask, OverlapIntervalException from rest_framework import serializers from rest_framework.fields import EmailField, BooleanField, CharField, IntegerField from rest_framework.relations import HyperlinkedRelatedField @@ -90,19 +91,23 @@ class MaskFieldSerializer(serializers.Field): } def to_representation(self, value): - if not isinstance(value, set) or not all([isinstance(i, tuple) for i in value]): - raise serializers.ValidationError("Invalid MaskField.") - return dumps(list(value)) + return dumps(list(self._make_mask(value))) - def to_internal_value(self, data): + def to_internal_value(self, value): + return self._make_mask(value) + + def _make_mask(self, data): try: - intervals = loads(data) - if not isinstance(intervals, list) or len(intervals) > 32 \ - or not all([isinstance(i, list) and len(i) == 2 for i in intervals]): - raise ValueError + mask = FlashcardMask(loads(data)) except ValueError: raise serializers.ValidationError("Invalid JSON for MaskField") - return set([tuple(i) for i in intervals]) + except TypeError: + raise serializers.ValidationError("Invalid data for MaskField.") + except OverlapIntervalException: + raise serializers.ValidationError("Invalid intervals for MaskField data.") + if len(mask) > 32: + raise serializers.ValidationError("Too many intervals in the mask.") + return mask class FlashcardSerializer(ModelSerializer): -- 1.9.1