Commit d7a4749f by muhammad-ammar

Paginate API

TNL-2453
parent 05dba592
......@@ -38,22 +38,3 @@ class Note(models.Model):
note_dict['tags'] = json.dumps(note_dict.get('tags', list()))
return cls(**note_dict)
def as_dict(self):
"""
Returns the note object as a dictionary.
"""
created = self.created.isoformat() if self.created else None
updated = self.updated.isoformat() if self.updated else None
return {
'id': str(self.pk),
'user': self.user_id,
'course_id': self.course_id,
'usage_id': self.usage_id,
'text': self.text,
'quote': self.quote,
'ranges': json.loads(self.ranges),
'created': created,
'updated': updated,
'tags': json.loads(self.tags)
}
"""
Paginator for Notes.
"""
from rest_framework import pagination
from rest_framework.response import Response
class NotesPaginator(pagination.PageNumberPagination):
"""
Student Notes Paginator.
"""
page_size = 10
page_size_query_param = "page_size"
def get_paginated_response(self, data):
"""
Annotate the response with pagination information.
"""
return Response({
'current': self.page.number,
'next': self.get_next_link(),
'previous': self.get_previous_link(),
'count': self.page.paginator.count,
'num_pages': self.page.paginator.num_pages,
'results': data
})
"""
Serializers for Notes API.
"""
import json
from rest_framework import serializers
from notesapi.v1.models import Note
class NoteSerializer(serializers.ModelSerializer):
"""
Student Notes Model Serializer.
"""
class Meta(object):
"""
Model Serializer Meta Class.
"""
model = Note
exclude = ('user_id',)
id = serializers.CharField(source='pk')
user = serializers.CharField(source='user_id')
ranges = serializers.SerializerMethodField()
tags = serializers.SerializerMethodField()
def get_ranges(self, note):
"""
Return note ranges.
"""
return json.loads(note.ranges)
def get_tags(self, note):
"""
Return note tags.
"""
return json.loads(note.tags)
class NotesElasticSearchSerializer(serializers.Serializer): # pylint: disable=abstract-method
"""
Student Notes Elastic Search Serializer.
"""
id = serializers.CharField(source='pk')
user = serializers.CharField()
created = serializers.DateTimeField()
updated = serializers.DateTimeField()
quote = serializers.CharField()
course_id = serializers.CharField()
usage_id = serializers.CharField()
text = serializers.SerializerMethodField()
ranges = serializers.SerializerMethodField()
tags = serializers.SerializerMethodField()
def get_text(self, note):
"""
Return note text.
"""
if note.highlighted:
return note.highlighted[0].decode('unicode_escape')
return note.text
def get_ranges(self, note):
"""
Return note ranges.
"""
return json.loads(note.ranges)
def get_tags(self, note):
"""
Return note tags.
"""
if note.highlighted_tags:
return json.loads(note.highlighted_tags[0])
return json.loads(note.tags) if note.tags else []
from unittest import TestCase
from notesapi.v1.models import Note
from django.core.exceptions import ValidationError
from notesapi.v1.serializers import NoteSerializer
class NoteTest(TestCase):
......@@ -27,7 +28,8 @@ class NoteTest(TestCase):
note = Note.create(self.note_dict.copy())
note.save()
result_note = note.as_dict()
serializer = NoteSerializer(note)
result_note = serializer.data
del result_note['id']
del result_note['created']
del result_note['updated']
......@@ -56,5 +58,6 @@ class NoteTest(TestCase):
note = Note.create(payload)
note.full_clean()
note.save()
self.assertEqual("[]", note.tags)
self.assertEqual([], note.as_dict()["tags"])
self.assertEqual([], NoteSerializer(note).data["tags"])
......@@ -31,18 +31,18 @@ class UpdateIndexTest(BaseAnnotationViewTests):
end = datetime.datetime.now()
results = self._get_search_results(text='note')
self.assertEqual(results, {'rows': [], 'total': 0})
self.assertDictContainsSubset({'results': [], 'count': 0}, results)
# When second note was created.
call_command('update_index', start_date=second_start.isoformat(), end_date=second_end.isoformat(), verbosity=0)
results = self._get_search_results(text='note')
self.assertEqual(results['total'], 1)
self.assertEqual(results['rows'][0]['text'], 'Second note')
self.assertEqual(results['count'], 1)
self.assertEqual(results['results'][0]['text'], 'Second note')
# All notes.
call_command('update_index', start_date=start.isoformat(), end_date=end.isoformat(), verbosity=0)
results = self._get_search_results(text='note')
self.assertEqual(results['total'], 3)
self.assertEqual(results['count'], 3)
@factory.django.mute_signals(signals.post_delete)
def test_delete(self):
......@@ -55,7 +55,7 @@ class UpdateIndexTest(BaseAnnotationViewTests):
self._create_annotation(text=u'Third note')
results = self._get_search_results(text='note')
self.assertEqual(results['total'], 3)
self.assertEqual(results['count'], 3)
# Delete first note.
url = reverse('api:v1:annotations_detail', kwargs={'annotation_id': first_note['id']})
......@@ -75,5 +75,5 @@ class UpdateIndexTest(BaseAnnotationViewTests):
results = self._get_search_results(text='note')
# When remove flag is provided, start and end flags do not play any role.
self.assertEqual(results['total'], 1)
self.assertEqual(results['rows'][0]['text'], 'Third note')
self.assertEqual(results['count'], 1)
self.assertEqual(results['results'][0]['text'], 'Third note')
......@@ -63,7 +63,8 @@ LOGGING = get_logger_config()
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'notesapi.v1.permissions.HasAccessToken'
]
],
'DEFAULT_PAGINATION_CLASS': 'notesapi.v1.paginators.NotesPaginator',
}
CORS_ORIGIN_ALLOW_ALL = True
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment