diff --git a/modoboa/relaydomains/factories.py b/modoboa/relaydomains/factories.py index b6626d4d8..ad5182e23 100644 --- a/modoboa/relaydomains/factories.py +++ b/modoboa/relaydomains/factories.py @@ -28,7 +28,7 @@ class RelayDomainFactory(PermissionFactory): model = models.RelayDomain django_get_or_create = ("domain", ) - domain = factory.SubFactory(DomainFactory, type="relaydomain") target_host = "external.host.tld" + domain = factory.SubFactory(DomainFactory) verify_recipients = True service = factory.SubFactory(ServiceFactory) diff --git a/modoboa/relaydomains/forms.py b/modoboa/relaydomains/forms.py index a656011ce..7312cc329 100644 --- a/modoboa/relaydomains/forms.py +++ b/modoboa/relaydomains/forms.py @@ -45,6 +45,9 @@ class RelayDomainFormGeneral(forms.ModelForm): """Custom save method.""" domain = kwargs.get("domain") instance = super(RelayDomainFormGeneral, self).save(commit=False) + if instance.domain and instance.domain.type == "domain": + # Avoid new creation if domain type has been changed. + return None if domain: instance.domain = domain instance.save() diff --git a/modoboa/relaydomains/handlers.py b/modoboa/relaydomains/handlers.py index a9bd873c0..badc45634 100644 --- a/modoboa/relaydomains/handlers.py +++ b/modoboa/relaydomains/handlers.py @@ -41,7 +41,7 @@ def clean_domain(sender, instance, **kwargs): return has_relaydom = hasattr(instance, "relaydomain") if instance.type == "domain" and has_relaydom: - models.RelayDomain.objects.filter(domain=instance).delete() + instance.relaydomain.delete() elif instance.type == "relaydomain" and not has_relaydom: # Make sure to create a RelayDomain instance since we can't do it # at form level... diff --git a/modoboa/relaydomains/tests.py b/modoboa/relaydomains/tests.py index b815d945a..5805299cf 100644 --- a/modoboa/relaydomains/tests.py +++ b/modoboa/relaydomains/tests.py @@ -14,13 +14,13 @@ from modoboa.lib.test_utils import MapFilesTestCaseMixin from modoboa.limits import utils as limits_utils from .factories import RelayDomainFactory -from .models import RelayDomain, Service +from . import models class Operations(object): def _create_relay_domain(self, name, status=200): - srv, created = Service.objects.get_or_create(name='dummy') + srv, created = models.Service.objects.get_or_create(name='dummy') values = { "name": name, "create_dom_admin": False, "type": "relaydomain", "target_host": "external.host.tld", "service": srv.id, @@ -32,7 +32,7 @@ class Operations(object): ) def _relay_domain_alias_operation(self, optype, rdomain, name, status=200): - rdom = RelayDomain.objects.get(domain__name=rdomain) + rdom = models.RelayDomain.objects.get(domain__name=rdomain) values = { "name": rdom.domain.name, "target_host": rdom.target_host, "type": "relaydomain", "service": rdom.service.id @@ -65,6 +65,8 @@ class RelayDomainsTestCase(ModoTestCase, Operations): super(RelayDomainsTestCase, cls).setUpTestData() admin_factories.populate_database() cls.rdom = RelayDomainFactory(domain__name="relaydomain.tld") + cls.rdom.domain.type = "relaydomain" + cls.rdom.domain.save() admin_factories.DomainAliasFactory( name="relaydomainalias.tld", target=cls.rdom.domain) admin_factories.MailboxFactory( @@ -91,7 +93,7 @@ class RelayDomainsTestCase(ModoTestCase, Operations): FIXME: add a check for domain alias. """ self._create_relay_domain('relaydomain1.tld') - rdom = RelayDomain.objects.get(domain__name='relaydomain1.tld') + rdom = models.RelayDomain.objects.get(domain__name='relaydomain1.tld') self.assertEqual(rdom.target_host, 'external.host.tld') self.assertEqual(rdom.service.name, 'dummy') self.assertEqual(rdom.domain.enabled, True) @@ -138,16 +140,16 @@ class RelayDomainsTestCase(ModoTestCase, Operations): Rename 'relaydomain.tld' domain to 'relaydomain.org' """ values = { - 'name': "relaydomain.org", "target_host": self.rdom.target_host, + "name": "relaydomain.org", "target_host": self.rdom.target_host, "type": "relaydomain", "enabled": True, "service": self.rdom.service.id } self.ajax_post( - reverse('admin:domain_change', + reverse("admin:domain_change", args=[self.rdom.domain.id]), values ) - RelayDomain.objects.get(domain__name='relaydomain.org') + models.RelayDomain.objects.get(domain__name='relaydomain.org') def test_relaydomain_domain_switch(self): """Check domain <-> relaydomain transitions.""" @@ -156,12 +158,13 @@ class RelayDomainsTestCase(ModoTestCase, Operations): "name": "relaydomain.tld", "type": "domain", "enabled": True, + "target_host": self.rdom.target_host, + "service": self.rdom.service.pk } self.ajax_post( - reverse('admin:domain_change', args=[domain.pk]), values) + reverse("admin:domain_change", args=[domain.pk]), values) self.assertFalse( - RelayDomain.objects.filter( - domain__name="relaydomain.tld").exists()) + models.RelayDomain.objects.filter(domain=domain).exists()) self.assertEqual( admin_models.Domain.objects.get(name="relaydomain.tld").type, "domain") @@ -176,7 +179,7 @@ class RelayDomainsTestCase(ModoTestCase, Operations): admin_models.Domain.objects.get(name="relaydomain.tld").type, "relaydomain") self.assertTrue( - RelayDomain.objects.filter( + models.RelayDomain.objects.filter( domain__name="relaydomain.tld").exists()) def test_edit_relaydomainalias(self): @@ -205,16 +208,16 @@ class RelayDomainsTestCase(ModoTestCase, Operations): args=[self.rdom.domain.id]), {} ) - with self.assertRaises(RelayDomain.DoesNotExist): - RelayDomain.objects.get(domain__name='relaydomain.tld') + with self.assertRaises(models.RelayDomain.DoesNotExist): + models.RelayDomain.objects.get(domain__name='relaydomain.tld') def test_delete_relaydomainalias(self): """Test the removal of a relay domain alias.""" self._relay_domain_alias_operation( 'del', self.rdom.domain.name, 'relaydomainalias.tld' ) - with self.assertRaises(RelayDomain.DoesNotExist): - RelayDomain.objects.get(domain__name='relaydomainalias.tld') + with self.assertRaises(models.RelayDomain.DoesNotExist): + models.RelayDomain.objects.get(domain__name='relaydomainalias.tld') def test_alias_on_relaydomain(self): """Create an alias on a relay domain."""