Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
course-discovery
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
course-discovery
Commits
1f833cc7
Commit
1f833cc7
authored
May 09, 2016
by
Peter Fogg
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add tracking parameters to marketing URLs.
ECOM-4331
parent
05af1d1e
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
65 additions
and
3 deletions
+65
-3
course_discovery/apps/api/serializers.py
+13
-0
course_discovery/apps/api/tests/test_serializers.py
+29
-2
course_discovery/apps/api/v1/tests/test_views/mixins.py
+3
-1
course_discovery/apps/core/migrations/0006_user_referral_tracking_id.py
+19
-0
course_discovery/apps/core/models.py
+1
-0
No files found.
course_discovery/apps/api/serializers.py
View file @
1f833cc7
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'
)
...
...
course_discovery/apps/api/tests/test_serializers.py
View file @
1f833cc7
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
):
...
...
course_discovery/apps/api/v1/tests/test_views/mixins.py
View file @
1f833cc7
...
...
@@ -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
...
...
course_discovery/apps/core/migrations/0006_user_referral_tracking_id.py
0 → 100644
View file @
1f833cc7
# -*- 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
=
''
),
),
]
course_discovery/apps/core/models.py
View file @
1f833cc7
...
...
@@ -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
):
...
...
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