diff --git a/admin/freeposte/admin/forms.py b/admin/freeposte/admin/forms.py index ce4b34f7..5760d7b6 100644 --- a/admin/freeposte/admin/forms.py +++ b/admin/freeposte/admin/forms.py @@ -22,17 +22,13 @@ class DomainEditForm(Form): submit = fields.SubmitField('Save') -class UserCreateForm(Form): +class UserForm(Form): localpart = fields.StringField('E-mail', [validators.DataRequired()]) pw = fields.PasswordField('Password', [validators.DataRequired()]) + pw2 = fields.PasswordField('Confirm password', [validators.EqualTo('pw')]) + quota_bytes = fields_.DecimalSliderField('Quota', default=1000000000) comment = fields.StringField('Comment') - submit = fields.SubmitField('Create') - - -class UserEditForm(Form): - quota_bytes = fields.IntegerField('Quota') - comment = fields.StringField('Comment') - submit = fields.SubmitField('Create') + submit = fields.SubmitField('Save') class UserSettingsForm(Form): diff --git a/admin/freeposte/admin/models.py b/admin/freeposte/admin/models.py index d1464eab..ba8d88d4 100644 --- a/admin/freeposte/admin/models.py +++ b/admin/freeposte/admin/models.py @@ -39,6 +39,13 @@ class Domain(Base): max_users = db.Column(db.Integer, nullable=True) max_aliases = db.Column(db.Integer, nullable=True) + def has_address(self, localpart): + for address in self.users + self.aliases: + if address.localpart == localpart: + return True + else: + return False + def __str__(self): return self.name diff --git a/admin/freeposte/admin/templates/base.html b/admin/freeposte/admin/templates/base.html index 9f348bc9..d15bf65f 100644 --- a/admin/freeposte/admin/templates/base.html +++ b/admin/freeposte/admin/templates/base.html @@ -1,5 +1,5 @@ -{% import "bootstrap/wtf.html" as wtf %} {% import "bootstrap/utils.html" as utils %} +{% import "macros.html" as macros %} {% extends "bootstrap/base.html" %} {% block styles %} diff --git a/admin/freeposte/admin/templates/domain/list.html b/admin/freeposte/admin/templates/domain/list.html index e8ef15ea..d1b385b9 100644 --- a/admin/freeposte/admin/templates/domain/list.html +++ b/admin/freeposte/admin/templates/domain/list.html @@ -18,7 +18,7 @@ Domain list Domain name Mailbox count Alias count - Comemnt + Comment Created Last edit diff --git a/admin/freeposte/admin/templates/form.html b/admin/freeposte/admin/templates/form.html index 5e1e26d1..c252e6fe 100644 --- a/admin/freeposte/admin/templates/form.html +++ b/admin/freeposte/admin/templates/form.html @@ -1,5 +1,5 @@ {% extends "base.html" %} {% block box_content %} -{{ wtf.quick_form(form) }} +{{ macros.form(form) }} {% endblock %} diff --git a/admin/freeposte/admin/templates/macros.html b/admin/freeposte/admin/templates/macros.html new file mode 100644 index 00000000..5ce402cf --- /dev/null +++ b/admin/freeposte/admin/templates/macros.html @@ -0,0 +1,57 @@ +{% macro form_errors(form) %} + {% if form.errors %} + {% for fieldname, errors in form.errors.items() %} + {% if bootstrap_is_hidden_field(form[fieldname]) %} + {% for error in errors %} +

{{error}}

+ {% endfor %} + {% endif %} + {% endfor %} + {% endif %} +{% endmacro %} + +{% macro form_fields(fields, prepend='', append='', label=True) %} + {% set width = (12 / fields|length)|int %} +
+
+ {% for field in fields %} +
+ {{ field.label if label else '' }} + {% if field.errors %} + {% for error in field.errors %} +

{{ error }}

+ {% endfor %} + {% endif %} + {% if prepend or append %}
{% endif %} + {{ prepend|safe }} + {{ field(class_="form-control", **kwargs) }} + {{ append|safe }} + {% if prepend or append %}
{% endif %} +
+ {% endfor %} +
+
+{% endmacro %} + +{% macro form_field(field) %} + {% if field.type == 'SubmitField' %} + {{ form_fields((field,), label=False, class="btn btn-default", **kwargs) }} + {% elif field.type == 'HiddenField' %} + {{ form_fields((field,), label=False, **kwargs) }} + {% else %} + {{ form_fields((field,), **kwargs) }} + {% endif %} +{% endmacro %} + +{% macro form(form) %} +
+ {{ form.hidden_tag() }} + {% for field in form %} + {% if bootstrap_is_hidden_field(field) %} + {{ field() }} + {% else %} + {{ form_field(field) }} + {% endif %} + {% endfor %} +
+{% endmacro %} diff --git a/admin/freeposte/admin/templates/user/create.html b/admin/freeposte/admin/templates/user/create.html index 0432aaca..e1533a1a 100644 --- a/admin/freeposte/admin/templates/user/create.html +++ b/admin/freeposte/admin/templates/user/create.html @@ -9,5 +9,14 @@ New user {% endblock %} {% block box_content %} -{{ wtf.quick_form(form) }} +
+ {{ form.hidden_tag() }} + {{ macros.form_field(form.localpart, append='@'+domain.name+'') }} + {{ macros.form_fields((form.pw, form.pw2)) }} + {{ macros.form_field(form.quota_bytes, step=1000000000, max=50000000000, + prepend=''+(form.quota_bytes.data//1000000000).__str__()+' GiB', + oninput='$("#quota").text(this.value/1000000000);') }} + {{ macros.form_field(form.comment) }} + {{ macros.form_field(form.submit) }} +
{% endblock %} diff --git a/admin/freeposte/admin/templates/user/edit.html b/admin/freeposte/admin/templates/user/edit.html index 0eb58334..7c4eaa1e 100644 --- a/admin/freeposte/admin/templates/user/edit.html +++ b/admin/freeposte/admin/templates/user/edit.html @@ -1,4 +1,4 @@ -{% extends "form.html" %} +{% extends "user/create.html" %} {% block title %} Edit user diff --git a/admin/freeposte/admin/views/users.py b/admin/freeposte/admin/views/users.py index da079d50..9191c618 100644 --- a/admin/freeposte/admin/views/users.py +++ b/admin/freeposte/admin/views/users.py @@ -3,6 +3,7 @@ from flask.ext import login as flask_login import os import flask +import wtforms_components @app.route('/user/list/', methods=['GET']) @@ -20,15 +21,14 @@ def user_create(domain_name): flask.flash('Too many users for domain %s' % domain, 'error') return flask.redirect( flask.url_for('.user_list', domain_name=domain.name)) - form = forms.UserCreateForm() + form = forms.UserForm() if form.validate_on_submit(): - for address in domain.users + domain.aliases: - if address.localpart == form.localpart.data: - flask.flash('Address %s is already used' % address, 'error') - break + if domain.has_address(form.localpart.data): + flask.flash('Address %s is already used' % address, 'error') else: user = models.User(localpart=form.localpart.data, domain=domain) user.comment = form.comment.data + user.quota_bytes = int(form.quota_bytes.data) user.set_password(form.pw.data) db.session.add(user) db.session.commit() @@ -43,16 +43,18 @@ def user_create(domain_name): @flask_login.login_required def user_edit(user_email): user = utils.get_user(user_email, True) - form = forms.UserEditForm(obj=user) + form = forms.UserForm(obj=user) + wtforms_components.read_only(form.localpart) + form.pw.validators = [] if form.validate_on_submit(): - user.quota_bytes = form.quota_bytes.data + user.quota_bytes = int(form.quota_bytes.data) user.comment = form.comment.data db.session.add(user) db.session.commit() flask.flash('User %s updated' % user) return flask.redirect( flask.url_for('.user_list', domain_name=user.domain.name)) - return flask.render_template('user/edit.html', form=form, user=user) + return flask.render_template('user/edit.html', form=form, user=user, domain=user.domain) @app.route('/user/delete/', methods=['GET'])