diff --git a/common/djangoapps/course_modes/views.py b/common/djangoapps/course_modes/views.py index 0943493a521bb48f222b854b15b57b6dd2da5459..3f351f0c57114777fd99e5babd888c7acea815c8 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 6a50ccf072f6fcb64f1d37e507dea59e979ddf15..db63d488705def3f8aa555704d7f600f9d3757da 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 d1c080584d975b01ac54877af2445900d8eca874..9e7b7c90e6f778fec357d30e0f424b96320cee85 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 e4657cbdf92dd607c8dbaa918b7044481c982ea8..5ca26fabc5328af02a76ce191f259f2785fe3c87 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 0362086622d9c7f3043b436c7bcf5682e24e0b50..3109f325d9f21c4337fa308786534ffb28362485 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 3a1e42f42746ebf3fd78a55e93dea07eefaa3688..4221cd4d2a2806134ffcab855b3d44a0aa47617e 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 18cd64b4db6619bc7dfacd45009ec924c61190a1..d0b67cbf940a3a522de10659f7e14be7e31bfca7 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,