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):
class CourseForm(BaseCourseForm):
""" Course Form. """
short_description = forms.CharField(widget=forms.Textarea, max_length=255, required=False)
class Meta:
model = Course
fields = '__all__'
......@@ -57,7 +59,7 @@ class CustomCourseForm(CourseForm):
'title', 'number', 'short_description', 'full_description',
'expected_learnings', 'level_type', 'primary_subject', 'secondary_subject',
'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):
class Meta(CourseRunForm.Meta):
fields = (
'keywords', 'start', 'end', 'length',
'transcript_languages', 'language', 'min_effort', 'max_effort', 'keywords',
'contacted_partner_manager', 'target_content', 'pacing_type', 'is_seo_review',
'video_language', 'staff',
'length', 'transcript_languages', 'language', 'min_effort', 'max_effort',
'contacted_partner_manager', 'target_content', 'pacing_type',
'video_language', 'staff', 'start', 'end',
)
......
# -*- 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
from simple_history.models import HistoricalRecords
from sortedm2m.fields import SortedManyToManyField
from stdimage.models import StdImageField
from taggit.managers import TaggableManager
from course_discovery.apps.core.models import User, Currency
from course_discovery.apps.course_metadata.choices import CourseRunPacing
......@@ -129,6 +130,9 @@ class Course(TimeStampedModel, ChangedByMixin):
}
)
is_seo_review = models.BooleanField(default=False)
keywords = TaggableManager(blank=True, verbose_name='keywords')
history = HistoricalRecords()
def __str__(self):
......@@ -156,6 +160,14 @@ class Course(TimeStampedModel, ChangedByMixin):
available_groups = get_groups_with_perms(self)
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):
""" Publisher CourseRun model. It contains fields related to the course run intake form."""
......@@ -212,11 +224,7 @@ class CourseRun(TimeStampedModel, ChangedByMixin):
is_micromasters = models.BooleanField(default=False)
micromasters_name = models.CharField(max_length=255, null=True, blank=True)
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(
default=None, null=True, blank=True, help_text=_(
"Please add any additional notes or special instructions for the course About Page."
......
......@@ -54,7 +54,6 @@ class CourseRunFactory(factory.DjangoModelFactory):
language = factory.Iterator(LanguageTag.objects.all())
pacing_type = FuzzyChoice([name for name, __ in CourseRunPacing.choices])
length = FuzzyInteger(1, 10)
keywords = "Test1, Test2, Test3"
notes = "Testing notes"
class Meta:
......
......@@ -92,6 +92,16 @@ class CourseTests(TestCase):
self.assertFalse(user1.has_perm(Course.VIEW_PERMISSION, self.course2))
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):
""" Tests for the publisher `Seat` model. """
......
......@@ -237,6 +237,7 @@ class CreateUpdateCourseViewTests(TestCase):
def _post_data(self, data, course, course_run, seat):
course_dict = model_to_dict(course)
course_dict.update(**data)
course_dict['keywords'] = 'abc def xyz'
if course_run:
course_dict.update(**model_to_dict(course_run))
course_dict.pop('video_language')
......@@ -287,6 +288,9 @@ class CreateUpdateCourseViewTests(TestCase):
response = self.client.get(reverse('publisher:publisher_courses_readonly', kwargs={'pk': course.id}))
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):
""" Tests for the publisher `CreateCourseRunView` and `UpdateCourseRunView`. """
......
......@@ -146,3 +146,10 @@ class CourseRunWrapperTests(TestCase):
self.course_run.start = current_date
self.course_run.save()
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):
course = course_form.save(commit=False)
course.changed_by = self.request.user
course.save()
# commit false does not save m2m object. Keyword field is m2m.
course_form.save_m2m()
run_course.course = course
run_course.changed_by = self.request.user
......
......@@ -182,3 +182,7 @@ class CourseRunWrapper(BaseWrapper):
@property
def verification_deadline(self):
return self.wrapped_obj.course.verification_deadline
@property
def keywords(self):
return self.wrapped_obj.course.keywords_data
......@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......
......@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -619,12 +619,6 @@ msgstr ""
"¢σηѕє¢тєтυ#"
#: 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 ""
"Please add any additional notes or special instructions for the course About"
" Page."
......
......@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......
......@@ -10,33 +10,27 @@ $(function () {
change_fields;
show_verified_fields= function () {
$('.field-price').show();
$('.field-upgrade_deadline').show();
$('#id_price').prop("readonly", false);
};
hide_verified_fields = function () {
$('.field-price').hide();
$('.field-upgrade_deadline').hide();
$('#id_price').prop("readonly", true).val('0.00');
};
show_professional_fields = function () {
$('.field-price').show();
$('#id_price').prop("readonly", false);
};
hide_professional_fields = function () {
$('.field-price').hide();
$('#id_price').prop("readonly", true).val('0.00');
};
show_credit_fields = function () {
show_verified_fields();
$('.field-credit_provider').show();
$('.field-credit_hours').show();
};
hide_credit_fields = function () {
hide_verified_fields();
$('.field-credit_provider').hide();
$('.field-credit_hours').hide();
};
hide_all_fields = function () {
......@@ -70,7 +64,7 @@ $(function () {
change_fields();
$('.field-type .input-select').change(function () {
$('#id_type').change(function () {
change_fields(this);
});
});
......@@ -4,12 +4,12 @@ function addDatePicker() {
if (el.getAttribute('datepicker-initialized') !== 'true') {
new Pikaday({
field: el,
format: 'YYYY-MM-DD hh:mm:ss',
format: 'YYYY-MM-DD',
defaultDate: $(el).val(),
setDefaultDate: true,
showTime: true,
showTime: false,
use24hour: false,
autoClose: false
autoClose: true
});
el.setAttribute('datepicker-initialized', 'true');
}
......
......@@ -4,10 +4,6 @@
{% block title %}
{% trans "Course Form" %}
{% endblock title %}
{% block extra_js %}
<script src="{% static 'js/publisher/publisher.js' %}"></script>
{% endblock %}
{% block content %}
<div>
......@@ -268,11 +264,11 @@
{% trans "Some instructions here???" %}
</div>
<div class="col col-6">
<label class="field-label ">{{ run_form.keywords.label_tag }}</label>
{{ run_form.keywords}}
<label class="field-label ">{{ course_form.keywords.label_tag }}</label>
{{ course_form.keywords}}
<label class="field-label ">{{ run_form.is_seo_review.label_tag }}</label>
{{ run_form.is_seo_review}}
<label class="field-label ">{{ course_form.is_seo_review.label_tag }}</label>
{{ course_form.is_seo_review}}
</div>
</div>
......@@ -451,3 +447,8 @@
</div>
{% 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 @@
{% trans "Keywords" %}
{% include "publisher/course_run_detail/clipboard.html" %}
</div>
<div class="copy">{{ object.wrapped_obj.keywords }}</div>
<div class="copy">{{ object.keywords }}</div>
</div>
<div class="info-item">
<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