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 %}
+
+{% 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) %}
+
+{% 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) }}
+
{% 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'])