Commit ed241967 by Awais

Clenup story. Moved fileds, add the new migration. Update wrapper.

Add taggit field for keywords.

ECOM-6003
parent e53a3db7
...@@ -37,6 +37,8 @@ class BaseCourseForm(forms.ModelForm): ...@@ -37,6 +37,8 @@ class BaseCourseForm(forms.ModelForm):
class CourseForm(BaseCourseForm): class CourseForm(BaseCourseForm):
""" Course Form. """ """ Course Form. """
short_description = forms.CharField(widget=forms.Textarea, max_length=255, required=False)
class Meta: class Meta:
model = Course model = Course
fields = '__all__' fields = '__all__'
...@@ -57,7 +59,7 @@ class CustomCourseForm(CourseForm): ...@@ -57,7 +59,7 @@ class CustomCourseForm(CourseForm):
'title', 'number', 'short_description', 'full_description', 'title', 'number', 'short_description', 'full_description',
'expected_learnings', 'level_type', 'primary_subject', 'secondary_subject', 'expected_learnings', 'level_type', 'primary_subject', 'secondary_subject',
'tertiary_subject', 'prerequisites', 'level_type', 'image', 'team_admin', 'tertiary_subject', 'prerequisites', 'level_type', 'image', 'team_admin',
'level_type', 'institution', 'level_type', 'institution', 'is_seo_review', 'keywords',
) )
...@@ -87,10 +89,9 @@ class CustomCourseRunForm(CourseRunForm): ...@@ -87,10 +89,9 @@ class CustomCourseRunForm(CourseRunForm):
class Meta(CourseRunForm.Meta): class Meta(CourseRunForm.Meta):
fields = ( fields = (
'keywords', 'start', 'end', 'length', 'length', 'transcript_languages', 'language', 'min_effort', 'max_effort',
'transcript_languages', 'language', 'min_effort', 'max_effort', 'keywords', 'contacted_partner_manager', 'target_content', 'pacing_type',
'contacted_partner_manager', 'target_content', 'pacing_type', 'is_seo_review', 'video_language', 'staff', 'start', 'end',
'video_language', 'staff',
) )
......
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
import taggit.managers
class Migration(migrations.Migration):
dependencies = [
('taggit', '0002_auto_20150616_2121'),
('publisher', '0011_userattributes'),
]
operations = [
# This is custom alteration to make migration reversible
migrations.AlterField(
model_name='courserun',
name='keywords',
field=models.TextField(verbose_name='keywords', default=None, blank=True),
preserve_default=False,
),
migrations.AlterField(
model_name='historicalcourserun',
name='keywords',
field=models.TextField(verbose_name='keywords', default=None, blank=True),
preserve_default=False,
),
# end custom migration
migrations.RemoveField(
model_name='courserun',
name='is_seo_review',
),
migrations.RemoveField(
model_name='courserun',
name='keywords',
),
migrations.RemoveField(
model_name='historicalcourserun',
name='is_seo_review',
),
migrations.RemoveField(
model_name='historicalcourserun',
name='keywords',
),
migrations.AddField(
model_name='course',
name='is_seo_review',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='course',
name='keywords',
field=taggit.managers.TaggableManager(help_text='A comma-separated list of tags.', verbose_name='keywords', through='taggit.TaggedItem', blank=True, to='taggit.Tag'),
),
migrations.AddField(
model_name='historicalcourse',
name='is_seo_review',
field=models.BooleanField(default=False),
),
]
...@@ -11,6 +11,7 @@ from guardian.shortcuts import assign_perm, get_groups_with_perms ...@@ -11,6 +11,7 @@ from guardian.shortcuts import assign_perm, get_groups_with_perms
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 stdimage.models import StdImageField
from taggit.managers import TaggableManager
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
...@@ -129,6 +130,9 @@ class Course(TimeStampedModel, ChangedByMixin): ...@@ -129,6 +130,9 @@ class Course(TimeStampedModel, ChangedByMixin):
} }
) )
is_seo_review = models.BooleanField(default=False)
keywords = TaggableManager(blank=True, verbose_name='keywords')
history = HistoricalRecords() history = HistoricalRecords()
def __str__(self): def __str__(self):
...@@ -156,6 +160,14 @@ class Course(TimeStampedModel, ChangedByMixin): ...@@ -156,6 +160,14 @@ class Course(TimeStampedModel, ChangedByMixin):
available_groups = get_groups_with_perms(self) available_groups = get_groups_with_perms(self)
return available_groups[0] if available_groups else None return available_groups[0] if available_groups else None
@property
def keywords_data(self):
keywords = self.keywords.all()
if keywords:
return ', '.join(k.name for k in keywords)
return None
class CourseRun(TimeStampedModel, ChangedByMixin): class CourseRun(TimeStampedModel, ChangedByMixin):
""" Publisher CourseRun model. It contains fields related to the course run intake form.""" """ Publisher CourseRun model. It contains fields related to the course run intake form."""
...@@ -212,11 +224,7 @@ class CourseRun(TimeStampedModel, ChangedByMixin): ...@@ -212,11 +224,7 @@ 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)
is_seo_review = models.BooleanField(default=False)
keywords = models.TextField(
default=None, blank=True, help_text=_("Please add top 10 comma separated keywords for your course content")
)
notes = models.TextField( notes = models.TextField(
default=None, null=True, blank=True, help_text=_( default=None, null=True, blank=True, help_text=_(
"Please add any additional notes or special instructions for the course About Page." "Please add any additional notes or special instructions for the course About Page."
......
...@@ -54,7 +54,6 @@ class CourseRunFactory(factory.DjangoModelFactory): ...@@ -54,7 +54,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)
keywords = "Test1, Test2, Test3"
notes = "Testing notes" notes = "Testing notes"
class Meta: class Meta:
......
...@@ -92,6 +92,16 @@ class CourseTests(TestCase): ...@@ -92,6 +92,16 @@ class CourseTests(TestCase):
self.assertFalse(user1.has_perm(Course.VIEW_PERMISSION, self.course2)) self.assertFalse(user1.has_perm(Course.VIEW_PERMISSION, self.course2))
self.assertFalse(user2.has_perm(Course.VIEW_PERMISSION, self.course)) self.assertFalse(user2.has_perm(Course.VIEW_PERMISSION, self.course))
def test_keywords_data(self):
""" Verify that the property returns the keywords as comma separated string. """
self.assertFalse(self.course.keywords_data)
self.course.keywords.add('abc')
self.assertEqual(self.course.keywords_data, 'abc')
self.course.keywords.add('def')
self.assertIn('abc', self.course.keywords_data)
self.assertIn('def', self.course.keywords_data)
class SeatTests(TestCase): class SeatTests(TestCase):
""" Tests for the publisher `Seat` model. """ """ Tests for the publisher `Seat` model. """
......
...@@ -237,6 +237,7 @@ class CreateUpdateCourseViewTests(TestCase): ...@@ -237,6 +237,7 @@ class CreateUpdateCourseViewTests(TestCase):
def _post_data(self, data, course, course_run, seat): def _post_data(self, data, course, course_run, seat):
course_dict = model_to_dict(course) course_dict = model_to_dict(course)
course_dict.update(**data) course_dict.update(**data)
course_dict['keywords'] = 'abc def xyz'
if course_run: if course_run:
course_dict.update(**model_to_dict(course_run)) course_dict.update(**model_to_dict(course_run))
course_dict.pop('video_language') course_dict.pop('video_language')
...@@ -287,6 +288,9 @@ class CreateUpdateCourseViewTests(TestCase): ...@@ -287,6 +288,9 @@ class CreateUpdateCourseViewTests(TestCase):
response = self.client.get(reverse('publisher:publisher_courses_readonly', kwargs={'pk': course.id})) response = self.client.get(reverse('publisher:publisher_courses_readonly', kwargs={'pk': course.id}))
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
# django-taggit stores data without any order. For test .
self.assertEqual(sorted([c.name for c in course.keywords.all()]), ['abc', 'def', 'xyz'])
class CreateUpdateCourseRunViewTests(TestCase): class CreateUpdateCourseRunViewTests(TestCase):
""" Tests for the publisher `CreateCourseRunView` and `UpdateCourseRunView`. """ """ Tests for the publisher `CreateCourseRunView` and `UpdateCourseRunView`. """
......
...@@ -146,3 +146,10 @@ class CourseRunWrapperTests(TestCase): ...@@ -146,3 +146,10 @@ class CourseRunWrapperTests(TestCase):
self.course_run.start = current_date self.course_run.start = current_date
self.course_run.save() self.course_run.save()
self.assertEqual(self.wrapped_course_run.mdc_submission_due_date, expected_date) self.assertEqual(self.wrapped_course_run.mdc_submission_due_date, expected_date)
def test_keywords(self):
""" Verify that the wrapper return the course keywords. """
self.assertEqual(
self.wrapped_course_run.keywords,
self.course.keywords_data
)
...@@ -101,6 +101,8 @@ class CreateCourseView(mixins.LoginRequiredMixin, CreateView): ...@@ -101,6 +101,8 @@ class CreateCourseView(mixins.LoginRequiredMixin, CreateView):
course = course_form.save(commit=False) course = course_form.save(commit=False)
course.changed_by = self.request.user course.changed_by = self.request.user
course.save() course.save()
# commit false does not save m2m object. Keyword field is m2m.
course_form.save_m2m()
run_course.course = course run_course.course = course
run_course.changed_by = self.request.user run_course.changed_by = self.request.user
......
...@@ -182,3 +182,7 @@ class CourseRunWrapper(BaseWrapper): ...@@ -182,3 +182,7 @@ class CourseRunWrapper(BaseWrapper):
@property @property
def verification_deadline(self): def verification_deadline(self):
return self.wrapped_obj.course.verification_deadline return self.wrapped_obj.course.verification_deadline
@property
def keywords(self):
return self.wrapped_obj.course.keywords_data
...@@ -8,7 +8,7 @@ msgid "" ...@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-10-21 07:12+0000\n" "POT-Creation-Date: 2016-10-23 15:52+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
......
...@@ -7,7 +7,7 @@ msgid "" ...@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-10-21 07:12+0000\n" "POT-Creation-Date: 2016-10-23 15:52+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
...@@ -619,12 +619,6 @@ msgstr "" ...@@ -619,12 +619,6 @@ msgstr ""
"¢σηѕє¢тєтυ#" "¢σηѕє¢тєтυ#"
#: course_discovery/apps/publisher/models.py #: course_discovery/apps/publisher/models.py
msgid "Please add top 10 comma separated keywords for your course content"
msgstr ""
"Pléäsé ädd töp 10 çömmä sépärätéd kéýwörds för ýöür çöürsé çöntént Ⱡ'σяєм "
"ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя #"
#: course_discovery/apps/publisher/models.py
msgid "" msgid ""
"Please add any additional notes or special instructions for the course About" "Please add any additional notes or special instructions for the course About"
" Page." " Page."
......
...@@ -7,7 +7,7 @@ msgid "" ...@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-10-21 07:12+0000\n" "POT-Creation-Date: 2016-10-23 15:52+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
......
...@@ -10,33 +10,27 @@ $(function () { ...@@ -10,33 +10,27 @@ $(function () {
change_fields; change_fields;
show_verified_fields= function () { show_verified_fields= function () {
$('.field-price').show(); $('#id_price').prop("readonly", false);
$('.field-upgrade_deadline').show();
}; };
hide_verified_fields = function () { hide_verified_fields = function () {
$('.field-price').hide(); $('#id_price').prop("readonly", true).val('0.00');
$('.field-upgrade_deadline').hide();
}; };
show_professional_fields = function () { show_professional_fields = function () {
$('.field-price').show(); $('#id_price').prop("readonly", false);
}; };
hide_professional_fields = function () { hide_professional_fields = function () {
$('.field-price').hide(); $('#id_price').prop("readonly", true).val('0.00');
}; };
show_credit_fields = function () { show_credit_fields = function () {
show_verified_fields(); show_verified_fields();
$('.field-credit_provider').show();
$('.field-credit_hours').show();
}; };
hide_credit_fields = function () { hide_credit_fields = function () {
hide_verified_fields(); hide_verified_fields();
$('.field-credit_provider').hide();
$('.field-credit_hours').hide();
}; };
hide_all_fields = function () { hide_all_fields = function () {
...@@ -70,7 +64,7 @@ $(function () { ...@@ -70,7 +64,7 @@ $(function () {
change_fields(); change_fields();
$('.field-type .input-select').change(function () { $('#id_type').change(function () {
change_fields(this); change_fields(this);
}); });
}); });
...@@ -4,12 +4,12 @@ function addDatePicker() { ...@@ -4,12 +4,12 @@ function addDatePicker() {
if (el.getAttribute('datepicker-initialized') !== 'true') { if (el.getAttribute('datepicker-initialized') !== 'true') {
new Pikaday({ new Pikaday({
field: el, field: el,
format: 'YYYY-MM-DD hh:mm:ss', format: 'YYYY-MM-DD',
defaultDate: $(el).val(), defaultDate: $(el).val(),
setDefaultDate: true, setDefaultDate: true,
showTime: true, showTime: false,
use24hour: false, use24hour: false,
autoClose: false autoClose: true
}); });
el.setAttribute('datepicker-initialized', 'true'); el.setAttribute('datepicker-initialized', 'true');
} }
......
...@@ -4,10 +4,6 @@ ...@@ -4,10 +4,6 @@
{% block title %} {% block title %}
{% trans "Course Form" %} {% trans "Course Form" %}
{% endblock title %} {% endblock title %}
{% block extra_js %}
<script src="{% static 'js/publisher/publisher.js' %}"></script>
{% endblock %}
{% block content %} {% block content %}
<div> <div>
...@@ -268,11 +264,11 @@ ...@@ -268,11 +264,11 @@
{% trans "Some instructions here???" %} {% trans "Some instructions here???" %}
</div> </div>
<div class="col col-6"> <div class="col col-6">
<label class="field-label ">{{ run_form.keywords.label_tag }}</label> <label class="field-label ">{{ course_form.keywords.label_tag }}</label>
{{ run_form.keywords}} {{ course_form.keywords}}
<label class="field-label ">{{ run_form.is_seo_review.label_tag }}</label> <label class="field-label ">{{ course_form.is_seo_review.label_tag }}</label>
{{ run_form.is_seo_review}} {{ course_form.is_seo_review}}
</div> </div>
</div> </div>
...@@ -451,3 +447,8 @@ ...@@ -451,3 +447,8 @@
</div> </div>
{% endblock content %} {% endblock content %}
{% block extra_js %}
<script src="{% static 'js/publisher/publisher.js' %}"></script>
<script src="{% static 'js/seat-type-change.js' %}"></script>
{% endblock %}
...@@ -137,7 +137,7 @@ ...@@ -137,7 +137,7 @@
{% trans "Keywords" %} {% trans "Keywords" %}
{% include "publisher/course_run_detail/clipboard.html" %} {% include "publisher/course_run_detail/clipboard.html" %}
</div> </div>
<div class="copy">{{ object.wrapped_obj.keywords }}</div> <div class="copy">{{ object.keywords }}</div>
</div> </div>
<div class="info-item"> <div class="info-item">
<div class="heading"> <div class="heading">
......
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