diff --git a/modoboa/core/extensions.py b/modoboa/core/extensions.py index 6ff68c88a..03997c150 100644 --- a/modoboa/core/extensions.py +++ b/modoboa/core/extensions.py @@ -51,11 +51,16 @@ class ExtensionsPool(object): return self.extensions[name]["instance"] def is_extension_enabled(self, name): + """Check if an extension is enabled or not.""" from modoboa.core.models import Extension if not name in self.extensions: return False - return Extension.objects.get(name=name).enabled + try: + state = Extension.objects.get(name=name).enabled + except Extension.DoesNotExist: + state = False + return state def get_extension_infos(self, name): instance = self.get_extension(name) diff --git a/modoboa/core/management/commands/manage_extensions.py b/modoboa/core/management/commands/manage_extensions.py index 289f4c638..0806d5ba0 100644 --- a/modoboa/core/management/commands/manage_extensions.py +++ b/modoboa/core/management/commands/manage_extensions.py @@ -25,14 +25,20 @@ class Command(BaseCommand): def _change_extension_state(self, name, options): """Change the state of an extension.""" - extension, created = Extension.objects.get_or_create(name=name) newstate = options["action"] == "enable" - if extension.enabled == newstate: - return - if newstate: - extension.on() + update_db = True + try: + extension = Extension.objects.get(name=name) + except Extension.DoesNotExist: + extension = Extension.objects.create(name=name, enabled=newstate) + update_db = False else: - extension.off() + if extension.enabled == newstate: + return + if newstate: + extension.on(update_db) + else: + extension.off(update_db) def handle(self, *args, **options): """Entry point.""" diff --git a/modoboa/core/models.py b/modoboa/core/models.py index 095d2d080..7be04bf6f 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -418,6 +418,9 @@ class ObjectAccess(models.Model): class Extension(models.Model): + + """A modoboa extension.""" + name = models.CharField(max_length=150) enabled = models.BooleanField( ugettext_lazy('enabled'), @@ -444,9 +447,11 @@ class Extension(models.Model): path = os.path.realpath(sys.modules[modname].__file__) self.extdir = os.path.dirname(path) - def on(self): - self.enabled = True - self.save() + def on(self, update_db=True): + """Activate this extension.""" + if update_db: + self.enabled = True + self.save() self.__get_ext_instance() self.instance.load() @@ -458,14 +463,16 @@ class Extension(models.Model): events.raiseEvent("ExtEnabled", self) - def off(self): + def off(self, update_db=True): + """Disable this extension.""" self.__get_ext_instance() if self.instance is None: return self.instance.destroy() - self.enabled = False - self.save() + if update_db: + self.enabled = False + self.save() if self.instance.needs_media: path = os.path.join(settings.MEDIA_ROOT, self.name) diff --git a/modoboa/extensions/postfix_relay_domains/factories.py b/modoboa/extensions/postfix_relay_domains/factories.py index c8bc6e1c5..1a0c0a5a2 100644 --- a/modoboa/extensions/postfix_relay_domains/factories.py +++ b/modoboa/extensions/postfix_relay_domains/factories.py @@ -14,6 +14,8 @@ class RelayDomainFactory(PermissionFactory): FACTORY_FOR = models.RelayDomain target_host = 'external.host.tld' + enabled = True + verify_recipients = True service = factory.SubFactory(ServiceFactory) diff --git a/tests/install_from_scratch.py b/tests/install_from_scratch.py index ef5646073..953467cc5 100644 --- a/tests/install_from_scratch.py +++ b/tests/install_from_scratch.py @@ -58,7 +58,7 @@ class DeployTest(unittest.TestCase): self.dbhost, self.projname) cmd = ( "modoboa-admin.py deploy --syncdb --collectstatic --dburl %s " - "--domain %s --extensions all %s" + "--extensions all --domain %s %s" % (dburl, 'localhost', self.projname) ) code, output = exec_cmd(cmd, cwd=self.workdir)