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.
 
 
 
 
padelclub_backend/mailing/views.py

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