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