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
8cea65b2
Commit
8cea65b2
authored
Apr 14, 2017
by
asadiqbal
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ENT-188
parent
a26560de
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
101 additions
and
5 deletions
+101
-5
cms/envs/common.py
+5
-0
common/djangoapps/util/tests/test_submit_feedback.py
+82
-3
common/djangoapps/util/views.py
+14
-2
No files found.
cms/envs/common.py
View file @
8cea65b2
...
...
@@ -1084,6 +1084,9 @@ OPTIONAL_APPS = (
# Organizations App (http://github.com/edx/edx-organizations)
'organizations'
,
# Enterprise App (http://github.com/edx/edx-enterprise)
'enterprise'
,
)
...
...
@@ -1263,6 +1266,8 @@ USER_TASKS_MAX_AGE = timedelta(days=7)
############## Settings for the Enterprise App ######################
ENTERPRISE_ENROLLMENT_API_URL
=
LMS_ROOT_URL
+
"/api/enrollment/v1/"
ENTERPRISE_SERVICE_WORKER_USERNAME
=
'enterprise_worker'
ENTERPRISE_API_CACHE_TIMEOUT
=
3600
# Value is in seconds
############## Settings for the Discovery App ######################
...
...
common/djangoapps/util/tests/test_submit_feedback.py
View file @
8cea65b2
...
...
@@ -7,8 +7,11 @@ from django.test.client import RequestFactory
from
django.test.utils
import
override_settings
from
smtplib
import
SMTPException
from
student.tests.factories
import
UserFactory
from
openedx.core.djangoapps.site_configuration.tests.factories
import
SiteFactory
from
openedx.features.enterprise_support.tests.mixins.enterprise
import
EnterpriseServiceMockMixin
from
util
import
views
from
zendesk
import
ZendeskError
import
httpretty
import
json
import
mock
from
ddt
import
ddt
,
data
,
unpack
...
...
@@ -17,7 +20,11 @@ from student.tests.test_configuration_overrides import fake_get_value
from
student.tests.factories
import
CourseEnrollmentFactory
TEST_SUPPORT_EMAIL
=
"support@example.com"
TEST_ZENDESK_CUSTOM_FIELD_CONFIG
=
{
"course_id"
:
1234
,
"enrollment_mode"
:
5678
}
TEST_ZENDESK_CUSTOM_FIELD_CONFIG
=
{
"course_id"
:
1234
,
"enrollment_mode"
:
5678
,
'enterprise_customer_name'
:
'enterprise_customer_name'
}
TEST_REQUEST_HEADERS
=
{
"HTTP_REFERER"
:
"test_referer"
,
"HTTP_USER_AGENT"
:
"test_user_agent"
,
...
...
@@ -44,11 +51,12 @@ def fake_support_backend_values(name, default=None): # pylint: disable=unused-a
ZENDESK_URL
=
"dummy"
,
ZENDESK_USER
=
"dummy"
,
ZENDESK_API_KEY
=
"dummy"
,
ZENDESK_CUSTOM_FIELDS
=
{}
ZENDESK_CUSTOM_FIELDS
=
{},
ENABLE_ENTERPRISE_INTEGRATION
=
False
)
@mock.patch
(
"util.views.dog_stats_api"
)
@mock.patch
(
"util.views._ZendeskApi"
,
autospec
=
True
)
class
SubmitFeedbackTest
(
TestCase
):
class
SubmitFeedbackTest
(
EnterpriseServiceMockMixin
,
TestCase
):
"""
Class to test the submit_feedback function in views.
"""
...
...
@@ -72,6 +80,13 @@ class SubmitFeedbackTest(TestCase):
# This does not contain issue_type nor course_id to ensure that they are optional
self
.
_auth_fields
=
{
"subject"
:
"a subject"
,
"details"
:
"some details"
}
# Create a service user, because the track selection page depends on it
UserFactory
.
create
(
username
=
'enterprise_worker'
,
email
=
"enterprise_worker@example.com"
,
password
=
"edx"
,
)
def
_build_and_run_request
(
self
,
user
,
fields
):
"""
Generate a request and invoke the view, returning the response.
...
...
@@ -87,6 +102,7 @@ class SubmitFeedbackTest(TestCase):
REMOTE_ADDR
=
TEST_REQUEST_HEADERS
[
"REMOTE_ADDR"
],
SERVER_NAME
=
TEST_REQUEST_HEADERS
[
"SERVER_NAME"
],
)
req
.
site
=
SiteFactory
.
create
()
req
.
user
=
user
return
views
.
submit_feedback
(
req
)
...
...
@@ -441,6 +457,69 @@ class SubmitFeedbackTest(TestCase):
self
.
_assert_zendesk_called
(
zendesk_mock_instance
,
ticket_id
,
ticket
,
ticket_update
)
self
.
_assert_datadog_called
(
datadog_mock
,
datadog_tags
)
@httpretty.activate
@data
(
(
"course-v1:testOrg+testCourseNumber+testCourseRun"
,
True
),
(
"course-v1:testOrg+testCourseNumber+testCourseRun"
,
False
),
)
@unpack
@override_settings
(
ZENDESK_CUSTOM_FIELDS
=
TEST_ZENDESK_CUSTOM_FIELD_CONFIG
,
ENABLE_ENTERPRISE_INTEGRATION
=
True
)
def
test_valid_request_auth_user_with_enterprise_info
(
self
,
course_id
,
enrolled
,
zendesk_mock_class
,
datadog_mock
):
"""
Test a valid request from an authenticated user with enterprise tags.
"""
self
.
mock_enterprise_learner_api
()
zendesk_mock_instance
=
zendesk_mock_class
.
return_value
user
=
self
.
_auth_user
fields
=
self
.
_auth_fields
.
copy
()
if
course_id
is
not
None
:
fields
[
"course_id"
]
=
course_id
ticket_id
=
42
zendesk_mock_instance
.
create_ticket
.
return_value
=
ticket_id
zendesk_tags
=
[
"enterprise_learner"
,
"LMS"
]
datadog_tags
=
[
'learner_type:enterprise_learner'
]
zendesk_custom_fields
=
[]
if
course_id
:
zendesk_tags
.
insert
(
0
,
course_id
)
datadog_tags
.
insert
(
0
,
"course_id:{}"
.
format
(
course_id
))
zendesk_custom_fields
.
append
({
"id"
:
TEST_ZENDESK_CUSTOM_FIELD_CONFIG
[
"course_id"
],
"value"
:
course_id
})
if
enrolled
is
not
None
:
enrollment
=
CourseEnrollmentFactory
.
create
(
user
=
user
,
course_id
=
course_id
,
is_active
=
enrolled
)
if
enrollment
.
is_active
:
zendesk_custom_fields
.
append
(
{
"id"
:
TEST_ZENDESK_CUSTOM_FIELD_CONFIG
[
"enrollment_mode"
],
"value"
:
enrollment
.
mode
}
)
zendesk_custom_fields
.
append
(
{
"id"
:
TEST_ZENDESK_CUSTOM_FIELD_CONFIG
[
"enterprise_customer_name"
],
"value"
:
'TestShib'
}
)
ticket
=
self
.
_build_zendesk_ticket
(
recipient
=
TEST_SUPPORT_EMAIL
,
name
=
user
.
profile
.
name
,
email
=
user
.
email
,
subject
=
fields
[
"subject"
],
details
=
fields
[
"details"
],
tags
=
zendesk_tags
,
custom_fields
=
zendesk_custom_fields
)
ticket_update
=
self
.
_build_zendesk_ticket_update
(
TEST_REQUEST_HEADERS
,
user
.
username
)
self
.
_test_success
(
user
,
fields
)
self
.
_assert_zendesk_called
(
zendesk_mock_instance
,
ticket_id
,
ticket
,
ticket_update
)
self
.
_assert_datadog_called
(
datadog_mock
,
datadog_tags
)
def
test_get_request
(
self
,
zendesk_mock_class
,
datadog_mock
):
"""Test that a GET results in a 405 even with all required fields"""
req
=
self
.
_request_factory
.
get
(
"/submit_feedback"
,
data
=
self
.
_anon_fields
)
...
...
common/djangoapps/util/views.py
View file @
8cea65b2
...
...
@@ -23,6 +23,7 @@ from opaque_keys.edx.keys import CourseKey, UsageKey
from
edxmako.shortcuts
import
render_to_response
,
render_to_string
from
openedx.core.djangoapps.site_configuration
import
helpers
as
configuration_helpers
from
openedx.features.enterprise_support
import
api
as
enterprise_api
import
track.views
from
student.roles
import
GlobalStaff
from
student.models
import
CourseEnrollment
...
...
@@ -223,7 +224,7 @@ class _ZendeskApi(object):
return
None
def
_get_zendesk_custom_field_context
(
request
):
def
_get_zendesk_custom_field_context
(
request
,
**
kwargs
):
"""
Construct a dictionary of data that can be stored in Zendesk custom fields.
"""
...
...
@@ -241,6 +242,11 @@ def _get_zendesk_custom_field_context(request):
if
enrollment
and
enrollment
.
is_active
:
context
[
"enrollment_mode"
]
=
enrollment
.
mode
enterprise_learner_data
=
kwargs
.
get
(
'learner_data'
,
None
)
if
enterprise_learner_data
:
enterprise_customer_name
=
enterprise_learner_data
[
0
][
'enterprise_customer'
][
'name'
]
context
[
"enterprise_customer_name"
]
=
enterprise_customer_name
return
context
...
...
@@ -434,6 +440,12 @@ def submit_feedback(request):
success
=
False
context
=
get_feedback_form_context
(
request
)
#Update the tag info with 'enterprise_learner' if the user belongs to an enterprise customer.
enterprise_learner_data
=
enterprise_api
.
get_enterprise_learner_data
(
site
=
request
.
site
,
user
=
request
.
user
)
if
enterprise_learner_data
:
context
[
"tags"
][
"learner_type"
]
=
"enterprise_learner"
support_backend
=
configuration_helpers
.
get_value
(
'CONTACT_FORM_SUBMISSION_BACKEND'
,
SUPPORT_BACKEND_ZENDESK
)
if
support_backend
==
SUPPORT_BACKEND_EMAIL
:
...
...
@@ -456,7 +468,7 @@ def submit_feedback(request):
custom_fields
=
None
if
settings
.
ZENDESK_CUSTOM_FIELDS
:
custom_field_context
=
_get_zendesk_custom_field_context
(
request
)
custom_field_context
=
_get_zendesk_custom_field_context
(
request
,
learner_data
=
enterprise_learner_data
)
custom_fields
=
_format_zendesk_custom_fields
(
custom_field_context
)
success
=
_record_feedback_in_zendesk
(
...
...
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