Commit d7a4749f by muhammad-ammar

Paginate API

TNL-2453
parent 05dba592
...@@ -38,22 +38,3 @@ class Note(models.Model): ...@@ -38,22 +38,3 @@ class Note(models.Model):
note_dict['tags'] = json.dumps(note_dict.get('tags', list())) note_dict['tags'] = json.dumps(note_dict.get('tags', list()))
return cls(**note_dict) 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 unittest import TestCase
from notesapi.v1.models import Note from notesapi.v1.models import Note
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from notesapi.v1.serializers import NoteSerializer
class NoteTest(TestCase): class NoteTest(TestCase):
...@@ -27,7 +28,8 @@ class NoteTest(TestCase): ...@@ -27,7 +28,8 @@ class NoteTest(TestCase):
note = Note.create(self.note_dict.copy()) note = Note.create(self.note_dict.copy())
note.save() note.save()
result_note = note.as_dict() serializer = NoteSerializer(note)
result_note = serializer.data
del result_note['id'] del result_note['id']
del result_note['created'] del result_note['created']
del result_note['updated'] del result_note['updated']
...@@ -56,5 +58,6 @@ class NoteTest(TestCase): ...@@ -56,5 +58,6 @@ class NoteTest(TestCase):
note = Note.create(payload) note = Note.create(payload)
note.full_clean() note.full_clean()
note.save() note.save()
self.assertEqual("[]", note.tags) self.assertEqual("[]", note.tags)
self.assertEqual([], note.as_dict()["tags"]) self.assertEqual([], NoteSerializer(note).data["tags"])
...@@ -31,18 +31,18 @@ class UpdateIndexTest(BaseAnnotationViewTests): ...@@ -31,18 +31,18 @@ class UpdateIndexTest(BaseAnnotationViewTests):
end = datetime.datetime.now() end = datetime.datetime.now()
results = self._get_search_results(text='note') results = self._get_search_results(text='note')
self.assertEqual(results, {'rows': [], 'total': 0}) self.assertDictContainsSubset({'results': [], 'count': 0}, results)
# When second note was created. # When second note was created.
call_command('update_index', start_date=second_start.isoformat(), end_date=second_end.isoformat(), verbosity=0) call_command('update_index', start_date=second_start.isoformat(), end_date=second_end.isoformat(), verbosity=0)
results = self._get_search_results(text='note') results = self._get_search_results(text='note')
self.assertEqual(results['total'], 1) self.assertEqual(results['count'], 1)
self.assertEqual(results['rows'][0]['text'], 'Second note') self.assertEqual(results['results'][0]['text'], 'Second note')
# All notes. # All notes.
call_command('update_index', start_date=start.isoformat(), end_date=end.isoformat(), verbosity=0) call_command('update_index', start_date=start.isoformat(), end_date=end.isoformat(), verbosity=0)
results = self._get_search_results(text='note') results = self._get_search_results(text='note')
self.assertEqual(results['total'], 3) self.assertEqual(results['count'], 3)
@factory.django.mute_signals(signals.post_delete) @factory.django.mute_signals(signals.post_delete)
def test_delete(self): def test_delete(self):
...@@ -55,7 +55,7 @@ class UpdateIndexTest(BaseAnnotationViewTests): ...@@ -55,7 +55,7 @@ class UpdateIndexTest(BaseAnnotationViewTests):
self._create_annotation(text=u'Third note') self._create_annotation(text=u'Third note')
results = self._get_search_results(text='note') results = self._get_search_results(text='note')
self.assertEqual(results['total'], 3) self.assertEqual(results['count'], 3)
# Delete first note. # Delete first note.
url = reverse('api:v1:annotations_detail', kwargs={'annotation_id': first_note['id']}) url = reverse('api:v1:annotations_detail', kwargs={'annotation_id': first_note['id']})
...@@ -75,5 +75,5 @@ class UpdateIndexTest(BaseAnnotationViewTests): ...@@ -75,5 +75,5 @@ class UpdateIndexTest(BaseAnnotationViewTests):
results = self._get_search_results(text='note') results = self._get_search_results(text='note')
# When remove flag is provided, start and end flags do not play any role. # When remove flag is provided, start and end flags do not play any role.
self.assertEqual(results['total'], 1) self.assertEqual(results['count'], 1)
self.assertEqual(results['rows'][0]['text'], 'Third note') self.assertEqual(results['results'][0]['text'], 'Third note')
...@@ -63,7 +63,8 @@ LOGGING = get_logger_config() ...@@ -63,7 +63,8 @@ LOGGING = get_logger_config()
REST_FRAMEWORK = { REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [ 'DEFAULT_PERMISSION_CLASSES': [
'notesapi.v1.permissions.HasAccessToken' 'notesapi.v1.permissions.HasAccessToken'
] ],
'DEFAULT_PAGINATION_CLASS': 'notesapi.v1.paginators.NotesPaginator',
} }
CORS_ORIGIN_ALLOW_ALL = True 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