]> git.0d.be Git - django-panik-newsletter.git/blobdiff - newsletter/models.py
add support for subscribing to mailman3
[django-panik-newsletter.git] / newsletter / models.py
index 9d9f4d578e456c4c2217e1dccdd22ee32c46a5d5..d24d36ad1a9f90df5947c0595c238a2813df374b 100644 (file)
@@ -7,6 +7,7 @@ from email.mime.multipart import MIMEMultipart
 from email.mime.text import MIMEText
 
 import html2text
+import mechanize
 import requests
 from ckeditor.fields import RichTextField
 from django.conf import settings
@@ -58,14 +59,14 @@ class Subscriber(models.Model):
         newsletter_service = getattr(settings, 'NEWSLETTER_SERVICE', 'mailman')
         if newsletter_service == 'mailman':
             return self.subscribe_in_mailman()
+        elif newsletter_service == 'mailman3':
+            return self.subscribe_in_mailman3()
         elif newsletter_service == 'mailchimp':
             return self.subscribe_in_mailchimp()
 
     def subscribe_in_mailman(self):
         try:
-            subprocess.run(
-                ['listadmin', '--add-member', self.email, settings.NEWSLETTER_NAME], check_call=True
-            )
+            subprocess.run(['listadmin', '--add-member', self.email, settings.NEWSLETTER_NAME], check=True)
         except subprocess.CalledProcessError:
             # maybe an error because email is already registered?
             result = subprocess.run(
@@ -78,6 +79,27 @@ class Subscriber(models.Model):
         self.is_registered = True
         self.save()
 
+    def subscribe_in_mailman3(self):
+        # emulate browser to login and subscribe user
+        br = mechanize.Browser()
+        br.open(settings.NEWSLETTER_MAILMAN3_LIST_URL)
+        br.follow_link(url_regex=re.compile('/accounts/login'))
+        br.select_form(action=lambda x: '/login/' in x)
+        br['login'] = settings.NEWSLETTER_MAILMAN3_LOGIN
+        br['password'] = settings.NEWSLETTER_MAILMAN3_PASSWORD
+        response = br.submit()
+        assert br.find_link(url_regex=re.compile('/accounts/logout'))
+        br.open(settings.NEWSLETTER_MAILMAN3_LIST_URL + 'mass_subscribe/')
+        br.select_form(action=lambda x: '/mass_subscribe/' in x)
+        br['emails'] = self.email
+        br['pre_confirmed'] = ['on']
+        br['pre_approved'] = ['on']
+        br['pre_verified'] = ['on']
+        br['send_welcome_message'] = ['False']
+        response = br.submit()
+        self.is_registered = True
+        self.save()
+
     def subscribe_in_mailchimp(self):
         dc = settings.MAILCHIMP_DC
         apikey = settings.MAILCHIMP_APIKEY