Commit f7fe1b4f by Renzo Lucioni

Make marketing slug required for program activation

A program's marketing_slug field must be populated before it can be marked as 'Active'. ECOM-5568.
parent 8e084214
...@@ -46,9 +46,14 @@ class ProgramAdminForm(forms.ModelForm): ...@@ -46,9 +46,14 @@ class ProgramAdminForm(forms.ModelForm):
def clean(self): def clean(self):
status = self.cleaned_data.get('status') status = self.cleaned_data.get('status')
marketing_slug = self.cleaned_data.get('marketing_slug')
banner_image = self.cleaned_data.get('banner_image') banner_image = self.cleaned_data.get('banner_image')
if status == ProgramStatus.Active and not banner_image:
raise ValidationError(_('Status cannot be change to active without banner image.')) if status == ProgramStatus.Active and not (marketing_slug and banner_image):
raise ValidationError(_(
'Programs can only be activated if they have a marketing slug and a banner image.'
))
return self.cleaned_data return self.cleaned_data
......
import itertools
import ddt import ddt
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.test import TestCase from django.test import TestCase
...@@ -25,6 +27,33 @@ class AdminTests(TestCase): ...@@ -25,6 +27,33 @@ class AdminTests(TestCase):
courses=self.courses, excluded_course_runs=[self.excluded_course_run] courses=self.courses, excluded_course_runs=[self.excluded_course_run]
) )
def _post_data(self, status=ProgramStatus.Unpublished, marketing_slug='/foo'):
return {
'title': 'some test title',
'courses': [self.courses[0].id],
'type': self.program.type.id,
'status': status,
'marketing_slug': marketing_slug,
'partner': self.program.partner.id
}
def assert_form_valid(self, data, files):
form = ProgramAdminForm(data=data, files=files)
self.assertTrue(form.is_valid())
program = form.save()
response = self.client.get(reverse('admin:course_metadata_program_change', args=(program.id,)))
self.assertEqual(response.status_code, 200)
def assert_form_invalid(self, data, files):
form = ProgramAdminForm(data=data, files=files)
self.assertFalse(form.is_valid())
self.assertEqual(
form.errors['__all__'],
['Programs can only be activated if they have a marketing slug and a banner image.']
)
with self.assertRaises(ValueError):
form.save()
def test_program_detail_form(self): def test_program_detail_form(self):
""" Verify in admin panel program detail form load successfully. """ """ Verify in admin panel program detail form load successfully. """
response = self.client.get(reverse('admin:course_metadata_program_change', args=(self.program.id,))) response = self.client.get(reverse('admin:course_metadata_program_change', args=(self.program.id,)))
...@@ -107,57 +136,42 @@ class AdminTests(TestCase): ...@@ -107,57 +136,42 @@ class AdminTests(TestCase):
response = self.client.get(reverse('admin_metadata:update_course_runs', args=(self.program.id,))) response = self.client.get(reverse('admin_metadata:update_course_runs', args=(self.program.id,)))
self.assertNotContains(response, '<input checked="checked")') self.assertNotContains(response, '<input checked="checked")')
def test_program_without_image_and_active_status(self):
""" Verify that new program cannot be added without `image` and active status together."""
data = self._post_data(ProgramStatus.Active)
form = ProgramAdminForm(data, {'banner_image': ''})
self.assertFalse(form.is_valid())
self.assertEqual(form.errors['__all__'], ['Status cannot be change to active without banner image.'])
with self.assertRaises(ValueError):
form.save()
@ddt.data(
ProgramStatus.Deleted,
ProgramStatus.Retired,
ProgramStatus.Unpublished
)
def test_program_without_image_and_non_active_status(self, status):
""" Verify that new program can be added without `image` and non-active
status using admin form.
"""
data = self._post_data(status)
self.valid_post_form(data, {'banner_image': ''})
@ddt.data( @ddt.data(
ProgramStatus.Deleted, *itertools.product(
ProgramStatus.Retired, (
ProgramStatus.Unpublished, (False, False, False),
ProgramStatus.Active (True, False, False),
(False, True, False),
(True, True, True)
),
ProgramStatus.labels
)
) )
def test_program_with_image(self, status): @ddt.unpack
""" Verify that new program can be added with `image` and any status.""" def test_program_activation_restrictions(self, booleans, label):
data = self._post_data(status) """Verify that program activation requires both a marketing slug and a banner image."""
self.valid_post_form(data, {'banner_image': make_image_file('test_banner.jpg')}) has_marketing_slug, has_banner_image, can_be_activated = booleans
status = getattr(ProgramStatus, label)
def _post_data(self, status):
return { marketing_slug = '/foo' if has_marketing_slug else ''
'title': 'some test title', banner_image = make_image_file('test_banner.jpg') if has_banner_image else ''
'courses': [self.courses[0].id],
'type': self.program.type.id, data = self._post_data(status=status, marketing_slug=marketing_slug)
'status': status, files = {'banner_image': banner_image}
'partner': self.program.partner.id
} if status == ProgramStatus.Active:
if can_be_activated:
def valid_post_form(self, data, file_data): # Transitioning to an active status should require a marketing slug and banner image.
form = ProgramAdminForm(data, file_data) self.assert_form_valid(data, files)
self.assertTrue(form.is_valid()) else:
program = form.save() self.assert_form_invalid(data, files)
response = self.client.get(reverse('admin:course_metadata_program_change', args=(program.id,))) else:
self.assertEqual(response.status_code, 200) # All other status transitions should be valid regardless of marketing slug and banner image.
self.assert_form_valid(data, files)
def test_new_program_without_courses(self): def test_new_program_without_courses(self):
""" Verify that new program can be added without `courses`.""" """ Verify that new program can be added without `courses`."""
data = self._post_data(ProgramStatus.Unpublished) data = self._post_data()
data['courses'] = [] data['courses'] = []
form = ProgramAdminForm(data) form = ProgramAdminForm(data)
self.assertTrue(form.is_valid()) self.assertTrue(form.is_valid())
......
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