Commit 602f720a by Clinton Blackburn

Updated Organization model

ECOM-5191 and ECOM-5192
parent 75b087e7
...@@ -157,11 +157,10 @@ class PersonSerializer(serializers.ModelSerializer): ...@@ -157,11 +157,10 @@ class PersonSerializer(serializers.ModelSerializer):
class OrganizationSerializer(serializers.ModelSerializer): class OrganizationSerializer(serializers.ModelSerializer):
"""Serializer for the ``Organization`` model.""" """Serializer for the ``Organization`` model."""
logo_image = ImageSerializer()
class Meta(object): class Meta(object):
model = Organization model = Organization
fields = ('key', 'name', 'description', 'logo_image', 'homepage_url',) fields = ('key', 'name', 'description', 'homepage_url',)
class CatalogSerializer(serializers.ModelSerializer): class CatalogSerializer(serializers.ModelSerializer):
......
...@@ -387,7 +387,6 @@ class VideoSerializerTests(TestCase): ...@@ -387,7 +387,6 @@ class VideoSerializerTests(TestCase):
class OrganizationSerializerTests(TestCase): class OrganizationSerializerTests(TestCase):
def test_data(self): def test_data(self):
organization = OrganizationFactory() organization = OrganizationFactory()
image = organization.logo_image
serializer = OrganizationSerializer(organization) serializer = OrganizationSerializer(organization)
expected = { expected = {
...@@ -395,12 +394,6 @@ class OrganizationSerializerTests(TestCase): ...@@ -395,12 +394,6 @@ class OrganizationSerializerTests(TestCase):
'name': organization.name, 'name': organization.name,
'description': organization.description, 'description': organization.description,
'homepage_url': organization.homepage_url, 'homepage_url': organization.homepage_url,
'logo_image': {
'src': image.src,
'description': image.description,
'height': image.height,
'width': image.width
}
} }
self.assertDictEqual(serializer.data, expected) self.assertDictEqual(serializer.data, expected)
......
from django.contrib import admin from django.contrib import admin
from simple_history.admin import SimpleHistoryAdmin
from course_discovery.apps.course_metadata.models import ( from course_discovery.apps.course_metadata.models import * # pylint: disable=wildcard-import
Seat, Image, Video, LevelType, Subject, Prerequisite, ExpectedLearningItem, Expertise, Course, CourseRun,
CourseRunSocialNetwork, MajorWork, Organization, Person, PersonSocialNetwork, CourseOrganization, SyllabusItem,
Program, JobOutlookItem, SeatType, Endorsement, CorporateEndorsement, FAQ, ProgramType)
class CourseOrganizationInline(admin.TabularInline): class CourseOrganizationInline(admin.TabularInline):
...@@ -69,9 +67,11 @@ class FAQAdmin(admin.ModelAdmin): ...@@ -69,9 +67,11 @@ class FAQAdmin(admin.ModelAdmin):
@admin.register(Organization) @admin.register(Organization)
class OrganizationAdmin(admin.ModelAdmin): class OrganizationAdmin(SimpleHistoryAdmin):
list_display = ('key', 'name',) list_display = ('uuid', 'key', 'name',)
list_filter = ('partner',) list_filter = ('partner',)
readonly_fields = ('uuid',)
search_fields = ('uuid', 'name', 'key',)
@admin.register(Subject) @admin.register(Subject)
......
...@@ -6,8 +6,8 @@ from opaque_keys.edx.keys import CourseKey ...@@ -6,8 +6,8 @@ from opaque_keys.edx.keys import CourseKey
from course_discovery.apps.core.models import Currency 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, Video, Organization, Seat, CourseRun, Program, Course, CourseOrganization, ProgramType,
ProgramType) )
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -41,18 +41,14 @@ class OrganizationsApiDataLoader(AbstractDataLoader): ...@@ -41,18 +41,14 @@ class OrganizationsApiDataLoader(AbstractDataLoader):
self.delete_orphans() self.delete_orphans()
def update_organization(self, body): def update_organization(self, body):
image = None
image_url = body['logo']
if image_url:
image, __ = Image.objects.get_or_create(src=image_url)
defaults = { defaults = {
'name': body['name'], 'name': body['name'],
'description': body['description'], 'description': body['description'],
'logo_image': image, 'logo_image_url': body['logo'],
'partner': self.partner, 'partner': self.partner,
} }
Organization.objects.update_or_create(key=body['short_name'], defaults=defaults) Organization.objects.update_or_create(key=body['short_name'], defaults=defaults)
logger.info('Created/updated organization "%s"', body['short_name']) logger.info('Processed organization "%s"', body['short_name'])
class CoursesApiDataLoader(AbstractDataLoader): class CoursesApiDataLoader(AbstractDataLoader):
......
...@@ -84,10 +84,9 @@ class DrupalApiDataLoader(AbstractDataLoader): ...@@ -84,10 +84,9 @@ class DrupalApiDataLoader(AbstractDataLoader):
"""Update `course` with sponsors from `body`.""" """Update `course` with sponsors from `body`."""
course.courseorganization_set.filter(relation_type=CourseOrganization.SPONSOR).delete() course.courseorganization_set.filter(relation_type=CourseOrganization.SPONSOR).delete()
for sponsor_body in body['sponsors']: for sponsor_body in body['sponsors']:
image, __ = Image.objects.get_or_create(src=sponsor_body['image'])
defaults = { defaults = {
'name': sponsor_body['title'], 'name': sponsor_body['title'],
'logo_image': image, 'logo_image_url': sponsor_body['image'],
'homepage_url': urljoin(self.partner.marketing_site_url_root, sponsor_body['uri']), 'homepage_url': urljoin(self.partner.marketing_site_url_root, sponsor_body['uri']),
} }
organization, __ = Organization.objects.update_or_create(key=sponsor_body['uuid'], defaults=defaults) organization, __ = Organization.objects.update_or_create(key=sponsor_body['uuid'], defaults=defaults)
......
...@@ -14,7 +14,7 @@ from course_discovery.apps.course_metadata.data_loaders.api import ( ...@@ -14,7 +14,7 @@ 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, ProgramType, Course, CourseRun, 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 (
...@@ -83,13 +83,7 @@ class OrganizationsApiDataLoaderTests(ApiClientTestMixin, DataLoaderTestMixin, T ...@@ -83,13 +83,7 @@ class OrganizationsApiDataLoaderTests(ApiClientTestMixin, DataLoaderTestMixin, T
organization = Organization.objects.get(key=AbstractDataLoader.clean_string(body['short_name'])) organization = Organization.objects.get(key=AbstractDataLoader.clean_string(body['short_name']))
self.assertEqual(organization.name, AbstractDataLoader.clean_string(body['name'])) self.assertEqual(organization.name, AbstractDataLoader.clean_string(body['name']))
self.assertEqual(organization.description, AbstractDataLoader.clean_string(body['description'])) self.assertEqual(organization.description, AbstractDataLoader.clean_string(body['description']))
self.assertEqual(organization.logo_image_url, AbstractDataLoader.clean_string(body['logo']))
image = None
image_url = AbstractDataLoader.clean_string(body['logo'])
if image_url:
image = Image.objects.get(src=image_url)
self.assertEqual(organization.logo_image, image)
@responses.activate @responses.activate
def test_ingest(self): def test_ingest(self):
......
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import uuid
from django.db import migrations, models
def update_organizations(apps, schema_editor):
Organization = apps.get_model('course_metadata', 'Organization')
HistoricalOrganization = apps.get_model('course_metadata', 'HistoricalOrganization')
# Clear history to avoid null constraint issues
HistoricalOrganization.objects.all().delete()
for organization in Organization.objects.all():
organization.name = organization.name or organization.key
organization.uuid = uuid.uuid4()
organization.save()
class Migration(migrations.Migration):
dependencies = [
('course_metadata', '0013_auto_20160809_1259'),
]
operations = [
migrations.AlterModelOptions(
name='organization',
options={},
),
migrations.RemoveField(
model_name='historicalorganization',
name='banner_image',
),
migrations.RemoveField(
model_name='historicalorganization',
name='logo_image',
),
migrations.AddField(
model_name='historicalorganization',
name='banner_image_url',
field=models.URLField(blank=True, null=True),
),
migrations.AddField(
model_name='historicalorganization',
name='logo_image_url',
field=models.URLField(blank=True, null=True),
),
migrations.AddField(
model_name='historicalorganization',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, verbose_name='UUID'),
),
migrations.AddField(
model_name='organization',
name='banner_image_url',
field=models.URLField(blank=True, null=True),
),
migrations.AddField(
model_name='organization',
name='logo_image_url',
field=models.URLField(blank=True, null=True),
),
migrations.AddField(
model_name='organization',
name='uuid',
field=models.UUIDField(default=uuid.uuid4, editable=False, verbose_name='UUID'),
),
migrations.AlterField(
model_name='historicalorganization',
name='key',
field=models.CharField(max_length=255),
),
migrations.AlterField(
model_name='organization',
name='key',
field=models.CharField(max_length=255),
),
migrations.RemoveField(
model_name='organization',
name='banner_image',
),
migrations.RemoveField(
model_name='organization',
name='logo_image',
),
migrations.RunPython(update_organizations, reverse_code=migrations.RunPython.noop),
migrations.AlterUniqueTogether(
name='organization',
unique_together=set([('partner', 'uuid'), ('partner', 'key')]),
),
migrations.AlterField(
model_name='historicalorganization',
name='name',
field=models.CharField(max_length=255),
),
migrations.AlterField(
model_name='organization',
name='name',
field=models.CharField(max_length=255),
),
]
...@@ -152,18 +152,22 @@ class MajorWork(AbstractNamedModel): ...@@ -152,18 +152,22 @@ class MajorWork(AbstractNamedModel):
class Organization(TimeStampedModel): class Organization(TimeStampedModel):
""" Organization model. """ """ Organization model. """
key = models.CharField(max_length=255, unique=True) partner = models.ForeignKey(Partner, null=True, blank=False)
name = models.CharField(max_length=255, null=True, blank=True) uuid = models.UUIDField(blank=False, null=False, default=uuid4, editable=False, verbose_name=_('UUID'))
key = models.CharField(max_length=255)
name = models.CharField(max_length=255)
description = models.TextField(null=True, blank=True) description = models.TextField(null=True, blank=True)
homepage_url = models.URLField(max_length=255, null=True, blank=True) homepage_url = models.URLField(max_length=255, null=True, blank=True)
# NOTE (CCB): The related_name values are here to prevent the images from being treated as orphans. logo_image_url = models.URLField(null=True, blank=True)
logo_image = models.ForeignKey(Image, null=True, blank=True, related_name='logoed_organizations') banner_image_url = models.URLField(null=True, blank=True)
banner_image = models.ForeignKey(Image, null=True, blank=True, related_name='bannered_organizations')
partner = models.ForeignKey(Partner, null=True, blank=False)
history = HistoricalRecords() history = HistoricalRecords()
class Meta:
unique_together = (
('partner', 'key'),
('partner', 'uuid'),
)
def __str__(self): def __str__(self):
return '{key}: {name}'.format(key=self.key, name=self.name) return '{key}: {name}'.format(key=self.key, name=self.name)
......
...@@ -137,7 +137,8 @@ class OrganizationFactory(factory.DjangoModelFactory): ...@@ -137,7 +137,8 @@ class OrganizationFactory(factory.DjangoModelFactory):
name = FuzzyText() name = FuzzyText()
description = FuzzyText() description = FuzzyText()
homepage_url = FuzzyURL() homepage_url = FuzzyURL()
logo_image = factory.SubFactory(ImageFactory) logo_image_url = FuzzyURL()
banner_image_url = FuzzyURL()
partner = factory.SubFactory(PartnerFactory) partner = factory.SubFactory(PartnerFactory)
class Meta: class Meta:
......
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