diff --git a/src/postorius/models.py b/src/postorius/models.py index 295cd24..cb79995 100644 --- a/src/postorius/models.py +++ b/src/postorius/models.py @@ -27,8 +27,10 @@ from django.conf import settings from django.contrib.auth.models import User from django.core.exceptions import ImproperlyConfigured -from django.core.urlresolvers import reverse from django.core.mail import send_mail +from django.db.models.signals import post_save +from django.core.urlresolvers import reverse +from django.dispatch import receiver from django.db import models from django.http import Http404 from django.template import Context @@ -41,6 +43,22 @@ logger = logging.getLogger(__name__) +@receiver(post_save, sender=User) +def create_mailman_user(sender, **kwargs): + if kwargs.get('created'): + autocreate = False + try: + autocreate = settings.AUTOCREATE_MAILMAN_USER + except AttributeError: + pass + if autocreate: + user = kwargs.get('instance') + client = get_client() + try: + client.create_user(user.email, None, None) + except HTTPError: + pass + class MailmanApiError(Exception): """Raised if the API is not available. """ diff --git a/src/postorius/tests/mailman_api_tests/test_list_summary.py b/src/postorius/tests/mailman_api_tests/test_list_summary.py index 1bf20d8..2529585 100644 --- a/src/postorius/tests/mailman_api_tests/test_list_summary.py +++ b/src/postorius/tests/mailman_api_tests/test_list_summary.py @@ -18,6 +18,7 @@ from django.contrib.auth.models import User from django.core.urlresolvers import reverse +from django.db import IntegrityError from django.test import Client, SimpleTestCase from django.test.utils import override_settings from urllib2 import HTTPError @@ -53,11 +54,18 @@ except HTTPError: domain = self.mmclient.get_domain('example.com') self.foo_list = domain.create_list('foo') + try: + User.objects.create_user('testuser', 'test@example.com', 'testpass') + except IntegrityError: + pass @MM_VCR.use_cassette('test_list_summary.yaml') def tearDown(self): - for mlist in get_client().lists: + for mlist in self.mmclient.lists: mlist.delete() + for user in self.mmclient.users: + user.delete() + User.objects.all().delete() @MM_VCR.use_cassette('test_list_summary.yaml') def test_list_summary_logged_out(self): @@ -73,7 +81,6 @@ @MM_VCR.use_cassette('test_list_summary.yaml') def test_list_summary_logged_in(self): # Response must contain list obj and the form. - User.objects.create_user('testuser', 'test@example.com', 'testpass') self.client.login(username='testuser', password='testpass') response = self.client.get(reverse('list_summary', args=('foo@example.com', ))) @@ -83,23 +90,21 @@ @MM_VCR.use_cassette('test_list_summary.yaml') def test_list_summary_shows_all_addresses(self): - User.objects.create_user('testuser2', 'test2@example.com', 'testpass') mlist = self.mmclient.get_list('foo@example.com') - mlist.subscribe('test2@example.com') - user = self.mmclient.get_user('test2@example.com') + mlist.subscribe('test@example.com') + user = self.mmclient.get_user('test@example.com') user.add_address('anotheremail@example.com') - self.client.login(username='testuser2', password='testpass') + self.client.login(username='testuser', password='testpass') response = self.client.get(reverse('list_summary', args=('foo@example.com', ))) self.assertEqual(response.status_code, 200) self.assertTrue('anotheremail@example.com' in response.content) - @MM_VCR.use_cassette('test_list_summary.yaml') + @MM_VCR.use_cassette('test_change_subscription.yaml') def test_change_subscription(self): mlist = self.mmclient.get_list('foo@example.com') - User.objects.create_user('testuser3', 'test3@example.com', 'testpass') - mlist.subscribe('test3@example.com') - self.client.login(username='testuser3', password='testpass') + mlist.subscribe('test@example.com') + self.client.login(username='testuser', password='testpass') response = self.client.get(reverse('list_summary', args=('foo@example.com', ))) self.assertEqual(response.status_code, 200) diff --git a/src/postorius/tests/mailman_api_tests/test_models.py b/src/postorius/tests/mailman_api_tests/test_models.py new file mode 100644 index 0000000..08d2e4e --- /dev/null +++ b/src/postorius/tests/mailman_api_tests/test_models.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2012-2015 by the Free Software Foundation, Inc. +# +# This file is part of Postorius. +# +# Postorius is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) +# any later version. +# Postorius is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along with +# Postorius. If not, see . + +import logging +from django.contrib.auth.models import User +from django.core.urlresolvers import reverse +from django.db import IntegrityError +from django.test import Client, SimpleTestCase +from django.test.utils import override_settings +from urllib2 import HTTPError + +from postorius.utils import get_client +from postorius.tests import MM_VCR + + +logger = logging.getLogger(__name__) +vcr_log = logging.getLogger('vcr') +vcr_log.setLevel(logging.WARNING) + + +API_CREDENTIALS = {'MAILMAN_API_URL': 'http://localhost:9001', + 'MAILMAN_USER': 'restadmin', + 'MAILMAN_PASS': 'restpass'} + + +@override_settings(**API_CREDENTIALS) +class ModelTest(SimpleTestCase): + """Tests for the list index page.""" + + @MM_VCR.use_cassette('test_model.yaml') + def setUp(self): + self.client = Client() + self.mmclient = get_client() + try: + self.domain = get_client().create_domain('example.com') + except HTTPError: + self.domain = get_client().get_domain('example.com') + self.foo_list = self.domain.create_list('foo') + + @MM_VCR.use_cassette('test_model.yaml') + def tearDown(self): + for mlist in self.mmclient.lists: + mlist.delete() + for user in self.mmclient.users: + user.delete() + User.objects.all().delete() + + @MM_VCR.use_cassette('test_model.yaml') + def test_mailman_user_not_created_when_flag_is_off(self): + with self.settings(AUTOCREATE_MAILMAN_USER=False): + User.objects.create_user('testuser', 'test@example.com', 'testpass') + with self.assertRaises(HTTPError): + self.mmclient.get_user('test@example.com') + + @MM_VCR.use_cassette('test_model.yaml') + def test_mailman_user_created_when_flag_is_on(self): + with self.settings(AUTOCREATE_MAILMAN_USER=True): + User.objects.create_user('testuser', 'test@example.com', 'testpass') + user = self.mmclient.get_user('test@example.com') + self.assertEqual(str(user.addresses[0]), 'test@example.com')