Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
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
edx-platform
Commits
ed33d3b0
Commit
ed33d3b0
authored
Mar 29, 2017
by
asadiqbal
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ENT-287 Track Selection: Enterprise messaging only for catalog courses
parent
82dea974
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
137 additions
and
20 deletions
+137
-20
cms/envs/common.py
+4
-0
common/djangoapps/course_modes/tests/test_views.py
+9
-1
common/djangoapps/course_modes/views.py
+30
-12
common/djangoapps/util/enterprise_helpers.py
+42
-0
common/djangoapps/util/tests/mixins/discovery.py
+43
-0
lms/envs/aws.py
+4
-0
lms/envs/common.py
+4
-0
lms/templates/course_modes/choose.html
+1
-7
No files found.
cms/envs/common.py
View file @
ed33d3b0
...
...
@@ -1263,3 +1263,7 @@ USER_TASKS_MAX_AGE = timedelta(days=7)
############## Settings for the Enterprise App ######################
ENTERPRISE_ENROLLMENT_API_URL
=
LMS_ROOT_URL
+
"/api/enrollment/v1/"
############## Settings for the Discovery App ######################
COURSE_CATALOG_API_URL
=
None
common/djangoapps/course_modes/tests/test_views.py
View file @
ed33d3b0
...
...
@@ -27,13 +27,14 @@ from student.tests.factories import CourseEnrollmentFactory, UserFactory
from
util.testing
import
UrlResetMixin
from
openedx.core.djangoapps.theming.tests.test_util
import
with_comprehensive_theme
from
util.tests.mixins.enterprise
import
EnterpriseServiceMockMixin
from
util.tests.mixins.discovery
import
CourseCatalogServiceMockMixin
from
util
import
organizations_helpers
as
organizations_api
@attr
(
shard
=
3
)
@ddt.ddt
@unittest.skipUnless
(
settings
.
ROOT_URLCONF
==
'lms.urls'
,
'Test only valid in lms'
)
class
CourseModeViewTest
(
UrlResetMixin
,
ModuleStoreTestCase
,
EnterpriseServiceMockMixin
):
class
CourseModeViewTest
(
UrlResetMixin
,
ModuleStoreTestCase
,
EnterpriseServiceMockMixin
,
CourseCatalogServiceMockMixin
):
"""
Course Mode View tests
"""
...
...
@@ -156,6 +157,10 @@ class CourseModeViewTest(UrlResetMixin, ModuleStoreTestCase, EnterpriseServiceMo
self
.
mock_enterprise_learner_api
()
self
.
mock_course_discovery_api_for_catalog_contains
(
catalog_id
=
1
,
course_run_ids
=
[
str
(
self
.
course
.
id
)]
)
# User visits the track selection page directly without ever enrolling
url
=
reverse
(
'course_modes_choose'
,
args
=
[
unicode
(
self
.
course
.
id
)])
response
=
self
.
client
.
get
(
url
)
...
...
@@ -181,6 +186,9 @@ class CourseModeViewTest(UrlResetMixin, ModuleStoreTestCase, EnterpriseServiceMo
CourseModeFactory
.
create
(
mode_slug
=
mode
,
course_id
=
self
.
course
.
id
)
self
.
mock_enterprise_learner_api
()
self
.
mock_course_discovery_api_for_catalog_contains
(
catalog_id
=
1
,
course_run_ids
=
[
str
(
self
.
course
.
id
)]
)
# Creating organization
for
i
in
xrange
(
2
):
...
...
common/djangoapps/course_modes/views.py
View file @
ed33d3b0
...
...
@@ -20,6 +20,7 @@ from opaque_keys.edx.locations import SlashSeparatedCourseKey
from
xmodule.modulestore.django
import
modulestore
from
lms.djangoapps.commerce.utils
import
EcommerceService
from
openedx.core.djangoapps.api_admin.utils
import
course_discovery_api_client
from
course_modes.models
import
CourseMode
from
courseware.access
import
has_access
from
edxmako.shortcuts
import
render_to_response
...
...
@@ -132,11 +133,11 @@ class ChooseModeView(View):
CourseMode
.
is_credit_mode
(
mode
)
for
mode
in
CourseMode
.
modes_for_course
(
course_key
,
only_selectable
=
False
)
)
course_id
=
course_key
.
to_deprecated_string
()
context
=
{
"course_modes_choose_url"
:
reverse
(
"course_modes_choose"
,
kwargs
=
{
'course_id'
:
course_
key
.
to_deprecated_string
()
}
kwargs
=
{
'course_id'
:
course_
id
}
),
"modes"
:
modes
,
"has_credit_upsell"
:
has_credit_upsell
,
...
...
@@ -149,18 +150,35 @@ class ChooseModeView(View):
"nav_hidden"
:
True
,
}
title_content
=
_
(
"Congratulations! You are now enrolled in {course_name}"
)
.
format
(
course_name
=
course
.
display_name_with_default_escaped
)
enterprise_learner_data
=
enterprise_api
.
get_enterprise_learner_data
(
site
=
request
.
site
,
user
=
request
.
user
)
if
enterprise_learner_data
:
context
[
"show_enterprise_context"
]
=
True
context
[
"partner_names"
]
=
partner_name
=
course
.
display_organization
\
if
course
.
display_organization
else
course
.
org
context
[
"enterprise_name"
]
=
enterprise_learner_data
[
0
][
'enterprise_customer'
][
'name'
]
context
[
"username"
]
=
request
.
user
.
username
organizations
=
organization_api
.
get_course_organizations
(
course_id
=
course
.
id
)
if
organizations
:
context
[
"partner_names"
]
=
' and '
.
join
([
org
.
get
(
'name'
,
partner_name
)
for
org
in
organizations
])
is_course_in_enterprise_catalog
=
enterprise_api
.
is_course_in_enterprise_catalog
(
site
=
request
.
site
,
course_id
=
course_id
,
user
=
request
.
user
,
enterprise_catalog_id
=
enterprise_learner_data
[
0
][
'enterprise_customer'
][
'catalog'
]
)
if
is_course_in_enterprise_catalog
:
partner_names
=
partner_name
=
course
.
display_organization
\
if
course
.
display_organization
else
course
.
org
enterprise_name
=
enterprise_learner_data
[
0
][
'enterprise_customer'
][
'name'
]
organizations
=
organization_api
.
get_course_organizations
(
course_id
=
course
.
id
)
if
organizations
:
partner_names
=
' and '
.
join
([
org
.
get
(
'name'
,
partner_name
)
for
org
in
organizations
])
title_content
=
_
(
"Welcome, {username}! You are about to enroll in {course_name},"
" from {partner_names}, sponsored by {enterprise_name}. Please select your enrollment"
" information below."
)
.
format
(
username
=
request
.
user
.
username
,
course_name
=
course
.
display_name_with_default_escaped
,
partner_names
=
partner_names
,
enterprise_name
=
enterprise_name
)
context
[
"title_content"
]
=
title_content
if
"verified"
in
modes
:
verified_mode
=
modes
[
"verified"
]
...
...
common/djangoapps/util/enterprise_helpers.py
View file @
ed33d3b0
...
...
@@ -20,6 +20,10 @@ try:
except
ImportError
:
pass
from
openedx.core.djangoapps.site_configuration
import
helpers
as
configuration_helpers
from
slumber.exceptions
import
SlumberBaseException
from
requests.exceptions
import
ConnectionError
,
Timeout
from
openedx.core.djangoapps.api_admin.utils
import
course_discovery_api_client
from
openedx.core.lib.token_utils
import
JwtBuilder
from
slumber.exceptions
import
HttpClientError
,
HttpServerError
import
hashlib
...
...
@@ -442,3 +446,41 @@ def get_dashboard_consent_notification(request, user, course_enrollments):
}
)
return
''
def
is_course_in_enterprise_catalog
(
site
,
course_id
,
user
,
enterprise_catalog_id
):
"""
Verify that the provided course id exists in the site base list of course
run keys from the provided enterprise course catalog.
Arguments:
course_id (str): The course ID.
site: (django.contrib.sites.Site) site instance
enterprise_catalog_id (Int): Course catalog id of enterprise
Returns:
Boolean
"""
cache_key
=
get_cache_key
(
site_domain
=
site
.
domain
,
resource
=
'catalogs.contains'
,
course_id
=
course_id
,
catalog_id
=
enterprise_catalog_id
)
response
=
cache
.
get
(
cache_key
)
if
not
response
:
try
:
# GET: /api/v1/catalogs/{catalog_id}/contains?course_run_id={course_run_ids}
response
=
course_discovery_api_client
(
user
=
user
)
.
catalogs
(
enterprise_catalog_id
)
.
contains
.
get
(
course_run_id
=
course_id
)
cache
.
set
(
cache_key
,
response
,
settings
.
COURSES_API_CACHE_TIMEOUT
)
except
(
ConnectionError
,
SlumberBaseException
,
Timeout
):
LOGGER
.
exception
(
'Unable to connect to Course Catalog service for catalog contains endpoint.'
)
return
False
try
:
return
response
[
'courses'
][
course_id
]
except
KeyError
:
return
False
common/djangoapps/util/tests/mixins/discovery.py
0 → 100644
View file @
ed33d3b0
"""
Mixins for the CourseDiscoveryApiClient.
"""
import
json
import
httpretty
from
django.conf
import
settings
from
django.core.cache
import
cache
class
CourseCatalogServiceMockMixin
(
object
):
"""
Mocks for the Open edX service 'Course Catalog Service' responses.
"""
COURSE_DISCOVERY_CATALOGS_URL
=
'{}/catalogs/'
.
format
(
settings
.
COURSE_CATALOG_API_URL
,
)
def
setUp
(
self
):
super
(
CourseCatalogServiceMockMixin
,
self
)
.
setUp
()
cache
.
clear
()
def
mock_course_discovery_api_for_catalog_contains
(
self
,
catalog_id
=
1
,
course_run_ids
=
None
):
"""
Helper function to register course catalog contains API endpoint.
"""
course_run_ids
=
course_run_ids
or
[]
courses
=
{
course_run_id
:
True
for
course_run_id
in
course_run_ids
}
course_discovery_api_response
=
{
'courses'
:
courses
}
course_discovery_api_response_json
=
json
.
dumps
(
course_discovery_api_response
)
catalog_contains_uri
=
'{}{}/contains/?course_run_id={}'
.
format
(
self
.
COURSE_DISCOVERY_CATALOGS_URL
,
catalog_id
,
','
.
join
(
course_run_ids
)
)
httpretty
.
register_uri
(
method
=
httpretty
.
GET
,
uri
=
catalog_contains_uri
,
body
=
course_discovery_api_response_json
,
content_type
=
'application/json'
)
lms/envs/aws.py
View file @
ed33d3b0
...
...
@@ -916,3 +916,7 @@ ENTERPRISE_ENROLLMENT_API_URL = ENV_TOKENS.get(
'ENTERPRISE_ENROLLMENT_API_URL'
,
ENTERPRISE_ENROLLMENT_API_URL
)
# Discovery App config
COURSES_API_CACHE_TIMEOUT
=
ENV_TOKENS
.
get
(
'COURSES_API_CACHE_TIMEOUT'
,
COURSES_API_CACHE_TIMEOUT
)
lms/envs/common.py
View file @
ed33d3b0
...
...
@@ -3081,3 +3081,7 @@ COURSE_ENROLLMENT_MODES = {
"credit"
:
5
,
"honor"
:
6
,
}
############## Settings for the Discovery App ######################
COURSES_API_CACHE_TIMEOUT
=
3600
# Value is in seconds
lms/templates/course_modes/choose.html
View file @
ed33d3b0
...
...
@@ -73,13 +73,7 @@ from openedx.core.djangolib.markup import HTML, Text
<article
class=
"register-choose content-main"
>
<header
class=
"page-header content-main"
>
<h3
class=
"title"
>
% if show_enterprise_context:
${_("Welcome, {username}! You are about to enroll in {course_name}, from "
"{partner_names}, sponsored by {enterprise_name}. Please select your enrollment"
" information below.").format(username=username, course_name=course_name, partner_names=partner_names, enterprise_name=enterprise_name)}
% else:
${_("Congratulations! You are now enrolled in {course_name}").format(course_name=course_name)}
% endif
${title_content}
</h3>
</header>
...
...
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