From f3f9a1bf5497ad37320ba3fe99f3c6ab52a4fb13 Mon Sep 17 00:00:00 2001 From: Sujeet Kumar Gupta Date: Tue, 19 May 2026 09:07:50 +0000 Subject: [PATCH] chore: Added b2c_subscription_inclusion field with boolean value --- course_discovery/apps/api/serializers.py | 20 +++++++++++-------- .../apps/course_metadata/admin.py | 6 +++--- .../apps/course_metadata/models.py | 19 ++++++++++++++++++ 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/course_discovery/apps/api/serializers.py b/course_discovery/apps/api/serializers.py index 3f60a54992..04aa7572e0 100644 --- a/course_discovery/apps/api/serializers.py +++ b/course_discovery/apps/api/serializers.py @@ -446,7 +446,7 @@ class Meta(MinimalOrganizationSerializer.Meta): 'marketing_url', 'slug', 'banner_image_url', - 'enterprise_subscription_inclusion', + 'enterprise_subscription_inclusion', 'b2c_subscription_inclusion', ) read_only_fields = ('slug',) @@ -1075,6 +1075,7 @@ class CourseRunSerializer(MinimalCourseRunSerializer): estimated_hours = serializers.SerializerMethodField() enterprise_subscription_inclusion = serializers.BooleanField(required=False) +b2c_subscription_inclusion = serializers.BooleanField(required=False) @classmethod def prefetch_queryset(cls, queryset=None): queryset = super().prefetch_queryset(queryset=queryset) @@ -1102,11 +1103,11 @@ class Meta(MinimalCourseRunSerializer.Meta): 'level_type', 'mobile_available', 'hidden', 'reporting_type', 'eligible_for_financial_aid', 'first_enrollable_paid_seat_price', 'has_ofac_restrictions', 'ofac_comment', 'enrollment_count', 'recent_enrollment_count', 'expected_program_type', 'expected_program_name', - 'course_uuid', 'estimated_hours', 'content_language_search_facet_name', 'enterprise_subscription_inclusion', + 'course_uuid', 'estimated_hours', 'content_language_search_facet_name', 'enterprise_subscription_inclusion', 'b2c_subscription_inclusion', 'transcript_languages_search_facet_names', 'ai_languages' ) read_only_fields = ('enrollment_count', 'recent_enrollment_count', 'content_language_search_facet_name', - 'enterprise_subscription_inclusion', 'ai_languages') + 'enterprise_subscription_inclusion', 'b2c_subscription_inclusion', 'ai_languages') def get_instructors(self, obj): # pylint: disable=unused-argument # This field is deprecated. Use the staff field. @@ -1217,6 +1218,7 @@ class MinimalCourseSerializer(FlexFieldsSerializerMixin, TimestampModelSerialize course_type = serializers.SerializerMethodField() enterprise_subscription_inclusion = serializers.BooleanField(required=False) course_run_statuses = serializers.ReadOnlyField() + b2c_subscription_inclusion = serializers.BooleanField(required=False) @classmethod def prefetch_queryset(cls, queryset=None, course_runs=None): @@ -1257,7 +1259,7 @@ def prefetch_course_runs(cls, serializer_class, course_runs=None): class Meta: model = Course fields = ('key', 'uuid', 'title', 'course_runs', 'entitlements', 'owners', 'image', - 'short_description', 'type', 'url_slug', 'course_type', 'enterprise_subscription_inclusion', + 'short_description', 'type', 'url_slug', 'course_type', 'enterprise_subscription_inclusion', 'b2c_subscription_inclusion', 'excluded_from_seo', 'excluded_from_search', 'course_run_statuses') @@ -1361,6 +1363,7 @@ class CourseSerializer(TaggitSerializer, MinimalCourseSerializer): skills = serializers.SerializerMethodField() enterprise_subscription_inclusion = serializers.BooleanField(required=False) geolocation = GeoLocationSerializer(required=False, allow_null=True) + b2c_subscription_inclusion = serializers.BooleanField(required=False) location_restriction = CourseLocationRestrictionSerializer(required=False) in_year_value = ProductValueSerializer(required=False) product_source = SlugRelatedFieldWithReadSerializer( @@ -1435,10 +1438,10 @@ class Meta(MinimalCourseSerializer.Meta): 'enrollment_count', 'recent_enrollment_count', 'topics', 'partner', 'key_for_reruns', 'url_slug', 'url_slug_history', 'url_redirects', 'course_run_statuses', 'editors', 'collaborators', 'skill_names', 'skills', 'organization_short_code_override', 'organization_logo_override_url', - 'enterprise_subscription_inclusion', 'geolocation', 'location_restriction', 'in_year_value', + 'enterprise_subscription_inclusion', 'b2c_subscription_inclusion', 'geolocation', 'location_restriction', 'in_year_value', 'product_source', 'data_modified_timestamp', 'excluded_from_search', 'excluded_from_seo', 'watchers', ) - read_only_fields = ('enterprise_subscription_inclusion', 'product_source', 'data_modified_timestamp') + read_only_fields = ('enterprise_subscription_inclusion', 'b2c_subscription_inclusion', 'product_source', 'data_modified_timestamp') extra_kwargs = { 'partner': {'write_only': True} } @@ -2252,6 +2255,7 @@ class ProgramSerializer(MinimalProgramSerializer): topics = serializers.SerializerMethodField() enterprise_subscription_inclusion = serializers.BooleanField() geolocation = GeoLocationSerializer(required=False, allow_null=True) + b2c_subscription_inclusion = serializers.BooleanField(required=False) location_restriction = ProgramLocationRestrictionSerializer(read_only=True) is_2u_degree_program = serializers.BooleanField() in_year_value = ProductValueSerializer(required=False) @@ -2333,11 +2337,11 @@ class Meta(MinimalProgramSerializer.Meta): 'faq', 'credit_backing_organizations', 'corporate_endorsements', 'job_outlook_items', 'individual_endorsements', 'languages', 'transcript_languages', 'subjects', 'price_ranges', 'staff', 'credit_redemption_overview', 'applicable_seat_types', 'instructor_ordering', - 'enrollment_count', 'topics', 'credit_value', 'enterprise_subscription_inclusion', 'geolocation', + 'enrollment_count', 'topics', 'credit_value', 'enterprise_subscription_inclusion', 'b2c_subscription_inclusion', 'geolocation', 'location_restriction', 'is_2u_degree_program', 'in_year_value', 'skill_names', 'skills', 'product_source', 'excluded_from_search', 'excluded_from_seo', ) - read_only_fields = ('enterprise_subscription_inclusion', 'product_source',) + read_only_fields = ('enterprise_subscription_inclusion', 'b2c_subscription_inclusion', 'product_source',) class PathwaySerializer(BaseModelSerializer): diff --git a/course_discovery/apps/course_metadata/admin.py b/course_discovery/apps/course_metadata/admin.py index 3f3c47fc45..387ec9f64b 100644 --- a/course_discovery/apps/course_metadata/admin.py +++ b/course_discovery/apps/course_metadata/admin.py @@ -312,7 +312,7 @@ class CourseRunAdmin(SimpleHistoryAdmin): ordering = ('key',) raw_id_fields = ('course', 'draft_version',) readonly_fields = [ - 'enrollment_count', 'recent_enrollment_count', 'hidden', 'key', 'enterprise_subscription_inclusion', + 'enrollment_count', 'recent_enrollment_count', 'hidden', 'key', 'enterprise_subscription_inclusion', 'b2c_subscription_inclusion', 'variant_id', 'fixed_price_usd', 'ai_languages' ] search_fields = ('uuid', 'key', 'title_override', 'course__title', 'slug', 'external_key', 'variant_id') @@ -451,7 +451,7 @@ class ProgramAdmin(DjangoObjectActions, SimpleHistoryAdmin): ordering = ('uuid', 'title', 'status') readonly_fields = ( 'uuid', 'custom_course_runs_display', 'excluded_course_runs', 'enrollment_count', 'recent_enrollment_count', - 'enterprise_subscription_inclusion', 'ofac_comment', 'data_modified_timestamp' + 'enterprise_subscription_inclusion', 'b2c_subscription_inclusion', 'ofac_comment', 'data_modified_timestamp' ) raw_id_fields = ('video',) autocomplete_fields = ( @@ -470,7 +470,7 @@ class ProgramAdmin(DjangoObjectActions, SimpleHistoryAdmin): 'corporate_endorsements', 'faq', 'individual_endorsements', 'job_outlook_items', 'expected_learning_items', 'instructor_ordering', 'enrollment_count', 'recent_enrollment_count', 'credit_value', 'organization_short_code_override', 'organization_logo_override', 'primary_subject_override', - 'level_type_override', 'language_override', 'enterprise_subscription_inclusion', 'in_year_value', 'labels', + 'level_type_override', 'language_override', 'enterprise_subscription_inclusion', 'b2c_subscription_inclusion', 'in_year_value', 'labels', 'geolocation', 'program_duration_override', 'has_ofac_restrictions', 'ofac_comment', 'data_modified_timestamp', 'excluded_from_search', 'excluded_from_seo' ) diff --git a/course_discovery/apps/course_metadata/models.py b/course_discovery/apps/course_metadata/models.py index 6139d3ecdd..9312afd4fb 100644 --- a/course_discovery/apps/course_metadata/models.py +++ b/course_discovery/apps/course_metadata/models.py @@ -286,6 +286,10 @@ class Organization(ManageHistoryMixin, CachedMixin, TimeStampedModel): default=False, help_text=_('This field signifies if any of this org\'s courses are in the enterprise subscription catalog'), ) + b2c_subscription_inclusion = models.BooleanField( + default=False, + help_text=_('This field signifies if any of this org\'s courses are in the B2C subscription catalog'), + ) organization_hex_color = models.CharField( help_text=_("""The 6 character-hex-value of the orgnization theme color, all related course under same organization will use this color as theme color. @@ -1564,6 +1568,11 @@ class Course(ManageHistoryMixin, DraftModelMixin, PkSearchableMixin, CachedMixin help_text=_('This field signifies if this course is in the enterprise subscription catalog'), ) + b2c_subscription_inclusion = models.BooleanField( + null=True, + help_text=_('This field signifies if this course is in the B2C subscription catalog'), + ) + excluded_from_search = models.BooleanField( null=True, blank=True, @@ -2399,6 +2408,11 @@ class CourseRun(ManageHistoryMixin, DraftModelMixin, CachedMixin, TimeStampedMod help_text=_('This calculated field signifies if this course run is in the enterprise subscription catalog'), ) + b2c_subscription_inclusion = models.BooleanField( + default=False, + help_text=_('This calculated field signifies if this course run is in the B2C subscription catalog'), + ) + variant_id = models.UUIDField( blank=True, null=True, editable=True, help_text=_( @@ -3509,6 +3523,11 @@ class Program(ManageHistoryMixin, PkSearchableMixin, TimeStampedModel): in_year_value = models.ForeignKey( ProductValue, models.SET_NULL, related_name='programs', default=None, null=True, blank=True ) + b2c_subscription_inclusion = models.BooleanField( + null=True, + help_text=_('This field signifies if this course is in the B2C subscription catalog'), + ) + excluded_from_search = models.BooleanField( null=True, blank=True,