From d62cf69a700921fbc00e0e59aaa493351d347a8e Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Thu, 28 Aug 2014 08:22:45 +0200 Subject: [PATCH] Form display fixes + confirmation plugin. see #585 --- modoboa/extensions/admin/forms/account.py | 32 +++++------ modoboa/extensions/admin/forms/domain.py | 9 ++-- modoboa/extensions/amavis/forms.py | 17 +++--- .../amavis/domain_content_filter.html | 16 ++++-- .../extensions/postfix_relay_domains/forms.py | 10 ++-- .../postfix_relay_domains/service_field.html | 4 +- modoboa/lib/templatetags/form_tags.py | 5 +- modoboa/static/js/confirmation.js | 54 +++++++++---------- modoboa/static/js/global.js | 12 +++++ modoboa/templates/common/generic_field.html | 37 +++++++------ 10 files changed, 112 insertions(+), 84 deletions(-) diff --git a/modoboa/extensions/admin/forms/account.py b/modoboa/extensions/admin/forms/account.py index 9658fb528..6a1b8f53b 100644 --- a/modoboa/extensions/admin/forms/account.py +++ b/modoboa/extensions/admin/forms/account.py @@ -22,30 +22,22 @@ class AccountFormGeneral(forms.ModelForm): help_text=ugettext_lazy( "The user's name. Must be a valid e-mail address for simple users " "or administrators with a mailbox." - ), - widget=forms.TextInput(attrs={"class": "form-control"}) + ) ) role = forms.ChoiceField( label=ugettext_lazy("Role"), choices=[('', ugettext_lazy("Choose"))], - help_text=ugettext_lazy("What level of permission this user will have"), - widget=forms.Select(attrs={"class": "form-control"}) + help_text=ugettext_lazy("What level of permission this user will have") ) password1 = forms.CharField( - label=ugettext_lazy("Password"), - widget=forms.PasswordInput(attrs={"class": "form-control"}) + label=ugettext_lazy("Password") ) password2 = forms.CharField( label=ugettext_lazy("Confirmation"), - widget=forms.PasswordInput(attrs={"class": "form-control"}), help_text=ugettext_lazy("Enter the same password as above, for verification.") ) - first_name= forms.CharField( - widget=forms.TextInput(attrs={"class": "form-control"}), - ) - last_name= forms.CharField( - widget=forms.TextInput(attrs={"class": "form-control"}), - ) + first_name = forms.CharField() + last_name = forms.CharField() class Meta: model = User @@ -137,7 +129,7 @@ class AccountFormGeneral(forms.ModelForm): class AccountFormMail(forms.Form, DynamicForm): - email = forms.EmailField(label=ugettext_lazy("E-mail"), required=False, widget=forms.TextInput(attrs={"class": "form-control"})) + email = forms.EmailField(label=ugettext_lazy("E-mail"), required=False) quota = forms.IntegerField( label=ugettext_lazy("Quota"), required=False, @@ -145,7 +137,7 @@ class AccountFormMail(forms.Form, DynamicForm): "use domain's default one. Leave empty to define an " "unlimited value (not allowed for domain " "administrators)."), - widget=forms.widgets.TextInput(attrs={"class": "col-md-1 form-control"}) + widget=forms.widgets.TextInput(attrs={"class": "form-control"}) ) quota_act = forms.BooleanField(required=False) aliases = forms.EmailField( @@ -155,8 +147,7 @@ class AccountFormMail(forms.Form, DynamicForm): "Alias(es) of this mailbox. Indicate only one address per input, " "press ENTER to add a new input. Use the '*' character to create " "a 'catchall' alias (ex: *@domain.tld)." - ), - widget=forms.TextInput(attrs={"class": "form-control"}) + ) ) def __init__(self, *args, **kwargs): @@ -166,6 +157,9 @@ class AccountFormMail(forms.Form, DynamicForm): else: self.mb = None super(AccountFormMail, self).__init__(*args, **kwargs) + self.field_widths = { + "quota": 3 + } self.extra_fields = [] for fname, field in events.raiseQueryEvent('ExtraFormFields', 'mailform', self.mb): self.fields[fname] = field @@ -332,7 +326,9 @@ class AccountPermissionsForm(forms.Form, DynamicForm): self._load_from_qdict(args[0], "domains", DomainNameField) def save(self): - current_domains = [dom.name for dom in Domain.objects.get_for_admin(self.account)] + current_domains = [ + dom.name for dom in Domain.objects.get_for_admin(self.account) + ] for name, value in self.cleaned_data.items(): if not name.startswith("domains"): continue diff --git a/modoboa/extensions/admin/forms/domain.py b/modoboa/extensions/admin/forms/domain.py index 8dc682046..ed0629851 100644 --- a/modoboa/extensions/admin/forms/domain.py +++ b/modoboa/extensions/admin/forms/domain.py @@ -183,7 +183,9 @@ class DomainFormOptions(forms.Form): create_dom_admin = YesNoField( label=ugettext_lazy("Create a domain administrator"), initial="no", - help_text=ugettext_lazy("Automatically create an administrator for this domain") + help_text=ugettext_lazy( + "Automatically create an administrator for this domain" + ) ) dom_admin_username = forms.CharField( @@ -193,14 +195,15 @@ class DomainFormOptions(forms.Form): "The administrator's name. Don't include the domain's name here, " "it will be automatically appended." ), - widget=forms.widgets.TextInput(attrs={"class": "form-control input-small"}), required=False ) create_aliases = YesNoField( label=ugettext_lazy("Create aliases"), initial="yes", - help_text=ugettext_lazy("Automatically create standard aliases for this domain"), + help_text=ugettext_lazy( + "Automatically create standard aliases for this domain" + ), required=False ) diff --git a/modoboa/extensions/amavis/forms.py b/modoboa/extensions/amavis/forms.py index ae58d3db3..7d9cc82cb 100644 --- a/modoboa/extensions/amavis/forms.py +++ b/modoboa/extensions/amavis/forms.py @@ -5,6 +5,7 @@ from modoboa.extensions.amavis.models import Policy, Users class DomainPolicyForm(forms.ModelForm): + spam_subject_tag2_act = forms.BooleanField() class Meta: @@ -15,9 +16,12 @@ class DomainPolicyForm(forms.ModelForm): widgets = { 'bypass_virus_checks': InlineRadioSelect(), 'bypass_spam_checks': InlineRadioSelect(), - 'spam_tag2_level': forms.TextInput(attrs={'class': 'col-md-1 form-control'}), - 'spam_kill_level': forms.TextInput(attrs={'class': 'col-md-1 form-control'}), - 'spam_subject_tag2': forms.TextInput(attrs={'class': 'col-md-2 form-control'}), + 'spam_tag2_level': forms.TextInput( + attrs={'class': 'form-control'}), + 'spam_kill_level': forms.TextInput( + attrs={'class': 'form-control'}), + 'spam_subject_tag2': forms.TextInput( + attrs={'class': 'form-control'}), 'bypass_banned_checks': InlineRadioSelect(), } @@ -25,13 +29,14 @@ class DomainPolicyForm(forms.ModelForm): if "instance" in kwargs: self.domain = kwargs["instance"] try: - policy = Users.objects.get(email="@%s" % self.domain.name).policy + policy = Users.objects.get( + email="@%s" % self.domain.name).policy kwargs["instance"] = policy except (Users.DoesNotExist, Policy.DoesNotExist): del kwargs["instance"] super(DomainPolicyForm, self).__init__(*args, **kwargs) - for f in self.fields.keys(): - self.fields[f].required = False + for field in self.fields.keys(): + self.fields[field].required = False def save(self, user, commit=True): policy = super(DomainPolicyForm, self).save(commit=False) diff --git a/modoboa/extensions/amavis/templates/amavis/domain_content_filter.html b/modoboa/extensions/amavis/templates/amavis/domain_content_filter.html index 49cee4ad6..45ba0ee18 100644 --- a/modoboa/extensions/amavis/templates/amavis/domain_content_filter.html +++ b/modoboa/extensions/amavis/templates/amavis/domain_content_filter.html @@ -1,12 +1,18 @@ {% load i18n form_tags %} {% render_field form.bypass_virus_checks %} {% render_field form.bypass_spam_checks %} -
- -
- {{ form.spam_tag2_level }} {% trans "or more is spam" %}
- {{ form.spam_kill_level }} {% trans "or more throw spam message away" %} +
+ +
+ {{ form.spam_tag2_level }}
+ {% trans "or more is spam" %} +
+
+
+ {{ form.spam_kill_level }} +
+ {% trans "or more throw spam message away" %}
{% render_field_with_activator form.spam_subject_tag2 _("default") %} {% render_field form.bypass_banned_checks %} diff --git a/modoboa/extensions/postfix_relay_domains/forms.py b/modoboa/extensions/postfix_relay_domains/forms.py index 8b7246240..2f0102f7c 100644 --- a/modoboa/extensions/postfix_relay_domains/forms.py +++ b/modoboa/extensions/postfix_relay_domains/forms.py @@ -19,21 +19,21 @@ class RelayDomainFormGeneral(forms.ModelForm, DynamicForm): help_text=ugettext_lazy( "Alias(es) of this relay domain. Indicate only one name per input" ", press ENTER to add a new input." - ), - widget=forms.TextInput(attrs={'class': 'form-control'}) + ) ) class Meta: model = RelayDomain exclude = ['dates'] widgets = { - 'service': forms.Select(attrs={'class': 'col-mg-2 form-control'}), - 'target_host': forms.TextInput(attrs={'class': 'form-control'}), - 'name': forms.TextInput(attrs={'class': 'form-control'}) + "service": forms.Select(attrs={"class": "form-control"}) } def __init__(self, *args, **kwargs): super(RelayDomainFormGeneral, self).__init__(*args, **kwargs) + self.field_widths = { + "service": 3 + } if args and isinstance(args[0], QueryDict): self._load_from_qdict(args[0], "aliases", DomainNameField) elif 'instance' in kwargs: diff --git a/modoboa/extensions/postfix_relay_domains/templates/postfix_relay_domains/service_field.html b/modoboa/extensions/postfix_relay_domains/templates/postfix_relay_domains/service_field.html index 4f715103c..d1d028ef1 100644 --- a/modoboa/extensions/postfix_relay_domains/templates/postfix_relay_domains/service_field.html +++ b/modoboa/extensions/postfix_relay_domains/templates/postfix_relay_domains/service_field.html @@ -1,2 +1,4 @@ {% extends "common/generic_field.html" %}{% load i18n %} -{% block extra_controls %}{% trans "Scan" %}{% endblock %} +{% block extra_controls %} +{% trans "Scan" %} +{% endblock %} diff --git a/modoboa/lib/templatetags/form_tags.py b/modoboa/lib/templatetags/form_tags.py index dcd3796e6..aad499651 100644 --- a/modoboa/lib/templatetags/form_tags.py +++ b/modoboa/lib/templatetags/form_tags.py @@ -58,6 +58,7 @@ def render_field_appended(field, text): @register.simple_tag def render_field_with_activator(field, activator_label=ugettext_lazy("activate")): + configure_field_classes(field) return render_to_string("common/generic_field.html", { "field": field, "help_display_mode": "tooltip", "activator": True, "activator_label": activator_label, "deactivate_if_empty": True @@ -73,7 +74,7 @@ def render_and_hide_field(field): @register.simple_tag def render_fields_group(form, pattern): - first = forms.BoundField(form, form.fields[pattern], pattern) + first = forms.forms.BoundField(form, form.fields[pattern], pattern) configure_field_classes(first) label = first.label group = [first] @@ -83,7 +84,7 @@ def render_fields_group(form, pattern): fname = "%s_%d" % (pattern, cpt) if not fname in form.fields: break - bfield = forms.BoundField(form, form.fields[fname], fname) + bfield = forms.forms.BoundField(form, form.fields[fname], fname) if len(bfield.errors): haserror = True configure_field_classes(bfield) diff --git a/modoboa/static/js/confirmation.js b/modoboa/static/js/confirmation.js index a987d1041..285f6e0f8 100644 --- a/modoboa/static/js/confirmation.js +++ b/modoboa/static/js/confirmation.js @@ -19,13 +19,12 @@ buildcheckboxes: function() { var result = ""; - if (!this.options.checkboxes) { + if (!this.options.checkboxes || !this.options.checkboxes.length) { return ""; } result = '
'; $.each(this.options.checkboxes, function(key, val) { - result += ""; + result += "".format(key, val); }); result += '
'; return result; @@ -34,55 +33,56 @@ buildbox: function() { var box = $('
', { id: "confirmbox", - 'class': "modal" + 'class': "modal fade" }); - var question = (typeof this.options.question == 'function') - ? this.options.question.apply(this) : this.options.question; + var question = (typeof this.options.question == 'function') ? + this.options.question.apply(this) : this.options.question; + var checkboxes = this.buildcheckboxes(); + var body = ""; - box.append($('