Commit 066d6216 by Clinton Blackburn

Exposed enrollment date fields on course run form

LEARNER-2621
parent 7360a79d
...@@ -286,6 +286,7 @@ class CourseRunForm(BaseForm): ...@@ -286,6 +286,7 @@ class CourseRunForm(BaseForm):
'length', 'transcript_languages', 'language', 'min_effort', 'max_effort', 'target_content', 'pacing_type', 'length', 'transcript_languages', 'language', 'min_effort', 'max_effort', 'target_content', 'pacing_type',
'video_language', 'staff', 'start', 'end', 'is_xseries', 'xseries_name', 'is_professional_certificate', 'video_language', 'staff', 'start', 'end', 'is_xseries', 'xseries_name', 'is_professional_certificate',
'professional_certificate_name', 'is_micromasters', 'micromasters_name', 'lms_course_id', 'professional_certificate_name', 'is_micromasters', 'micromasters_name', 'lms_course_id',
'enrollment_start', 'enrollment_end',
) )
def save(self, commit=True, course=None, changed_by=None): # pylint: disable=arguments-differ def save(self, commit=True, course=None, changed_by=None): # pylint: disable=arguments-differ
...@@ -323,30 +324,48 @@ class CourseRunForm(BaseForm): ...@@ -323,30 +324,48 @@ class CourseRunForm(BaseForm):
def clean(self): def clean(self):
cleaned_data = self.cleaned_data cleaned_data = self.cleaned_data
min_effort = cleaned_data.get("min_effort") min_effort = cleaned_data.get('min_effort')
max_effort = cleaned_data.get("max_effort") max_effort = cleaned_data.get('max_effort')
start = cleaned_data.get("start") start = cleaned_data.get('start')
end = cleaned_data.get("end") end = cleaned_data.get('end')
is_xseries = cleaned_data.get("is_xseries") is_xseries = cleaned_data.get('is_xseries')
xseries_name = cleaned_data.get("xseries_name") xseries_name = cleaned_data.get('xseries_name')
is_micromasters = cleaned_data.get("is_micromasters") is_micromasters = cleaned_data.get('is_micromasters')
micromasters_name = cleaned_data.get("micromasters_name") micromasters_name = cleaned_data.get('micromasters_name')
is_professional_certificate = cleaned_data.get("is_professional_certificate") is_professional_certificate = cleaned_data.get('is_professional_certificate')
professional_certificate_name = cleaned_data.get("professional_certificate_name") professional_certificate_name = cleaned_data.get('professional_certificate_name')
if start and end and start > end:
raise ValidationError({'start': _('Start date cannot be after the End date')}) if start and end and start >= end:
if min_effort and max_effort and min_effort > max_effort: self.add_error('start', _('The start date must occur before the end date.'))
raise ValidationError({'min_effort': _('Minimum effort cannot be greater than Maximum effort')})
if min_effort and max_effort and min_effort == max_effort: if min_effort and max_effort and min_effort >= max_effort:
raise ValidationError({'min_effort': _('Minimum effort and Maximum effort can not be same')}) self.add_error('min_effort', _('Minimum effort must be less than maximum effort.'))
if not min_effort and max_effort:
raise ValidationError({'min_effort': _('Minimum effort can not be empty')})
if is_xseries and not xseries_name: if is_xseries and not xseries_name:
raise ValidationError({'xseries_name': _('Enter XSeries program name')}) self.add_error('xseries_name', _('Please provide the name of the associated XSeries.'))
if is_micromasters and not micromasters_name: if is_micromasters and not micromasters_name:
raise ValidationError({'micromasters_name': _('Enter Micromasters program name')}) self.add_error('micromasters_name', _('Please provide the name of the associated MicroMasters.'))
if is_professional_certificate and not professional_certificate_name: if is_professional_certificate and not professional_certificate_name:
raise ValidationError({'professional_certificate_name': _('Enter Professional Certificate program name')}) self.add_error('professional_certificate_name',
_('Please provide the name of the associated Professional Certificate program.'))
enrollment_start = cleaned_data.get('enrollment_start')
if enrollment_start:
if start and enrollment_start > start:
self.add_error('enrollment_start',
_('The enrollment start date must occur on or before the course start date.'))
else:
cleaned_data['enrollment_start'] = start
enrollment_end = cleaned_data.get('enrollment_end')
if enrollment_end:
if end and enrollment_end > end:
self.add_error('enrollment_end',
_('The enrollment end date must occur on or after the course end date.'))
else:
cleaned_data['enrollment_end'] = end
return cleaned_data return cleaned_data
...@@ -413,18 +432,18 @@ class SeatForm(BaseForm): ...@@ -413,18 +432,18 @@ class SeatForm(BaseForm):
credit_price = self.cleaned_data.get('credit_price') credit_price = self.cleaned_data.get('credit_price')
seat_type = self.cleaned_data.get('type') seat_type = self.cleaned_data.get('type')
if seat_type in [Seat.PROFESSIONAL, Seat.VERIFIED, Seat.CREDIT] and not price: if seat_type and seat_type != Seat.AUDIT and not price:
self.add_error('price', _('Only audit seat can be without price.')) self.add_error('price', _('Please specify a price.'))
if seat_type == Seat.CREDIT and not credit_price: if seat_type == Seat.CREDIT and not credit_price:
self.add_error('credit_price', _('Only audit seat can be without price.')) self.add_error('credit_price', _('Please specify a price for credit.'))
return self.cleaned_data return self.cleaned_data
def reset_credit_to_default(self, seat): def reset_credit_to_default(self, seat):
seat.credit_provider = '' seat.credit_provider = ''
seat.credit_hours = None seat.credit_hours = None
seat.credit_price = 0.00 seat.credit_price = 0
class BaseUserAdminForm(forms.ModelForm): class BaseUserAdminForm(forms.ModelForm):
......
# -*- coding: utf-8 -*-
# Generated by Django 1.11.3 on 2017-09-25 16:44
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('publisher', '0057_auto_20170920_1821'),
]
operations = [
migrations.AlterField(
model_name='courserun',
name='enrollment_end',
field=models.DateTimeField(blank=True, null=True, verbose_name='Enrollment End Date'),
),
migrations.AlterField(
model_name='courserun',
name='enrollment_start',
field=models.DateTimeField(blank=True, null=True, verbose_name='Enrollment Start Date'),
),
migrations.AlterField(
model_name='historicalcourserun',
name='enrollment_end',
field=models.DateTimeField(blank=True, null=True, verbose_name='Enrollment End Date'),
),
migrations.AlterField(
model_name='historicalcourserun',
name='enrollment_start',
field=models.DateTimeField(blank=True, null=True, verbose_name='Enrollment Start Date'),
),
]
...@@ -275,8 +275,8 @@ class CourseRun(TimeStampedModel, ChangedByMixin): ...@@ -275,8 +275,8 @@ class CourseRun(TimeStampedModel, ChangedByMixin):
start = models.DateTimeField(null=True, blank=True) start = models.DateTimeField(null=True, blank=True)
end = models.DateTimeField(null=True, blank=True) end = models.DateTimeField(null=True, blank=True)
enrollment_start = models.DateTimeField(null=True, blank=True) enrollment_start = models.DateTimeField(null=True, blank=True, verbose_name=_('Enrollment Start Date'))
enrollment_end = models.DateTimeField(null=True, blank=True) enrollment_end = models.DateTimeField(null=True, blank=True, verbose_name=_('Enrollment End Date'))
certificate_generation = models.DateTimeField(null=True, blank=True) certificate_generation = models.DateTimeField(null=True, blank=True)
pacing_type = models.CharField( pacing_type = models.CharField(
max_length=255, db_index=True, null=True, blank=True, choices=CourseRunPacing.choices, max_length=255, db_index=True, null=True, blank=True, choices=CourseRunPacing.choices,
......
from datetime import datetime, timedelta from datetime import datetime, timedelta
import pytz
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.test import TestCase from django.test import TestCase
from pytz import timezone
from course_discovery.apps.core.models import User from course_discovery.apps.core.models import User
from course_discovery.apps.core.tests.factories import UserFactory from course_discovery.apps.core.tests.factories import UserFactory
...@@ -84,111 +84,125 @@ class PublisherUserCreationFormTests(TestCase): ...@@ -84,111 +84,125 @@ class PublisherUserCreationFormTests(TestCase):
class PublisherCourseRunEditFormTests(TestCase): class PublisherCourseRunEditFormTests(TestCase):
""" def assert_field_valid(self, data, field_name):
Tests for the publisher 'CourseRunForm'. form = CourseRunForm(data=data)
""" form.is_valid()
assert field_name not in form.errors
def test_minimum_effort(self): def test_minimum_effort(self):
""" form = CourseRunForm(data={'min_effort': 1, 'max_effort': 1})
Verify that 'clean' raises 'ValidationError' error if Minimum effort is greater assert not form.is_valid()
than Maximum effort. assert form.errors['min_effort'] == ['Minimum effort must be less than maximum effort.']
"""
run_form = CourseRunForm()
run_form.cleaned_data = {'min_effort': 4, 'max_effort': 2}
with self.assertRaises(ValidationError):
run_form.clean()
run_form.cleaned_data['min_effort'] = 1 form = CourseRunForm(data={'min_effort': 2, 'max_effort': 1})
self.assertEqual(run_form.clean(), run_form.cleaned_data) assert not form.is_valid()
assert form.errors['min_effort'] == ['Minimum effort must be less than maximum effort.']
def test_minimum_maximum_effort_equality(self): self.assert_field_valid({'min_effort': 1, 'max_effort': 2}, 'min_effort')
"""
Verify that 'clean' raises 'ValidationError' error if Minimum effort and
Maximum effort are equal.
"""
run_form = CourseRunForm()
run_form.cleaned_data = {'min_effort': 4, 'max_effort': 4}
with self.assertRaises(ValidationError) as err:
run_form.clean()
self.assertEqual(str(err.exception), "{'min_effort': ['Minimum effort and Maximum effort can not be same']}") def test_start(self):
run_form.cleaned_data['min_effort'] = 2 now = datetime.utcnow()
self.assertEqual(run_form.clean(), run_form.cleaned_data) form = CourseRunForm(data={'start': now, 'end': now - timedelta(days=1)})
assert not form.is_valid()
assert form.errors['start'] == ['The start date must occur before the end date.']
def test_minimum__effort_is_not_empty(self): form = CourseRunForm(data={'start': now, 'end': now})
""" assert not form.is_valid()
Verify that 'clean' raises 'ValidationError' error if Minimum effort is assert form.errors['start'] == ['The start date must occur before the end date.']
empty.
"""
run_form = CourseRunForm()
run_form.cleaned_data = {'max_effort': 4}
with self.assertRaises(ValidationError) as err:
run_form.clean()
self.assertEqual(str(err.exception), "{'min_effort': ['Minimum effort can not be empty']}") self.assert_field_valid({'start': now, 'end': now + timedelta(days=1)}, 'start')
run_form.cleaned_data['min_effort'] = 1
self.assertEqual(run_form.clean(), run_form.cleaned_data)
def test_course_run_dates(self): def test_xseries_name(self):
""" form = CourseRunForm(data={'is_xseries': True, 'xseries_name': ''})
Verify that 'clean' raises 'ValidationError' if the Start date is in the past assert not form.is_valid()
Or if the Start date is after the End date assert form.errors['xseries_name'] == ['Please provide the name of the associated XSeries.']
"""
run_form = CourseRunForm()
current_datetime = datetime.now(timezone('US/Central'))
run_form.cleaned_data = {'start': current_datetime + timedelta(days=3),
'end': current_datetime + timedelta(days=1)}
with self.assertRaises(ValidationError):
run_form.clean()
run_form.cleaned_data['start'] = current_datetime + timedelta(days=1) self.assert_field_valid({'is_xseries': True, 'xseries_name': 'abc'}, 'xseries_name')
run_form.cleaned_data['end'] = current_datetime + timedelta(days=3)
self.assertEqual(run_form.clean(), run_form.cleaned_data)
def test_course_run_xseries(self): def test_micromasters_name(self):
""" form = CourseRunForm(data={'is_micromasters': True, 'micromasters_name': ''})
Verify that 'clean' raises 'ValidationError' if the is_xseries is checked assert not form.is_valid()
but no xseries_name has been entered assert form.errors['micromasters_name'] == ['Please provide the name of the associated MicroMasters.']
"""
run_form = CourseRunForm()
run_form.cleaned_data = {'is_xseries': True, 'xseries_name': ''}
with self.assertRaises(ValidationError):
run_form.clean()
run_form.cleaned_data['xseries_name'] = "Test Name" self.assert_field_valid({'is_micromasters': True, 'micromasters_name': 'abc'}, 'micromasters_name')
self.assertEqual(run_form.clean(), run_form.cleaned_data)
def test_course_run_micromasters(self): def test_professional_certificate_name(self):
""" form = CourseRunForm(data={'is_professional_certificate': True, 'professional_certificate_name': ''})
Verify that 'clean' raises 'ValidationError' if the is_micromasters is checked assert not form.is_valid()
but no micromasters_name has been entered assert form.errors['professional_certificate_name'] == [
""" 'Please provide the name of the associated Professional Certificate program.']
run_form = CourseRunForm()
run_form.cleaned_data = {'is_micromasters': True, 'micromasters_name': ''}
with self.assertRaises(ValidationError):
run_form.clean()
run_form.cleaned_data['micromasters_name'] = "Test Name" self.assert_field_valid({'is_professional_certificate': True, 'professional_certificate_name': 'abc'},
self.assertEqual(run_form.clean(), run_form.cleaned_data) 'professional_certificate_name')
def test_course_run_professional_certificate(self): def test_enrollment_start_validation(self):
""" now = datetime.utcnow().replace(tzinfo=pytz.utc)
Verify that 'clean' raises 'ValidationError' if the is_professional_certificate is checked data = {
but no professional_certificate_name has been entered 'enrollment_start': now + timedelta(days=1),
""" 'start': now,
run_form = CourseRunForm() }
run_form.cleaned_data = {'is_professional_certificate': True, 'professional_certificate_name': ''} form = CourseRunForm(data=data)
with self.assertRaises(ValidationError): assert not form.is_valid()
run_form.clean() expected = ['The enrollment start date must occur on or before the course start date.']
assert form.errors['enrollment_start'] == expected
data = {
'enrollment_start': now,
'start': now,
}
self.assert_field_valid(data, 'enrollment_start')
run_form.cleaned_data['professional_certificate_name'] = "Test Name" data = {
self.assertEqual(run_form.clean(), run_form.cleaned_data) 'enrollment_start': now - timedelta(days=1),
'start': now,
}
self.assert_field_valid(data, 'enrollment_start')
def test_enrollment_start_default(self):
now = datetime.utcnow().replace(tzinfo=pytz.utc)
data = {
'enrollment_start': None,
'start': now,
}
form = CourseRunForm(data=data)
form.is_valid()
assert form.cleaned_data['enrollment_start'] == now
def test_enrollment_end_validation(self):
now = datetime.utcnow().replace(tzinfo=pytz.utc)
data = {
'enrollment_end': now + timedelta(days=1),
'end': now,
}
form = CourseRunForm(data=data)
assert not form.is_valid()
expected = ['The enrollment end date must occur on or after the course end date.']
assert form.errors['enrollment_end'] == expected
data = {
'enrollment_end': now,
'end': now,
}
self.assert_field_valid(data, 'enrollment_end')
data = {
'enrollment_end': now - timedelta(days=1),
'end': now,
}
self.assert_field_valid(data, 'enrollment_end')
def test_enrollment_end_default(self):
now = datetime.utcnow().replace(tzinfo=pytz.utc)
data = {
'enrollment_end': None,
'end': now,
}
form = CourseRunForm(data=data)
form.is_valid()
assert form.cleaned_data['enrollment_end'] == now
class PublisherCustomCourseFormTests(TestCase): class PublisherCustomCourseFormTests(TestCase):
"""
Tests for publisher 'CourseForm'
"""
def setUp(self): def setUp(self):
super(PublisherCustomCourseFormTests, self).setUp() super(PublisherCustomCourseFormTests, self).setUp()
self.course_form = CourseForm() self.course_form = CourseForm()
......
...@@ -18,7 +18,6 @@ from django.test import TestCase ...@@ -18,7 +18,6 @@ from django.test import TestCase
from django.urls import reverse from django.urls import reverse
from guardian.shortcuts import assign_perm from guardian.shortcuts import assign_perm
from opaque_keys.edx.keys import CourseKey from opaque_keys.edx.keys import CourseKey
from pytz import timezone
from testfixtures import LogCapture from testfixtures import LogCapture
from course_discovery.apps.api.tests.mixins import SiteMixin from course_discovery.apps.api.tests.mixins import SiteMixin
...@@ -298,9 +297,9 @@ class CreateCourseRunViewTests(SiteMixin, TestCase): ...@@ -298,9 +297,9 @@ class CreateCourseRunViewTests(SiteMixin, TestCase):
self.course_run_dict, self.course_run_dict,
['end', 'enrollment_start', 'enrollment_end', 'priority', 'certificate_generation', 'id'] ['end', 'enrollment_start', 'enrollment_end', 'priority', 'certificate_generation', 'id']
) )
current_datetime = datetime.now(timezone('US/Central')) now = datetime.utcnow()
self.course_run_dict['start'] = (current_datetime + timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S') self.course_run_dict['start'] = (now + timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S')
self.course_run_dict['end'] = (current_datetime + timedelta(days=3)).strftime('%Y-%m-%d %H:%M:%S') self.course_run_dict['end'] = (now + timedelta(days=3)).strftime('%Y-%m-%d %H:%M:%S')
self.client.login(username=self.user.username, password=USER_PASSWORD) self.client.login(username=self.user.username, password=USER_PASSWORD)
def _pop_valuse_from_dict(self, data_dict, key_list): def _pop_valuse_from_dict(self, data_dict, key_list):
...@@ -445,7 +444,7 @@ class CreateCourseRunViewTests(SiteMixin, TestCase): ...@@ -445,7 +444,7 @@ class CreateCourseRunViewTests(SiteMixin, TestCase):
post_data post_data
) )
self.assertContains(response, 'Only audit seat can be without price.', status_code=400) self.assertContains(response, 'Please specify a price.', status_code=400)
post_data['price'] = 450 post_data['price'] = 450
...@@ -2848,9 +2847,6 @@ class CourseRunEditViewTests(SiteMixin, TestCase): ...@@ -2848,9 +2847,6 @@ class CourseRunEditViewTests(SiteMixin, TestCase):
self.seat = factories.SeatFactory(course_run=self.course_run, type=Seat.VERIFIED, price=2) self.seat = factories.SeatFactory(course_run=self.course_run, type=Seat.VERIFIED, price=2)
self.client.login(username=self.user.username, password=USER_PASSWORD) self.client.login(username=self.user.username, password=USER_PASSWORD)
current_datetime = datetime.now(timezone('US/Central'))
self.start_date_time = (current_datetime + timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S')
self.end_date_time = (current_datetime + timedelta(days=60)).strftime('%Y-%m-%d %H:%M:%S')
# creating default organizations roles # creating default organizations roles
factories.OrganizationUserRoleFactory( factories.OrganizationUserRoleFactory(
...@@ -2875,7 +2871,7 @@ class CourseRunEditViewTests(SiteMixin, TestCase): ...@@ -2875,7 +2871,7 @@ class CourseRunEditViewTests(SiteMixin, TestCase):
assign_perm(OrganizationExtension.EDIT_COURSE_RUN, self.group, self.organization_extension) assign_perm(OrganizationExtension.EDIT_COURSE_RUN, self.group, self.organization_extension)
assign_perm(OrganizationExtension.VIEW_COURSE_RUN, self.group, self.organization_extension) assign_perm(OrganizationExtension.VIEW_COURSE_RUN, self.group, self.organization_extension)
# assert edit page is loading sucesfully. # assert edit page is loading successfully.
self.edit_page_url = reverse('publisher:publisher_course_runs_edit', kwargs={'pk': self.new_course_run.id}) self.edit_page_url = reverse('publisher:publisher_course_runs_edit', kwargs={'pk': self.new_course_run.id})
response = self.client.get(self.edit_page_url) response = self.client.get(self.edit_page_url)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
...@@ -2895,14 +2891,19 @@ class CourseRunEditViewTests(SiteMixin, TestCase): ...@@ -2895,14 +2891,19 @@ class CourseRunEditViewTests(SiteMixin, TestCase):
course_dict.update(**data) course_dict.update(**data)
course_dict['team_admin'] = self.user.id course_dict['team_admin'] = self.user.id
if course_run: if course_run:
now = datetime.utcnow()
start = now.strftime('%Y-%m-%d %H:%M:%S')
end = (now + timedelta(days=60)).strftime('%Y-%m-%d %H:%M:%S')
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')
course_dict.pop('end')
course_dict.pop('priority') course_dict.pop('priority')
course_dict['lms_course_id'] = '' course_dict['lms_course_id'] = ''
course_dict['start'] = self.start_date_time course_dict['start'] = start
course_dict['end'] = self.end_date_time course_dict['end'] = end
course_dict['organization'] = self.organization_extension.organization.id course_dict['organization'] = self.organization_extension.organization.id
course_dict['enrollment_start'] = start
course_dict['enrollment_end'] = end
course_dict.pop('id') course_dict.pop('id')
return course_dict return course_dict
...@@ -3460,7 +3461,7 @@ class CreateRunFromDashboardViewTests(SiteMixin, TestCase): ...@@ -3460,7 +3461,7 @@ class CreateRunFromDashboardViewTests(SiteMixin, TestCase):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
def _post_data(self): def _post_data(self):
current_datetime = datetime.now(timezone('US/Central')) current_datetime = datetime.utcnow()
return { return {
'course': self.course.id, 'course': self.course.id,
'start': (current_datetime + timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'), 'start': (current_datetime + timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'),
......
...@@ -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: 2017-09-20 15:36-0400\n" "POT-Creation-Date: 2017-09-25 14:59-0400\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"
...@@ -737,31 +737,33 @@ msgid "Video Language" ...@@ -737,31 +737,33 @@ msgid "Video Language"
msgstr "" msgstr ""
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Start date cannot be after the End date" msgid "The start date must occur before the end date."
msgstr "" msgstr ""
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Minimum effort cannot be greater than Maximum effort" msgid "Minimum effort must be less than maximum effort."
msgstr "" msgstr ""
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Minimum effort and Maximum effort can not be same" msgid "Please provide the name of the associated XSeries."
msgstr "" msgstr ""
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Minimum effort can not be empty" msgid "Please provide the name of the associated MicroMasters."
msgstr "" msgstr ""
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Enter XSeries program name" msgid ""
"Please provide the name of the associated Professional Certificate program."
msgstr "" msgstr ""
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Enter Micromasters program name" msgid ""
"The enrollment start date must occur on or before the course start date."
msgstr "" msgstr ""
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Enter Professional Certificate program name" msgid "The enrollment end date must occur on or after the course end date."
msgstr "" msgstr ""
#: apps/publisher/forms.py #: apps/publisher/forms.py
...@@ -782,7 +784,11 @@ msgid "Enrollment Track" ...@@ -782,7 +784,11 @@ msgid "Enrollment Track"
msgstr "" msgstr ""
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Only audit seat can be without price." msgid "Please specify a price."
msgstr ""
#: apps/publisher/forms.py
msgid "Please specify a price for credit."
msgstr "" msgstr ""
#: apps/publisher/forms.py #: apps/publisher/forms.py
...@@ -858,6 +864,14 @@ msgid "Level 5" ...@@ -858,6 +864,14 @@ msgid "Level 5"
msgstr "" msgstr ""
#: apps/publisher/models.py #: apps/publisher/models.py
msgid "Enrollment Start Date"
msgstr ""
#: apps/publisher/models.py
msgid "Enrollment End Date"
msgstr ""
#: apps/publisher/models.py
msgid "Content Language" msgid "Content Language"
msgstr "" msgstr ""
...@@ -2064,6 +2078,24 @@ msgid "" ...@@ -2064,6 +2078,24 @@ msgid ""
msgstr "" msgstr ""
#: apps/publisher/templates/publisher/course_run/edit_run_form.html #: apps/publisher/templates/publisher/course_run/edit_run_form.html
msgid "Enrollment Dates"
msgstr ""
#: apps/publisher/templates/publisher/course_run/edit_run_form.html
msgid ""
"The date on which the course opens for enrollment. This date must occur on "
"or before the course start date. Leaving this field empty will result in the"
" default value, the course start date, being used."
msgstr ""
#: apps/publisher/templates/publisher/course_run/edit_run_form.html
msgid ""
"The date on which course enrollment is closed. This date must occur after "
"the course start date, but before the course end date. Leaving this field "
"empty will result in the default value, the course end date, being used."
msgstr ""
#: apps/publisher/templates/publisher/course_run/edit_run_form.html
msgid "Update Course Run" msgid "Update Course Run"
msgstr "" msgstr ""
...@@ -2612,8 +2644,8 @@ msgstr "" ...@@ -2612,8 +2644,8 @@ msgstr ""
#: apps/publisher/templates/publisher/email/comment.html #: apps/publisher/templates/publisher/email/comment.html
#, python-format #, python-format
msgid "" msgid ""
"The %(team_name)s made the following comment on %(course_name)s on %(date)s " "%(user_name)s made the following comment on %(course_name)s on %(date)s at "
"at %(time)s" "%(time)s"
msgstr "" msgstr ""
#: apps/publisher/templates/publisher/email/comment.html #: apps/publisher/templates/publisher/email/comment.html
...@@ -2634,7 +2666,7 @@ msgstr "" ...@@ -2634,7 +2666,7 @@ msgstr ""
#: apps/publisher/templates/publisher/email/comment.txt #: apps/publisher/templates/publisher/email/comment.txt
#, python-format #, python-format
msgid "" msgid ""
"The %(team_name)s made the following comment on %(course_name)s %(date)s at " "%(user_name)s made the following comment on %(course_name)s %(date)s at "
"%(time)s." "%(time)s."
msgstr "" msgstr ""
......
...@@ -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: 2017-09-20 15:36-0400\n" "POT-Creation-Date: 2017-09-25 14:59-0400\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"
...@@ -870,40 +870,48 @@ msgid "Video Language" ...@@ -870,40 +870,48 @@ msgid "Video Language"
msgstr "Vïdéö Längüägé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт#" msgstr "Vïdéö Längüägé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт#"
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Start date cannot be after the End date" msgid "The start date must occur before the end date."
msgstr "" msgstr ""
"Stärt däté çännöt ßé äftér thé Énd däté Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " "Thé stärt däté müst öççür ßéföré thé énd däté. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
"¢σηѕє¢тєтυя#" "¢σηѕє¢тєтυя α#"
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Minimum effort cannot be greater than Maximum effort" msgid "Minimum effort must be less than maximum effort."
msgstr "" msgstr ""
"Mïnïmüm éffört çännöt ßé gréätér thän Mäxïmüm éffört Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт " "Mïnïmüm éffört müst ßé léss thän mäxïmüm éffört. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт "
"αмєт, ¢σηѕє¢тєтυя α#" "αмєт, ¢σηѕє¢тєтυя α#"
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Minimum effort and Maximum effort can not be same" msgid "Please provide the name of the associated XSeries."
msgstr "" msgstr ""
"Mïnïmüm éffört änd Mäxïmüm éffört çän nöt ßé sämé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт " "Pléäsé prövïdé thé nämé öf thé ässöçïätéd XSérïés. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт "
"αмєт, ¢σηѕє¢тєтυя α#" "αмєт, ¢σηѕє¢тєтυя α#"
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Minimum effort can not be empty" msgid "Please provide the name of the associated MicroMasters."
msgstr "Mïnïmüm éffört çän nöt ßé émptý Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#" msgstr ""
"Pléäsé prövïdé thé nämé öf thé ässöçïätéd MïçröMästérs. Ⱡ'σяєм ιρѕυм ∂σłσя "
"ѕιт αмєт, ¢σηѕє¢тєтυя α#"
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Enter XSeries program name" msgid ""
msgstr "Éntér XSérïés prögräm nämé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#" "Please provide the name of the associated Professional Certificate program."
msgstr ""
"Pléäsé prövïdé thé nämé öf thé ässöçïätéd Pröféssïönäl Çértïfïçäté prögräm. "
"Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυ#"
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Enter Micromasters program name" msgid ""
msgstr "Éntér Mïçrömästérs prögräm nämé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#" "The enrollment start date must occur on or before the course start date."
msgstr ""
"Thé énröllmént stärt däté müst öççür ön ör ßéföré thé çöürsé stärt däté. "
"Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя#"
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Enter Professional Certificate program name" msgid "The enrollment end date must occur on or after the course end date."
msgstr "" msgstr ""
"Éntér Pröféssïönäl Çértïfïçäté prögräm nämé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " "Thé énröllmént énd däté müst öççür ön ör äftér thé çöürsé énd däté. Ⱡ'σяєм "
"¢σηѕє¢тєтυя #" "ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя #"
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Choose enrollment track" msgid "Choose enrollment track"
...@@ -923,10 +931,13 @@ msgid "Enrollment Track" ...@@ -923,10 +931,13 @@ msgid "Enrollment Track"
msgstr "Énröllmént Träçk Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αм#" msgstr "Énröllmént Träçk Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αм#"
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "Only audit seat can be without price." msgid "Please specify a price."
msgstr "Pléäsé spéçïfý ä prïçé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σ#"
#: apps/publisher/forms.py
msgid "Please specify a price for credit."
msgstr "" msgstr ""
"Önlý äüdït séät çän ßé wïthöüt prïçé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, " "Pléäsé spéçïfý ä prïçé för çrédït. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєт#"
"¢σηѕє¢тєтυ#"
#: apps/publisher/forms.py #: apps/publisher/forms.py
msgid "This field is required." msgid "This field is required."
...@@ -1001,6 +1012,14 @@ msgid "Level 5" ...@@ -1001,6 +1012,14 @@ msgid "Level 5"
msgstr "Lévél 5 Ⱡ'σяєм ιρѕυм #" msgstr "Lévél 5 Ⱡ'σяєм ιρѕυм #"
#: apps/publisher/models.py #: apps/publisher/models.py
msgid "Enrollment Start Date"
msgstr "Énröllmént Stärt Däté Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, #"
#: apps/publisher/models.py
msgid "Enrollment End Date"
msgstr "Énröllmént Énd Däté Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт,#"
#: apps/publisher/models.py
msgid "Content Language" msgid "Content Language"
msgstr "Çöntént Längüägé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αм#" msgstr "Çöntént Längüägé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αм#"
...@@ -2473,6 +2492,40 @@ msgstr "" ...@@ -2473,6 +2492,40 @@ msgstr ""
"Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя#" "Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя#"
#: apps/publisher/templates/publisher/course_run/edit_run_form.html #: apps/publisher/templates/publisher/course_run/edit_run_form.html
msgid "Enrollment Dates"
msgstr "Énröllmént Dätés Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αм#"
#: apps/publisher/templates/publisher/course_run/edit_run_form.html
msgid ""
"The date on which the course opens for enrollment. This date must occur on "
"or before the course start date. Leaving this field empty will result in the"
" default value, the course start date, being used."
msgstr ""
"Thé däté ön whïçh thé çöürsé öpéns för énröllmént. Thïs däté müst öççür ön "
"ör ßéföré thé çöürsé stärt däté. Léävïng thïs fïéld émptý wïll résült ïn thé"
" défäült välüé, thé çöürsé stärt däté, ßéïng üséd. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт "
"αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт "
"łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм νєηιαм, qυιѕ ησѕтяυ∂ "
"єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ "
"αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ "
"ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢α#"
#: apps/publisher/templates/publisher/course_run/edit_run_form.html
msgid ""
"The date on which course enrollment is closed. This date must occur after "
"the course start date, but before the course end date. Leaving this field "
"empty will result in the default value, the course end date, being used."
msgstr ""
"Thé däté ön whïçh çöürsé énröllmént ïs çlöséd. Thïs däté müst öççür äftér "
"thé çöürsé stärt däté, ßüt ßéföré thé çöürsé énd däté. Léävïng thïs fïéld "
"émptý wïll résült ïn thé défäült välüé, thé çöürsé énd däté, ßéïng üséd. "
"Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ "
"тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм νєηιαм,"
" qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ "
"¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє "
"¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ρ#"
#: apps/publisher/templates/publisher/course_run/edit_run_form.html
msgid "Update Course Run" msgid "Update Course Run"
msgstr "Ûpdäté Çöürsé Rün Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмє#" msgstr "Ûpdäté Çöürsé Rün Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмє#"
...@@ -3081,11 +3134,11 @@ msgstr "" ...@@ -3081,11 +3134,11 @@ msgstr ""
#: apps/publisher/templates/publisher/email/comment.html #: apps/publisher/templates/publisher/email/comment.html
#, python-format #, python-format
msgid "" msgid ""
"The %(team_name)s made the following comment on %(course_name)s on %(date)s " "%(user_name)s made the following comment on %(course_name)s on %(date)s at "
"at %(time)s" "%(time)s"
msgstr "" msgstr ""
"Thé %(team_name)s mädé thé föllöwïng çömmént ön %(course_name)s ön %(date)s " "%(user_name)s mädé thé föllöwïng çömmént ön %(course_name)s ön %(date)s ät "
"ät %(time)s Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#" "%(time)s Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#"
#: apps/publisher/templates/publisher/email/comment.html #: apps/publisher/templates/publisher/email/comment.html
#: apps/publisher/templates/publisher/email/comment.txt #: apps/publisher/templates/publisher/email/comment.txt
...@@ -3105,10 +3158,10 @@ msgstr "Thé édX téäm Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#" ...@@ -3105,10 +3158,10 @@ msgstr "Thé édX téäm Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#"
#: apps/publisher/templates/publisher/email/comment.txt #: apps/publisher/templates/publisher/email/comment.txt
#, python-format #, python-format
msgid "" msgid ""
"The %(team_name)s made the following comment on %(course_name)s %(date)s at " "%(user_name)s made the following comment on %(course_name)s %(date)s at "
"%(time)s." "%(time)s."
msgstr "" msgstr ""
"Thé %(team_name)s mädé thé föllöwïng çömmént ön %(course_name)s %(date)s ät " "%(user_name)s mädé thé föllöwïng çömmént ön %(course_name)s %(date)s ät "
"%(time)s. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#" "%(time)s. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#"
#: apps/publisher/templates/publisher/email/course/mark_as_reviewed.html #: apps/publisher/templates/publisher/email/course/mark_as_reviewed.html
......
...@@ -14,11 +14,6 @@ ...@@ -14,11 +14,6 @@
@include float(left); @include float(left);
@include padding(20px, 20px, 20px, 20px); @include padding(20px, 20px, 20px, 20px);
} }
.layout-col {
}
} }
.layout, .layout-flush { .layout, .layout-flush {
...@@ -209,6 +204,7 @@ ...@@ -209,6 +204,7 @@
-webkit-box-shadow: 0 -8px 6px -6px rgba(0,0,0,0.05); -webkit-box-shadow: 0 -8px 6px -6px rgba(0,0,0,0.05);
-moz-box-shadow: 0 -8px 6px -6px rgba(0,0,0,0.05); -moz-box-shadow: 0 -8px 6px -6px rgba(0,0,0,0.05);
box-shadow: 0 -8px 6px -6px rgba(0,0,0,0.05); box-shadow: 0 -8px 6px -6px rgba(0,0,0,0.05);
text-transform: uppercase;
} }
.field-label { .field-label {
font-weight: bold; font-weight: bold;
......
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