You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

94 lines
3.8 KiB

"""Views for emencia.django.newsletter Tracking"""
import base64
from urllib import urlencode
from urlparse import urlparse
from urlparse import urlunparse
from urlparse import parse_qs
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404
from django.template import RequestContext
from django.utils.encoding import smart_str
from django.utils.translation import ugettext as _
from django.shortcuts import render_to_response
from django.contrib.auth.decorators import login_required
from emencia.django.newsletter.models import Link
from emencia.django.newsletter.models import Newsletter
from emencia.django.newsletter.utils.tokens import untokenize
from emencia.django.newsletter.models import ContactMailingStatus
from emencia.django.newsletter.settings import USE_UTM_TAGS
from emencia.django.newsletter.settings import TRACKING_IMAGE
def view_newsletter_tracking(request, slug, uidb36, token, format):
"""Track the opening of the newsletter by requesting a blank img"""
newsletter = get_object_or_404(Newsletter, slug=slug)
contact = untokenize(uidb36, token)
params = dict(newsletter=newsletter,
contact=contact,
status=ContactMailingStatus.OPENED)
if newsletter.ab_testing:
try:
ab_state = ContactMailingStatus.objects.filter(
newsletter=newsletter,
contact=contact,
status__in=(ContactMailingStatus.SENT_TEST, ContactMailingStatus.SENT),
).order_by('-creation_date')[0].ab
params.update({'ab': ab_state})
except:
pass
ContactMailingStatus.objects.create(**params)
return HttpResponse(base64.b64decode(TRACKING_IMAGE),
mimetype='image/%s' % format)
def view_newsletter_tracking_link(request, slug, uidb36, token, link_id):
"""Track the opening of a link on the website"""
newsletter = get_object_or_404(Newsletter, slug=slug)
contact = untokenize(uidb36, token)
link = get_object_or_404(Link, pk=link_id)
params = dict(newsletter=newsletter,
contact=contact,
status=ContactMailingStatus.LINK_OPENED,
link=link)
if newsletter.ab_testing:
try:
ab_state = ContactMailingStatus.objects.filter(
newsletter=newsletter,
contact=contact,
status__in=(ContactMailingStatus.SENT_TEST, ContactMailingStatus.SENT),
).order_by('-creation_date')[0].ab
params.update({'ab': ab_state})
except:
pass
ContactMailingStatus.objects.create(**params)
if not USE_UTM_TAGS:
return HttpResponseRedirect(link.url)
url_parts = urlparse(link.url)
query_dict = parse_qs(url_parts.query)
query_dict.update({'utm_source': 'Expomap',
'utm_medium': 'email',
'utm_campaign': str(newsletter.sending_date.date())})
url = urlunparse((url_parts.scheme, url_parts.netloc, url_parts.path,
url_parts.params, urlencode(query_dict, True), url_parts.fragment))
return HttpResponseRedirect(url)
@login_required
def view_newsletter_historic(request, slug):
"""Display the historic of a newsletter"""
opts = Newsletter._meta
newsletter = get_object_or_404(Newsletter, slug=slug)
context = {'title': _('Historic of %s') % newsletter.__unicode__(),
'original': newsletter,
'opts': opts,
'object_id': newsletter.pk,
'app_label': opts.app_label}
return render_to_response('newsletter/newsletter_historic.html',
context, context_instance=RequestContext(request))