Commit c91a932f6e439e3c9e9170823bad3073d10433d4
Exists in
master
Merge remote-tracking branch 'origin/master'
Conflicts: flashcards/tests/test_api.py
Showing 6 changed files Side-by-side Diff
flashcards/models.py
View file @
c91a932
... | ... | @@ -283,7 +283,8 @@ |
283 | 283 | |
284 | 284 | @property |
285 | 285 | def short_start_time(self): |
286 | - return self.start_time.strftime('%-I %p') | |
286 | + # lstrip 0 because windows doesn't support %-I | |
287 | + return self.start_time.strftime('%I %p').lstrip('0') | |
287 | 288 | |
288 | 289 | class Meta: |
289 | 290 | unique_together = (('section', 'start_time', 'week_day'),) |
flashcards/serializers.py
View file @
c91a932
... | ... | @@ -155,7 +155,7 @@ |
155 | 155 | return value |
156 | 156 | |
157 | 157 | def validate_mask(self, value): |
158 | - if len(self.data['text']) < value.max_offset(): | |
158 | + if len(self.initial_data['text']) < value.max_offset(): | |
159 | 159 | raise serializers.ValidationError("Mask out of bounds") |
160 | 160 | return value |
161 | 161 | |
162 | 162 | |
... | ... | @@ -165,12 +165,12 @@ |
165 | 165 | |
166 | 166 | |
167 | 167 | class FlashcardUpdateSerializer(serializers.Serializer): |
168 | - text = CharField(max_length=255) | |
169 | - material_date = DateTimeField() | |
170 | - mask = MaskFieldSerializer() | |
168 | + text = CharField(max_length=255, required=False) | |
169 | + material_date = DateTimeField(required=False) | |
170 | + mask = MaskFieldSerializer(required=False) | |
171 | 171 | |
172 | 172 | def validate_material_date(self, date): |
173 | - quarter_end = datetime(2015, 6, 15) | |
173 | + quarter_end = pytz.UTC.localize(datetime(2015, 6, 15)) | |
174 | 174 | if date > quarter_end: |
175 | 175 | raise serializers.ValidationError("Invalid material_date for the flashcard") |
176 | 176 | return date |
flashcards/tests/test_api.py
View file @
c91a932
... | ... | @@ -200,8 +200,7 @@ |
200 | 200 | def setUp(self): |
201 | 201 | self.client.login(email='none@none.com', password='1234') |
202 | 202 | self.user = User.objects.get(email='none@none.com') |
203 | - self.flashcard = Flashcard(text="jason", section=Section.objects.get(pk=1), material_date=now(), | |
204 | - author=self.user) | |
203 | + self.flashcard = Flashcard(text="jason", section=Section.objects.get(pk=1), material_date=now(), author=self.user) | |
205 | 204 | self.flashcard.save() |
206 | 205 | self.section = Section.objects.get(pk=1) |
207 | 206 | |
... | ... | @@ -281,21 +280,5 @@ |
281 | 280 | response = self.client.get('/api/sections/1/ordered_deck/') |
282 | 281 | self.assertEqual(response.status_code, HTTP_200_OK) |
283 | 282 | |
284 | - | |
285 | -class FlashcardViewSetTest(APITestCase): | |
286 | - fixtures = ['testusers', 'testsections'] | |
287 | - | |
288 | - def setUp(self): | |
289 | - self.client.login(email='none@none.com', password='1234') | |
290 | - self.user = User.objects.get(email='none@none.com') | |
291 | - self.flashcard = Flashcard(text="jason", section=Section.objects.get(pk=1), material_date=now(), | |
292 | - author=self.user) | |
293 | - self.flashcard.save() | |
294 | - self.section = Section.objects.get(pk=1) | |
295 | - | |
296 | - def test_hide_flashcard(self): | |
297 | - url = '/api/flashcards/1/hide/' | |
298 | - data = {1, ''} | |
299 | - response = self.client.post(url, data, format='json') | |
300 | - self.assertEqual(response.status_code, HTTP_204_NO_CONTENT) | |
283 | + def test_hide_card(self): |
flashcards/tests/test_models.py
View file @
c91a932
... | ... | @@ -38,6 +38,23 @@ |
38 | 38 | |
39 | 39 | |
40 | 40 | class FlashcardMaskTest(TestCase): |
41 | + def test_empty(self): | |
42 | + try: | |
43 | + fm = FlashcardMask([]) | |
44 | + self.assertEqual(fm.max_offset(), -1) | |
45 | + except TypeError: | |
46 | + self.fail() | |
47 | + try: | |
48 | + fm = FlashcardMask('') | |
49 | + self.assertEqual(fm.max_offset(), -1) | |
50 | + except TypeError: | |
51 | + self.fail() | |
52 | + try: | |
53 | + fm = FlashcardMask(None) | |
54 | + self.assertEqual(fm.max_offset(), -1) | |
55 | + except TypeError: | |
56 | + self.fail() | |
57 | + | |
41 | 58 | def test_iterable(self): |
42 | 59 | try: |
43 | 60 | FlashcardMask(1) |
... | ... | @@ -115,6 +132,7 @@ |
115 | 132 | UserFlashcard.objects.create(user=user2, flashcard=flashcard).save() |
116 | 133 | flashcard.edit(user2, {'text': 'This is the new text'}) |
117 | 134 | self.assertNotEqual(flashcard.pk, pk_backup) |
135 | + self.assertEqual(flashcard.text, 'This is the new text') | |
118 | 136 | |
119 | 137 | def test_mask_field(self): |
120 | 138 | user = User.objects.get(email="none@none.com") |
flashcards/validators.py
View file @
c91a932
... | ... | @@ -3,6 +3,8 @@ |
3 | 3 | |
4 | 4 | class FlashcardMask(set): |
5 | 5 | def __init__(self, iterable, *args, **kwargs): |
6 | + if iterable is None or iterable == '': | |
7 | + iterable = [] | |
6 | 8 | self._iterable_check(iterable) |
7 | 9 | iterable = map(tuple, iterable) |
8 | 10 | super(FlashcardMask, self).__init__(iterable, *args, **kwargs) |
flashcards/views.py
View file @
c91a932
... | ... | @@ -290,12 +290,17 @@ |
290 | 290 | |
291 | 291 | # Override create in CreateModelMixin |
292 | 292 | def create(self, request, *args, **kwargs): |
293 | - serializer = self.get_serializer(data=request.data) | |
293 | + serializer = FlashcardSerializer(data=request.data) | |
294 | 294 | serializer.is_valid(raise_exception=True) |
295 | - serializer.validated_data['author'] = request.user | |
296 | - self.perform_create(serializer) | |
297 | - headers = self.get_success_headers(serializer.data) | |
298 | - return Response(serializer.data, status=HTTP_201_CREATED, headers=headers) | |
295 | + data = serializer.validated_data | |
296 | + if not request.user.is_in_section(data['section']): | |
297 | + raise PermissionDenied("You have to be enrolled in this section to add a flashcard") | |
298 | + data['author'] = request.user | |
299 | + flashcard = Flashcard.objects.create(**data) | |
300 | + self.perform_create(flashcard) | |
301 | + headers = self.get_success_headers(data) | |
302 | + response_data = FlashcardSerializer(flashcard) | |
303 | + return Response(response_data.data, status=HTTP_201_CREATED, headers=headers) | |
299 | 304 | |
300 | 305 | @detail_route(methods=['post']) |
301 | 306 | def hide(self, request, pk): |