diff --git a/src/organizations/views.py b/src/organizations/views.py index d98d790..8d29e3e 100644 --- a/src/organizations/views.py +++ b/src/organizations/views.py @@ -105,6 +105,8 @@ SOURCE_RECORD_ORDERING_FIELDS = ( "extension__organization__okpo", "status", "payload__attestation_status", + "payload__sentiment", + "payload__news_source", ) SOURCE_RECORD_ORDERING_VALUES = [ value @@ -227,8 +229,9 @@ SOURCE_RECORD_LIST_PARAMS = [ "extension__organization__full_name, created_at, updated_at, title, " "uid, extension__organization__inn, extension__organization__ogrn, " "extension__organization__okpo, status, " - "payload__attestation_status. Для обратной сортировки используйте " - "префикс -. Значения record_date с null сортируются последними." + "payload__attestation_status, payload__sentiment, " + "payload__news_source. Для обратной сортировки используйте префикс -. " + "Значения record_date с null сортируются последними." ), enum=SOURCE_RECORD_ORDERING_VALUES, ), diff --git a/tests/apps/organizations/test_api_v2.py b/tests/apps/organizations/test_api_v2.py index 6682fd7..2a2e4e8 100644 --- a/tests/apps/organizations/test_api_v2.py +++ b/tests/apps/organizations/test_api_v2.py @@ -207,6 +207,21 @@ class OrganizationsApiV2Test(APITestCase): ) self.assertIn("/api/v2/organizations/{uid}/sources/", paths) self.assertIn("/api/v2/organization-sources/{uid}/records/", paths) + source_record_list_operation = paths[ + "/api/v2/organization-source-records/" + ]["get"] + source_record_parameters = { + parameter["name"]: parameter + for parameter in source_record_list_operation["parameters"] + } + source_record_ordering_values = source_record_parameters["ordering"]["enum"] + for ordering_value in ( + "payload__sentiment", + "-payload__sentiment", + "payload__news_source", + "-payload__news_source", + ): + self.assertIn(ordering_value, source_record_ordering_values) def test_retrieve_returns_item_by_uid(self): organization = create_frontend_organization( diff --git a/tests/apps/organizations/test_api_v2_source_extensions.py b/tests/apps/organizations/test_api_v2_source_extensions.py index a72543b..c083ec5 100644 --- a/tests/apps/organizations/test_api_v2_source_extensions.py +++ b/tests/apps/organizations/test_api_v2_source_extensions.py @@ -7,6 +7,7 @@ from django.urls import reverse from organizations.models import ( ArbitrationExtension, ElectronicDocumentExchangeExtension, + MediaMentionExtension, Organization, OrganizationSourceRecord, PlannedInspectionExtension, @@ -388,6 +389,54 @@ class OrganizationSourceExtensionsApiV2Test(APITestCase): expected, ) + def test_flat_media_records_support_frontend_sorting_fields(self): + organization = create_frontend_organization( + name="Media sorting organization", + inn="7707083817", + ogrn="1027700132017", + ) + extension = MediaMentionExtension.objects.create( + organization=organization, + title="Media mentions", + ) + for external_id, news_source, sentiment in ( + ("NEWS-ZULU", "Zulu Media", "negative"), + ("NEWS-ALPHA", "Alpha Media", "positive"), + ): + OrganizationSourceRecord.objects.create( + extension=extension, + record_type="media_mention", + source="media_news", + external_id=external_id, + status=sentiment, + payload={ + "news_source": news_source, + "sentiment": sentiment, + }, + ) + + endpoint = reverse("api_v2:organizations:organization-source-records-list") + params = { + "source_group": "media_mentions", + "source": "media_news", + "record_type": "media_mention", + } + + for ordering, expected in ( + ("payload__news_source", ["NEWS-ALPHA", "NEWS-ZULU"]), + ("-payload__news_source", ["NEWS-ZULU", "NEWS-ALPHA"]), + ("payload__sentiment", ["NEWS-ZULU", "NEWS-ALPHA"]), + ("-payload__sentiment", ["NEWS-ALPHA", "NEWS-ZULU"]), + ): + with self.subTest(ordering=ordering): + response = self.client.get(endpoint, {**params, "ordering": ordering}) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual( + [item["external_id"] for item in response.data["data"]], + expected, + ) + def test_flat_source_records_rejects_invalid_date_range_and_ordering(self): response = self.client.get( reverse("api_v2:organizations:organization-source-records-list"),