contacts: Add field to represent the mailout the unsubscribe came from
This commit is contained in:
parent
9c01770b3c
commit
495f841d39
4 changed files with 37 additions and 6 deletions
|
@ -5,4 +5,5 @@ from .models import Unsubscription
|
||||||
|
|
||||||
@admin.register(Unsubscription)
|
@admin.register(Unsubscription)
|
||||||
class UnsubscriptionAdmin(admin.ModelAdmin):
|
class UnsubscriptionAdmin(admin.ModelAdmin):
|
||||||
list_display = ['created', 'email']
|
list_display = ['created', 'email', 'mailout']
|
||||||
|
search_fields = ['email', 'mailout']
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Generated by Django 4.2.11 on 2024-04-10 02:02
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('contacts', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='unsubscription',
|
||||||
|
name='mailout',
|
||||||
|
field=models.SlugField(default=''),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
|
@ -4,6 +4,7 @@ from django.db import models
|
||||||
class Unsubscription(models.Model):
|
class Unsubscription(models.Model):
|
||||||
created = models.DateTimeField(auto_now_add=True, blank=True)
|
created = models.DateTimeField(auto_now_add=True, blank=True)
|
||||||
email = models.EmailField()
|
email = models.EmailField()
|
||||||
|
mailout = models.SlugField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ['created']
|
ordering = ['created']
|
||||||
|
|
|
@ -11,17 +11,27 @@ logger = logging.getLogger(__name__)
|
||||||
class UnsubscribeForm(ModelForm):
|
class UnsubscribeForm(ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Unsubscription
|
model = Unsubscription
|
||||||
fields = ['email']
|
fields = ['email', 'mailout']
|
||||||
|
|
||||||
|
|
||||||
# Exempt from CSRF protection so that it can be triggered by Gmail's on-click
|
@csrf_exempt # Submitted directly by Gmail and similar - no CSRF token.
|
||||||
# unsubscribe.
|
|
||||||
@csrf_exempt
|
|
||||||
def unsubscribe(request):
|
def unsubscribe(request):
|
||||||
|
"""Endpoint for use with Gmail one-click unsubscribe or similar.
|
||||||
|
|
||||||
|
Gmail now requires "List-Unsubscribe" headers for senders over a certain
|
||||||
|
monthly volume (currently 5000 emails). Add the following headers to your
|
||||||
|
mailout:
|
||||||
|
|
||||||
|
List-Unsubscribe: <https://sfconservancy.org/contacts/unsubscribe/?email=foo@bar.com&mailout=jan2024-news>
|
||||||
|
List-Unsubscribe-Post: List-Unsubscribe=One-Click
|
||||||
|
|
||||||
|
Interfaces like Gmail will then provide a user interface to unsubscribe
|
||||||
|
which will hit this endpoint.
|
||||||
|
"""
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
logger.debug('Unsubscribe GET: %s', request.GET)
|
logger.debug('Unsubscribe GET: %s', request.GET)
|
||||||
logger.debug('Unsubscribe POST: %s', request.POST)
|
logger.debug('Unsubscribe POST: %s', request.POST)
|
||||||
form = UnsubscribeForm(request.GET | request.POST)
|
form = UnsubscribeForm(request.GET)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
form.save()
|
form.save()
|
||||||
logger.info('Unsubscribed %s', form.cleaned_data['email'])
|
logger.info('Unsubscribed %s', form.cleaned_data['email'])
|
||||||
|
|
Loading…
Reference in a new issue