From 8cea65b2d789ef0f276b9f08ca6301a30b94347b Mon Sep 17 00:00:00 2001 From: asadiqbal Date: Fri, 14 Apr 2017 11:16:51 +0500 Subject: [PATCH] ENT-188 --- cms/envs/common.py | 5 ++ .../util/tests/test_submit_feedback.py | 85 ++++++++++++++++++- common/djangoapps/util/views.py | 16 +++- 3 files changed, 101 insertions(+), 5 deletions(-) diff --git a/cms/envs/common.py b/cms/envs/common.py index dc8ceb2209..13747ea66a 100644 --- a/cms/envs/common.py +++ b/cms/envs/common.py @@ -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 ###################### diff --git a/common/djangoapps/util/tests/test_submit_feedback.py b/common/djangoapps/util/tests/test_submit_feedback.py index 35e80c83d5..761046342f 100644 --- a/common/djangoapps/util/tests/test_submit_feedback.py +++ b/common/djangoapps/util/tests/test_submit_feedback.py @@ -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) diff --git a/common/djangoapps/util/views.py b/common/djangoapps/util/views.py index 9602cb79ef..6bf13364f0 100644 --- a/common/djangoapps/util/views.py +++ b/common/djangoapps/util/views.py @@ -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(