Commit c91a932f6e439e3c9e9170823bad3073d10433d4

Authored by Chung Wang
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):