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.
86 lines
3.0 KiB
86 lines
3.0 KiB
from django.shortcuts import render, get_object_or_404, redirect
|
|
from django.http import HttpResponse, Http404
|
|
from django.utils import timezone
|
|
from django.contrib import messages
|
|
from .models import Subscriber, EmailLog
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def unsubscribe(request, token):
|
|
"""Handle unsubscribe requests using the unique token"""
|
|
try:
|
|
subscriber = get_object_or_404(Subscriber, unsubscribe_token=token)
|
|
|
|
if request.method == 'POST':
|
|
subscriber.is_active = False
|
|
subscriber.save()
|
|
|
|
context = {
|
|
'success': True,
|
|
'email': subscriber.email
|
|
}
|
|
return render(request, 'mailing/unsubscribe_success.html', context)
|
|
|
|
context = {
|
|
'subscriber': subscriber
|
|
}
|
|
return render(request, 'mailing/unsubscribe_confirm.html', context)
|
|
|
|
except Subscriber.DoesNotExist:
|
|
context = {
|
|
'error': True
|
|
}
|
|
return render(request, 'mailing/unsubscribe_error.html', context)
|
|
|
|
|
|
def track_email_open(request, tracking_id):
|
|
"""Track email opens using a 1x1 pixel image"""
|
|
try:
|
|
email_log = EmailLog.objects.get(tracking_id=tracking_id)
|
|
|
|
# Only record the first open
|
|
if not email_log.opened_at:
|
|
email_log.opened_at = timezone.now()
|
|
email_log.save()
|
|
|
|
# Update campaign statistics
|
|
campaign = email_log.campaign
|
|
campaign.total_opened += 1
|
|
campaign.save()
|
|
|
|
logger.info(f"Email opened: {email_log.subscriber.email} for campaign {email_log.campaign.name}")
|
|
|
|
except EmailLog.DoesNotExist:
|
|
logger.warning(f"Tracking ID not found: {tracking_id}")
|
|
|
|
# Return a 1x1 transparent pixel
|
|
pixel_data = b'\x47\x49\x46\x38\x39\x61\x01\x00\x01\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x21\xF9\x04\x01\x00\x00\x00\x00\x2C\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02\x04\x01\x00\x3B'
|
|
return HttpResponse(pixel_data, content_type='image/gif')
|
|
|
|
|
|
def track_email_click(request, tracking_id):
|
|
"""Track email clicks and redirect to the original URL"""
|
|
try:
|
|
email_log = EmailLog.objects.get(tracking_id=tracking_id)
|
|
|
|
# Only record the first click
|
|
if not email_log.clicked_at:
|
|
email_log.clicked_at = timezone.now()
|
|
email_log.save()
|
|
|
|
# Update campaign statistics
|
|
campaign = email_log.campaign
|
|
campaign.total_clicked += 1
|
|
campaign.save()
|
|
|
|
logger.info(f"Email clicked: {email_log.subscriber.email} for campaign {email_log.campaign.name}")
|
|
|
|
# Get the original URL from the query parameter
|
|
original_url = request.GET.get('url', '/')
|
|
return redirect(original_url)
|
|
|
|
except EmailLog.DoesNotExist:
|
|
logger.warning(f"Tracking ID not found: {tracking_id}")
|
|
return redirect('/') # Redirect to home if tracking fails
|
|
|