Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
course-discovery
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
course-discovery
Commits
602f720a
Commit
602f720a
authored
Aug 11, 2016
by
Clinton Blackburn
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Updated Organization model
ECOM-5191 and ECOM-5192
parent
75b087e7
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
131 additions
and
42 deletions
+131
-42
course_discovery/apps/api/serializers.py
+1
-2
course_discovery/apps/api/tests/test_serializers.py
+0
-7
course_discovery/apps/course_metadata/admin.py
+6
-6
course_discovery/apps/course_metadata/data_loaders/api.py
+4
-8
course_discovery/apps/course_metadata/data_loaders/marketing_site.py
+1
-2
course_discovery/apps/course_metadata/data_loaders/tests/test_api.py
+2
-8
course_discovery/apps/course_metadata/migrations/0014_auto_20160811_0436.py
+103
-0
course_discovery/apps/course_metadata/models.py
+12
-8
course_discovery/apps/course_metadata/tests/factories.py
+2
-1
No files found.
course_discovery/apps/api/serializers.py
View file @
602f720a
...
@@ -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
):
...
...
course_discovery/apps/api/tests/test_serializers.py
View file @
602f720a
...
@@ -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
)
...
...
course_discovery/apps/course_metadata/admin.py
View file @
602f720a
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
.
Model
Admin
):
class
OrganizationAdmin
(
SimpleHistory
Admin
):
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
)
...
...
course_discovery/apps/course_metadata/data_loaders/api.py
View file @
602f720a
...
@@ -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/updat
ed organization "
%
s"'
,
body
[
'short_name'
])
logger
.
info
(
'
Process
ed organization "
%
s"'
,
body
[
'short_name'
])
class
CoursesApiDataLoader
(
AbstractDataLoader
):
class
CoursesApiDataLoader
(
AbstractDataLoader
):
...
...
course_discovery/apps/course_metadata/data_loaders/marketing_site.py
View file @
602f720a
...
@@ -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
)
...
...
course_discovery/apps/course_metadata/data_loaders/tests/test_api.py
View file @
602f720a
...
@@ -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
):
...
...
course_discovery/apps/course_metadata/migrations/0014_auto_20160811_0436.py
0 → 100644
View file @
602f720a
# -*- 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
),
),
]
course_discovery/apps/course_metadata/models.py
View file @
602f720a
...
@@ -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
)
...
...
course_discovery/apps/course_metadata/tests/factories.py
View file @
602f720a
...
@@ -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
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment