From 88097e56fe1b31ae9322871316a00fa3b3258f96 Mon Sep 17 00:00:00 2001 From: jean-philippe Date: Mon, 8 Jul 2013 14:37:07 +0200 Subject: [PATCH] modification de la gestion de la souscritpion --- __init__.py | 0 admin.py | 6 +++++ forms.py | 6 +++++ models.py | 40 ++++++++++++++++++++++++++++++ templates/subscription_form.html | 23 +++++++++++++++++ tests.py | 16 ++++++++++++ urls.py | 8 ++++++ views.py | 42 ++++++++++++++++++++++++++++++++ 8 files changed, 141 insertions(+) create mode 100644 __init__.py create mode 100644 admin.py create mode 100644 forms.py create mode 100644 models.py create mode 100644 templates/subscription_form.html create mode 100644 tests.py create mode 100644 urls.py create mode 100644 views.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/admin.py b/admin.py new file mode 100644 index 0000000..b5b7410 --- /dev/null +++ b/admin.py @@ -0,0 +1,6 @@ +# -*- coding: utf8 -*- + +from django.contrib import admin +from .models import Subscriber + +admin.site.register(Subscriber) diff --git a/forms.py b/forms.py new file mode 100644 index 0000000..0e39bde --- /dev/null +++ b/forms.py @@ -0,0 +1,6 @@ +# *-* coding: utf8 -*- + +from django import forms + +class SubscriptionForm(forms.Form): + email = forms.EmailField() diff --git a/models.py b/models.py new file mode 100644 index 0000000..47e3943 --- /dev/null +++ b/models.py @@ -0,0 +1,40 @@ +# -*- coding: utf8 -*- + +from smtplib import SMTPException +import socket + +from django.db import models +from django.core.mail import send_mail + + +class Subscriber(models.Model) : + email = models.EmailField(unique = True) # TODO : informer si déjà inscrit ? Que faire dans ce cas. + inscription_date = models.DateField(auto_now_add=True) + is_validated = models.NullBooleanField() # Au click sur le lien de confirmation. Null si erreur à l'envoi au souscripteur. + is_registered = models.NullBooleanField() # À l'inscription après la confirmation Null si erreur à l'envoi à mailman. + password = models.CharField(max_length=100) # sh1 + def __unicode__(self) : + return self.email + + + def save(self, *args, **kwargs): + super(Subscriber, self).save(*args, **kwargs) + self.send_confirmation_email() + + def send_confirmation_email(self): + subject = 'confirmation de votre inscription' + message = 'blabla, veuillez cliquer sur le lien suivant http://127.0.0.1:8000/newsletter%s' % self.password + sender = 'no-reply@panik.org' + try : + send_mail( + subject, + message, + sender, + [self.email] + ) + except socket.error as error : + raise error + + self.is_validated=False + Subscriber.objects.filter(email=self.email).update(is_validated=False) + diff --git a/templates/subscription_form.html b/templates/subscription_form.html new file mode 100644 index 0000000..69b89bd --- /dev/null +++ b/templates/subscription_form.html @@ -0,0 +1,23 @@ + +{% block newsletter_form %} + {% if is_sent %} +

+ Vous devriez recevoir sous peu un mail de confirmation dans votre boîte mail. +

+ {% endif %} + {% if custom_errors %} +

+ {% for error in custom_errors %} + {{ error }}
+ {% endfor %} +

+ {% endif %} + +
+ + {{ form.as_table }} + + {% csrf_token %} + + +{% endblock %} diff --git a/tests.py b/tests.py new file mode 100644 index 0000000..501deb7 --- /dev/null +++ b/tests.py @@ -0,0 +1,16 @@ +""" +This file demonstrates writing tests using the unittest module. These will pass +when you run "manage.py test". + +Replace this with more appropriate tests for your application. +""" + +from django.test import TestCase + + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.assertEqual(1 + 1, 2) diff --git a/urls.py b/urls.py new file mode 100644 index 0000000..0f5db4e --- /dev/null +++ b/urls.py @@ -0,0 +1,8 @@ +from django.conf.urls import * + +from .views import subscription + +urlpatterns = patterns('', + url(r'^$', subscription), +) + diff --git a/views.py b/views.py new file mode 100644 index 0000000..b57351d --- /dev/null +++ b/views.py @@ -0,0 +1,42 @@ +# -*- coding: utf8 -*- + +import hashlib +import random + +import socket + +from django.db import models, IntegrityError +from django.shortcuts import render +from django.core.mail import send_mail + +from .forms import SubscriptionForm +from .models import Subscriber + +# Create your views here. + +def subscription(request) : + + if request.method == 'POST' : + form = SubscriptionForm(request.POST) + custom_errors = [] + if form.is_valid() : + cd = form.cleaned_data + # Va aussi servir pour le lien de validation. + passwd = hashlib.sha1(str(random.random())).hexdigest() + + subscriber = Subscriber(email=cd['email'], password=passwd, is_validated=None, is_registered=False) + try : + subscriber.save() + except IntegrityError, validation_error : + custom_errors.append(str(validation_error)) + except socket.error: + custom_errors.append("Connexion impossible pour l'instant") + + return render(request, 'subscription_form.html', {'form' : form, 'custom_errors' : custom_errors}) + else : + return render(request, 'subscription_form.html', {'form' : form}) + else : + form = SubscriptionForm() + return render(request, "subscription_form.html", {'form' : form}) + + -- 2.39.2