diff --git a/app/server/api.py b/app/server/api.py index 30d2aaea..a1c73c8d 100644 --- a/app/server/api.py +++ b/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) diff --git a/app/server/tests/test_api.py b/app/server/tests/test_api.py index a2cddde2..d693985a 100644 --- a/app/server/tests/test_api.py +++ b/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):