]> git.0d.be Git - django-panik-newsletter.git/blob - newsletter/views.py
c3e90583a006b3eb04598bc60b284df78433ce4d
[django-panik-newsletter.git] / newsletter / views.py
1 # -*- coding: utf8 -*-
2
3 import hashlib
4 import random
5 import socket
6 import urllib
7 import urllib2
8 import cookielib
9
10 from smtplib import SMTPException 
11
12 from django.db import models, IntegrityError
13 from django.conf import settings
14
15 from django.shortcuts import render
16 from django.utils.translation import ugettext as _
17
18 from .forms import SubscriptionForm
19 from .models import Subscriber 
20
21
22 def subscription(request) :
23     INTEGRITY_ERROR = _("You're already registered at our newsletter.")
24     SOCKET_ERROR = _("Connexion error. Try later.")
25     SMTP_ERROR = _("Error to sending email.")
26     REVALIDATION_ERROR = _("You've already receipt a confirmation email.")
27     
28     if request.method == 'POST' :
29         form = SubscriptionForm(request.POST)
30         custom_errors = []
31         if form.is_valid() :
32             cd = form.cleaned_data
33             # Va aussi servir pour le lien de validation.
34             passwd = hashlib.sha1(str(random.random())).hexdigest()
35             
36             subscriber = Subscriber(email=cd['email'], password=passwd, is_validated=None, is_registered=False)
37             is_sent=False
38             try :
39                 subscriber.save(request)
40                 is_sent=True
41             except IntegrityError :
42                 custom_errors.append(INTEGRITY_ERROR)
43                 if(Subscriber.objects.get(email=subscriber.email).is_validated != False) :
44                     custom_errors.append(REVALIDATION_ERROR)
45             except socket.error :
46                 custom_errors.append(SOCKET_ERROR)
47             except SMTPException :
48                 custom_errors.append(SMTP_ERROR)
49
50             return render(request, 'subscription_form.html', {'form' : form, 'custom_errors' : custom_errors, 'is_sent' : is_sent})
51         else :
52             return render(request, 'subscription_form.html', {'form' : form})
53     else :
54         form = SubscriptionForm()
55         return render(request, "subscription_form.html", {'form' : form})
56
57
58
59 def unsubscription(request) :
60     UNSUBSCRIPTION_MESSAGE = _("Enter your email for unsunscribe to the newsletter.")
61     UNSUBSCRIPTION_CONFIRMATION_MESSAGE = _("You're now unsubscribed")
62
63     if request.method == 'GET' :
64         form = SubscriptionForm()
65         return render(request, 'unsubscription_form.html', {'form' : form, 'message' : UNSUBSCRIPTION_MESSAGE})
66     elif request.method == 'POST' :
67         form = SubscriptionForm(request.POST)
68         if form.is_valid() :
69             cd = form.cleaned_data
70             try :
71                 subscriber = Subscriber.objects.get(email = cd['email'])
72                 
73                 cookie_jar = cookielib.CookieJar()
74                 url_opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar))
75
76                 login_params = urllib.urlencode({'email' : subscriber.email, 'password' : subscriber.password})
77                 login_request = urllib2.Request(settings.NEWSLETTER_UNSUBSCRIPTION_URL, login_params)
78                 url = url_opener.open(login_request)
79                 
80                 unsubscribe_action_url = ("%s/%s" % (settings.NEWSLETTER_UNSUBSCRIPTION_URL, subscriber.email))
81                 unsubscribe_params = urllib.urlencode({'unsub' : 'Résilier', 'unsubconfirm' : '1'})
82                 unsubscribe_request = urllib2.Request(unsubscribe_action_url, unsubscribe_params)
83                 url = url_opener.open(unsubscribe_request)
84
85                 url.close()
86
87                 subscriber.delete()
88                 return render(request, 'unsubscription_form.html', {'message' : UNSUBSCRIPTION_CONFIRMATION_MESSAGE})
89             except Subscriber.DoesNotExist :
90                 error_message = _("The entered email address does not exist. Please try another one.")
91                 return render(request, 'unsubscription_form.html', {'form' : form, 'message' : error_message})
92
93
94         
95
96
97
98 def registration(request, validation_value) :
99     error_message = ''
100     registration_message = ''
101     try :
102         subscriber = Subscriber.objects.get(password = validation_value)
103         subscriber.is_validated = True
104
105         if subscriber.is_registered is False  :
106             params = urllib.urlencode({'email' : subscriber.email, 'fullname' : '', 'pw' : subscriber.password, 'pw-conf' : subscriber.password, 'digest' : '0'})
107             response = urllib.urlopen(settings.NEWSLETTER_SUBSCRIPTION_URL, params)
108             if  response.getcode() == 200 :
109                 subscriber.is_registered = True
110                 registration_message = _("You subscribed to our newsletter.")
111             else :
112                 subscriber.is_registered = None # TODO : rajouter une méthode niveau table pour gérer les enregistrements qui échouent (pareil pour la souscription proprement dite).
113             response.close()
114         elif subscriber.is_registered :
115             error_message = _('You already subscribed to our newsletter.')
116         else :
117             error_message = _('Your subscription is pending.')
118
119         subscriber.save()
120         
121         return render(request, 'registration.html', {'user_exist' : True, 'error_message' : error_message, 'registration_message' : registration_message })
122
123     except Subscriber.DoesNotExist :
124         error_message = _('Forbidden page.')
125         return render(request, 'registration.html', {'user_exist' : False, 'error_message' : error_message})
126         
127     
128
129