Merge pull request #27 from Schlabonski/unsubscribe

Add unsubscribe system
v1-0-stable
Christian Merten 9 years ago committed by GitHub
commit 1c998f2ddf

@ -28,4 +28,5 @@ urlpatterns += i18n_patterns(
)
# TODO: django serving from MEDIA_URL should be disabled in production stage
# see http://stackoverflow.com/questions/5871730/need-a-minimal-django-file-upload-example
# see
# http://stackoverflow.com/questions/5871730/need-a-minimal-django-file-upload-example

@ -0,0 +1,33 @@
from django.core.mail import send_mass_mail, send_mail
def send(subject, content, sender, recipicient):
send_mail(subject, content, sender, [recipicient])
def send_mass(subject, content, sender, recipicients):
data = [
(subject, content, sender, [recipicient])
for recipicient in recipicients]
print("sending data", data)
send_mass_mail(data)
def get_content(content):
# TODO: generate right url here
url = "localhost:8000/newsletter/unsubscribe"
text = "{}\n\nDiese Email wurde über die Webseite der JDAV Ludwigsburg"\
" verschickt. Wenn du in Zukunft keine Emails mehr erhalten möchtest,"\
" kannst du hier den Newsletter deabonnieren.\n\n{}"\
.format(content, url)
return text
def get_unsubscribe_link(member):
key = member.generate_key()
print("generating key for", member, key)
# TODO: generate right url here
return "localhost:8000/newsletter/unsubscribe?key={}".format(key)
mail_root = "christian@localhost"

@ -1,6 +1,6 @@
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.core.mail import send_mass_mail
from .mailutils import send_mass, get_content
# Create your models here.
@ -29,11 +29,8 @@ class Message(models.Model):
if not member.gets_newsletter:
continue
members.add(member)
data = [
(self.subject, self.content, self.from_addr, [member.email])
for member in members
]
send_mass_mail(data)
send_mass(self.subject, get_content(self.content),
self.from_addr, [member.email for member in members])
self.sent = True
self.save()

@ -0,0 +1,3 @@
{% load i18n %}
<p>{% trans "Sent confirmation mail to" %} <b>{{ email }}</b>. {% trans "Follow the link in your mail to confirm your unsubscription." %}</p>

@ -0,0 +1,21 @@
{% load i18n %}
<p><b>{% trans "Here you can unsubscribe from the newsletter" %}</b></p>
{% if error_message %}
<p><b>{{ error_message }}</b></p>
{% endif %}
<form action="" method="post">
{% csrf_token %}
<input type="hidden" name="post" value="yes">
<p>
{% trans "Email address" %}
<input type="email" name="email">
</p>
<p>
<input type="submit" value="{% trans "Unsubscribe" %}">
</p>
</form>

@ -0,0 +1,5 @@
{% load i18n %}
<p>
{% trans "Successfully unsubscribed from the newsletter for " %}<b>{{ email }}</b>
</p>

@ -5,5 +5,6 @@ from . import views
app_name = "mailer"
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^subscribe$', views.subscribe, name='subscribe'),
# url(r'^subscribe', views.subscribe, name='subscribe'),
url(r'^unsubscribe', views.unsubscribe, name='unsubscribe'),
]

@ -3,12 +3,54 @@ from django import forms
from django.utils.translation import ugettext_lazy as _
from django.urls import reverse
from django.http import HttpResponseRedirect
from .mailutils import send as send_mail, mail_root, get_unsubscribe_link
from members.models import Member
def index(request):
return HttpResponseRedirect(reverse('mailer:subscribe'))
return HttpResponseRedirect(reverse('mailer:unsubscribe'))
def render_unsubscribe(request, error_message=""):
context = {}
if error_message:
context['error_message'] = error_message
return render(request, 'mailer/unsubscribe.html', context)
def render_unsubscribed(request, email):
return render(request, 'mailer/unsubscribed.html', {'email': email})
def unsubscribe(request):
if request.method == 'GET' and 'key' in request.GET:
try:
key = request.GET['key']
member = Member.objects.get(unsubscribe_key=key)
if not member.unsubscribe(key):
raise KeyError
except (KeyError, Member.DoesNotExist):
return render_unsubscribe(request,
_("Can't verify this link. Try again!"))
else:
return render_unsubscribed(request, member.email)
elif not request.POST.get('post', False):
# just calling up unsubscribe page
return render_unsubscribe(request)
try:
email = request.POST['email']
member = Member.objects.filter(email=email).first()
if not member: # member not found
raise KeyError
except (KeyError, Member.DoesNotExist):
return render_unsubscribe(request, _("Please fill in every field"))
else:
send_mail(_("Confirmation of unsubscription"),
_("Click the link to unsubscribe to the newsletter of"
" the JDAV\n{}".format(get_unsubscribe_link(member))),
mail_root, email)
return render_confirmation_sent(request, email)
def render_subscribe(request, error_message=""):
@ -22,6 +64,10 @@ def render_subscribe(request, error_message=""):
return render(request, 'mailer/subscribe.html', context)
def render_confirmation_sent(request, email):
return render(request, 'mailer/confirmation_sent.html', {'email': email})
def subscribe(request):
try:
request.POST['post']
@ -41,7 +87,8 @@ def subscribe(request):
lastname=lastname)
if len(exists) > 0:
return render_subscribe(request,
error_message=_("Member already exists"))
error_message=_("Member "
"already exists"))
member = Member(prename=prename,
lastname=lastname,
email=email,

@ -1,6 +1,8 @@
from datetime import datetime
import uuid
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
class Group(models.Model):
@ -37,12 +39,31 @@ class Member(models.Model):
group = models.ManyToManyField(Group)
gets_newsletter = models.BooleanField(_('receives newsletter'),
default=True)
unsubscribe_key = models.CharField(max_length=32, default="")
unsubscribe_expire = models.DateTimeField(default=timezone.now)
comments = models.TextField(_('comments'), default='', blank=True)
def __str__(self):
"""String representation"""
return self.name
def generate_key(self):
self.unsubscribe_key = uuid.uuid4().hex
self.unsubscribe_expire = timezone.now() + timezone.timedelta(days=1)
self.save()
return self.unsubscribe_key
def unsubscribe(self, key):
if self.unsubscribe_key == key and timezone.now() <\
self.unsubscribe_expire:
for member in Member.objects.filter(email=self.email):
member.gets_newsletter = False
member.save()
self.unsubscribe_key, self.unsubscribe_expire = "", timezone.now()
return True
else:
return False
@property
def name(self):
"""Returning whole name (prename + lastname)"""

Loading…
Cancel
Save