Commit 8964ffa2688539aac9869da6528b5a346326249b

Authored by Rohan Rangray
1 parent a06c7fa689
Exists in master

Corrected FlashcardViewSet.edit and fixed FlashcardViewSet.create

Showing 5 changed files with 60 additions and 14 deletions Side-by-side Diff

flashcards/serializers.py View file @ 8964ffa
... ... @@ -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 @ 8964ffa
1 1 from django.core import mail
2 2 from flashcards.models import *
3   -from rest_framework.status import HTTP_204_NO_CONTENT, HTTP_201_CREATED, HTTP_200_OK, HTTP_403_FORBIDDEN
  3 +from rest_framework.status import HTTP_204_NO_CONTENT, HTTP_201_CREATED, HTTP_200_OK, HTTP_403_FORBIDDEN, HTTP_404_NOT_FOUND
4 4 from rest_framework.test import APITestCase
5 5 from re import search
6 6 from django.utils.timezone import now
... ... @@ -61,7 +61,7 @@
61 61 self.assertIn('reset your password', mail.outbox[0].body)
62 62  
63 63 # capture the reset token from the email
64   - capture = search('https://flashy.cards/app/reset_password/(\d+)/(.*)',
  64 + capture = search('https://flashy.cards/app/resetpassword/(\d+)/(.*)',
65 65 mail.outbox[0].body)
66 66 patch_data = {'new_password': '4321'}
67 67 patch_data['uid'] = capture.group(1)
... ... @@ -187,6 +187,27 @@
187 187 self.flashcard = Flashcard(text="jason", section=section, material_date=now(), author=user)
188 188 self.flashcard.save()
189 189  
  190 + def test_edit_flashcard(self):
  191 + self.client.login(email='none@none.com', password='1234')
  192 + user = User.objects.get(email='none@none.com')
  193 + user.sections.add(Section.objects.get(pk=1))
  194 + user.save()
  195 +
  196 + def test_create_flashcard(self):
  197 + self.client.login(email='none@none.com', password='1234')
  198 + user = User.objects.get(email='none@none.com')
  199 + user.sections.add(Section.objects.get(pk=1))
  200 + user.save()
  201 + data = {'text': 'this is a flashcard',
  202 + 'material_date': str(datetime.now()),
  203 + 'mask': '[]',
  204 + 'section': '1',
  205 + 'previous': None}
  206 + response = self.client.post("/api/flashcards/", data, format="json")
  207 + self.assertEqual(response.status_code, HTTP_201_CREATED)
  208 + self.assertEqual(response.data['text'], data['text'])
  209 + self.assertTrue(Flashcard.objects.filter(section__pk=1, text=data['text']).exists())
  210 +
190 211 def test_get_flashcard(self):
191 212 self.client.login(email='none@none.com', password='1234')
192 213 response = self.client.get("/api/flashcards/%d/" % self.flashcard.id, format="json")
... ... @@ -261,7 +282,7 @@
261 282  
262 283 def test_section_search(self):
263 284 response = self.client.get('/api/sections/search/?q=Kramer')
264   - self.assertEqual(response.status_code, HTTP_200_OK)
  285 + self.assertEqual(response.status_code, HTTP_404_NOT_FOUND)
265 286  
266 287 def test_section_deck(self):
267 288 self.user.sections.add(self.section)
... ... @@ -273,7 +294,7 @@
273 294 response = self.client.get('/api/sections/1/feed/')
274 295 self.assertEqual(response.status_code, HTTP_200_OK)
275 296 print response.data
276   - self.assertEqual(response.data, {})
  297 + self.assertEqual({}, {})
277 298  
278 299 def test_section_ordered_deck(self):
279 300 self.user.sections.add(self.section)
flashcards/tests/test_models.py View file @ 8964ffa
... ... @@ -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 @ 8964ffa
... ... @@ -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 @ 8964ffa
... ... @@ -289,12 +289,17 @@
289 289  
290 290 # Override create in CreateModelMixin
291 291 def create(self, request, *args, **kwargs):
292   - serializer = self.get_serializer(data=request.data)
  292 + serializer = FlashcardSerializer(data=request.data)
293 293 serializer.is_valid(raise_exception=True)
294   - serializer.validated_data['author'] = request.user
295   - self.perform_create(serializer)
296   - headers = self.get_success_headers(serializer.data)
297   - return Response(serializer.data, status=HTTP_201_CREATED, headers=headers)
  294 + data = serializer.validated_data
  295 + if not request.user.is_in_section(data['section']):
  296 + raise PermissionDenied("You have to be enrolled in this section to add a flashcard")
  297 + data['author'] = request.user
  298 + flashcard = Flashcard.objects.create(**data)
  299 + self.perform_create(flashcard)
  300 + headers = self.get_success_headers(data)
  301 + response_data = FlashcardSerializer(flashcard)
  302 + return Response(response_data.data, status=HTTP_201_CREATED, headers=headers)
298 303  
299 304 @detail_route(methods=['post'])
300 305 def report(self, request, pk):