diff --git a/modoboa/relaydomains/forms.py b/modoboa/relaydomains/forms.py index 87c728d62..0e5d4b2b1 100644 --- a/modoboa/relaydomains/forms.py +++ b/modoboa/relaydomains/forms.py @@ -4,12 +4,37 @@ from __future__ import unicode_literals +from django.db.models.signals import pre_save, post_save + from modoboa.lib.form_utils import WizardStep from modoboa.transport import forms as tr_forms, models as tr_models -class RelayDomainWizardStep(WizardStep): +class DisableSignals(object): + """Context manager to disable signals.""" + def __init__(self): + self.stashed_signals = {} + self.disabled_signals = [pre_save, post_save] + + def __enter__(self): + for signal in self.disabled_signals: + self.disconnect(signal) + + def __exit__(self, exc_type, exc_val, exc_tb): + for signal in self.stashed_signals.keys(): + self.reconnect(signal) + + def disconnect(self, signal): + self.stashed_signals[signal] = signal.receivers + signal.receivers = [] + + def reconnect(self, signal): + signal.receivers = self.stashed_signals.get(signal, []) + del self.stashed_signals[signal] + + +class RelayDomainWizardStep(WizardStep): """A custom wizard step.""" def check_access(self, wizard): @@ -39,5 +64,6 @@ class RelayDomainFormGeneral(tr_forms.TransportForm): instance.save() if not domain.transport: domain.transport = instance - domain.save(update_fields=["transport"]) + with DisableSignals(): + domain.save(update_fields=["transport"]) return instance