Commit 1f833cc7 by Peter Fogg

Add tracking parameters to marketing URLs.

ECOM-4331
parent 05af1d1e
from urllib.parse import urlencode
from django.contrib.auth import get_user_model
from django.db import transaction
from django.utils.translation import ugettext_lazy as _
......@@ -156,6 +158,7 @@ class CourseSerializer(TimestampModelSerializer):
owners = OrganizationSerializer(many=True)
sponsors = OrganizationSerializer(many=True)
course_runs = CourseRunSerializer(many=True)
marketing_url = serializers.SerializerMethodField()
class Meta(object):
model = Course
......@@ -165,6 +168,16 @@ class CourseSerializer(TimestampModelSerializer):
'marketing_url'
)
def get_marketing_url(self, obj):
if obj.marketing_url is None:
return None
user = self.context['request'].user
params = urlencode({
'utm_source': user.username,
'utm_medium': user.referral_tracking_id,
})
return '{url}?{params}'.format(url=obj.marketing_url, params=params)
class CourseSerializerExcludingClosedRuns(CourseSerializer):
course_runs = CourseRunSerializer(many=True, source='active_course_runs')
......
from datetime import datetime
from urllib.parse import urlencode
import ddt
from django.test import TestCase
from rest_framework.test import APIRequestFactory
from course_discovery.apps.api.serializers import(
CatalogSerializer, CourseSerializer, CourseRunSerializer, ContainedCoursesSerializer, ImageSerializer,
......@@ -71,8 +73,11 @@ class CourseSerializerTests(TestCase):
course = CourseFactory()
image = course.image
video = course.video
request = self._make_request()
CourseRunFactory.create_batch(3, course=course)
serializer = CourseSerializer(course)
serializer = CourseSerializer(course, context={'request': request})
expected = {
'key': course.key,
......@@ -89,11 +94,33 @@ class CourseSerializerTests(TestCase):
'sponsors': [],
'modified': json_date_format(course.modified), # pylint: disable=no-member
'course_runs': CourseRunSerializer(course.course_runs, many=True).data,
'marketing_url': course.marketing_url
'marketing_url': '{url}?{params}'.format(
url=course.marketing_url,
params=urlencode({
'utm_source': request.user.username,
'utm_medium': request.user.referral_tracking_id,
})
)
}
self.assertDictEqual(serializer.data, expected)
def test_data_url_none(self):
"""
Verify that the course serializer does not attempt to add URL
parameters if the course has no marketing URL.
"""
course = CourseFactory(marketing_url=None)
request = self._make_request()
serializer = CourseSerializer(course, context={'request': request})
self.assertEqual(serializer.data['marketing_url'], None)
def _make_request(self):
user = UserFactory()
request = APIRequestFactory().get('/')
request.user = user
return request
class CourseRunSerializerTests(TestCase):
def test_data(self):
......
......@@ -16,7 +16,9 @@ class SerializationMixin(object):
query_data = {}
if format:
query_data['format'] = format
return APIRequestFactory().get('/', query_data)
request = APIRequestFactory().get('/', query_data)
request.user = self.user
return request
def _serialize_object(self, serializer, obj, many=False, format=None):
return serializer(obj, many=many, context={'request': self._get_request(format)}).data
......
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('core', '0005_populate_currencies'),
]
operations = [
migrations.AddField(
model_name='user',
name='referral_tracking_id',
field=models.CharField(max_length=255, default='affiliate_partner', verbose_name=''),
),
]
......@@ -9,6 +9,7 @@ from guardian.mixins import GuardianUserMixin
class User(GuardianUserMixin, AbstractUser):
"""Custom user model for use with OpenID Connect."""
full_name = models.CharField(_('Full Name'), max_length=255, blank=True, null=True)
referral_tracking_id = models.CharField(_(''), max_length=255, default='affiliate_partner')
@property
def access_token(self):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment