diff --git a/modoboa/admin/app_settings.py b/modoboa/admin/app_settings.py index c7a0d1c3f..4418e3ffd 100644 --- a/modoboa/admin/app_settings.py +++ b/modoboa/admin/app_settings.py @@ -108,6 +108,14 @@ class AdminParametersForm(param_forms.AdminParametersForm): ) ) + create_alias_on_mbox_rename = YesNoField( + label=ugettext_lazy("Create an alias when a mailbox is renamed"), + initial=False, + help_text=ugettext_lazy( + "Create an alias using the old address when a mailbox is renamed." + ) + ) + # Visibility rules visibility_rules = { "valid_mxs": "enable_mx_checks=True", diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index 093529f32..19effd8ab 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -223,6 +223,11 @@ class AccountFormMail(forms.Form, DynamicForm): email = lib_fields.UTF8EmailField( label=ugettext_lazy("E-mail"), required=False) + create_alias_with_old_address = forms.BooleanField( + label=ugettext_lazy("Create an alias using the old address"), + required=False, + initial=False + ) quota = forms.IntegerField( label=ugettext_lazy("Quota"), required=False, @@ -277,7 +282,12 @@ class AccountFormMail(forms.Form, DynamicForm): self.fields["quota_act"].initial = self.mb.use_domain_quota if not self.mb.use_domain_quota and self.mb.quota: self.fields["quota"].initial = self.mb.quota + self.fields["create_alias_with_old_address"].initial = ( + param_tools.get_global_parameter( + "create_alias_on_mbox_rename") + ) else: + del self.fields["create_alias_with_old_address"] self.fields["quota_act"].initial = True if len(args) and isinstance(args[0], QueryDict): @@ -422,6 +432,8 @@ class AccountFormMail(forms.Form, DynamicForm): else: self.cleaned_data["use_domain_quota"] = ( self.cleaned_data["quota_act"]) + if self.cleaned_data.get("create_alias_with_old_address", False): + self.aliases.append(self.mb.full_address) self.mb.update_from_dict(user, self.cleaned_data) account.email = self.cleaned_data["email"] diff --git a/modoboa/admin/handlers.py b/modoboa/admin/handlers.py index 427990efa..41663b927 100644 --- a/modoboa/admin/handlers.py +++ b/modoboa/admin/handlers.py @@ -84,14 +84,20 @@ def manage_alias_for_mailbox(sender, instance, **kwargs): old_address = getattr(instance, "old_full_address", None) if old_address is None or old_address == instance.full_address: return + # Update old self alias alr = models.AliasRecipient.objects.get( alias__address=old_address, address=old_address, r_mailbox=instance, alias__internal=True) alr.address = instance.full_address alr.save() alr.alias.address = instance.full_address + alr.alias.domain = instance.domain alr.alias.save() + # Update AliasRecipient instances + instance.aliasrecipient_set.filter(alias__internal=False).update( + address=instance.full_address) + @receiver(signals.pre_delete, sender=models.Mailbox) def mailbox_deleted_handler(sender, **kwargs): diff --git a/modoboa/admin/static/admin/js/admin.js b/modoboa/admin/static/admin/js/admin.js index 5c33d4f1c..f3cd6cf26 100644 --- a/modoboa/admin/static/admin/js/admin.js +++ b/modoboa/admin/static/admin/js/admin.js @@ -437,13 +437,20 @@ Identities.prototype = { }, simpleuser_mode: function() { - $("#id_username").autocompleter({ + var $username = $('#id_username'); + var $email = $('#id_email'); + + $username.change(function (evt) { + $email.val($(this).val()); + $email.change(); + }); + $username.autocompleter({ from_character: "@", choices: $.proxy(this.get_domain_list, this) }); $("#id_email").addClass("disabled") .attr("readonly", "") - .autocompleter("unbind"); + .autocompleter("unbind"); this.toggle_master_user(); }, @@ -483,6 +490,18 @@ Identities.prototype = { } }, + /** + * Callback to watch for username change. + * + */ + emailChanged: function(event) { + var $target = get_target(event); + + if ($target.val() !== this.originalEmail) { + $('#id_create_alias_with_old_address').parents(".form-group").show(); + } + }, + generalform_init: function(notrigger) { $("#id_role").change($.proxy(function(e) { var $this = $(e.target); @@ -499,6 +518,7 @@ Identities.prototype = { this.togglePasswordInputs(!$this.prop('checked')); }, this)); this.toggle_master_user($("#id_role").val()); + $('#id_create_alias_with_old_address').parents('.form-group').hide(); if (notrigger !== undefined && notrigger) { return; } @@ -506,6 +526,10 @@ Identities.prototype = { }, mailform_init: function() { + var $email = $('#id_email'); + + this.originalEmail = $email.val(); + $email.change($.proxy(this.emailChanged, this)); $("#id_aliases").autocompleter({ from_character: "@", choices: $.proxy(this.get_domain_list, this) @@ -528,7 +552,7 @@ Identities.prototype = { return true; } }); - $("#id_email").autocompleter({ + $email.autocompleter({ from_character: "@", choices: $.proxy(this.get_domain_list, this) }); diff --git a/modoboa/admin/templates/admin/index.html b/modoboa/admin/templates/admin/index.html new file mode 100644 index 000000000..3f7c3e2a5 --- /dev/null +++ b/modoboa/admin/templates/admin/index.html @@ -0,0 +1,29 @@ +{% extends "fluid.html" %} + +{% load i18n lib_tags static %} +{% load render_bundle from webpack_loader %} + +{% block pagetitle %}{% trans "Admin" %}{% endblock %} + +{% block extra_css %} + {% if not debug %} + {% render_bundle 'app' 'css' 'ADMIN' %} + {% endif %} +{% endblock %} + +{% block extra_js %} + {% if not debug %} + {% render_bundle 'manifest' 'js' 'ADMIN' %} + {% render_bundle 'vendor' 'js' 'ADMIN' %} + {% render_bundle 'app' 'js' 'ADMIN' %} + {% else %} + {% render_bundle 'app' 'js' 'ADMIN' %} + {% endif %} +{% endblock %} + +{% block container_content %} + +