]> git.0d.be Git - django-panik-newsletter.git/blob - newsletter/models.py
always pass bytes to hashlib
[django-panik-newsletter.git] / newsletter / models.py
1 # -*- coding: utf8 -*-
2
3 import datetime
4 import hashlib
5 import random
6 import smtplib
7 import subprocess
8
9 from email.mime.multipart import MIMEMultipart
10 from email.mime.text import MIMEText
11
12 import html2text
13
14 from django.db import models
15 from django.core.urlresolvers import reverse
16
17 from django.template import loader
18 from django.template.loader import render_to_string
19 from django.conf import settings
20
21 from django.utils.encoding import force_bytes
22 from django.utils.safestring import mark_safe
23 from django.utils.translation import ugettext
24 from django.utils.translation import ugettext_lazy as _
25 from django.core.mail import send_mail
26
27 from ckeditor.fields import RichTextField
28
29
30 class Subscriber(models.Model) :
31     email = models.EmailField(unique = True)   # TODO : informer si déjà inscrit ? Que faire dans ce cas.
32     inscription_date = models.DateField(auto_now_add=True)
33     is_validated = models.NullBooleanField() # Au click sur le lien de confirmation. Null si erreur à l'envoi au souscripteur.
34     is_registered = models.NullBooleanField() # À l'inscription après la confirmation Null si erreur à l'envoi à mailman.
35     password = models.CharField(max_length=100) # sha1
36     
37     def __unicode__(self) :
38         return self.email
39
40     def save(self, *args, **kwargs):
41         super(Subscriber, self).save(*args, **kwargs)
42         if self.is_validated is None:
43             self.send_confirmation_email()
44
45     def send_confirmation_email(self):
46         self.password = hashlib.sha1(force_bytes(str(random.random()))).hexdigest()
47         confirm_subject = loader.get_template('newsletter/confirmation_email_subject.txt')
48         confirm_body = loader.get_template('newsletter/confirmation_email_body.txt')
49         context = {'token': self.password}
50         send_mail(confirm_subject.render(context).strip(), confirm_body.render(context),
51                 settings.NEWSLETTER_SENDER, [self.email])
52         self.is_validated = False
53         self.save()
54
55     def subscribe_in_mailman(self):
56         t = subprocess.call(['listadmin', '--add-member', self.email, settings.NEWSLETTER_NAME])
57         if t != 0:
58             return
59         self.is_registered = True
60         self.save()
61
62
63 class Newsletter(models.Model):
64
65     class Meta:
66         verbose_name = _('Newsletter')
67         verbose_name_plural = _('Newsletters')
68         ordering = ['date']
69
70     subject = models.CharField(_('Title'), max_length=50)
71     date = models.DateField(_('Date'))
72     text = RichTextField(_('Text'), null=True, blank=True)
73
74     expedition_datetime = models.DateTimeField(_('Expedition Date/time'), null=True, blank=True)
75
76     def send(self):
77         msg = MIMEMultipart('alternative')
78         msg['Subject'] = self.subject
79         msg['From'] = settings.NEWSLETTER_SENDER
80         if settings.DEBUG:
81             msg['To'] = 'fred@localhost'
82         else:
83             msg['To'] = '%s@%s' % (settings.NEWSLETTER_NAME, settings.NEWSLETTER_DOMAIN)
84
85         h2t = html2text.HTML2Text()
86         h2t.unicode_snob = True
87         context = {
88             'text_part': mark_safe(h2t.handle(self.text)),
89             'html_part': mark_safe(self.text),
90         }
91
92         part1 = MIMEText(render_to_string('newsletter/email_body.txt', context), 'plain', _charset='utf-8')
93         part2 = MIMEText(render_to_string('newsletter/email_body.html', context), 'html', _charset='utf-8')
94
95         msg.attach(part1)
96         msg.attach(part2)
97
98         s = smtplib.SMTP('localhost')
99         s.sendmail(msg['From'], msg['To'], msg.as_string())
100         s.quit()
101
102         self.expedition_datetime = datetime.datetime.now()
103         self.save()
104
105     def get_absolute_url(self):
106         return reverse('newsletter-view', kwargs={'pk': self.id})