Commit 23a9a7f1 by Awais Qureshi Committed by GitHub

Merge pull request #353 from edx/awais786/ECOM-5802-publisher-model-changes

Awais786/ecom 5802 publisher model changes
parents b6ed9e1c 0eedab67
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
import stdimage.models
import django.db.models.deletion
from django.conf import settings
import course_discovery.apps.course_metadata.utils
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('ietf_language_tags', '0005_fix_language_tag_names_again'),
('publisher', '0008_auto_20160928_1015'),
]
operations = [
migrations.RemoveField(
model_name='courserun',
name='seo_review',
),
migrations.RemoveField(
model_name='historicalcourserun',
name='seo_review',
),
migrations.AddField(
model_name='course',
name='image',
field=stdimage.models.StdImageField(null=True, blank=True, upload_to=course_discovery.apps.course_metadata.utils.UploadToFieldNamePath('number', path='media/publisher/courses/images')),
),
migrations.AddField(
model_name='course',
name='team_admin',
field=models.ForeignKey(related_name='team_admin_user', null=True, to=settings.AUTH_USER_MODEL, blank=True),
),
migrations.AddField(
model_name='courserun',
name='is_seo_review',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='courserun',
name='video_language',
field=models.ForeignKey(related_name='video_language', null=True, to='ietf_language_tags.LanguageTag', blank=True),
),
migrations.AddField(
model_name='historicalcourse',
name='image',
field=models.TextField(max_length=100, null=True, blank=True),
),
migrations.AddField(
model_name='historicalcourse',
name='team_admin',
field=models.ForeignKey(related_name='+', null=True, db_constraint=False, to=settings.AUTH_USER_MODEL, on_delete=django.db.models.deletion.DO_NOTHING, blank=True),
),
migrations.AddField(
model_name='historicalcourserun',
name='is_seo_review',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='historicalcourserun',
name='video_language',
field=models.ForeignKey(related_name='+', null=True, db_constraint=False, to='ietf_language_tags.LanguageTag', on_delete=django.db.models.deletion.DO_NOTHING, blank=True),
),
]
...@@ -10,10 +10,12 @@ from django_fsm import FSMField, transition ...@@ -10,10 +10,12 @@ from django_fsm import FSMField, transition
from guardian.shortcuts import assign_perm from guardian.shortcuts import assign_perm
from simple_history.models import HistoricalRecords from simple_history.models import HistoricalRecords
from sortedm2m.fields import SortedManyToManyField from sortedm2m.fields import SortedManyToManyField
from stdimage.models import StdImageField
from course_discovery.apps.core.models import User, Currency from course_discovery.apps.core.models import User, Currency
from course_discovery.apps.course_metadata.choices import CourseRunPacing from course_discovery.apps.course_metadata.choices import CourseRunPacing
from course_discovery.apps.course_metadata.models import LevelType, Subject, Person, Organization from course_discovery.apps.course_metadata.models import LevelType, Subject, Person, Organization
from course_discovery.apps.course_metadata.utils import UploadToFieldNamePath
from course_discovery.apps.ietf_language_tags.models import LanguageTag from course_discovery.apps.ietf_language_tags.models import LanguageTag
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
...@@ -112,6 +114,21 @@ class Course(TimeStampedModel, ChangedByMixin): ...@@ -112,6 +114,21 @@ class Course(TimeStampedModel, ChangedByMixin):
Subject, default=None, null=True, blank=True, related_name='publisher_courses_tertiary' Subject, default=None, null=True, blank=True, related_name='publisher_courses_tertiary'
) )
team_admin = models.ForeignKey(User, null=True, blank=True, related_name='team_admin_user')
image = StdImageField(
upload_to=UploadToFieldNamePath(
populate_from='number',
path='media/publisher/courses/images'
),
blank=True,
null=True,
variations={
'large': (2120, 1192),
'medium': (1440, 480),
'thumbnail': (100, 100, True),
}
)
history = HistoricalRecords() history = HistoricalRecords()
def __str__(self): def __str__(self):
...@@ -183,9 +200,8 @@ class CourseRun(TimeStampedModel, ChangedByMixin): ...@@ -183,9 +200,8 @@ class CourseRun(TimeStampedModel, ChangedByMixin):
is_micromasters = models.BooleanField(default=False) is_micromasters = models.BooleanField(default=False)
micromasters_name = models.CharField(max_length=255, null=True, blank=True) micromasters_name = models.CharField(max_length=255, null=True, blank=True)
contacted_partner_manager = models.BooleanField(default=False) contacted_partner_manager = models.BooleanField(default=False)
seo_review = models.TextField( is_seo_review = models.BooleanField(default=False)
default=None, null=True, blank=True, help_text=_("SEO review on your course title and short description")
)
keywords = models.TextField( keywords = models.TextField(
default=None, blank=True, help_text=_("Please add top 10 comma separated keywords for your course content") default=None, blank=True, help_text=_("Please add top 10 comma separated keywords for your course content")
) )
...@@ -206,6 +222,7 @@ class CourseRun(TimeStampedModel, ChangedByMixin): ...@@ -206,6 +222,7 @@ class CourseRun(TimeStampedModel, ChangedByMixin):
"Comma separated list of edX usernames or emails of additional staff." "Comma separated list of edX usernames or emails of additional staff."
) )
) )
video_language = models.ForeignKey(LanguageTag, null=True, blank=True, related_name='video_language')
history = HistoricalRecords() history = HistoricalRecords()
......
...@@ -51,7 +51,6 @@ class CourseRunFactory(factory.DjangoModelFactory): ...@@ -51,7 +51,6 @@ class CourseRunFactory(factory.DjangoModelFactory):
language = factory.Iterator(LanguageTag.objects.all()) language = factory.Iterator(LanguageTag.objects.all())
pacing_type = FuzzyChoice([name for name, __ in CourseRunPacing.choices]) pacing_type = FuzzyChoice([name for name, __ in CourseRunPacing.choices])
length = FuzzyInteger(1, 10) length = FuzzyInteger(1, 10)
seo_review = "test-seo-review"
keywords = "Test1, Test2, Test3" keywords = "Test1, Test2, Test3"
notes = "Testing notes" notes = "Testing notes"
......
...@@ -9,6 +9,7 @@ from django.test import TestCase ...@@ -9,6 +9,7 @@ from django.test import TestCase
from guardian.shortcuts import assign_perm from guardian.shortcuts import assign_perm
from course_discovery.apps.core.tests.factories import UserFactory, USER_PASSWORD from course_discovery.apps.core.tests.factories import UserFactory, USER_PASSWORD
from course_discovery.apps.core.tests.helpers import make_image_file
from course_discovery.apps.publisher.models import Course, CourseRun, Seat, State from course_discovery.apps.publisher.models import Course, CourseRun, Seat, State
from course_discovery.apps.publisher.tests import factories from course_discovery.apps.publisher.tests import factories
from course_discovery.apps.publisher.tests.utils import create_non_staff_user_and_login from course_discovery.apps.publisher.tests.utils import create_non_staff_user_and_login
...@@ -17,6 +18,7 @@ from course_discovery.apps.publisher.wrappers import CourseRunWrapper ...@@ -17,6 +18,7 @@ from course_discovery.apps.publisher.wrappers import CourseRunWrapper
from course_discovery.apps.publisher_comments.tests.factories import CommentFactory from course_discovery.apps.publisher_comments.tests.factories import CommentFactory
@ddt.ddt
class CreateUpdateCourseViewTests(TestCase): class CreateUpdateCourseViewTests(TestCase):
""" Tests for the publisher `CreateCourseView` and `UpdateCourseView`. """ """ Tests for the publisher `CreateCourseView` and `UpdateCourseView`. """
...@@ -44,13 +46,23 @@ class CreateUpdateCourseViewTests(TestCase): ...@@ -44,13 +46,23 @@ class CreateUpdateCourseViewTests(TestCase):
target_status_code=302 target_status_code=302
) )
def test_create_course(self): @ddt.data(
""" Verify that we can create a new course. """ {'number': 'course_1', 'image': '', 'team_admin': False},
# Create unique course number {'number': 'course_2', 'image': make_image_file('test_banner.jpg'), 'team_admin': False},
course_number = '{}.1.456'.format(self.course.number) {'number': 'course_3', 'image': make_image_file('test_banner1.jpg'), 'team_admin': True}
)
def test_create_course(self, data):
""" Verify that new course can be created with different data sets. """
course_dict = model_to_dict(self.course) course_dict = model_to_dict(self.course)
course_dict.pop('verification_deadline') course_dict.pop('verification_deadline')
course_dict['number'] = course_number course_dict.update(**data)
if data['team_admin']:
course_dict['team_admin'] = self.user.id
else:
course_dict['team_admin'] = ''
course_number = course_dict['number']
response = self.client.post(reverse('publisher:publisher_courses_new'), course_dict) response = self.client.post(reverse('publisher:publisher_courses_new'), course_dict)
course = Course.objects.get(number=course_number) course = Course.objects.get(number=course_number)
...@@ -71,6 +83,9 @@ class CreateUpdateCourseViewTests(TestCase): ...@@ -71,6 +83,9 @@ class CreateUpdateCourseViewTests(TestCase):
""" Verify that staff user can update an existing course. """ """ Verify that staff user can update an existing course. """
course_dict = model_to_dict(self.course) course_dict = model_to_dict(self.course)
course_dict.pop('verification_deadline') course_dict.pop('verification_deadline')
course_dict.pop('image')
course_dict.pop('team_admin')
updated_course_title = 'Updated {}'.format(self.course.title) updated_course_title = 'Updated {}'.format(self.course.title)
course_dict['title'] = updated_course_title course_dict['title'] = updated_course_title
self.assertNotEqual(self.course.title, updated_course_title) self.assertNotEqual(self.course.title, updated_course_title)
...@@ -126,9 +141,11 @@ class CreateUpdateCourseViewTests(TestCase): ...@@ -126,9 +141,11 @@ class CreateUpdateCourseViewTests(TestCase):
def test_update_course_with_non_staff(self): def test_update_course_with_non_staff(self):
""" Tests for update course with non staff user. """ """ Tests for update course with non staff user. """
non_staff_user, group = create_non_staff_user_and_login(self) non_staff_user, group = create_non_staff_user_and_login(self)
course_dict = model_to_dict(self.course) course_dict = model_to_dict(self.course)
course_dict.pop('verification_deadline') course_dict.pop('verification_deadline')
course_dict.pop('image')
course_dict.pop('team_admin')
updated_course_title = 'Updated {}'.format(self.course.title) updated_course_title = 'Updated {}'.format(self.course.title)
course_dict['title'] = updated_course_title course_dict['title'] = updated_course_title
self.assertNotEqual(self.course.title, updated_course_title) self.assertNotEqual(self.course.title, updated_course_title)
...@@ -148,7 +165,6 @@ class CreateUpdateCourseViewTests(TestCase): ...@@ -148,7 +165,6 @@ class CreateUpdateCourseViewTests(TestCase):
reverse('publisher:publisher_courses_edit', kwargs={'pk': self.course.id}), reverse('publisher:publisher_courses_edit', kwargs={'pk': self.course.id}),
course_dict course_dict
) )
self.assertRedirects( self.assertRedirects(
response, response,
expected_url=reverse('publisher:publisher_courses_edit', kwargs={'pk': self.course.id}), expected_url=reverse('publisher:publisher_courses_edit', kwargs={'pk': self.course.id}),
...@@ -177,7 +193,10 @@ class CreateUpdateCourseRunViewTests(TestCase): ...@@ -177,7 +193,10 @@ class CreateUpdateCourseRunViewTests(TestCase):
self.course_run_dict = model_to_dict(self.course_run) self.course_run_dict = model_to_dict(self.course_run)
self._pop_valuse_from_dict( self._pop_valuse_from_dict(
self.course_run_dict, self.course_run_dict,
['start', 'end', 'enrollment_start', 'enrollment_end', 'priority', 'certificate_generation'] [
'start', 'end', 'enrollment_start', 'enrollment_end',
'priority', 'certificate_generation', 'video_language'
]
) )
self.user = UserFactory(is_staff=True, is_superuser=True) self.user = UserFactory(is_staff=True, is_superuser=True)
self.site = Site.objects.get(pk=settings.SITE_ID) self.site = Site.objects.get(pk=settings.SITE_ID)
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
<div class="publisher-container"> <div class="publisher-container">
<div class="course-information"> <div class="course-information">
<h4 class="hd-4">{% trans "Course Form" %}</h4> <h4 class="hd-4">{% trans "Course Form" %}</h4>
<form class="form" method="post" action=""> <form class="form" method="post" action="" enctype="multipart/form-data">
{% csrf_token %} {% csrf_token %}
<fieldset class="form-group"> <fieldset class="form-group">
{% for field in form %} {% for field in form %}
......
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