Commit 066d6216 by Clinton Blackburn

Exposed enrollment date fields on course run form

LEARNER-2621
parent 7360a79d
......@@ -286,6 +286,7 @@ class CourseRunForm(BaseForm):
'length', 'transcript_languages', 'language', 'min_effort', 'max_effort', 'target_content', 'pacing_type',
'video_language', 'staff', 'start', 'end', 'is_xseries', 'xseries_name', 'is_professional_certificate',
'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
......@@ -323,30 +324,48 @@ class CourseRunForm(BaseForm):
def clean(self):
cleaned_data = self.cleaned_data
min_effort = cleaned_data.get("min_effort")
max_effort = cleaned_data.get("max_effort")
start = cleaned_data.get("start")
end = cleaned_data.get("end")
is_xseries = cleaned_data.get("is_xseries")
xseries_name = cleaned_data.get("xseries_name")
is_micromasters = cleaned_data.get("is_micromasters")
micromasters_name = cleaned_data.get("micromasters_name")
is_professional_certificate = cleaned_data.get("is_professional_certificate")
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 min_effort and max_effort and min_effort > max_effort:
raise ValidationError({'min_effort': _('Minimum effort cannot be greater than Maximum 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')})
if not min_effort and max_effort:
raise ValidationError({'min_effort': _('Minimum effort can not be empty')})
min_effort = cleaned_data.get('min_effort')
max_effort = cleaned_data.get('max_effort')
start = cleaned_data.get('start')
end = cleaned_data.get('end')
is_xseries = cleaned_data.get('is_xseries')
xseries_name = cleaned_data.get('xseries_name')
is_micromasters = cleaned_data.get('is_micromasters')
micromasters_name = cleaned_data.get('micromasters_name')
is_professional_certificate = cleaned_data.get('is_professional_certificate')
professional_certificate_name = cleaned_data.get('professional_certificate_name')
if start and end and start >= end:
self.add_error('start', _('The start date must occur before the end date.'))
if min_effort and max_effort and min_effort >= max_effort:
self.add_error('min_effort', _('Minimum effort must be less than maximum effort.'))
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:
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:
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
......@@ -413,18 +432,18 @@ class SeatForm(BaseForm):
credit_price = self.cleaned_data.get('credit_price')
seat_type = self.cleaned_data.get('type')
if seat_type in [Seat.PROFESSIONAL, Seat.VERIFIED, Seat.CREDIT] and not price:
self.add_error('price', _('Only audit seat can be without price.'))
if seat_type and seat_type != Seat.AUDIT and not price:
self.add_error('price', _('Please specify a 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
def reset_credit_to_default(self, seat):
seat.credit_provider = ''
seat.credit_hours = None
seat.credit_price = 0.00
seat.credit_price = 0
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):
start = models.DateTimeField(null=True, blank=True)
end = models.DateTimeField(null=True, blank=True)
enrollment_start = models.DateTimeField(null=True, blank=True)
enrollment_end = 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, verbose_name=_('Enrollment End Date'))
certificate_generation = models.DateTimeField(null=True, blank=True)
pacing_type = models.CharField(
max_length=255, db_index=True, null=True, blank=True, choices=CourseRunPacing.choices,
......
from datetime import datetime, timedelta
import pytz
from django.core.exceptions import ValidationError
from django.test import TestCase
from pytz import timezone
from course_discovery.apps.core.models import User
from course_discovery.apps.core.tests.factories import UserFactory
......@@ -84,111 +84,125 @@ class PublisherUserCreationFormTests(TestCase):
class PublisherCourseRunEditFormTests(TestCase):
"""
Tests for the publisher 'CourseRunForm'.
"""
def assert_field_valid(self, data, field_name):
form = CourseRunForm(data=data)
form.is_valid()
assert field_name not in form.errors
def test_minimum_effort(self):
"""
Verify that 'clean' raises 'ValidationError' error if Minimum effort is greater
than Maximum effort.
"""
run_form = CourseRunForm()
run_form.cleaned_data = {'min_effort': 4, 'max_effort': 2}
with self.assertRaises(ValidationError):
run_form.clean()
form = CourseRunForm(data={'min_effort': 1, 'max_effort': 1})
assert not form.is_valid()
assert form.errors['min_effort'] == ['Minimum effort must be less than maximum effort.']
run_form.cleaned_data['min_effort'] = 1
self.assertEqual(run_form.clean(), run_form.cleaned_data)
form = CourseRunForm(data={'min_effort': 2, 'max_effort': 1})
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):
"""
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.assert_field_valid({'min_effort': 1, 'max_effort': 2}, 'min_effort')
self.assertEqual(str(err.exception), "{'min_effort': ['Minimum effort and Maximum effort can not be same']}")
run_form.cleaned_data['min_effort'] = 2
self.assertEqual(run_form.clean(), run_form.cleaned_data)
def test_start(self):
now = datetime.utcnow()
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):
"""
Verify that 'clean' raises 'ValidationError' error if Minimum effort is
empty.
"""
run_form = CourseRunForm()
run_form.cleaned_data = {'max_effort': 4}
with self.assertRaises(ValidationError) as err:
run_form.clean()
form = CourseRunForm(data={'start': now, 'end': now})
assert not form.is_valid()
assert form.errors['start'] == ['The start date must occur before the end date.']
self.assertEqual(str(err.exception), "{'min_effort': ['Minimum effort can not be empty']}")
run_form.cleaned_data['min_effort'] = 1
self.assertEqual(run_form.clean(), run_form.cleaned_data)
self.assert_field_valid({'start': now, 'end': now + timedelta(days=1)}, 'start')
def test_course_run_dates(self):
"""
Verify that 'clean' raises 'ValidationError' if the Start date is in the past
Or if the Start date is after the End date
"""
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()
def test_xseries_name(self):
form = CourseRunForm(data={'is_xseries': True, 'xseries_name': ''})
assert not form.is_valid()
assert form.errors['xseries_name'] == ['Please provide the name of the associated XSeries.']
run_form.cleaned_data['start'] = current_datetime + timedelta(days=1)
run_form.cleaned_data['end'] = current_datetime + timedelta(days=3)
self.assertEqual(run_form.clean(), run_form.cleaned_data)
self.assert_field_valid({'is_xseries': True, 'xseries_name': 'abc'}, 'xseries_name')
def test_course_run_xseries(self):
"""
Verify that 'clean' raises 'ValidationError' if the is_xseries is checked
but no xseries_name has been entered
"""
run_form = CourseRunForm()
run_form.cleaned_data = {'is_xseries': True, 'xseries_name': ''}
with self.assertRaises(ValidationError):
run_form.clean()
def test_micromasters_name(self):
form = CourseRunForm(data={'is_micromasters': True, 'micromasters_name': ''})
assert not form.is_valid()
assert form.errors['micromasters_name'] == ['Please provide the name of the associated MicroMasters.']
run_form.cleaned_data['xseries_name'] = "Test Name"
self.assertEqual(run_form.clean(), run_form.cleaned_data)
self.assert_field_valid({'is_micromasters': True, 'micromasters_name': 'abc'}, 'micromasters_name')
def test_course_run_micromasters(self):
"""
Verify that 'clean' raises 'ValidationError' if the is_micromasters is checked
but no micromasters_name has been entered
"""
run_form = CourseRunForm()
run_form.cleaned_data = {'is_micromasters': True, 'micromasters_name': ''}
with self.assertRaises(ValidationError):
run_form.clean()
def test_professional_certificate_name(self):
form = CourseRunForm(data={'is_professional_certificate': True, 'professional_certificate_name': ''})
assert not form.is_valid()
assert form.errors['professional_certificate_name'] == [
'Please provide the name of the associated Professional Certificate program.']
run_form.cleaned_data['micromasters_name'] = "Test Name"
self.assertEqual(run_form.clean(), run_form.cleaned_data)
self.assert_field_valid({'is_professional_certificate': True, 'professional_certificate_name': 'abc'},
'professional_certificate_name')
def test_course_run_professional_certificate(self):
"""
Verify that 'clean' raises 'ValidationError' if the is_professional_certificate is checked
but no professional_certificate_name has been entered
"""
run_form = CourseRunForm()
run_form.cleaned_data = {'is_professional_certificate': True, 'professional_certificate_name': ''}
with self.assertRaises(ValidationError):
run_form.clean()
def test_enrollment_start_validation(self):
now = datetime.utcnow().replace(tzinfo=pytz.utc)
data = {
'enrollment_start': now + timedelta(days=1),
'start': now,
}
form = CourseRunForm(data=data)
assert not form.is_valid()
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"
self.assertEqual(run_form.clean(), run_form.cleaned_data)
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):
"""
Tests for publisher 'CourseForm'
"""
def setUp(self):
super(PublisherCustomCourseFormTests, self).setUp()
self.course_form = CourseForm()
......
......@@ -18,7 +18,6 @@ from django.test import TestCase
from django.urls import reverse
from guardian.shortcuts import assign_perm
from opaque_keys.edx.keys import CourseKey
from pytz import timezone
from testfixtures import LogCapture
from course_discovery.apps.api.tests.mixins import SiteMixin
......@@ -298,9 +297,9 @@ class CreateCourseRunViewTests(SiteMixin, TestCase):
self.course_run_dict,
['end', 'enrollment_start', 'enrollment_end', 'priority', 'certificate_generation', 'id']
)
current_datetime = datetime.now(timezone('US/Central'))
self.course_run_dict['start'] = (current_datetime + 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')
now = datetime.utcnow()
self.course_run_dict['start'] = (now + timedelta(days=1)).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)
def _pop_valuse_from_dict(self, data_dict, key_list):
......@@ -445,7 +444,7 @@ class CreateCourseRunViewTests(SiteMixin, TestCase):
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
......@@ -2848,9 +2847,6 @@ class CourseRunEditViewTests(SiteMixin, TestCase):
self.seat = factories.SeatFactory(course_run=self.course_run, type=Seat.VERIFIED, price=2)
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
factories.OrganizationUserRoleFactory(
......@@ -2875,7 +2871,7 @@ class CourseRunEditViewTests(SiteMixin, TestCase):
assign_perm(OrganizationExtension.EDIT_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})
response = self.client.get(self.edit_page_url)
self.assertEqual(response.status_code, 200)
......@@ -2895,14 +2891,19 @@ class CourseRunEditViewTests(SiteMixin, TestCase):
course_dict.update(**data)
course_dict['team_admin'] = self.user.id
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.pop('video_language')
course_dict.pop('end')
course_dict.pop('priority')
course_dict['lms_course_id'] = ''
course_dict['start'] = self.start_date_time
course_dict['end'] = self.end_date_time
course_dict['start'] = start
course_dict['end'] = end
course_dict['organization'] = self.organization_extension.organization.id
course_dict['enrollment_start'] = start
course_dict['enrollment_end'] = end
course_dict.pop('id')
return course_dict
......@@ -3460,7 +3461,7 @@ class CreateRunFromDashboardViewTests(SiteMixin, TestCase):
self.assertEqual(response.status_code, 200)
def _post_data(self):
current_datetime = datetime.now(timezone('US/Central'))
current_datetime = datetime.utcnow()
return {
'course': self.course.id,
'start': (current_datetime + timedelta(days=1)).strftime('%Y-%m-%d %H:%M:%S'),
......
......@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -737,31 +737,33 @@ msgid "Video Language"
msgstr ""
#: apps/publisher/forms.py
msgid "Start date cannot be after the End date"
msgid "The start date must occur before the end date."
msgstr ""
#: apps/publisher/forms.py
msgid "Minimum effort cannot be greater than Maximum effort"
msgid "Minimum effort must be less than maximum effort."
msgstr ""
#: apps/publisher/forms.py
msgid "Minimum effort and Maximum effort can not be same"
msgid "Please provide the name of the associated XSeries."
msgstr ""
#: apps/publisher/forms.py
msgid "Minimum effort can not be empty"
msgid "Please provide the name of the associated MicroMasters."
msgstr ""
#: apps/publisher/forms.py
msgid "Enter XSeries program name"
msgid ""
"Please provide the name of the associated Professional Certificate program."
msgstr ""
#: apps/publisher/forms.py
msgid "Enter Micromasters program name"
msgid ""
"The enrollment start date must occur on or before the course start date."
msgstr ""
#: 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 ""
#: apps/publisher/forms.py
......@@ -782,7 +784,11 @@ msgid "Enrollment Track"
msgstr ""
#: 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 ""
#: apps/publisher/forms.py
......@@ -858,6 +864,14 @@ msgid "Level 5"
msgstr ""
#: 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"
msgstr ""
......@@ -2064,6 +2078,24 @@ msgid ""
msgstr ""
#: 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"
msgstr ""
......@@ -2612,8 +2644,8 @@ msgstr ""
#: apps/publisher/templates/publisher/email/comment.html
#, python-format
msgid ""
"The %(team_name)s made the following comment on %(course_name)s on %(date)s "
"at %(time)s"
"%(user_name)s made the following comment on %(course_name)s on %(date)s at "
"%(time)s"
msgstr ""
#: apps/publisher/templates/publisher/email/comment.html
......@@ -2634,7 +2666,7 @@ msgstr ""
#: apps/publisher/templates/publisher/email/comment.txt
#, python-format
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."
msgstr ""
......
......@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
......@@ -870,40 +870,48 @@ msgid "Video Language"
msgstr "Vïdéö Längüägé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт#"
#: apps/publisher/forms.py
msgid "Start date cannot be after the End date"
msgid "The start date must occur before the end date."
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
msgid "Minimum effort cannot be greater than Maximum effort"
msgid "Minimum effort must be less than maximum effort."
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
msgid "Minimum effort and Maximum effort can not be same"
msgid "Please provide the name of the associated XSeries."
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
msgid "Minimum effort can not be empty"
msgstr "Mïnïmüm éffört çän nöt ßé émptý Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#"
msgid "Please provide the name of the associated MicroMasters."
msgstr ""
"Pléäsé prövïdé thé nämé öf thé ässöçïätéd MïçröMästérs. Ⱡ'σяєм ιρѕυм ∂σłσя "
"ѕιт αмєт, ¢σηѕє¢тєтυя α#"
#: apps/publisher/forms.py
msgid "Enter XSeries program name"
msgstr "Éntér XSérïés prögräm nämé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#"
msgid ""
"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
msgid "Enter Micromasters program name"
msgstr "Éntér Mïçrömästérs prögräm nämé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢т#"
msgid ""
"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
msgid "Enter Professional Certificate program name"
msgid "The enrollment end date must occur on or after the course end date."
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
msgid "Choose enrollment track"
......@@ -923,10 +931,13 @@ msgid "Enrollment Track"
msgstr "Énröllmént Träçk Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αм#"
#: 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 ""
"Önlý äüdït séät çän ßé wïthöüt prïçé. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
"¢σηѕє¢тєтυ#"
"Pléäsé spéçïfý ä prïçé för çrédït. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєт#"
#: apps/publisher/forms.py
msgid "This field is required."
......@@ -1001,6 +1012,14 @@ msgid "Level 5"
msgstr "Lévél 5 Ⱡ'σяєм ιρѕυм #"
#: 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"
msgstr "Çöntént Längüägé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αм#"
......@@ -2473,6 +2492,40 @@ msgstr ""
"Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя#"
#: 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"
msgstr "Ûpdäté Çöürsé Rün Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмє#"
......@@ -3081,11 +3134,11 @@ msgstr ""
#: apps/publisher/templates/publisher/email/comment.html
#, python-format
msgid ""
"The %(team_name)s made the following comment on %(course_name)s on %(date)s "
"at %(time)s"
"%(user_name)s made the following comment on %(course_name)s on %(date)s at "
"%(time)s"
msgstr ""
"Thé %(team_name)s mädé thé föllöwïng çömmént ön %(course_name)s ön %(date)s "
"ät %(time)s Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#"
"%(user_name)s mädé thé föllöwïng çömmént ön %(course_name)s ön %(date)s ät "
"%(time)s Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#"
#: apps/publisher/templates/publisher/email/comment.html
#: apps/publisher/templates/publisher/email/comment.txt
......@@ -3105,10 +3158,10 @@ msgstr "Thé édX téäm Ⱡ'σяєм ιρѕυм ∂σłσя ѕ#"
#: apps/publisher/templates/publisher/email/comment.txt
#, python-format
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."
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. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α#"
#: apps/publisher/templates/publisher/email/course/mark_as_reviewed.html
......
......@@ -14,11 +14,6 @@
@include float(left);
@include padding(20px, 20px, 20px, 20px);
}
.layout-col {
}
}
.layout, .layout-flush {
......@@ -209,6 +204,7 @@
-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);
box-shadow: 0 -8px 6px -6px rgba(0,0,0,0.05);
text-transform: uppercase;
}
.field-label {
font-weight: bold;
......@@ -373,7 +369,7 @@
.approval-widget, .course-widgets, .edit-history-widget {
.btn-course-edit, .btn-courserun-edit, .btn-change-state, .btn-preview, .btn-save-preview-url, .btn-edit-preview-url {
@include padding(2px, 20px, 3px, 20px);
@include float(right);
......
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