From d84d47f32c54a895ab675bdf8907c782c6f32f9e Mon Sep 17 00:00:00 2001 From: uzairr <uzairr@yahoo.com> Date: Thu, 28 Jun 2018 20:29:53 +0500 Subject: [PATCH] Update sailthru audit purchase calls Currently, there are two purchase calls are occurring for each audit purchase on sail-thru.To avoid it,code is updated so that a single call will occur for each purchase. LEARNER-5257 --- common/djangoapps/course_modes/views.py | 4 ++-- common/djangoapps/student/signals/__init__.py | 3 ++- common/djangoapps/student/signals/signals.py | 1 + lms/djangoapps/commerce/api/v0/views.py | 8 +++++++- lms/djangoapps/email_marketing/signals.py | 11 ++++++----- lms/djangoapps/email_marketing/tasks.py | 8 ++++++-- lms/djangoapps/email_marketing/tests/test_signals.py | 1 + 7 files changed, 25 insertions(+), 11 deletions(-) diff --git a/common/djangoapps/course_modes/views.py b/common/djangoapps/course_modes/views.py index 0943493a521..3f351f0c571 100644 --- a/common/djangoapps/course_modes/views.py +++ b/common/djangoapps/course_modes/views.py @@ -9,13 +9,13 @@ import urllib import waffle from babel.dates import format_datetime from django.contrib.auth.decorators import login_required -from django.urls import reverse from django.db import transaction from django.http import HttpResponse, HttpResponseBadRequest from django.shortcuts import redirect +from django.urls import reverse from django.utils.decorators import method_decorator -from django.utils.translation import ugettext as _ from django.utils.translation import get_language, to_locale +from django.utils.translation import ugettext as _ from django.views.generic.base import View from ipware.ip import get_ip from opaque_keys.edx.keys import CourseKey diff --git a/common/djangoapps/student/signals/__init__.py b/common/djangoapps/student/signals/__init__.py index 6a50ccf072f..db63d488705 100644 --- a/common/djangoapps/student/signals/__init__.py +++ b/common/djangoapps/student/signals/__init__.py @@ -2,5 +2,6 @@ from student.signals.signals import ( ENROLLMENT_TRACK_UPDATED, UNENROLL_DONE, ENROLL_STATUS_CHANGE, - REFUND_ORDER + REFUND_ORDER, + SAILTHRU_AUDIT_PURCHASE ) diff --git a/common/djangoapps/student/signals/signals.py b/common/djangoapps/student/signals/signals.py index d1c080584d9..9e7b7c90e6f 100644 --- a/common/djangoapps/student/signals/signals.py +++ b/common/djangoapps/student/signals/signals.py @@ -7,3 +7,4 @@ ENROLLMENT_TRACK_UPDATED = Signal(providing_args=['user', 'course_key']) UNENROLL_DONE = Signal(providing_args=["course_enrollment", "skip_refund"]) ENROLL_STATUS_CHANGE = Signal(providing_args=["event", "user", "course_id", "mode", "cost", "currency"]) REFUND_ORDER = Signal(providing_args=["course_enrollment"]) +SAILTHRU_AUDIT_PURCHASE = Signal(providing_args=["event", "user", "course_id", "mode"]) diff --git a/lms/djangoapps/commerce/api/v0/views.py b/lms/djangoapps/commerce/api/v0/views.py index e4657cbdf92..5ca26fabc53 100644 --- a/lms/djangoapps/commerce/api/v0/views.py +++ b/lms/djangoapps/commerce/api/v0/views.py @@ -1,7 +1,6 @@ """ API v0 views. """ import logging -from courseware import courses from django.urls import reverse from edx_rest_api_client import exceptions from opaque_keys import InvalidKeyError @@ -13,6 +12,7 @@ from rest_framework.views import APIView from six import text_type from course_modes.models import CourseMode +from courseware import courses from enrollment.api import add_enrollment from enrollment.views import EnrollmentCrossDomainSessionAuth from entitlements.models import CourseEntitlement @@ -21,7 +21,9 @@ from openedx.core.djangoapps.embargo import api as embargo_api from openedx.core.djangoapps.user_api.preferences.api import update_email_opt_in from openedx.core.lib.api.authentication import OAuth2AuthenticationAllowInactiveUser from student.models import CourseEnrollment +from student.signals import SAILTHRU_AUDIT_PURCHASE from util.json_request import JsonResponse + from ...constants import Messages from ...http import DetailResponse @@ -139,6 +141,10 @@ class BasketsView(APIView): ) log.info(msg) self._enroll(course_key, user, default_enrollment_mode.slug) + mode = CourseMode.AUDIT if audit_mode else CourseMode.HONOR + SAILTHRU_AUDIT_PURCHASE.send( + sender=None, event='enroll', user=user, mode=mode, course_id=course_key + ) self._handle_marketing_opt_in(request, course_key, user) return DetailResponse(msg) else: diff --git a/lms/djangoapps/email_marketing/signals.py b/lms/djangoapps/email_marketing/signals.py index 0362086622d..3109f325d9f 100644 --- a/lms/djangoapps/email_marketing/signals.py +++ b/lms/djangoapps/email_marketing/signals.py @@ -16,14 +16,15 @@ from six import text_type import third_party_auth from course_modes.models import CourseMode from email_marketing.models import EmailMarketingConfiguration +from lms.djangoapps.email_marketing.tasks import get_email_cookies_via_sailthru, update_user, update_user_email +from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY from openedx.core.djangoapps.user_api.accounts.signals import USER_RETIRE_THIRD_PARTY_MAILINGS from openedx.core.djangoapps.waffle_utils import WaffleSwitchNamespace -from lms.djangoapps.email_marketing.tasks import update_user, update_user_email, get_email_cookies_via_sailthru -from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY from student.cookies import CREATE_LOGON_COOKIE -from student.signals import ENROLL_STATUS_CHANGE +from student.signals import SAILTHRU_AUDIT_PURCHASE from student.views import REGISTER_USER from util.model_utils import USER_FIELD_CHANGED + from .tasks import update_course_enrollment log = logging.getLogger(__name__) @@ -39,7 +40,7 @@ WAFFLE_SWITCHES = WaffleSwitchNamespace(name=WAFFLE_NAMESPACE) SAILTHRU_AUDIT_PURCHASE_ENABLED = 'audit_purchase_enabled' -@receiver(ENROLL_STATUS_CHANGE) +@receiver(SAILTHRU_AUDIT_PURCHASE) def update_sailthru(sender, event, user, mode, course_id, **kwargs): """ Receives signal and calls a celery task to update the @@ -51,7 +52,7 @@ def update_sailthru(sender, event, user, mode, course_id, **kwargs): None """ if WAFFLE_SWITCHES.is_enabled(SAILTHRU_AUDIT_PURCHASE_ENABLED) and mode in CourseMode.AUDIT_MODES: - course_key = str(course_id) + course_key = course_id email = str(user.email) update_course_enrollment.delay(email, course_key, mode) diff --git a/lms/djangoapps/email_marketing/tasks.py b/lms/djangoapps/email_marketing/tasks.py index 3a1e42f4274..4221cd4d2a2 100644 --- a/lms/djangoapps/email_marketing/tasks.py +++ b/lms/djangoapps/email_marketing/tasks.py @@ -1,6 +1,7 @@ """ This file contains celery tasks for email marketing signal handler. """ + import logging import time from datetime import datetime, timedelta @@ -320,7 +321,7 @@ def update_course_enrollment(self, email, course_key, mode): course_data = _get_course_content(course_key, course_url, sailthru_client, config) - item = _build_purchase_item(course_key, course_url, cost_in_cents, mode, course_data, None) + item = _build_purchase_item(course_key, course_url, cost_in_cents, mode, course_data) options = {} if send_template: @@ -433,7 +434,7 @@ def _get_course_content(course_id, course_url, sailthru_client, config): return response -def _build_purchase_item(course_id, course_url, cost_in_cents, mode, course_data, sku): +def _build_purchase_item(course_id, course_url, cost_in_cents, mode, course_data): """Build and return Sailthru purchase item object""" # build item description @@ -454,6 +455,9 @@ def _build_purchase_item(course_id, course_url, cost_in_cents, mode, course_data if 'tags' in course_data: item['tags'] = course_data['tags'] + # add vars to item + item['vars'] = dict(course_data.get('vars', {}), mode=mode, course_run_id=unicode(course_id)) + return item diff --git a/lms/djangoapps/email_marketing/tests/test_signals.py b/lms/djangoapps/email_marketing/tests/test_signals.py index 18cd64b4db6..d0b67cbf940 100644 --- a/lms/djangoapps/email_marketing/tests/test_signals.py +++ b/lms/djangoapps/email_marketing/tests/test_signals.py @@ -704,6 +704,7 @@ class SailthruTests(TestCase): m.return_value = self.course_url update_course_enrollment(TEST_EMAIL, self.course_id, 'audit') item = [{ + 'vars': {'course_run_id': u'edX/toy/2012_Fall', 'mode': 'audit'}, 'url': self.course_url, 'price': 0, 'qty': 1, -- GitLab