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