Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
course-discovery
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
course-discovery
Commits
f4cfb5dc
Commit
f4cfb5dc
authored
Sep 13, 2016
by
Renzo Lucioni
Committed by
GitHub
Sep 13, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #320 from edx/renzo/require-slug
Make marketing slug required for program activation
parents
8e084214
f7fe1b4f
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
67 additions
and
48 deletions
+67
-48
course_discovery/apps/course_metadata/forms.py
+7
-2
course_discovery/apps/course_metadata/tests/test_admin.py
+60
-46
No files found.
course_discovery/apps/course_metadata/forms.py
View file @
f4cfb5dc
...
...
@@ -46,9 +46,14 @@ class ProgramAdminForm(forms.ModelForm):
def
clean
(
self
):
status
=
self
.
cleaned_data
.
get
(
'status'
)
marketing_slug
=
self
.
cleaned_data
.
get
(
'marketing_slug'
)
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
...
...
course_discovery/apps/course_metadata/tests/test_admin.py
View file @
f4cfb5dc
import
itertools
import
ddt
from
django.core.urlresolvers
import
reverse
from
django.test
import
TestCase
...
...
@@ -25,6 +27,33 @@ class AdminTests(TestCase):
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
):
""" Verify in admin panel program detail form load successfully. """
response
=
self
.
client
.
get
(
reverse
(
'admin:course_metadata_program_change'
,
args
=
(
self
.
program
.
id
,)))
...
...
@@ -107,57 +136,42 @@ class AdminTests(TestCase):
response
=
self
.
client
.
get
(
reverse
(
'admin_metadata:update_course_runs'
,
args
=
(
self
.
program
.
id
,)))
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
(
ProgramStatus
.
Deleted
,
ProgramStatus
.
Retired
,
ProgramStatus
.
Unpublished
,
ProgramStatus
.
Active
*
itertools
.
product
(
(
(
False
,
False
,
False
),
(
True
,
False
,
False
),
(
False
,
True
,
False
),
(
True
,
True
,
True
)
),
ProgramStatus
.
labels
)
)
def
test_program_with_image
(
self
,
status
):
""" Verify that new program can be added with `image` and any status."""
data
=
self
.
_post_data
(
status
)
self
.
valid_post_form
(
data
,
{
'banner_image'
:
make_image_file
(
'test_banner.jpg'
)})
def
_post_data
(
self
,
status
):
return
{
'title'
:
'some test title'
,
'courses'
:
[
self
.
courses
[
0
]
.
id
],
'type'
:
self
.
program
.
type
.
id
,
'status'
:
status
,
'partner'
:
self
.
program
.
partner
.
id
}
def
valid_post_form
(
self
,
data
,
file_data
):
form
=
ProgramAdminForm
(
data
,
file_data
)
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
)
@ddt.unpack
def
test_program_activation_restrictions
(
self
,
booleans
,
label
):
"""Verify that program activation requires both a marketing slug and a banner image."""
has_marketing_slug
,
has_banner_image
,
can_be_activated
=
booleans
status
=
getattr
(
ProgramStatus
,
label
)
marketing_slug
=
'/foo'
if
has_marketing_slug
else
''
banner_image
=
make_image_file
(
'test_banner.jpg'
)
if
has_banner_image
else
''
data
=
self
.
_post_data
(
status
=
status
,
marketing_slug
=
marketing_slug
)
files
=
{
'banner_image'
:
banner_image
}
if
status
==
ProgramStatus
.
Active
:
if
can_be_activated
:
# Transitioning to an active status should require a marketing slug and banner image.
self
.
assert_form_valid
(
data
,
files
)
else
:
self
.
assert_form_invalid
(
data
,
files
)
else
:
# 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
):
""" Verify that new program can be added without `courses`."""
data
=
self
.
_post_data
(
ProgramStatus
.
Unpublished
)
data
=
self
.
_post_data
()
data
[
'courses'
]
=
[]
form
=
ProgramAdminForm
(
data
)
self
.
assertTrue
(
form
.
is_valid
())
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment