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