Browse Source

Add ordering documents by most/least recently updated annotation

Corresponding issue: #20
pull/110/head
Hironsan 5 years ago
parent
commit
463129c7e6
2 changed files with 26 additions and 3 deletions
  1. 3
      app/server/api.py
  2. 26
      app/server/tests/test_api.py

3
app/server/api.py

@ -87,7 +87,8 @@ class DocumentList(generics.ListCreateAPIView):
serializer_class = DocumentSerializer
filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
search_fields = ('text', )
ordering_fields = ('created_at', 'updated_at')
ordering_fields = ('created_at', 'updated_at', 'doc_annotations__updated_at',
'seq_annotations__updated_at')
filter_fields = ('doc_annotations__label__id', 'seq_annotations__label__id')
permission_classes = (IsAuthenticated, IsProjectUser, IsAdminUserAndWriteOnly)

26
app/server/tests/test_api.py

@ -530,8 +530,12 @@ class TestSearch(APITestCase):
cls.main_project = mixer.blend('server.Project', users=[project_member])
cls.search_term = 'example'
mixer.blend('server.Document', text=cls.search_term, project=cls.main_project)
mixer.blend('server.Document', text='Lorem', project=cls.main_project)
doc1 = mixer.blend('server.Document', text=cls.search_term, project=cls.main_project)
doc2 = mixer.blend('server.Document', text='Lorem', project=cls.main_project)
label1 = mixer.blend('server.Label', project=cls.main_project)
label2 = mixer.blend('server.Label', project=cls.main_project)
mixer.blend('server.SequenceAnnotation', document=doc1, user=project_member, label=label1)
mixer.blend('server.SequenceAnnotation', document=doc2, user=project_member, label=label2)
sub_project = mixer.blend('server.Project', users=[non_project_member])
mixer.blend('server.Document', text=cls.search_term, project=sub_project)
@ -564,6 +568,24 @@ class TestSearch(APITestCase):
for d1, d2 in zip(response.data['results'], docs):
self.assertEqual(d1['id'], d2['id'])
def test_can_order_doc_by_annotation_updated_at_ascending(self):
params = {'ordering': 'seq_annotations__updated_at'}
self.client.login(username=self.project_member_name,
password=self.project_member_pass)
response = self.client.get(self.url, format='json', data=params)
docs = Document.objects.filter(project=self.main_project).order_by('seq_annotations__updated_at').values()
for d1, d2 in zip(response.data['results'], docs):
self.assertEqual(d1['id'], d2['id'])
def test_can_order_doc_by_annotation_updated_at_descending(self):
params = {'ordering': '-seq_annotations__updated_at'}
self.client.login(username=self.project_member_name,
password=self.project_member_pass)
response = self.client.get(self.url, format='json', data=params)
docs = Document.objects.filter(project=self.main_project).order_by('-seq_annotations__updated_at').values()
for d1, d2 in zip(response.data['results'], docs):
self.assertEqual(d1['id'], d2['id'])
class TestFilter(APITestCase):

Loading…
Cancel
Save