6 from email.mime.multipart import MIMEMultipart
7 from email.mime.text import MIMEText
11 from ckeditor.fields import RichTextField
12 from django.conf import settings
13 from django.core.mail import send_mail
14 from django.db import IntegrityError, models
15 from django.template import loader
16 from django.template.loader import render_to_string
17 from django.urls import reverse
18 from django.utils.encoding import force_bytes
19 from django.utils.safestring import mark_safe
20 from django.utils.translation import ugettext
21 from django.utils.translation import ugettext_lazy as _
24 class Subscriber(models.Model):
25 email = models.EmailField(unique=False)
26 inscription_date = models.DateTimeField(auto_now_add=True)
27 is_validated = models.NullBooleanField()
28 is_registered = models.NullBooleanField()
29 password = models.CharField(max_length=100)
30 bot_check1 = models.BooleanField(default=False)
31 bot_check2 = models.BooleanField(default=False)
32 user_agent = models.CharField(max_length=1000, blank=True)
33 source_ip = models.CharField(max_length=100, blank=True)
35 def __unicode__(self):
38 def is_from_bot(self):
39 return bool(self.bot_check1 or self.bot_check2)
41 def send_confirmation_email(self):
42 if self.is_from_bot():
44 self.password = hashlib.sha1(force_bytes(str(random.random()))).hexdigest()
45 confirm_subject = loader.get_template('newsletter/confirmation_email_subject.txt')
46 confirm_body = loader.get_template('newsletter/confirmation_email_body.txt')
47 context = {'token': self.password}
49 confirm_subject.render(context).strip(),
50 confirm_body.render(context),
51 settings.NEWSLETTER_SENDER,
54 self.is_validated = False
58 newsletter_service = getattr(settings, 'NEWSLETTER_SERVICE', 'mailman')
59 if newsletter_service == 'mailman':
60 return self.subscribe_in_mailman()
61 elif newsletter_service == 'mailchimp':
62 return self.subscribe_in_mailchimp()
64 def subscribe_in_mailman(self):
65 t = subprocess.call(['listadmin', '--add-member', self.email, settings.NEWSLETTER_NAME])
68 self.is_registered = True
71 def subscribe_in_mailchimp(self):
72 dc = settings.MAILCHIMP_DC
73 apikey = settings.MAILCHIMP_APIKEY
74 list_id = settings.MAILCHIMP_LIST_ID
75 self.email = self.email.lower()
77 email_hash = hashlib.md5(self.email.encode()).hexdigest()
80 f'https://{dc}.api.mailchimp.com/3.0/lists/{list_id}/members/{email_hash}',
83 'email_address': self.email,
84 'status_if_new': 'subscribed',
87 if resp.ok and resp.json().get('status') == 'subscribed':
88 self.is_registered = True
92 class Newsletter(models.Model):
94 verbose_name = _('Newsletter')
95 verbose_name_plural = _('Newsletters')
98 subject = models.CharField(_('Title'), max_length=50)
99 date = models.DateField(_('Date'))
100 text = RichTextField(_('Text'), null=True, blank=True)
102 expedition_datetime = models.DateTimeField(_('Expedition Date/time'), null=True, blank=True)
105 msg = MIMEMultipart('alternative')
106 msg['Subject'] = self.subject
107 msg['From'] = settings.NEWSLETTER_SENDER
108 msg['To'] = '%s@%s' % (settings.NEWSLETTER_NAME, settings.NEWSLETTER_DOMAIN)
110 h2t = html2text.HTML2Text()
111 h2t.unicode_snob = True
113 'text_part': mark_safe(h2t.handle(self.text)),
114 'html_part': mark_safe(self.text),
117 part1 = MIMEText(render_to_string('newsletter/email_body.txt', context), 'plain', _charset='utf-8')
118 part2 = MIMEText(render_to_string('newsletter/email_body.html', context), 'html', _charset='utf-8')
123 s = smtplib.SMTP('localhost')
124 s.sendmail(msg['From'], msg['To'], msg.as_string())
127 self.expedition_datetime = datetime.datetime.now()
130 def get_absolute_url(self):
131 return reverse('newsletter-view', kwargs={'pk': self.id})