]> git.0d.be Git - django-panik-newsletter.git/blob - newsletter/views.py
add support for django 1.11
[django-panik-newsletter.git] / newsletter / views.py
1 # -*- coding: utf8 -*-
2
3 import email
4 import hashlib
5 import random
6 import socket
7 import urllib
8 import urllib2
9 import cookielib
10 import datetime
11
12 from django.conf import settings
13 from django.core.exceptions import PermissionDenied
14 from django.core.urlresolvers import reverse_lazy
15 from django.db import models, IntegrityError
16 from django.http import JsonResponse
17 from django.shortcuts import get_object_or_404
18 from django.utils.translation import ugettext as _
19
20 from django.views.generic.base import TemplateView, RedirectView
21 from django.views.generic.detail import DetailView
22 from django.views.generic.list import ListView
23 from django.views.generic.edit import CreateView, UpdateView
24 from django.views.decorators.csrf import csrf_exempt
25
26 from .forms import SubscribeForm, NewsletterForm
27 from .models import Subscriber, Newsletter
28
29
30 class SubscribeView(CreateView):
31     form_class = SubscribeForm
32     model = Subscriber
33
34     success_url = 'thanks'
35 subscribe = csrf_exempt(SubscribeView.as_view())
36
37
38 class ThanksView(TemplateView):
39     template_name = 'newsletter/thanks.html'
40 thanks = ThanksView.as_view()
41
42
43 class ConfirmationView(TemplateView):
44     template_name = 'newsletter/done.html'
45
46     def get_context_data(self, token, **kwargs):
47         context = super(ConfirmationView, self).get_context_data(**kwargs)
48         subscriber = get_object_or_404(Subscriber, password=token, is_validated=False)
49         subscriber.is_validated = True
50         subscriber.save()
51         return context
52 confirmation = ConfirmationView.as_view()
53
54
55 def unsubscription(request) :
56     UNSUBSCRIPTION_MESSAGE = _("Enter your email for unsunscribe to the newsletter.")
57     UNSUBSCRIPTION_CONFIRMATION_MESSAGE = _("You're now unsubscribed")
58
59     if request.method == 'GET' :
60         form = SubscriptionForm()
61         return render(request, 'unsubscription_form.html', {'form' : form, 'message' : UNSUBSCRIPTION_MESSAGE})
62     elif request.method == 'POST' :
63         form = SubscriptionForm(request.POST)
64         if form.is_valid() :
65             cd = form.cleaned_data
66             try :
67                 subscriber = Subscriber.objects.get(email = cd['email'])
68                 
69                 cookie_jar = cookielib.CookieJar()
70                 url_opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar))
71
72                 login_params = urllib.urlencode({'email' : subscriber.email, 'password' : subscriber.password})
73                 login_request = urllib2.Request(settings.NEWSLETTER_UNSUBSCRIPTION_URL, login_params)
74                 url = url_opener.open(login_request)
75                 
76                 unsubscribe_action_url = ("%s/%s" % (settings.NEWSLETTER_UNSUBSCRIPTION_URL, subscriber.email))
77                 unsubscribe_params = urllib.urlencode({'unsub' : 'RĂ©silier', 'unsubconfirm' : '1'})
78                 unsubscribe_request = urllib2.Request(unsubscribe_action_url, unsubscribe_params)
79                 url = url_opener.open(unsubscribe_request)
80
81                 url.close()
82
83                 subscriber.delete()
84                 return render(request, 'unsubscription_form.html', {'message' : UNSUBSCRIPTION_CONFIRMATION_MESSAGE})
85             except Subscriber.DoesNotExist :
86                 error_message = _("The entered email address does not exist. Please try another one.")
87                 return render(request, 'unsubscription_form.html', {'form' : form, 'message' : error_message})
88
89
90 class NewsletterCreateView(CreateView):
91     form_class = NewsletterForm
92     model = Newsletter
93
94     success_url = reverse_lazy('newsletter-list')
95
96     def get_form(self, *args, **kwargs):
97         if not self.request.user.has_perm('newsletter.add_newsletter'):
98             raise PermissionDenied()
99         return super(NewsletterCreateView, self).get_form(*args, **kwargs)
100
101     def get_initial(self):
102         initial = super(NewsletterCreateView, self).get_initial()
103         initial['date'] = datetime.datetime.today()
104         return initial
105
106 newsletter_create = NewsletterCreateView.as_view()
107
108
109 class NewsletterListView(ListView):
110     model = Newsletter
111
112 newsletter_list = NewsletterListView.as_view()
113
114
115 class NewsletterDetailView(DetailView):
116     model = Newsletter
117
118 newsletter_view = NewsletterDetailView.as_view()
119
120 class NewsletterUpdateView(UpdateView):
121     form_class = NewsletterForm
122     model = Newsletter
123
124     def get_form(self, *args, **kwargs):
125         if not self.request.user.has_perm('newsletter.add_newsletter'):
126             raise PermissionDenied()
127         return super(NewsletterUpdateView, self).get_form(*args, **kwargs)
128
129 newsletter_update = NewsletterUpdateView.as_view()
130
131
132 class NewsletterSendView(RedirectView):
133     permanent = False
134     def get_redirect_url(self, pk):
135         if not self.request.user.has_perm('newsletter.add_newsletter'):
136             raise PermissionDenied()
137
138         newsletter = get_object_or_404(Newsletter, pk=pk)
139         newsletter.send()
140         return reverse_lazy('newsletter-list')
141
142 newsletter_send = NewsletterSendView.as_view()
143
144 @csrf_exempt
145 def stats(request) :
146     return JsonResponse({'registered': Subscriber.objects.filter(is_registered=True).count()})