mirror of
https://github.com/Mailu/Mailu.git
synced 2025-02-21 19:19:39 +02:00
Implement relayed domains in the admin interface
This commit is contained in:
parent
b5c55d10d3
commit
01ddfef149
@ -28,5 +28,6 @@ from mailu.admin.views import \
|
||||
aliases, \
|
||||
users, \
|
||||
domains, \
|
||||
relays, \
|
||||
alternatives, \
|
||||
fetches
|
||||
|
@ -56,6 +56,13 @@ class AlternativeForm(flask_wtf.FlaskForm):
|
||||
submit = fields.SubmitField(_('Create'))
|
||||
|
||||
|
||||
class RelayForm(flask_wtf.FlaskForm):
|
||||
name = fields.StringField(_('Relayed domain name'), [validators.DataRequired()])
|
||||
smtp = fields.StringField(_('Remote host'))
|
||||
comment = fields.StringField(_('Comment'))
|
||||
submit = fields.SubmitField(_('Create'))
|
||||
|
||||
|
||||
class UserForm(flask_wtf.FlaskForm):
|
||||
localpart = fields.StringField(_('E-mail'), [validators.DataRequired()])
|
||||
pw = fields.PasswordField(_('Password'), [validators.DataRequired()])
|
||||
|
5
admin/mailu/admin/templates/relay/create.html
Normal file
5
admin/mailu/admin/templates/relay/create.html
Normal file
@ -0,0 +1,5 @@
|
||||
{% extends "form.html" %}
|
||||
|
||||
{% block title %}
|
||||
{% trans %}New relay domain{% endtrans %}
|
||||
{% endblock %}
|
9
admin/mailu/admin/templates/relay/edit.html
Normal file
9
admin/mailu/admin/templates/relay/edit.html
Normal file
@ -0,0 +1,9 @@
|
||||
{% extends "form.html" %}
|
||||
|
||||
{% block title %}
|
||||
{% trans %}Edit relayd domain{% endtrans %}
|
||||
{% endblock %}
|
||||
|
||||
{% block subtitle %}
|
||||
{{ relay }}
|
||||
{% endblock %}
|
39
admin/mailu/admin/templates/relay/list.html
Normal file
39
admin/mailu/admin/templates/relay/list.html
Normal file
@ -0,0 +1,39 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}
|
||||
{% trans %}Relayed domain list{% endtrans %}
|
||||
{% endblock %}
|
||||
|
||||
{% block main_action %}
|
||||
{% if current_user.global_admin %}
|
||||
<a class="btn btn-primary" href="{{ url_for('.relay_create') }}">{% trans %}New relayed domain{% endtrans %}</a>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block box %}
|
||||
<table class="table table-bordered">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th>{% trans %}Actions{% endtrans %}</th>
|
||||
<th>{% trans %}Domain name{% endtrans %}</th>
|
||||
<th>{% trans %}Remote host{% endtrans %}</th>
|
||||
<th>{% trans %}Comment{% endtrans %}</th>
|
||||
<th>{% trans %}Created{% endtrans %}</th>
|
||||
<th>{% trans %}Last edit{% endtrans %}</th>
|
||||
</tr>
|
||||
{% for relay in relays %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{ url_for('.relay_edit', relay_name=relay.name) }}" title="{% trans %}Edit{% endtrans %}"><i class="fa fa-pencil"></i></a>
|
||||
<a href="{{ url_for('.relay_delete', relay_name=relay.name) }}" title="{% trans %}Delete{% endtrans %}"><i class="fa fa-trash"></i></a>
|
||||
</td>
|
||||
<td>{{ relay.name }}</td>
|
||||
<td>{{ relay.smtp or '-' }}</td>
|
||||
<td>{{ relay.comment or '' }}</td>
|
||||
<td>{{ relay.created_at }}</td>
|
||||
<td>{{ relay.updated_at or '' }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endblock %}
|
@ -50,6 +50,11 @@
|
||||
<i class="fa fa-user"></i> <span>{% trans %}Administrators{% endtrans %}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{{ url_for('.relay_list') }}">
|
||||
<i class="fa fa-reply-all"></i> <span>{% trans %}Relayed domains{% endtrans %}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if current_user.manager_of or current_user.global_admin %}
|
||||
<li>
|
||||
|
60
admin/mailu/admin/views/relays.py
Normal file
60
admin/mailu/admin/views/relays.py
Normal file
@ -0,0 +1,60 @@
|
||||
from mailu.admin import app, db, models, forms, access
|
||||
from mailu import app as flask_app
|
||||
|
||||
import flask
|
||||
import wtforms_components
|
||||
|
||||
|
||||
@app.route('/relay', methods=['GET'])
|
||||
@access.global_admin
|
||||
def relay_list():
|
||||
relays = models.Relay.query.all()
|
||||
return flask.render_template('relay/list.html', relays=relays)
|
||||
|
||||
|
||||
@app.route('/relay/create', methods=['GET', 'POST'])
|
||||
@access.global_admin
|
||||
def relay_create():
|
||||
form = forms.RelayForm()
|
||||
if form.validate_on_submit():
|
||||
conflicting_domain = models.Domain.query.get(form.name.data)
|
||||
conflicting_alternative = models.Alternative.query.get(form.name.data)
|
||||
conflicting_relay = models.Relay.query.get(form.name.data)
|
||||
if conflicting_domain or conflicting_alternative or conflicting_relay:
|
||||
flask.flash('Domain %s is already used' % form.name.data, 'error')
|
||||
else:
|
||||
relay = models.Relay()
|
||||
form.populate_obj(relay)
|
||||
db.session.add(relay)
|
||||
db.session.commit()
|
||||
flask.flash('Relayed domain %s created' % relay)
|
||||
return flask.redirect(flask.url_for('.relay_list'))
|
||||
return flask.render_template('relay/create.html', form=form)
|
||||
|
||||
|
||||
@app.route('/relay/edit/<relay_name>', methods=['GET', 'POST'])
|
||||
@access.global_admin
|
||||
def relay_edit(relay_name):
|
||||
relay = models.Relay.query.get(relay_name) or flask.abort(404)
|
||||
form = forms.RelayForm(obj=relay)
|
||||
wtforms_components.read_only(form.name)
|
||||
form.name.validators = []
|
||||
if form.validate_on_submit():
|
||||
form.populate_obj(relay)
|
||||
db.session.commit()
|
||||
flask.flash('Relayed domain %s saved' % relay)
|
||||
return flask.redirect(flask.url_for('.relay_list'))
|
||||
return flask.render_template('relay/edit.html', form=form,
|
||||
relay=relay)
|
||||
|
||||
|
||||
@app.route('/relay/delete/<relay_name>', methods=['GET', 'POST'])
|
||||
@access.global_admin
|
||||
@access.confirmation_required("delete {relay_name}")
|
||||
def relay_delete(relay_name):
|
||||
relay = models.Relay.query.get(relay_name) or flask.abort(404)
|
||||
db.session.delete(relay)
|
||||
db.session.commit()
|
||||
flask.flash('Relayed domain %s deleted' % relay)
|
||||
return flask.redirect(flask.url_for('.relay_list'))
|
||||
|
Loading…
x
Reference in New Issue
Block a user