9 from email.mime.multipart import MIMEMultipart
10 from email.mime.text import MIMEText
14 from django.db import models
15 from django.core.urlresolvers import reverse
17 from django.template import loader
18 from django.template.loader import render_to_string
19 from django.conf import settings
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
27 from ckeditor.fields import RichTextField
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
37 def __unicode__(self) :
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()
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
55 def subscribe_in_mailman(self):
56 t = subprocess.call(['listadmin', '--add-member', self.email, settings.NEWSLETTER_NAME])
59 self.is_registered = True
63 class Newsletter(models.Model):
66 verbose_name = _('Newsletter')
67 verbose_name_plural = _('Newsletters')
70 subject = models.CharField(_('Title'), max_length=50)
71 date = models.DateField(_('Date'))
72 text = RichTextField(_('Text'), null=True, blank=True)
74 expedition_datetime = models.DateTimeField(_('Expedition Date/time'), null=True, blank=True)
77 msg = MIMEMultipart('alternative')
78 msg['Subject'] = self.subject
79 msg['From'] = settings.NEWSLETTER_SENDER
81 msg['To'] = 'fred@localhost'
83 msg['To'] = '%s@%s' % (settings.NEWSLETTER_NAME, settings.NEWSLETTER_DOMAIN)
85 h2t = html2text.HTML2Text()
86 h2t.unicode_snob = True
88 'text_part': mark_safe(h2t.handle(self.text)),
89 'html_part': mark_safe(self.text),
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')
98 s = smtplib.SMTP('localhost')
99 s.sendmail(msg['From'], msg['To'], msg.as_string())
102 self.expedition_datetime = datetime.datetime.now()
105 def get_absolute_url(self):
106 return reverse('newsletter-view', kwargs={'pk': self.id})