From b739ceb2492a1efc7801003bd5984ef7af147f7b Mon Sep 17 00:00:00 2001 From: Ali Nawaz Date: Thu, 28 Nov 2024 14:12:05 +0500 Subject: [PATCH 1/4] fix: add partner field to person documents --- course_discovery/apps/api/tests/test_serializers.py | 1 + course_discovery/apps/api/v1/tests/test_views/mixins.py | 8 ++++++-- .../apps/api/v1/tests/test_views/test_search.py | 9 +++++++++ .../course_metadata/search_indexes/documents/common.py | 8 ++++---- .../search_indexes/documents/learner_pathway.py | 4 ---- .../course_metadata/search_indexes/documents/person.py | 3 +++ .../course_metadata/search_indexes/documents/program.py | 4 ---- .../course_metadata/search_indexes/serializers/person.py | 1 + 8 files changed, 24 insertions(+), 14 deletions(-) diff --git a/course_discovery/apps/api/tests/test_serializers.py b/course_discovery/apps/api/tests/test_serializers.py index 2151123a04..fec2cdbc40 100644 --- a/course_discovery/apps/api/tests/test_serializers.py +++ b/course_discovery/apps/api/tests/test_serializers.py @@ -2593,6 +2593,7 @@ def get_expected_data(cls, person, request): 'profile_image_url': person.get_profile_image_url, 'full_name': person.full_name, 'organizations': [], + 'partner': person.partner.short_code, } def test_data(self): diff --git a/course_discovery/apps/api/v1/tests/test_views/mixins.py b/course_discovery/apps/api/v1/tests/test_views/mixins.py index fd59b60af7..96cf78cb7d 100644 --- a/course_discovery/apps/api/v1/tests/test_views/mixins.py +++ b/course_discovery/apps/api/v1/tests/test_views/mixins.py @@ -12,11 +12,11 @@ from course_discovery.apps.api.tests.mixins import SiteMixin from course_discovery.apps.core.tests.factories import USER_PASSWORD, UserFactory from course_discovery.apps.course_metadata.search_indexes.documents import ( - CourseDocument, CourseRunDocument, LearnerPathwayDocument, ProgramDocument + CourseDocument, CourseRunDocument, LearnerPathwayDocument, ProgramDocument, PersonDocument ) from course_discovery.apps.course_metadata.search_indexes.serializers import ( CourseRunSearchDocumentSerializer, CourseSearchDocumentSerializer, LearnerPathwaySearchDocumentSerializer, - ProgramSearchDocumentSerializer + ProgramSearchDocumentSerializer, PersonSearchDocumentSerializer ) from course_discovery.apps.course_metadata.tests import factories @@ -82,6 +82,10 @@ def serialize_course_run_search(self, run, serializer=None): def serialize_person(self, person, many=False, format=None, extra_context=None): return self._serialize_object(serializers.PersonSerializer, person, many, format, extra_context) + def serialize_person_search(self, person, serializer=None): + obj = self._get_search_result(PersonDocument, uuid=person.uuid) + return self._serialize_object(serializer or PersonSearchDocumentSerializer, obj) + def serialize_program(self, program, many=False, format=None, extra_context=None): return self._serialize_object( serializers.MinimalProgramSerializer if many else serializers.ProgramSerializer, diff --git a/course_discovery/apps/api/v1/tests/test_views/test_search.py b/course_discovery/apps/api/v1/tests/test_views/test_search.py index b477cc7324..ad4a93ed35 100644 --- a/course_discovery/apps/api/v1/tests/test_views/test_search.py +++ b/course_discovery/apps/api/v1/tests/test_views/test_search.py @@ -763,6 +763,15 @@ def test_results_include_aggregation_key(self): ) assert expected == actual + def test_results_include_person_objects(self): + """ Verify that a get against search/all includes person objects. """ + person = PersonFactory(partner=self.partner) + response = self.client.get(self.list_path) + assert response.status_code == 200 + response_data = response.json() + assert response_data["count"] == 1 + assert response_data["results"] == [self.serialize_person_search(person)] + @ddt.data((True, 10, 8), (False, 0, 4)) @ddt.unpack def test_learner_pathway_feature_flag(self, include_learner_pathways, expected_result_count, expected_query_count): diff --git a/course_discovery/apps/course_metadata/search_indexes/documents/common.py b/course_discovery/apps/course_metadata/search_indexes/documents/common.py index 1bf6f8fe87..076cf5514d 100644 --- a/course_discovery/apps/course_metadata/search_indexes/documents/common.py +++ b/course_discovery/apps/course_metadata/search_indexes/documents/common.py @@ -116,6 +116,10 @@ def __init__(self, *args, **kwargs): self._object = None aggregation_key = fields.KeywordField() + partner = fields.TextField( + analyzer=html_strip, + fields={'raw': fields.KeywordField(), 'lower': fields.TextField(analyzer=case_insensitive_keyword)} + ) content_type = fields.KeywordField() id = fields.KeywordField() organizations = fields.TextField(analyzer=html_strip, multi=True, fields={'raw': fields.KeywordField(multi=True)}) @@ -219,10 +223,6 @@ class BaseCourseDocument(OrganizationsMixin, BaseDocument): level_type = fields.TextField( fields={'raw': fields.KeywordField(), 'lower': fields.TextField(analyzer=case_insensitive_keyword)} ) - partner = fields.TextField( - analyzer=html_strip, - fields={'raw': fields.KeywordField(), 'lower': fields.TextField(analyzer=case_insensitive_keyword)} - ) outcome = fields.TextField() org = fields.TextField( analyzer=html_strip, diff --git a/course_discovery/apps/course_metadata/search_indexes/documents/learner_pathway.py b/course_discovery/apps/course_metadata/search_indexes/documents/learner_pathway.py index 0650355058..58263a66f8 100644 --- a/course_discovery/apps/course_metadata/search_indexes/documents/learner_pathway.py +++ b/course_discovery/apps/course_metadata/search_indexes/documents/learner_pathway.py @@ -30,10 +30,6 @@ class LearnerPathwayDocument(BaseDocument, OrganizationsMixin): 'edge_ngram_completion': fields.TextField(analyzer=edge_ngram_completion), }, ) - partner = fields.TextField( - analyzer=html_strip, - fields={'raw': fields.KeywordField(), 'lower': fields.TextField(analyzer=case_insensitive_keyword)} - ) visible_via_association = fields.BooleanField() status = fields.TextField() overview = fields.TextField() diff --git a/course_discovery/apps/course_metadata/search_indexes/documents/person.py b/course_discovery/apps/course_metadata/search_indexes/documents/person.py index 03a9a41e57..84e09a5706 100644 --- a/course_discovery/apps/course_metadata/search_indexes/documents/person.py +++ b/course_discovery/apps/course_metadata/search_indexes/documents/person.py @@ -29,6 +29,9 @@ class PersonDocument(BaseDocument): def prepare_aggregation_key(self, obj): return 'person:{}'.format(obj.uuid) + def prepare_partner(self, obj): + return obj.partner.short_code if obj.partner else '' + def prepare_bio_language(self, obj): if obj.bio_language: return obj.bio_language.name diff --git a/course_discovery/apps/course_metadata/search_indexes/documents/program.py b/course_discovery/apps/course_metadata/search_indexes/documents/program.py index 4c1e29a0f3..d350abc89f 100644 --- a/course_discovery/apps/course_metadata/search_indexes/documents/program.py +++ b/course_discovery/apps/course_metadata/search_indexes/documents/program.py @@ -43,10 +43,6 @@ class ProgramDocument(BaseDocument, OrganizationsMixin): marketing_url = fields.TextField() min_hours_effort_per_week = fields.IntegerField() max_hours_effort_per_week = fields.IntegerField() - partner = fields.TextField( - analyzer=html_strip, - fields={'raw': fields.KeywordField(), 'lower': fields.TextField(analyzer=case_insensitive_keyword)} - ) published = fields.BooleanField() subtitle = fields.TextField(analyzer=html_strip) status = fields.KeywordField() diff --git a/course_discovery/apps/course_metadata/search_indexes/serializers/person.py b/course_discovery/apps/course_metadata/search_indexes/serializers/person.py index 6c368348a4..85394819da 100644 --- a/course_discovery/apps/course_metadata/search_indexes/serializers/person.py +++ b/course_discovery/apps/course_metadata/search_indexes/serializers/person.py @@ -37,6 +37,7 @@ class Meta: 'profile_image_url', 'position', 'organizations', + 'partner' ) From e3b663e60b5c2044b8fa06ede964ecce52be94c0 Mon Sep 17 00:00:00 2001 From: Ali Nawaz Date: Thu, 28 Nov 2024 16:27:04 +0500 Subject: [PATCH 2/4] fix: remove field from serializer --- course_discovery/apps/api/tests/test_serializers.py | 1 - .../apps/course_metadata/search_indexes/serializers/person.py | 1 - 2 files changed, 2 deletions(-) diff --git a/course_discovery/apps/api/tests/test_serializers.py b/course_discovery/apps/api/tests/test_serializers.py index fec2cdbc40..2151123a04 100644 --- a/course_discovery/apps/api/tests/test_serializers.py +++ b/course_discovery/apps/api/tests/test_serializers.py @@ -2593,7 +2593,6 @@ def get_expected_data(cls, person, request): 'profile_image_url': person.get_profile_image_url, 'full_name': person.full_name, 'organizations': [], - 'partner': person.partner.short_code, } def test_data(self): diff --git a/course_discovery/apps/course_metadata/search_indexes/serializers/person.py b/course_discovery/apps/course_metadata/search_indexes/serializers/person.py index 85394819da..6c368348a4 100644 --- a/course_discovery/apps/course_metadata/search_indexes/serializers/person.py +++ b/course_discovery/apps/course_metadata/search_indexes/serializers/person.py @@ -37,7 +37,6 @@ class Meta: 'profile_image_url', 'position', 'organizations', - 'partner' ) From 181614c04774b4c4e7085539194d2db68106adcd Mon Sep 17 00:00:00 2001 From: Ali Nawaz Date: Mon, 2 Dec 2024 16:55:37 +0500 Subject: [PATCH 3/4] refactor: move prepare_partner to common --- .../apps/course_metadata/search_indexes/documents/common.py | 3 +++ .../apps/course_metadata/search_indexes/documents/course.py | 3 --- .../search_indexes/documents/learner_pathway.py | 3 --- .../apps/course_metadata/search_indexes/documents/person.py | 3 --- .../apps/course_metadata/search_indexes/documents/program.py | 3 --- 5 files changed, 3 insertions(+), 12 deletions(-) diff --git a/course_discovery/apps/course_metadata/search_indexes/documents/common.py b/course_discovery/apps/course_metadata/search_indexes/documents/common.py index 076cf5514d..078bc4eb8e 100644 --- a/course_discovery/apps/course_metadata/search_indexes/documents/common.py +++ b/course_discovery/apps/course_metadata/search_indexes/documents/common.py @@ -167,6 +167,9 @@ def _prepare_is_active(self, obj): def prepare_authoring_organization_uuids(self, obj): return [str(organization.uuid) for organization in obj.authoring_organizations.all()] + def prepare_partner(self, obj): + return obj.partner.short_code if obj.partner else '' + def prepare_content_type(self, obj): # pylint: disable=unused-argument return self.Django.model.__name__.lower() diff --git a/course_discovery/apps/course_metadata/search_indexes/documents/course.py b/course_discovery/apps/course_metadata/search_indexes/documents/course.py index 12d6ad2e6e..b2a493fff2 100644 --- a/course_discovery/apps/course_metadata/search_indexes/documents/course.py +++ b/course_discovery/apps/course_metadata/search_indexes/documents/course.py @@ -117,9 +117,6 @@ def prepare_status(self, obj): def prepare_start(self, obj): return [course_run.start for course_run in filter_visible_runs(obj.course_runs)] - def prepare_partner(self, obj): - return obj.partner.short_code - def prepare_prerequisites(self, obj): return [prerequisite.name for prerequisite in obj.prerequisites.all()] diff --git a/course_discovery/apps/course_metadata/search_indexes/documents/learner_pathway.py b/course_discovery/apps/course_metadata/search_indexes/documents/learner_pathway.py index 58263a66f8..079ea6c8b8 100644 --- a/course_discovery/apps/course_metadata/search_indexes/documents/learner_pathway.py +++ b/course_discovery/apps/course_metadata/search_indexes/documents/learner_pathway.py @@ -43,9 +43,6 @@ class LearnerPathwayDocument(BaseDocument, OrganizationsMixin): def prepare_aggregation_key(self, obj): return 'learnerpathway:{}'.format(obj.uuid) - def prepare_partner(self, obj): - return obj.partner.short_code if obj.partner else '' - def prepare_published(self, obj): return obj.status == PathwayStatus.Active diff --git a/course_discovery/apps/course_metadata/search_indexes/documents/person.py b/course_discovery/apps/course_metadata/search_indexes/documents/person.py index 84e09a5706..03a9a41e57 100644 --- a/course_discovery/apps/course_metadata/search_indexes/documents/person.py +++ b/course_discovery/apps/course_metadata/search_indexes/documents/person.py @@ -29,9 +29,6 @@ class PersonDocument(BaseDocument): def prepare_aggregation_key(self, obj): return 'person:{}'.format(obj.uuid) - def prepare_partner(self, obj): - return obj.partner.short_code if obj.partner else '' - def prepare_bio_language(self, obj): if obj.bio_language: return obj.bio_language.name diff --git a/course_discovery/apps/course_metadata/search_indexes/documents/program.py b/course_discovery/apps/course_metadata/search_indexes/documents/program.py index d350abc89f..25cc2d23dd 100644 --- a/course_discovery/apps/course_metadata/search_indexes/documents/program.py +++ b/course_discovery/apps/course_metadata/search_indexes/documents/program.py @@ -86,9 +86,6 @@ def prepare_language(self, obj): def prepare_organizations(self, obj): return self.prepare_authoring_organizations(obj) + self.prepare_credit_backing_organizations(obj) - def prepare_partner(self, obj): - return obj.partner.short_code - def prepare_published(self, obj): return obj.status == ProgramStatus.Active From 25d172c5af905f8024da94c65f2c3d789881a1b2 Mon Sep 17 00:00:00 2001 From: Ali Nawaz Date: Mon, 2 Dec 2024 17:04:27 +0500 Subject: [PATCH 4/4] style: chores --- course_discovery/apps/api/v1/tests/test_views/mixins.py | 4 ++-- .../search_indexes/documents/learner_pathway.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/course_discovery/apps/api/v1/tests/test_views/mixins.py b/course_discovery/apps/api/v1/tests/test_views/mixins.py index 96cf78cb7d..5d61bbff50 100644 --- a/course_discovery/apps/api/v1/tests/test_views/mixins.py +++ b/course_discovery/apps/api/v1/tests/test_views/mixins.py @@ -12,11 +12,11 @@ from course_discovery.apps.api.tests.mixins import SiteMixin from course_discovery.apps.core.tests.factories import USER_PASSWORD, UserFactory from course_discovery.apps.course_metadata.search_indexes.documents import ( - CourseDocument, CourseRunDocument, LearnerPathwayDocument, ProgramDocument, PersonDocument + CourseDocument, CourseRunDocument, LearnerPathwayDocument, PersonDocument, ProgramDocument ) from course_discovery.apps.course_metadata.search_indexes.serializers import ( CourseRunSearchDocumentSerializer, CourseSearchDocumentSerializer, LearnerPathwaySearchDocumentSerializer, - ProgramSearchDocumentSerializer, PersonSearchDocumentSerializer + PersonSearchDocumentSerializer, ProgramSearchDocumentSerializer ) from course_discovery.apps.course_metadata.tests import factories diff --git a/course_discovery/apps/course_metadata/search_indexes/documents/learner_pathway.py b/course_discovery/apps/course_metadata/search_indexes/documents/learner_pathway.py index 079ea6c8b8..3a07357fe1 100644 --- a/course_discovery/apps/course_metadata/search_indexes/documents/learner_pathway.py +++ b/course_discovery/apps/course_metadata/search_indexes/documents/learner_pathway.py @@ -7,7 +7,7 @@ from course_discovery.apps.learner_pathway.choices import PathwayStatus from course_discovery.apps.learner_pathway.models import LearnerPathway -from .analyzers import case_insensitive_keyword, edge_ngram_completion, html_strip, synonym_text +from .analyzers import edge_ngram_completion, synonym_text from .common import BaseDocument, OrganizationsMixin __all__ = ('LearnerPathwayDocument',)