Commit e60aaeaa by Clinton Blackburn Committed by Clinton Blackburn

Replaced usage of the Program category field with type

ECOM-5173
parent 82d9dcd5
...@@ -10,7 +10,7 @@ from rest_framework.fields import DictField ...@@ -10,7 +10,7 @@ from rest_framework.fields import DictField
from course_discovery.apps.catalogs.models import Catalog from course_discovery.apps.catalogs.models import Catalog
from course_discovery.apps.course_metadata.models import ( from course_discovery.apps.course_metadata.models import (
Course, CourseRun, Image, Organization, Person, Prerequisite, Seat, Subject, Video, Program Course, CourseRun, Image, Organization, Person, Prerequisite, Seat, Subject, Video, Program, ProgramType,
) )
from course_discovery.apps.course_metadata.search_indexes import CourseIndex, CourseRunIndex, ProgramIndex from course_discovery.apps.course_metadata.search_indexes import CourseIndex, CourseRunIndex, ProgramIndex
...@@ -50,7 +50,7 @@ PROGRAM_FACET_FIELD_OPTIONS = { ...@@ -50,7 +50,7 @@ PROGRAM_FACET_FIELD_OPTIONS = {
} }
PROGRAM_SEARCH_FIELDS = ( PROGRAM_SEARCH_FIELDS = (
'text', 'uuid', 'title', 'subtitle', 'category', 'marketing_url', 'organizations', 'content_type', 'status', 'text', 'uuid', 'title', 'subtitle', 'type', 'marketing_url', 'organizations', 'content_type', 'status',
'card_image_url', 'card_image_url',
) )
...@@ -264,10 +264,11 @@ class ContainedCoursesSerializer(serializers.Serializer): ...@@ -264,10 +264,11 @@ class ContainedCoursesSerializer(serializers.Serializer):
class ProgramSerializer(serializers.ModelSerializer): class ProgramSerializer(serializers.ModelSerializer):
courses = CourseSerializer(many=True) courses = CourseSerializer(many=True)
authoring_organizations = OrganizationSerializer(many=True) authoring_organizations = OrganizationSerializer(many=True)
type = serializers.SlugRelatedField(slug_field='name', queryset=ProgramType.objects.all())
class Meta: class Meta:
model = Program model = Program
fields = ('uuid', 'title', 'subtitle', 'category', 'marketing_slug', 'marketing_url', 'card_image_url', fields = ('uuid', 'title', 'subtitle', 'type', 'marketing_slug', 'marketing_url', 'card_image_url',
'banner_image_url', 'authoring_organizations', 'courses',) 'banner_image_url', 'authoring_organizations', 'courses',)
read_only_fields = ('uuid', 'marketing_url',) read_only_fields = ('uuid', 'marketing_url',)
......
...@@ -181,7 +181,7 @@ class ProgramSerializerTests(TestCase): ...@@ -181,7 +181,7 @@ class ProgramSerializerTests(TestCase):
'uuid': str(program.uuid), 'uuid': str(program.uuid),
'title': program.title, 'title': program.title,
'subtitle': program.subtitle, 'subtitle': program.subtitle,
'category': program.category, 'type': program.type.name,
'marketing_slug': program.marketing_slug, 'marketing_slug': program.marketing_slug,
'marketing_url': program.marketing_url, 'marketing_url': program.marketing_url,
'card_image_url': program.card_image_url, 'card_image_url': program.card_image_url,
...@@ -409,7 +409,7 @@ class ProgramSearchSerializerTests(TestCase): ...@@ -409,7 +409,7 @@ class ProgramSearchSerializerTests(TestCase):
'uuid': str(program.uuid), 'uuid': str(program.uuid),
'title': program.title, 'title': program.title,
'subtitle': program.subtitle, 'subtitle': program.subtitle,
'category': program.category, 'type': program.type.name,
'marketing_url': program.marketing_url, 'marketing_url': program.marketing_url,
'organizations': expected_organizations, 'organizations': expected_organizations,
'content_type': 'program', 'content_type': 'program',
......
...@@ -7,7 +7,7 @@ from course_discovery.apps.core.models import Currency ...@@ -7,7 +7,7 @@ from course_discovery.apps.core.models import Currency
from course_discovery.apps.course_metadata.data_loaders import AbstractDataLoader from course_discovery.apps.course_metadata.data_loaders import AbstractDataLoader
from course_discovery.apps.course_metadata.models import ( from course_discovery.apps.course_metadata.models import (
Image, Video, Organization, Seat, CourseRun, Program, Course, CourseOrganization, Image, Video, Organization, Seat, CourseRun, Program, Course, CourseOrganization,
) ProgramType)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -240,6 +240,11 @@ class ProgramsApiDataLoader(AbstractDataLoader): ...@@ -240,6 +240,11 @@ class ProgramsApiDataLoader(AbstractDataLoader):
""" Loads programs from the Programs API. """ """ Loads programs from the Programs API. """
image_width = 1440 image_width = 1440
image_height = 480 image_height = 480
XSERIES = None
def __init__(self, partner, api_url, access_token=None, token_type=None):
super(ProgramsApiDataLoader, self).__init__(partner, api_url, access_token, token_type)
self.XSERIES = ProgramType.objects.get(name='XSeries')
def ingest(self): def ingest(self):
api_url = self.partner.programs_api_url api_url = self.partner.programs_api_url
...@@ -272,7 +277,7 @@ class ProgramsApiDataLoader(AbstractDataLoader): ...@@ -272,7 +277,7 @@ class ProgramsApiDataLoader(AbstractDataLoader):
defaults = { defaults = {
'title': body['name'], 'title': body['name'],
'subtitle': body['subtitle'], 'subtitle': body['subtitle'],
'category': body['category'], 'type': self.XSERIES,
'status': body['status'], 'status': body['status'],
'marketing_slug': body['marketing_slug'], 'marketing_slug': body['marketing_slug'],
'banner_image_url': self._get_banner_image_url(body), 'banner_image_url': self._get_banner_image_url(body),
......
...@@ -274,7 +274,6 @@ class XSeriesMarketingSiteDataLoader(AbstractMarketingSiteDataLoader): ...@@ -274,7 +274,6 @@ class XSeriesMarketingSiteDataLoader(AbstractMarketingSiteDataLoader):
data = { data = {
'subtitle': data.get('field_xseries_subtitle_short'), 'subtitle': data.get('field_xseries_subtitle_short'),
'category': 'XSeries',
'card_image_url': card_image_url, 'card_image_url': card_image_url,
'overview': overview, 'overview': overview,
'video': self.get_or_create_video(video_url) 'video': self.get_or_create_video(video_url)
......
...@@ -14,12 +14,12 @@ from course_discovery.apps.course_metadata.data_loaders.api import ( ...@@ -14,12 +14,12 @@ from course_discovery.apps.course_metadata.data_loaders.api import (
from course_discovery.apps.course_metadata.data_loaders.tests import JSON from course_discovery.apps.course_metadata.data_loaders.tests import JSON
from course_discovery.apps.course_metadata.data_loaders.tests.mixins import ApiClientTestMixin, DataLoaderTestMixin from course_discovery.apps.course_metadata.data_loaders.tests.mixins import ApiClientTestMixin, DataLoaderTestMixin
from course_discovery.apps.course_metadata.models import ( from course_discovery.apps.course_metadata.models import (
Course, CourseRun, Image, Organization, Seat, Program Course, CourseRun, Image, Organization, Seat, Program, ProgramType,
) )
from course_discovery.apps.course_metadata.tests import mock_data from course_discovery.apps.course_metadata.tests import mock_data
from course_discovery.apps.course_metadata.tests.factories import ( from course_discovery.apps.course_metadata.tests.factories import (
CourseRunFactory, SeatFactory, ImageFactory, PersonFactory, VideoFactory, CourseRunFactory, SeatFactory, ImageFactory, PersonFactory, VideoFactory, OrganizationFactory, CourseFactory,
OrganizationFactory, CourseFactory) )
LOGGER_PATH = 'course_discovery.apps.course_metadata.data_loaders.api.logger' LOGGER_PATH = 'course_discovery.apps.course_metadata.data_loaders.api.logger'
...@@ -392,9 +392,11 @@ class ProgramsApiDataLoaderTests(ApiClientTestMixin, DataLoaderTestMixin, TestCa ...@@ -392,9 +392,11 @@ class ProgramsApiDataLoaderTests(ApiClientTestMixin, DataLoaderTestMixin, TestCa
program = Program.objects.get(uuid=AbstractDataLoader.clean_string(body['uuid']), partner=self.partner) program = Program.objects.get(uuid=AbstractDataLoader.clean_string(body['uuid']), partner=self.partner)
self.assertEqual(program.title, body['name']) self.assertEqual(program.title, body['name'])
for attr in ('subtitle', 'category', 'status', 'marketing_slug',): for attr in ('subtitle', 'status', 'marketing_slug',):
self.assertEqual(getattr(program, attr), AbstractDataLoader.clean_string(body[attr])) self.assertEqual(getattr(program, attr), AbstractDataLoader.clean_string(body[attr]))
self.assertEqual(program.type, ProgramType.objects.get(name='XSeries'))
keys = [org['key'] for org in body['organizations']] keys = [org['key'] for org in body['organizations']]
expected_organizations = list(Organization.objects.filter(key__in=keys)) expected_organizations = list(Organization.objects.filter(key__in=keys))
self.assertEqual(keys, [org.key for org in expected_organizations]) self.assertEqual(keys, [org.key for org in expected_organizations])
......
...@@ -328,7 +328,6 @@ class XSeriesMarketingSiteDataLoaderTests(AbstractMarketingSiteDataLoaderTestMix ...@@ -328,7 +328,6 @@ class XSeriesMarketingSiteDataLoaderTests(AbstractMarketingSiteDataLoaderTestMix
self.assertEqual(program.overview, overview) self.assertEqual(program.overview, overview)
self.assertEqual(program.subtitle, data.get('field_xseries_subtitle_short')) self.assertEqual(program.subtitle, data.get('field_xseries_subtitle_short'))
self.assertEqual(program.category, 'XSeries')
card_image_url = data.get('field_card_image', {}).get('url') card_image_url = data.get('field_card_image', {}).get('url')
self.assertEqual(program.card_image_url, card_image_url) self.assertEqual(program.card_image_url, card_image_url)
......
...@@ -561,7 +561,7 @@ class Program(TimeStampedModel): ...@@ -561,7 +561,7 @@ class Program(TimeStampedModel):
@property @property
def marketing_url(self): def marketing_url(self):
if self.marketing_slug: if self.marketing_slug:
path = '{category}/{slug}'.format(category=self.category, slug=self.marketing_slug) path = '{type}/{slug}'.format(type=self.type.name.lower(), slug=self.marketing_slug)
return urljoin(self.partner.marketing_site_url_root, path) return urljoin(self.partner.marketing_site_url_root, path)
return None return None
......
...@@ -112,7 +112,7 @@ class ProgramIndex(BaseIndex, indexes.Indexable, OrganizationsMixin): ...@@ -112,7 +112,7 @@ class ProgramIndex(BaseIndex, indexes.Indexable, OrganizationsMixin):
uuid = indexes.CharField(model_attr='uuid') uuid = indexes.CharField(model_attr='uuid')
title = indexes.CharField(model_attr='title') title = indexes.CharField(model_attr='title')
subtitle = indexes.CharField(model_attr='subtitle') subtitle = indexes.CharField(model_attr='subtitle')
category = indexes.CharField(model_attr='category', faceted=True) type = indexes.CharField(model_attr='type__name', faceted=True)
marketing_url = indexes.CharField(null=True) marketing_url = indexes.CharField(null=True)
organizations = indexes.MultiValueField(faceted=True) organizations = indexes.MultiValueField(faceted=True)
authoring_organizations = indexes.MultiValueField(faceted=True) authoring_organizations = indexes.MultiValueField(faceted=True)
......
...@@ -173,8 +173,8 @@ class ProgramFactory(factory.django.DjangoModelFactory): ...@@ -173,8 +173,8 @@ class ProgramFactory(factory.django.DjangoModelFactory):
title = factory.Sequence(lambda n: 'test-program-{}'.format(n)) # pylint: disable=unnecessary-lambda title = factory.Sequence(lambda n: 'test-program-{}'.format(n)) # pylint: disable=unnecessary-lambda
uuid = factory.LazyFunction(uuid4) uuid = factory.LazyFunction(uuid4)
subtitle = 'test-subtitle' subtitle = 'test-subtitle'
category = 'xseries' type = factory.SubFactory(ProgramTypeFactory)
status = 'unpublished' status = Program.ProgramStatus.Unpublished
marketing_slug = factory.Sequence(lambda n: 'test-slug-{}'.format(n)) # pylint: disable=unnecessary-lambda marketing_slug = factory.Sequence(lambda n: 'test-slug-{}'.format(n)) # pylint: disable=unnecessary-lambda
banner_image_url = FuzzyText(prefix='https://example.com/program/banner') banner_image_url = FuzzyText(prefix='https://example.com/program/banner')
card_image_url = FuzzyText(prefix='https://example.com/program/card') card_image_url = FuzzyText(prefix='https://example.com/program/card')
......
...@@ -269,8 +269,8 @@ class ProgramTests(TestCase): ...@@ -269,8 +269,8 @@ class ProgramTests(TestCase):
def test_marketing_url(self): def test_marketing_url(self):
""" Verify the property creates a complete marketing URL. """ """ Verify the property creates a complete marketing URL. """
expected = '{root}/{category}/{slug}'.format(root=self.program.partner.marketing_site_url_root.strip('/'), expected = '{root}/{type}/{slug}'.format(root=self.program.partner.marketing_site_url_root.strip('/'),
category=self.program.category, slug=self.program.marketing_slug) type=self.program.type.name.lower(), slug=self.program.marketing_slug)
self.assertEqual(self.program.marketing_url, expected) self.assertEqual(self.program.marketing_url, expected)
def test_marketing_url_without_slug(self): def test_marketing_url_without_slug(self):
......
{{ object.uuid }} {{ object.uuid }}
{{ object.name }} {{ object.name }}
{{ object.category }} {{ object.type.name }}
{{ object.status }} {{ object.status }}
{{ object.marketing_slug|default:'' }} {{ object.marketing_slug|default:'' }}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment