You've already forked Mailu
							
							
				mirror of
				https://github.com/Mailu/Mailu.git
				synced 2025-10-30 23:37:43 +02:00 
			
		
		
		
	Improve forms for user creation an deletion
This commit is contained in:
		| @@ -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): | ||||
|   | ||||
| @@ -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 | ||||
|  | ||||
|   | ||||
| @@ -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 %} | ||||
|   | ||||
| @@ -18,7 +18,7 @@ Domain list | ||||
|       <th>Domain name</th> | ||||
|       <th>Mailbox count</th> | ||||
|       <th>Alias count</th> | ||||
|       <th>Comemnt</th> | ||||
|       <th>Comment</th> | ||||
|       <th>Created</th> | ||||
|       <th>Last edit</th> | ||||
|     </tr> | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| {% extends "base.html" %} | ||||
|  | ||||
| {% block box_content %} | ||||
| {{ wtf.quick_form(form) }} | ||||
| {{ macros.form(form) }} | ||||
| {% endblock %} | ||||
|   | ||||
							
								
								
									
										57
									
								
								admin/freeposte/admin/templates/macros.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								admin/freeposte/admin/templates/macros.html
									
									
									
									
									
										Normal file
									
								
							| @@ -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 %} | ||||
|           <p class="error">{{error}}</p> | ||||
|         {% endfor %} | ||||
|       {% endif %} | ||||
|     {% endfor %} | ||||
|   {% endif %} | ||||
| {% endmacro %} | ||||
|  | ||||
| {% macro form_fields(fields, prepend='', append='', label=True) %} | ||||
|   {% set width = (12 / fields|length)|int %} | ||||
|   <div class="form-group"> | ||||
|     <div class="row"> | ||||
|       {% for field in fields %} | ||||
|       <div class="col-lg-{{ width }} col-xs-12 {{ 'has-error' if field.errors else '' }}"> | ||||
|         {{ field.label if label else '' }} | ||||
|         {% if field.errors %} | ||||
|           {% for error in field.errors %} | ||||
|             <p class="help-block inline">{{ error }}</p> | ||||
|           {% endfor %} | ||||
|         {% endif %} | ||||
|         {% if prepend or append %}<div class="input-group">{% endif %} | ||||
|           {{ prepend|safe }} | ||||
|           {{ field(class_="form-control", **kwargs) }} | ||||
|           {{ append|safe }} | ||||
|         {% if prepend or append %}</div>{% endif %} | ||||
|       </div> | ||||
|       {% endfor %} | ||||
|     </div> | ||||
|   </div> | ||||
| {% 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 class="form" method="post" role="form"> | ||||
|   {{ form.hidden_tag() }} | ||||
|   {% for field in form %} | ||||
|     {% if  bootstrap_is_hidden_field(field) %} | ||||
|       {{ field() }} | ||||
|     {% else %} | ||||
|       {{ form_field(field) }} | ||||
|     {% endif %} | ||||
|   {% endfor %} | ||||
| </form> | ||||
| {% endmacro %} | ||||
| @@ -9,5 +9,14 @@ New user | ||||
| {% endblock %} | ||||
|  | ||||
| {% block box_content %} | ||||
| {{ wtf.quick_form(form) }} | ||||
| <form class="form" method="post" role="form"> | ||||
|   {{ form.hidden_tag() }} | ||||
|   {{ macros.form_field(form.localpart, append='<span class="input-group-addon">@'+domain.name+'</span>') }} | ||||
|   {{ macros.form_fields((form.pw, form.pw2)) }} | ||||
|   {{ macros.form_field(form.quota_bytes, step=1000000000, max=50000000000, | ||||
|       prepend='<span class="input-group-addon"><span id="quota">'+(form.quota_bytes.data//1000000000).__str__()+'</span> GiB</span>', | ||||
|       oninput='$("#quota").text(this.value/1000000000);') }} | ||||
|   {{ macros.form_field(form.comment) }} | ||||
|   {{ macros.form_field(form.submit) }} | ||||
| </form> | ||||
| {% endblock %} | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| {% extends "form.html" %} | ||||
| {% extends "user/create.html" %} | ||||
|  | ||||
| {% block title %} | ||||
| Edit user | ||||
|   | ||||
| @@ -3,6 +3,7 @@ from flask.ext import login as flask_login | ||||
|  | ||||
| import os | ||||
| import flask | ||||
| import wtforms_components | ||||
|  | ||||
|  | ||||
| @app.route('/user/list/<domain_name>', 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/<user_email>', methods=['GET']) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user