Commit ec2af959 by Waheed Ahmed

Create only course object from new course page, removed run and seat related code.

ECOM-7760
parent 5e8c9f42
...@@ -157,6 +157,8 @@ class CustomCourseForm(CourseForm): ...@@ -157,6 +157,8 @@ class CustomCourseForm(CourseForm):
validators=[validate_text_count(max_length=2500)] validators=[validate_text_count(max_length=2500)]
) )
add_new_run = forms.BooleanField(required=False)
class Meta(CourseForm.Meta): class Meta(CourseForm.Meta):
model = Course model = Course
widgets = { widgets = {
......
...@@ -53,16 +53,12 @@ class CreateCourseViewTests(TestCase): ...@@ -53,16 +53,12 @@ class CreateCourseViewTests(TestCase):
self.group = self.organization_extension.group self.group = self.organization_extension.group
self.user.groups.add(self.group) self.user.groups.add(self.group)
# create base course objects # create base course object
self.course = factories.CourseFactory() self.course = factories.CourseFactory()
self.course_run = factories.CourseRunFactory(course=self.course)
self.seat = factories.SeatFactory(course_run=self.course_run, type=Seat.VERIFIED, price=2)
self.course.organizations.add(self.organization_extension.organization) self.course.organizations.add(self.organization_extension.organization)
self.site = Site.objects.get(pk=settings.SITE_ID) self.site = Site.objects.get(pk=settings.SITE_ID)
self.client.login(username=self.user.username, password=USER_PASSWORD) self.client.login(username=self.user.username, password=USER_PASSWORD)
self.start_date_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
self.end_date_time = (datetime.now() + timedelta(days=60)).strftime('%Y-%m-%d %H:%M:%S')
# creating default organizations roles # creating default organizations roles
factories.OrganizationUserRoleFactory( factories.OrganizationUserRoleFactory(
...@@ -98,51 +94,37 @@ class CreateCourseViewTests(TestCase): ...@@ -98,51 +94,37 @@ class CreateCourseViewTests(TestCase):
response, "Must be Publisher user to perform this action.", status_code=403 response, "Must be Publisher user to perform this action.", status_code=403
) )
def test_create_course_and_course_run_and_seat_with_errors(self): def test_create_course_with_errors(self):
""" """
Verify that without providing required data course and other objects cannot be created. Verify that without providing required data course cannot be created.
""" """
course_dict = model_to_dict(self.course) course_dict = model_to_dict(self.course)
course_dict['number'] = 'test course' course_dict['number'] = ''
course_dict['image'] = '' course_dict['image'] = ''
course_dict['lms_course_id'] = '' course_dict['lms_course_id'] = ''
response = self.client.post(reverse('publisher:publisher_courses_new'), course_dict) response = self.client.post(reverse('publisher:publisher_courses_new'), course_dict)
self.assertEqual(response.status_code, 400) self.assertEqual(response.status_code, 400)
def test_create_course_and_course_run_without_seat(self): def test_create_course(self):
""" """
Verify that course and course run objects create successfully if seat type is not provided. Verify that user can create course successfully.
""" """
data = {'number': 'course_without_seat', 'image': ''} data = {'number': 'testX453', 'image': make_image_file('test_banner.jpg')}
course_dict = self._post_data(data, self.course, self.course_run, None) course_dict = self._post_data(data, self.course)
course_dict['image'] = '' response = self.client.post(reverse('publisher:publisher_courses_new'), course_dict)
self.client.post(reverse('publisher:publisher_courses_new'), course_dict)
course = Course.objects.get(number=course_dict['number']) course = Course.objects.get(number=course_dict['number'])
course_run = course.publisher_course_runs.first()
# verify no seat object created with course run.
self.assertFalse(course_run.seats.all())
@ddt.data( self.assertRedirects(
{'number': 'course_1', 'image': ''}, response,
{'number': 'course_2', 'image': make_image_file('test_banner.jpg')}, expected_url=reverse('publisher:publisher_course_detail', kwargs={'pk': course.id}),
{'number': 'course_3', 'image': make_image_file('test_banner1.jpg')} status_code=302,
target_status_code=200
) )
def test_create_course_and_course_run_and_seat(self, data):
"""
Verify that new course, course run and seat can be created with different data sets.
"""
self.user.groups.add(Group.objects.get(name=ADMIN_GROUP_NAME))
self._assert_records(1)
course_dict = self._post_data(data, self.course, self.course_run, self.seat)
response = self.client.post(reverse('publisher:publisher_courses_new'), course_dict, files=data['image'])
course = Course.objects.get(number=data['number'])
if data['image']: self.assertEqual(course.number, data['number'])
self._assert_image(course) self._assert_image(course)
self._assert_test_data(response, course, self.seat.type, self.seat.price)
@ddt.data( @ddt.data(
make_image_file('test_banner00.jpg', width=2120, height=1191), make_image_file('test_banner00.jpg', width=2120, height=1191),
make_image_file('test_banner01.jpg', width=2120, height=1193), make_image_file('test_banner01.jpg', width=2120, height=1193),
...@@ -159,7 +141,7 @@ class CreateCourseViewTests(TestCase): ...@@ -159,7 +141,7 @@ class CreateCourseViewTests(TestCase):
] ]
self.user.groups.add(Group.objects.get(name=ADMIN_GROUP_NAME)) self.user.groups.add(Group.objects.get(name=ADMIN_GROUP_NAME))
self._assert_records(1) self._assert_records(1)
course_dict = self._post_data({'image': image}, self.course, self.course_run, self.seat) course_dict = self._post_data({'image': image}, self.course)
response = self.client.post(reverse('publisher:publisher_courses_new'), course_dict, files=image) response = self.client.post(reverse('publisher:publisher_courses_new'), course_dict, files=image)
self.assertEqual(response.context['course_form'].errors['image'], image_error) self.assertEqual(response.context['course_form'].errors['image'], image_error)
self._assert_records(1) self._assert_records(1)
...@@ -170,7 +152,7 @@ class CreateCourseViewTests(TestCase): ...@@ -170,7 +152,7 @@ class CreateCourseViewTests(TestCase):
""" """
self._assert_records(1) self._assert_records(1)
data = {'number': 'course_2', 'image': make_image_file('test_banner.jpg')} data = {'number': 'course_2', 'image': make_image_file('test_banner.jpg')}
course_dict = self._post_data(data, self.course, self.course_run, self.seat) course_dict = self._post_data(data, self.course)
with patch.object(Course, "save") as mock_method: with patch.object(Course, "save") as mock_method:
mock_method.side_effect = IntegrityError mock_method.side_effect = IntegrityError
response = self.client.post(reverse('publisher:publisher_courses_new'), course_dict, files=data['image']) response = self.client.post(reverse('publisher:publisher_courses_new'), course_dict, files=data['image'])
...@@ -178,40 +160,6 @@ class CreateCourseViewTests(TestCase): ...@@ -178,40 +160,6 @@ class CreateCourseViewTests(TestCase):
self.assertEqual(response.status_code, 400) self.assertEqual(response.status_code, 400)
self._assert_records(1) self._assert_records(1)
@ddt.data(Seat.VERIFIED, Seat.PROFESSIONAL)
def test_create_course_without_price_with_error(self, seat_type):
""" Verify that error is thrown if seat type is not honor/audit and no price is input.
"""
self._assert_records(1)
data = {'number': 'course_1', 'image': ''}
course_dict = self._post_data(data, self.course, self.course_run, self.seat)
course_dict['price'] = 0
course_dict['type'] = seat_type
response = self.client.post(reverse('publisher:publisher_courses_new'), course_dict, files=data['image'])
self.assertEqual(response.status_code, 400)
self.assertEqual(
response.context['seat_form'].errors['price'][0], 'Only audit seat can be without price.'
)
self._assert_records(1)
def test_create_course_without_price_with_success(self):
""" Verify that if seat type is audit then price is not required. """
self.user.groups.add(Group.objects.get(name=ADMIN_GROUP_NAME))
self._assert_records(1)
data = {'number': 'course_1', 'image': ''}
course_dict = self._post_data(data, self.course, self.course_run, self.seat)
course_dict['price'] = 0
course_dict['type'] = Seat.AUDIT
response = self.client.post(
reverse('publisher:publisher_courses_new'), course_dict, files=data['image'], follow=True
)
course = Course.objects.get(number=data['number'])
self._assert_test_data(response, course, Seat.AUDIT, 0)
self.assertIn(
'You have successfully created a course. You can edit the course information',
response.content.decode('UTF-8')
)
def test_create_form_with_single_organization(self): def test_create_form_with_single_organization(self):
"""Verify that if there is only one organization then that organization will be shown as text. """ """Verify that if there is only one organization then that organization will be shown as text. """
response = self.client.get(reverse('publisher:publisher_courses_new')) response = self.client.get(reverse('publisher:publisher_courses_new'))
...@@ -257,13 +205,12 @@ class CreateCourseViewTests(TestCase): ...@@ -257,13 +205,12 @@ class CreateCourseViewTests(TestCase):
) )
) )
def test_create_without_selecting_radio_buttons(self): def test_create_course_without_course_number(self):
""" """
Verify that without selecting pacing type course cannot be created. Verify that without course number course cannot be created.
""" """
data = {'number': 'course_1', 'image': ''} course_dict = self._post_data({'image': ''}, self.course)
course_dict = self._post_data(data, self.course, self.course_run, self.seat) course_dict.pop('number')
course_dict.pop('pacing_type')
response = self.client.post(reverse('publisher:publisher_courses_new'), course_dict) response = self.client.post(reverse('publisher:publisher_courses_new'), course_dict)
self.assertEqual(response.status_code, 400) self.assertEqual(response.status_code, 400)
...@@ -274,26 +221,14 @@ class CreateCourseViewTests(TestCase): ...@@ -274,26 +221,14 @@ class CreateCourseViewTests(TestCase):
'<div id="about-page" class="layout-full publisher-layout layout', response.content.decode('UTF-8') '<div id="about-page" class="layout-full publisher-layout layout', response.content.decode('UTF-8')
) )
def _post_data(self, data, course, course_run, seat): def _post_data(self, data, course):
""" Returns dict of data to posts to a course endpoint. """ """ Returns dict of data to posts to a course endpoint. """
course_dict = model_to_dict(course) course_dict = model_to_dict(course)
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:
course_dict.update(**model_to_dict(course_run))
course_dict.pop('video_language')
course_dict.pop('end')
course_dict.pop('priority')
course_dict.pop('contacted_partner_manager')
course_dict['start'] = self.start_date_time
course_dict['end'] = self.end_date_time
course_dict['organization'] = self.organization_extension.organization.id course_dict['organization'] = self.organization_extension.organization.id
course_dict['lms_course_id'] = ''
if seat:
course_dict.update(**model_to_dict(seat))
course_dict.pop('verification_deadline')
course_dict.pop('id') course_dict.pop('id')
return course_dict return course_dict
def _assert_image(self, course): def _assert_image(self, course):
...@@ -308,41 +243,26 @@ class CreateCourseViewTests(TestCase): ...@@ -308,41 +243,26 @@ class CreateCourseViewTests(TestCase):
self.assertIn(image_url_prefix, sized_file.url) self.assertIn(image_url_prefix, sized_file.url)
def _assert_records(self, count): def _assert_records(self, count):
""" Asserts expected counts for Course, CourseRun, and Seat objects """ """ Asserts expected counts for Course"""
self.assertEqual(Course.objects.all().count(), count) self.assertEqual(Course.objects.all().count(), count)
self.assertEqual(CourseRun.objects.all().count(), count)
self.assertEqual(Seat.objects.all().count(), count)
def _assert_test_data(self, response, course, expected_type, expected_price): def test_create_course_with_add_run(self):
""" Asserts expected data present on create. """ """
course_run = course.publisher_course_runs.get() Verify that if add_new_run is checked user is redirected to
course_detail_path = reverse('publisher:publisher_course_detail', kwargs={'pk': course.id}) create course run page instead course detail page.
"""
data = {'number': 'testX234', 'image': '', 'add_new_run': True}
course_dict = self._post_data(data, self.course)
response = self.client.post(reverse('publisher:publisher_courses_new'), course_dict)
course = Course.objects.get(number=course_dict['number'])
self.assertRedirects( self.assertRedirects(
response, response,
expected_url=course_detail_path, expected_url=reverse('publisher:publisher_course_runs_new', kwargs={'parent_course_id': course.id}),
status_code=302, status_code=302,
target_status_code=200 target_status_code=200
) )
self.assertEqual(course.organizations.first(), self.organization_extension.organization)
self.assertEqual(len(course.course_user_roles.all()), 3)
self.assertEqual(course.course_user_roles.filter(role=PublisherUserRole.CourseTeam).count(), 1)
self.assertEqual(self.course_run.language, course_run.language)
self.assertFalse(course_run.contacted_partner_manager)
self.assertEqual(self.course_run.pacing_type, course_run.pacing_type)
self.assertEqual(course_run.start.strftime("%Y-%m-%d %H:%M:%S"), self.start_date_time)
self.assertEqual(course_run.end.strftime("%Y-%m-%d %H:%M:%S"), self.end_date_time)
seat = course_run.seats.first()
self.assertEqual(seat.type, expected_type)
self.assertEqual(seat.price, expected_price)
self._assert_records(2)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual([course.project_coordinator.email], mail.outbox[0].to)
expected_subject = 'New Studio instance request for {title}'.format(title=course.title)
self.assertEqual(str(mail.outbox[0].subject), expected_subject)
class CreateCourseRunViewTests(TestCase): class CreateCourseRunViewTests(TestCase):
...@@ -490,6 +410,51 @@ class CreateCourseRunViewTests(TestCase): ...@@ -490,6 +410,51 @@ class CreateCourseRunViewTests(TestCase):
expected_subject = 'New Studio instance request for {title}'.format(title=self.course.title) expected_subject = 'New Studio instance request for {title}'.format(title=self.course.title)
self.assertEqual(str(mail.outbox[0].subject), expected_subject) self.assertEqual(str(mail.outbox[0].subject), expected_subject)
def test_seat_without_price(self):
""" Verify that user cannot create a new course run without seat price. """
new_user = factories.UserFactory()
new_user.groups.add(self.organization_extension.group)
factories.CourseUserRoleFactory.create(
course=self.course, role=PublisherUserRole.ProjectCoordinator, user=factories.UserFactory()
)
self.assertEqual(self.course.course_team_admin, self.user)
post_data = self.course_run_dict
seat = factories.SeatFactory(course_run=self.course_run, type=Seat.HONOR, price=0)
post_data.update(**model_to_dict(seat))
post_data.update(
{
'type': Seat.VERIFIED,
'price': 0
}
)
self._pop_valuse_from_dict(post_data, ['id', 'course', 'course_run', 'lms_course_id'])
assign_perm(
OrganizationExtension.VIEW_COURSE_RUN, self.organization_extension.group, self.organization_extension
)
response = self.client.post(
reverse('publisher:publisher_course_runs_new', kwargs={'parent_course_id': self.course.id}),
post_data
)
self.assertContains(response, 'Only audit seat can be without price.', status_code=400)
post_data['price'] = 450
response = self.client.post(
reverse('publisher:publisher_course_runs_new', kwargs={'parent_course_id': self.course.id}),
post_data
)
new_seat = Seat.objects.get(type=post_data['type'], price=post_data['price'])
self.assertRedirects(
response,
expected_url=reverse('publisher:publisher_course_run_detail', kwargs={'pk': new_seat.course_run.id}),
status_code=302,
target_status_code=200
)
def test_existing_run_and_seat_data_auto_populated(self): def test_existing_run_and_seat_data_auto_populated(self):
""" """
Verify that existing course run and seat data auto populated on new course run form. Verify that existing course run and seat data auto populated on new course run form.
...@@ -2313,12 +2278,13 @@ class CourseRunEditViewTests(TestCase): ...@@ -2313,12 +2278,13 @@ class CourseRunEditViewTests(TestCase):
# in other tables also # in other tables also
data = {'number': 'course_update_1', 'image': '', 'title': 'test course'} data = {'number': 'course_update_1', 'image': '', 'title': 'test course'}
self.user.groups.add(Group.objects.get(name=ADMIN_GROUP_NAME)) self.user.groups.add(Group.objects.get(name=ADMIN_GROUP_NAME))
course_dict = self._post_data(data, self.course, self.course_run, None) course_dict = self._post_data(data, self.course, self.course_run)
self.client.post(reverse('publisher:publisher_courses_new'), course_dict, files=data['image']) self.client.post(reverse('publisher:publisher_courses_new'), course_dict, files=data['image'])
# newly created course from the page. # newly created course from the page.
self.new_course = Course.objects.get(number=data['number']) self.new_course = Course.objects.get(number=data['number'])
self.new_course_run = self.new_course.course_runs.first() self.new_course_run = factories.CourseRunFactory(course=self.new_course)
factories.CourseRunStateFactory(course_run=self.new_course_run, owner_role=PublisherUserRole.CourseTeam)
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)
...@@ -2330,7 +2296,7 @@ class CourseRunEditViewTests(TestCase): ...@@ -2330,7 +2296,7 @@ class CourseRunEditViewTests(TestCase):
# Update the data for course # Update the data for course
data = {'full_description': 'This is testing description.', 'image': ''} data = {'full_description': 'This is testing description.', 'image': ''}
self.updated_dict = self._post_data(data, self.new_course, self.new_course_run, None) self.updated_dict = self._post_data(data, self.new_course, self.new_course_run)
# Update the data for course-run # Update the data for course-run
self.updated_dict['is_xseries'] = True self.updated_dict['is_xseries'] = True
...@@ -2338,14 +2304,7 @@ class CourseRunEditViewTests(TestCase): ...@@ -2338,14 +2304,7 @@ class CourseRunEditViewTests(TestCase):
toggle_switch('enable_publisher_email_notifications', True) toggle_switch('enable_publisher_email_notifications', True)
# 1st email is due to course-creation. def _post_data(self, data, course, course_run):
self.assertEqual(len(mail.outbox), 1)
def _pop_valuse_from_dict(self, data_dict, key_list):
for key in key_list:
data_dict.pop(key)
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['team_admin'] = self.user.id course_dict['team_admin'] = self.user.id
...@@ -2358,9 +2317,6 @@ class CourseRunEditViewTests(TestCase): ...@@ -2358,9 +2317,6 @@ class CourseRunEditViewTests(TestCase):
course_dict['start'] = self.start_date_time course_dict['start'] = self.start_date_time
course_dict['end'] = self.end_date_time course_dict['end'] = self.end_date_time
course_dict['organization'] = self.organization_extension.organization.id course_dict['organization'] = self.organization_extension.organization.id
if seat:
course_dict.update(**model_to_dict(seat))
course_dict.pop('verification_deadline')
course_dict.pop('id') course_dict.pop('id')
return course_dict return course_dict
...@@ -2441,7 +2397,7 @@ class CourseRunEditViewTests(TestCase): ...@@ -2441,7 +2397,7 @@ class CourseRunEditViewTests(TestCase):
# post data without seat # post data without seat
data = {'image': ''} data = {'image': ''}
updated_dict = self._post_data(data, self.new_course, self.new_course_run, None) updated_dict = self._post_data(data, self.new_course, self.new_course_run)
updated_dict['type'] = Seat.PROFESSIONAL updated_dict['type'] = Seat.PROFESSIONAL
updated_dict['price'] = 10.00 updated_dict['price'] = 10.00
...@@ -2581,10 +2537,10 @@ class CourseRunEditViewTests(TestCase): ...@@ -2581,10 +2537,10 @@ class CourseRunEditViewTests(TestCase):
""" """
DRY method to assert sent email data. DRY method to assert sent email data.
""" """
self.assertEqual(len(mail.outbox), 2) self.assertEqual(len(mail.outbox), 1)
self.assertEqual(str(mail.outbox[1].subject), subject) self.assertEqual(str(mail.outbox[0].subject), subject)
body = mail.outbox[1].body.strip() body = mail.outbox[0].body.strip()
self.assertIn(expected_body, body) self.assertIn(expected_body, body)
page_url = 'https://{host}{path}'.format(host=Site.objects.get_current().domain.strip('/'), path=object_path) page_url = 'https://{host}{path}'.format(host=Site.objects.get_current().domain.strip('/'), path=object_path)
self.assertIn(page_url, body) self.assertIn(page_url, body)
...@@ -2640,7 +2596,7 @@ class CourseRunEditViewTests(TestCase): ...@@ -2640,7 +2596,7 @@ class CourseRunEditViewTests(TestCase):
self.assertNotContains(response, '<a class="studio-link"') self.assertNotContains(response, '<a class="studio-link"')
data = {'full_description': 'This is testing description.', 'image': ''} data = {'full_description': 'This is testing description.', 'image': ''}
updated_dict = self._post_data(data, self.new_course, None, None) updated_dict = self._post_data(data, self.new_course, None)
self.client.post(self.edit_page_url, updated_dict) self.client.post(self.edit_page_url, updated_dict)
response = self.client.get(self.edit_page_url) response = self.client.get(self.edit_page_url)
...@@ -2661,7 +2617,7 @@ class CourseRunEditViewTests(TestCase): ...@@ -2661,7 +2617,7 @@ class CourseRunEditViewTests(TestCase):
""" """
self.user.groups.add(Group.objects.get(name=INTERNAL_USER_GROUP_NAME)) self.user.groups.add(Group.objects.get(name=INTERNAL_USER_GROUP_NAME))
data = {'full_description': 'This is testing description.', 'image': ''} data = {'full_description': 'This is testing description.', 'image': ''}
updated_dict = self._post_data(data, self.new_course, self.new_course_run, None) updated_dict = self._post_data(data, self.new_course, self.new_course_run)
updated_dict['type'] = seat_type updated_dict['type'] = seat_type
updated_dict['price'] = 10.00 updated_dict['price'] = 10.00
...@@ -2736,7 +2692,7 @@ class CourseRunEditViewTests(TestCase): ...@@ -2736,7 +2692,7 @@ class CourseRunEditViewTests(TestCase):
user = self.new_course.course_team_admin user = self.new_course.course_team_admin
self.client.login(username=user.username, password=USER_PASSWORD) self.client.login(username=user.username, password=USER_PASSWORD)
post_data = self._post_data({'image': ''}, self.new_course, self.new_course_run, None) post_data = self._post_data({'image': ''}, self.new_course, self.new_course_run)
lms_course_id = 'course-v1:edX+DemoX+Demo_Course' lms_course_id = 'course-v1:edX+DemoX+Demo_Course'
self.new_course_run.lms_course_id = lms_course_id self.new_course_run.lms_course_id = lms_course_id
self.new_course_run.save() self.new_course_run.save()
......
...@@ -214,19 +214,18 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi ...@@ -214,19 +214,18 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi
""" Create Course View.""" """ Create Course View."""
model = Course model = Course
course_form = CustomCourseForm course_form = CustomCourseForm
run_form = CustomCourseRunForm
seat_form = CustomSeatForm
template_name = 'publisher/add_course_form.html' template_name = 'publisher/add_course_form.html'
success_url = 'publisher:publisher_course_detail' success_url = 'publisher:publisher_course_detail'
def get_success_url(self, course_id): # pylint: disable=arguments-differ def get_success_url(self, course_id, add_new_run=None): # pylint: disable=arguments-differ
return reverse(self.success_url, kwargs={'pk': course_id}) success_url = reverse(self.success_url, kwargs={'pk': course_id})
if add_new_run:
success_url = reverse('publisher:publisher_course_runs_new', kwargs={'parent_course_id': course_id})
return success_url
def get_context_data(self): def get_context_data(self):
return { return {
'course_form': self.course_form(user=self.request.user), 'course_form': self.course_form(user=self.request.user),
'run_form': self.run_form,
'seat_form': self.seat_form,
'publisher_hide_features_for_pilot': waffle.switch_is_active('publisher_hide_features_for_pilot'), 'publisher_hide_features_for_pilot': waffle.switch_is_active('publisher_hide_features_for_pilot'),
'publisher_add_instructor_feature': waffle.switch_is_active('publisher_add_instructor_feature'), 'publisher_add_instructor_feature': waffle.switch_is_active('publisher_add_instructor_feature'),
} }
...@@ -236,46 +235,25 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi ...@@ -236,46 +235,25 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
ctx = self.get_context_data() ctx = self.get_context_data()
add_new_run = request.POST.get('add_new_run')
# pass selected organization to CustomCourseForm to populate related # pass selected organization to CustomCourseForm to populate related
# choices into institution admin field # choices into institution admin field
user = self.request.user user = self.request.user
organization = self.request.POST.get('organization') organization = self.request.POST.get('organization')
self.request.POST['start'] = parse_datetime_field(self.request.POST.get('start'))
self.request.POST['end'] = parse_datetime_field(self.request.POST.get('end'))
course_form = self.course_form( course_form = self.course_form(
request.POST, request.FILES, user=user, organization=organization request.POST, request.FILES, user=user, organization=organization
) )
run_form = self.run_form(request.POST) if course_form.is_valid():
seat_form = self.seat_form(request.POST)
if course_form.is_valid() and run_form.is_valid() and seat_form.is_valid():
try: try:
with transaction.atomic(): with transaction.atomic():
seat = None
if request.POST.get('type'):
seat = seat_form.save(commit=False)
run_course = run_form.save(commit=False)
course = course_form.save(commit=False) course = course_form.save(commit=False)
course.changed_by = user course.changed_by = user
course.save() course.save()
# commit false does not save m2m object. Keyword field is m2m. # commit false does not save m2m object. Keyword field is m2m.
course_form.save_m2m() course_form.save_m2m()
run_course.course = course
run_course.changed_by = user
run_course.save()
# commit false does not save m2m object.
run_form.save_m2m()
if seat:
seat.course_run = run_course
seat.changed_by = user
seat.save()
organization_extension = get_object_or_404( organization_extension = get_object_or_404(
OrganizationExtension, organization=course_form.data['organization'] OrganizationExtension, organization=course_form.data['organization']
) )
...@@ -291,9 +269,7 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi ...@@ -291,9 +269,7 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi
# Initialize workflow for Course. # Initialize workflow for Course.
CourseState.objects.create(course=course, owner_role=PublisherUserRole.CourseTeam) CourseState.objects.create(course=course, owner_role=PublisherUserRole.CourseTeam)
# Initialize workflow for Course-run. if not add_new_run:
CourseRunState.objects.create(course_run=run_course, owner_role=PublisherUserRole.CourseTeam)
# pylint: disable=no-member # pylint: disable=no-member
messages.success( messages.success(
request, _( request, _(
...@@ -305,10 +281,7 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi ...@@ -305,10 +281,7 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi
) )
) )
# sending email for notifying new course is created. return HttpResponseRedirect(self.get_success_url(course.id, add_new_run=add_new_run))
emails.send_email_for_course_creation(course, run_course)
return HttpResponseRedirect(self.get_success_url(course.id))
except Exception as e: # pylint: disable=broad-except except Exception as e: # pylint: disable=broad-except
# pylint: disable=no-member # pylint: disable=no-member
error_message = _('An error occurred while saving your changes. {error}').format(error=str(e)) error_message = _('An error occurred while saving your changes. {error}').format(error=str(e))
...@@ -323,8 +296,6 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi ...@@ -323,8 +296,6 @@ class CreateCourseView(mixins.LoginRequiredMixin, mixins.PublisherUserRequiredMi
ctx.update( ctx.update(
{ {
'course_form': course_form, 'course_form': course_form,
'run_form': run_form,
'seat_form': seat_form
} }
) )
return render(request, self.template_name, ctx, status=400) return render(request, self.template_name, ctx, status=400)
...@@ -484,12 +455,16 @@ class CreateCourseRunView(mixins.LoginRequiredMixin, CreateView): ...@@ -484,12 +455,16 @@ class CreateCourseRunView(mixins.LoginRequiredMixin, CreateView):
def get_last_run(self): def get_last_run(self):
if not self.last_run: if not self.last_run:
parent_course = self.get_parent_course() parent_course = self.get_parent_course()
try:
self.last_run = parent_course.course_runs.latest('created') self.last_run = parent_course.course_runs.latest('created')
except CourseRun.DoesNotExist:
self.last_run = None
return self.last_run return self.last_run
def set_last_run_data(self, new_run): def set_last_run_data(self, new_run):
last_run = self.get_last_run() last_run = self.get_last_run()
if last_run:
last_run_data = model_to_dict(last_run) last_run_data = model_to_dict(last_run)
# Delete all those fields which cannot be copied from previous run # Delete all those fields which cannot be copied from previous run
del (last_run_data['id'], last_run_data['start'], last_run_data['end'], last_run_data['pacing_type'], del (last_run_data['id'], last_run_data['start'], last_run_data['end'], last_run_data['pacing_type'],
...@@ -513,7 +488,11 @@ class CreateCourseRunView(mixins.LoginRequiredMixin, CreateView): ...@@ -513,7 +488,11 @@ class CreateCourseRunView(mixins.LoginRequiredMixin, CreateView):
new_run.transcript_languages.add(*transcript_languages) new_run.transcript_languages.add(*transcript_languages)
def get_seat_initial_data(self): def get_seat_initial_data(self):
initial_seat_data = {}
last_run = self.get_last_run() last_run = self.get_last_run()
if not last_run:
return initial_seat_data
try: try:
latest_seat = last_run.seats.latest('created') latest_seat = last_run.seats.latest('created')
initial_seat_data = model_to_dict(latest_seat) initial_seat_data = model_to_dict(latest_seat)
...@@ -526,9 +505,13 @@ class CreateCourseRunView(mixins.LoginRequiredMixin, CreateView): ...@@ -526,9 +505,13 @@ class CreateCourseRunView(mixins.LoginRequiredMixin, CreateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
parent_course = self.get_parent_course() parent_course = self.get_parent_course()
last_run = self.get_last_run() last_run = self.get_last_run()
run_initial_data = {}
if last_run:
run_initial_data = {'pacing_type': last_run.pacing_type}
context = { context = {
'parent_course': parent_course, 'parent_course': parent_course,
'run_form': self.run_form(initial={'pacing_type': last_run.pacing_type}), 'run_form': self.run_form(initial=run_initial_data),
'seat_form': self.seat_form(initial=self.get_seat_initial_data()) 'seat_form': self.seat_form(initial=self.get_seat_initial_data())
} }
return context return context
......
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ 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-05-04 15:16+0500\n" "POT-Creation-Date: 2017-05-05 13:13+0500\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"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
#: apps/api/filters.py #: apps/api/filters.py
#, python-brace-format #, python-brace-format
...@@ -1332,70 +1332,6 @@ msgid "Statistics: Probability" ...@@ -1332,70 +1332,6 @@ msgid "Statistics: Probability"
msgstr "" msgstr ""
#: templates/publisher/add_course_form.html #: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "COURSE START DATE"
msgstr ""
#: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "Start on a Tuesday, Wednesday, or Thursday."
msgstr ""
#: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "Avoid major U.S. holidays."
msgstr ""
#: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid ""
"Specify a month, day, and year. If you are unsure of the exact date, specify"
" a day that is close to the estimated start date. For example, if your "
"course will start near the end of March, specify March 31."
msgstr ""
#: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "COURSE END DATE"
msgstr ""
#: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid ""
"Specify a month, day, and year. If you are unsure of the exact date, specify"
" a day that is close to the estimated end date. For example, if your course "
"will end near the end of March, specify March 31."
msgstr ""
#: templates/publisher/add_course_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "COURSE PACING"
msgstr ""
#: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid ""
"Instructor-paced courses include individual assignments that have specific "
"due dates before the course end date."
msgstr ""
#: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid ""
"Self-paced courses do not have individual assignments that have specific due"
" dates before the course end date. All assignments are due on the course end"
" date."
msgstr ""
#: templates/publisher/add_course_form.html
#: templates/publisher/course_edit_form.html #: templates/publisher/course_edit_form.html
msgid "COURSE NUMBER" msgid "COURSE NUMBER"
msgstr "" msgstr ""
...@@ -1436,6 +1372,10 @@ msgid "" ...@@ -1436,6 +1372,10 @@ msgid ""
" to Studio and enter content for the course." " to Studio and enter content for the course."
msgstr "" msgstr ""
#: templates/publisher/add_course_form.html
msgid "I want to add a run to this course at this time"
msgstr ""
#: templates/publisher/add_courserun_form.html #: templates/publisher/add_courserun_form.html
msgid "New Course Run" msgid "New Course Run"
msgstr "" msgstr ""
...@@ -1455,11 +1395,62 @@ msgid "" ...@@ -1455,11 +1395,62 @@ msgid ""
msgstr "" msgstr ""
#: templates/publisher/add_courserun_form.html #: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "COURSE START DATE"
msgstr ""
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "Start on a Tuesday, Wednesday, or Thursday."
msgstr ""
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "Avoid major U.S. holidays."
msgstr ""
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid ""
"Specify a month, day, and year. If you are unsure of the exact date, specify"
" a day that is close to the estimated start date. For example, if your "
"course will start near the end of March, specify March 31."
msgstr ""
#: templates/publisher/add_courserun_form.html
msgid "PACING TYPE" msgid "PACING TYPE"
msgstr "" msgstr ""
#: templates/publisher/add_courserun_form.html #: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html #: templates/publisher/course_run/edit_run_form.html
msgid ""
"Instructor-paced courses include individual assignments that have specific "
"due dates before the course end date."
msgstr ""
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid ""
"Self-paced courses do not have individual assignments that have specific due"
" dates before the course end date. All assignments are due on the course end"
" date."
msgstr ""
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "COURSE END DATE"
msgstr ""
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid ""
"Specify a month, day, and year. If you are unsure of the exact date, specify"
" a day that is close to the estimated end date. For example, if your course "
"will end near the end of March, specify March 31."
msgstr ""
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "CERTIFICATE TYPE AND PRICE" msgid "CERTIFICATE TYPE AND PRICE"
msgstr "" msgstr ""
...@@ -2023,6 +2014,10 @@ msgid "" ...@@ -2023,6 +2014,10 @@ msgid ""
msgstr "" msgstr ""
#: templates/publisher/course_run/edit_run_form.html #: templates/publisher/course_run/edit_run_form.html
msgid "COURSE PACING"
msgstr ""
#: templates/publisher/course_run/edit_run_form.html
msgid "The Studio URL for this course run." msgid "The Studio URL for this course run."
msgstr "" msgstr ""
......
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ 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-05-04 15:16+0500\n" "POT-Creation-Date: 2017-05-05 13:13+0500\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"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
#: static/js/catalogs-change-form.js #: static/js/catalogs-change-form.js
msgid "Preview" msgid "Preview"
......
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ 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-05-04 15:16+0500\n" "POT-Creation-Date: 2017-05-05 13:13+0500\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"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: apps/api/filters.py #: apps/api/filters.py
...@@ -1516,98 +1516,6 @@ msgid "Statistics: Probability" ...@@ -1516,98 +1516,6 @@ msgid "Statistics: Probability"
msgstr "Stätïstïçs: Prößäßïlïtý Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σ#" msgstr "Stätïstïçs: Prößäßïlïtý Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σ#"
#: templates/publisher/add_course_form.html #: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "COURSE START DATE"
msgstr "ÇÖÛRSÉ STÀRT DÀTÉ Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмє#"
#: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "Start on a Tuesday, Wednesday, or Thursday."
msgstr ""
"Stärt ön ä Tüésdäý, Wédnésdäý, ör Thürsdäý. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
"¢σηѕє¢тєтυя #"
#: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "Avoid major U.S. holidays."
msgstr "Àvöïd mäjör Û.S. hölïdäýs. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#"
#: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid ""
"Specify a month, day, and year. If you are unsure of the exact date, specify"
" a day that is close to the estimated start date. For example, if your "
"course will start near the end of March, specify March 31."
msgstr ""
"Spéçïfý ä mönth, däý, änd ýéär. Ìf ýöü äré ünsüré öf thé éxäçt däté, spéçïfý"
" ä däý thät ïs çlösé tö thé éstïmätéd stärt däté. För éxämplé, ïf ýöür "
"çöürsé wïll stärt néär thé énd öf Märçh, spéçïfý Märçh 31. Ⱡ'σяєм ιρѕυм "
"∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя "
"ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм νєηιαм, qυιѕ "
"ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ "
"¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє "
"¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт #"
#: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "COURSE END DATE"
msgstr "ÇÖÛRSÉ ÉND DÀTÉ Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт α#"
#: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid ""
"Specify a month, day, and year. If you are unsure of the exact date, specify"
" a day that is close to the estimated end date. For example, if your course "
"will end near the end of March, specify March 31."
msgstr ""
"Spéçïfý ä mönth, däý, änd ýéär. Ìf ýöü äré ünsüré öf thé éxäçt däté, spéçïfý"
" ä däý thät ïs çlösé tö thé éstïmätéd énd däté. För éxämplé, ïf ýöür çöürsé "
"wïll énd néär thé énd öf Märçh, spéçïfý Märçh 31. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт "
"αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт "
"łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм νєηιαм, qυιѕ ησѕтяυ∂ "
"єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ "
"αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ "
"ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢α#"
#: templates/publisher/add_course_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "COURSE PACING"
msgstr "ÇÖÛRSÉ PÀÇÌNG Ⱡ'σяєм ιρѕυм ∂σłσя ѕι#"
#: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid ""
"Instructor-paced courses include individual assignments that have specific "
"due dates before the course end date."
msgstr ""
"Ìnstrüçtör-päçéd çöürsés ïnçlüdé ïndïvïdüäl ässïgnménts thät hävé spéçïfïç "
"düé dätés ßéföré thé çöürsé énd däté. Ⱡ'σяєм ιρѕυм ∂σłσя#"
#: templates/publisher/add_course_form.html
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid ""
"Self-paced courses do not have individual assignments that have specific due"
" dates before the course end date. All assignments are due on the course end"
" date."
msgstr ""
"Sélf-päçéd çöürsés dö nöt hävé ïndïvïdüäl ässïgnménts thät hävé spéçïfïç düé"
" dätés ßéföré thé çöürsé énd däté. Àll ässïgnménts äré düé ön thé çöürsé énd"
" däté. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ "
"єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм"
" νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα "
"¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт"
" єѕѕє ¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт "
"¢υρι∂αтαт ηση ρяσι∂єηт, ѕυηт ιη ¢υłρα qυι σƒƒι¢ια ∂єѕєяυηт#"
#: templates/publisher/add_course_form.html
#: templates/publisher/course_edit_form.html #: templates/publisher/course_edit_form.html
msgid "COURSE NUMBER" msgid "COURSE NUMBER"
msgstr "ÇÖÛRSÉ NÛMBÉR Ⱡ'σяєм ιρѕυм ∂σłσя ѕι#" msgstr "ÇÖÛRSÉ NÛMBÉR Ⱡ'σяєм ιρѕυм ∂σłσя ѕι#"
...@@ -1668,6 +1576,12 @@ msgstr "" ...@@ -1668,6 +1576,12 @@ msgstr ""
"∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα" "∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα"
" ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт ¢υρι∂αтαт ηση#" " ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт ¢υρι∂αтαт ηση#"
#: templates/publisher/add_course_form.html
msgid "I want to add a run to this course at this time"
msgstr ""
"Ì wänt tö ädd ä rün tö thïs çöürsé ät thïs tïmé Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт,"
" ¢σηѕє¢тєтυя α#"
#: templates/publisher/add_courserun_form.html #: templates/publisher/add_courserun_form.html
msgid "New Course Run" msgid "New Course Run"
msgstr "Néw Çöürsé Rün Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт#" msgstr "Néw Çöürsé Rün Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт#"
...@@ -1693,11 +1607,90 @@ msgstr "" ...@@ -1693,11 +1607,90 @@ msgstr ""
" Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє#" " Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє#"
#: templates/publisher/add_courserun_form.html #: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "COURSE START DATE"
msgstr "ÇÖÛRSÉ STÀRT DÀTÉ Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмє#"
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "Start on a Tuesday, Wednesday, or Thursday."
msgstr ""
"Stärt ön ä Tüésdäý, Wédnésdäý, ör Thürsdäý. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, "
"¢σηѕє¢тєтυя #"
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "Avoid major U.S. holidays."
msgstr "Àvöïd mäjör Û.S. hölïdäýs. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#"
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid ""
"Specify a month, day, and year. If you are unsure of the exact date, specify"
" a day that is close to the estimated start date. For example, if your "
"course will start near the end of March, specify March 31."
msgstr ""
"Spéçïfý ä mönth, däý, änd ýéär. Ìf ýöü äré ünsüré öf thé éxäçt däté, spéçïfý"
" ä däý thät ïs çlösé tö thé éstïmätéd stärt däté. För éxämplé, ïf ýöür "
"çöürsé wïll stärt néär thé énd öf Märçh, spéçïfý Märçh 31. Ⱡ'σяєм ιρѕυм "
"∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя "
"ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм νєηιαм, qυιѕ "
"ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ "
"¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє "
"¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт #"
#: templates/publisher/add_courserun_form.html
msgid "PACING TYPE" msgid "PACING TYPE"
msgstr "PÀÇÌNG TÝPÉ Ⱡ'σяєм ιρѕυм ∂σłσя #" msgstr "PÀÇÌNG TÝPÉ Ⱡ'σяєм ιρѕυм ∂σłσя #"
#: templates/publisher/add_courserun_form.html #: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html #: templates/publisher/course_run/edit_run_form.html
msgid ""
"Instructor-paced courses include individual assignments that have specific "
"due dates before the course end date."
msgstr ""
"Ìnstrüçtör-päçéd çöürsés ïnçlüdé ïndïvïdüäl ässïgnménts thät hävé spéçïfïç "
"düé dätés ßéföré thé çöürsé énd däté. Ⱡ'σяєм ιρѕυм ∂σłσя#"
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid ""
"Self-paced courses do not have individual assignments that have specific due"
" dates before the course end date. All assignments are due on the course end"
" date."
msgstr ""
"Sélf-päçéd çöürsés dö nöt hävé ïndïvïdüäl ässïgnménts thät hävé spéçïfïç düé"
" dätés ßéföré thé çöürsé énd däté. Àll ässïgnménts äré düé ön thé çöürsé énd"
" däté. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ "
"єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм"
" νєηιαм, qυιѕ ησѕтяυ∂ єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα "
"¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт"
" єѕѕє ¢ιłłυм ∂σłσяє єυ ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢αт "
"¢υρι∂αтαт ηση ρяσι∂єηт, ѕυηт ιη ¢υłρα qυι σƒƒι¢ια ∂єѕєяυηт#"
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "COURSE END DATE"
msgstr "ÇÖÛRSÉ ÉND DÀTÉ Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт α#"
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid ""
"Specify a month, day, and year. If you are unsure of the exact date, specify"
" a day that is close to the estimated end date. For example, if your course "
"will end near the end of March, specify March 31."
msgstr ""
"Spéçïfý ä mönth, däý, änd ýéär. Ìf ýöü äré ünsüré öf thé éxäçt däté, spéçïfý"
" ä däý thät ïs çlösé tö thé éstïmätéd énd däté. För éxämplé, ïf ýöür çöürsé "
"wïll énd néär thé énd öf Märçh, spéçïfý Märçh 31. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт "
"αмєт, ¢σηѕє¢тєтυя α∂ιριѕι¢ιηg єłιт, ѕє∂ ∂σ єιυѕмσ∂ тємρσя ιη¢ι∂ι∂υηт υт "
"łαвσяє єт ∂σłσяє мαgηα αłιqυα. υт єηιм α∂ мιηιм νєηιαм, qυιѕ ησѕтяυ∂ "
"єχєя¢ιтαтιση υłłαм¢σ łαвσяιѕ ηιѕι υт αłιqυιρ єχ єα ¢σммσ∂σ ¢σηѕєqυαт. ∂υιѕ "
"αυтє ιяυяє ∂σłσя ιη яєρяєнєη∂єяιт ιη νσłυρтαтє νєłιт єѕѕє ¢ιłłυм ∂σłσяє єυ "
"ƒυgιαт ηυłłα ραяιαтυя. єχ¢єρтєυя ѕιηт σ¢¢αє¢α#"
#: templates/publisher/add_courserun_form.html
#: templates/publisher/course_run/edit_run_form.html
msgid "CERTIFICATE TYPE AND PRICE" msgid "CERTIFICATE TYPE AND PRICE"
msgstr "ÇÉRTÌFÌÇÀTÉ TÝPÉ ÀND PRÌÇÉ Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#" msgstr "ÇÉRTÌFÌÇÀTÉ TÝPÉ ÀND PRÌÇÉ Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕ#"
...@@ -2426,6 +2419,10 @@ msgstr "" ...@@ -2426,6 +2419,10 @@ msgstr ""
"σƒƒι¢ια ∂єѕєяυηт мσłłιт αη#" "σƒƒι¢ια ∂єѕєяυηт мσłłιт αη#"
#: templates/publisher/course_run/edit_run_form.html #: templates/publisher/course_run/edit_run_form.html
msgid "COURSE PACING"
msgstr "ÇÖÛRSÉ PÀÇÌNG Ⱡ'σяєм ιρѕυм ∂σłσя ѕι#"
#: templates/publisher/course_run/edit_run_form.html
msgid "The Studio URL for this course run." msgid "The Studio URL for this course run."
msgstr "" msgstr ""
"Thé Stüdïö ÛRL för thïs çöürsé rün. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєт#" "Thé Stüdïö ÛRL för thïs çöürsé rün. Ⱡ'σяєм ιρѕυм ∂σłσя ѕιт αмєт, ¢σηѕє¢тєт#"
......
...@@ -7,14 +7,14 @@ msgid "" ...@@ -7,14 +7,14 @@ 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-05-04 15:16+0500\n" "POT-Creation-Date: 2017-05-05 13:13+0500\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"
"Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: static/js/catalogs-change-form.js #: static/js/catalogs-change-form.js
......
...@@ -87,51 +87,6 @@ ...@@ -87,51 +87,6 @@
</div> </div>
</div> </div>
<div class="field-title">{% trans "COURSE START DATE" %}</div>
<div class="row">
<div class="col col-6 help-text">
<ul>
<li>
{% trans "Start on a Tuesday, Wednesday, or Thursday." %}
</li>
<li>
{% trans "Avoid major U.S. holidays." %}
</li>
<li>
{% trans "Specify a month, day, and year. If you are unsure of the exact date, specify a day that is close to the estimated start date. For example, if your course will start near the end of March, specify March 31." %}
</li>
</ul>
</div>
<div class="col col-6">
<label class="field-label ">{{ run_form.start.label_tag }} <span class="required">*</span></label>
{{ run_form.start }}
</div>
</div>
<div class="field-title">{% trans "COURSE END DATE" %}</div>
<div class="row">
<div class="col col-6 help-text">
{% trans "Specify a month, day, and year. If you are unsure of the exact date, specify a day that is close to the estimated end date. For example, if your course will end near the end of March, specify March 31." %}
</div>
<div class="col col-6">
<label class="field-label ">{{ run_form.end.label_tag }} <span class="required">*</span></label>
{{ run_form.end }}
</div>
</div>
<div class="field-title">{% trans "COURSE PACING" %}</div>
<div class="row">
<div class="col col-6 help-text">
<p>{% trans "Instructor-paced courses include individual assignments that have specific due dates before the course end date." %} </p>
<p>{% trans "Self-paced courses do not have individual assignments that have specific due dates before the course end date. All assignments are due on the course end date." %}</p>
</div>
<div class="col col-6">
<label class="field-label">{{ run_form.pacing_type.label_tag }} <span class="required">*</span></label>
<div class="checkbox-inline">{{ run_form.pacing_type }}</div>
</div>
</div>
<div class="field-title">{% trans "COURSE NUMBER" %}</div> <div class="field-title">{% trans "COURSE NUMBER" %}</div>
<div class="row"> <div class="row">
<div class="col col-6 help-text"> <div class="col col-6 help-text">
...@@ -177,11 +132,21 @@ ...@@ -177,11 +132,21 @@
</div> </div>
<div class="course-form"> <div class="course-form">
<div class="course-information action-buttons"> <div class="course-information action-buttons">
<div class="field">
<label class="field-label label-inline">
{{ course_form.add_new_run }}
<span class="field-input-label">
{% trans "I want to add a run to this course at this time" %}
</span>
</label>
</div>
<div class="action-buttons">
<a href="{% url 'publisher:publisher_courses' %}">{% trans "Cancel" %}</a> <a href="{% url 'publisher:publisher_courses' %}">{% trans "Cancel" %}</a>
<button class="btn-brand btn-base btn-save" type="submit"> <button class="btn-brand btn-base btn-save" type="submit">
{% trans "Create New Course" %} {% trans "Create New Course" %}
</button> </button>
</div> </div>
</div>
</div> </div>
</form> </form>
...@@ -199,7 +164,3 @@ ...@@ -199,7 +164,3 @@
<script src="{% static 'js/publisher/modal-screen.js' %}"></script> <script src="{% static 'js/publisher/modal-screen.js' %}"></script>
<script src="{% static 'js/publisher/course-image.js' %}"></script> <script src="{% static 'js/publisher/course-image.js' %}"></script>
{% endblock %} {% endblock %}
{% block js_without_compress %}
{{ run_form.media }}
{% endblock %}
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