Improved design of samba index, rewrote flask flash, some validation

This commit is contained in:
Daniel 2019-11-04 18:23:43 +01:00
parent 4ef5a16abd
commit 3cf012283b
7 changed files with 116 additions and 89 deletions

View file

@ -124,21 +124,6 @@ def generate_smb():
app.logger.info("Generated new samba config.")
def get_share_by_id(share_id):
"""
Returns drive object for given id
:param share_id: id of drive (primary key)
:type share_id: int
:return: Share object
:rtype: Share
"""
share = SambaShare.query.get(share_id)
if share is not None:
return share
else:
raise LookupError
def disable_share(share):
"""
Disables a given share object.

View file

@ -21,13 +21,13 @@
<i class="magic icon"></i> Generieren
</div>
</a>
<table class="ui celled fixed table">
<table class="ui celled padded table">
<thead>
<tr>
<th>Name</th>
<th>Pfad</th>
<th>Papierkorb</th>
<th>BtrFS Optimierungen</th>
<th class="collapsing">Papierkorb</th>
<th class="collapsing">BtrFS Modul</th>
<th>Aktionen</th>
</tr>
</thead>
@ -37,23 +37,31 @@
<tr>
<td>{{ share.name }}</td>
<td>{{ share.path }}</td>
<td>{{ share.recycle }}</td>
<td>{{ share.btrfs }}</td>
{% if share.recycle %}
<td class="collapsing"><i class="check icon"></i> Aktiviert</td>
{% else %}
<td class="collapsing"><i class="close icon"></i> Deaktiviert</td>
{% endif %}
{% if share.btrfs %}
<td class="collapsing"><i class="check icon"></i> Aktiviert</td>
{% else %}
<td class="collapsing"><i class="close icon"></i> Deaktiviert</td>
{% endif %}
<td>{% if share.enabled %}
<a href="{{ url_for('.index', disable=share.id) }}">
<div class="ui negative labeled icon button">
<i class="pause icon"></i> Exkludieren
<div class="ui orange icon basic button">
<i class="unlink icon"></i>
</div>
</a>
{% else %}
<a href="{{ url_for('.index', enable=share.id) }}">
<div class="ui positive labeled icon button">
<i class="play icon"></i> Inkludieren
<div class="ui green icon basic button">
<i class="linkify icon"></i>
</div>
</a>
{% endif %}
<a href="{{ url_for('.remove', share=share.id) }}">
<div class="ui orange icon button">
<div class="ui red icon basic button">
<i class="trash icon"></i>
</div>
</a>

View file

@ -1,20 +1,5 @@
{% extends "base.html" %}
{% block title %}Freigabe entfernen{% endblock %}
{% block head %}
{{ super() }}
{% if show_modal %}
<script type="text/javascript">
$(document).ready(function () {
$('#security')
.modal('show')
;
$('#confirm').click(function () {
$('.ui.modal').modal('hide');
});
});
</script>
{% endif %}
{% endblock %}
{% block body %}
<div class="topspacer"></div>
<div class="ui container">
@ -35,23 +20,20 @@
{% endif %}
{{ form.hidden_tag() }}
{{ render_field(form.remove_data) }}
<div class="ui tiny modal" id="security">
<div class="ui icon header">
<i class="smile icon"></i> Authentifizierung benötigt
</div>
<div class="content">
<p>Du hast ausgewählt, dass alle Daten der Freigabe restlos entfernt werden sollen. Diese Aktion ist
unumkehrbar!</p>
<p>Die Sicherheitsprotokolle von Dirkules verbieten diese Aktion. Um die Aktion dennoch auszuführen,
bitte die Sicherheitsprotokolle überbrücken.</p>
<p>{{ render_field(form.okay) }}</p>
</div>
<div class="actions">
<div class="ui button" id="confirm">
Bestätigen
{% if show_modal %}
<div class="ui segment">
{{ render_field(form.okay) }}
</div>
</div>
</div>
<div class="ui error message">
<i class="close icon"></i>
<div class="header">
Verletzung der Sicherheitsprotokolle
</div>
Die Sicherheitsprotokolle verhindern die automatische Ausführung.<br>
Für das Ausführen der gewünschten Aktion, ist eine Überbrückung der Sicherheitsprotokolle nötig.
Bitte bestätigen.
</div>
{% endif %}
{{ render_field(form.submit) }}
</form>
</div>

View file

@ -7,12 +7,12 @@ from dirkules.wtforms_extension import ToggleBooleanField, RequiredIf
class SambaConfigForm(FlaskForm):
workgroup = StringField("workgroup", [validators.required(message="Bitte Feld ausfüllen!"),
validators.Regexp('^[a-z]+$', message="Bitte nur Kleinbuchstaben eingeben."),
validators.Length(max=255, message="Eingabe zu lang")],
validators.Length(max=11, message="Maximal 11 Zeichen.")],
render_kw={"placeholder": "Nichts..."})
server_string = StringField("server string", [validators.required(message="Bitte Feld ausfüllen!"),
validators.Regexp('^[a-z]+$',
message="Bitte nur Kleinbuchstaben eingeben."),
validators.Length(max=255, message="Eingabe zu lang")],
validators.Length(max=15, message="Maximal 15 Zeichen.")],
render_kw={"placeholder": "Nichts..."})
submit = SubmitField("Speichern")
@ -41,4 +41,4 @@ class SambaRemovalForm(FlaskForm):
remove_data = BooleanField("Alle Daten entfernen")
okay = ToggleBooleanField("Sicherheitsprotokolle überbrücken.",
validators=[RequiredIf("remove_data",)])
submit = SubmitField("Pool erstellen")
submit = SubmitField("Freigabe löschen")

View file

@ -4,7 +4,7 @@ from dirkules.config import staticDir
from flask import render_template, url_for, request, redirect, flash
from dirkules.samba import bp_samba
from dirkules.samba import manager as smb_man
from dirkules.samba.models import SambaShare
from dirkules.samba.models import SambaShare, SambaGlobal
from dirkules.samba.validation import SambaConfigForm, SambaAddForm, SambaRemovalForm
@ -17,31 +17,34 @@ def index():
if e_share is not None:
try:
e_share = int(e_share)
share = smb_man.get_share_by_id(e_share)
share = SambaShare.query.get_or_404(e_share)
smb_man.enable_share(share)
except ValueError:
flash("ValueError: enable")
flash("ValueError: enable", category="error")
except LookupError:
flash("LookupError: id not valid")
flash("LookupError: id not valid", category="error")
return redirect(url_for('.index'))
elif d_share is not None:
try:
d_share = int(d_share)
share = smb_man.get_share_by_id(d_share)
share = SambaShare.query.get_or_404(d_share)
smb_man.disable_share(share)
except ValueError:
flash("ValueError: disable")
flash("ValueError: disable", category="error")
except LookupError:
flash("LookupError: id not valid")
flash("LookupError: id not valid", category="error")
return redirect(url_for('.index'))
else:
flash("Value Error: enable and disable set")
flash("Value Error: enable and disable set", category="error")
return render_template('samba/index.html', shares=shares)
@bp_samba.route('/config', methods=['GET', 'POST'])
def config():
form = SambaConfigForm(request.form)
if SambaGlobal.query.first() is not None:
form.workgroup.data = SambaGlobal.query.get(1)
form.server_string.data = SambaGlobal.query.get(2)
if request.method == 'POST' and form.validate():
smb_man.set_samba_global(form.workgroup.data, form.server_string.data)
return redirect(url_for('.index'))
@ -70,6 +73,9 @@ def add():
@bp_samba.route('/generate')
def generate():
smb_man.generate_smb()
if SambaGlobal.query.first() is None:
flash("Samba wurde nicht konfiguriert. Es wird der default fallback verwendet", category="warn")
flash("Konfiguration erfolgreich generiert", category="positive")
return redirect(url_for('.index'))
@ -78,23 +84,20 @@ def remove():
share_id = request.args.get('share')
show_modal = False
if share_id is None:
flash("Can't remove drive without id.")
flash("Keine id angegeben. Möglicherweise ist der Verweis veraltet", category="error")
return redirect(url_for('.index'))
else:
try:
form = SambaRemovalForm(request.form)
share_id = int(share_id)
share = smb_man.get_share_by_id(share_id)
share = SambaShare.query.get_or_404(share_id)
if request.method == 'POST':
if form.validate():
print("Alles Easy")
smb_man.remove_share(share, remove_data=bool(form.remove_data.data))
return redirect(url_for('.index'))
else:
show_modal = True
print(form.okay.data)
return render_template('samba/remove.html', name=share.name, form=form, show_modal=show_modal)
except ValueError:
flash("ValueError: id is not an int")
except LookupError:
flash("LookupError: id not valid")
flash("ValueError: id is not an int", category="error")
return redirect(url_for('.index'))

View file

@ -46,13 +46,7 @@
{% else %}
<div class="field">
{% endif %}
{% if field.errors %}
{% for error in field.errors %}
<div class="ui pointing below red basic label">
{{ error }}
</div>
{% endfor %}
{% endif %}
{% if field.type == 'BooleanField' %}
<div class="ui checkbox">
{% else %}
@ -110,6 +104,6 @@
</div>
</div>
{% else %}
ERROR
ERROR LOL
{% endif %}
{% endmacro %}

View file

@ -28,8 +28,9 @@
<a class="ui item" href="{{ url_for('about') }}">über Dirkules</a>
</div>
</nav>
{% with messages = get_flashed_messages() %}
{% if messages %}
{% with errors = get_flashed_messages(category_filter=["error"]) %}
{% if errors %}
<div class="tablebox">
<div class="ui negative message">
<i class="close icon"></i>
@ -37,16 +38,72 @@
Ein oder Mehrere Fehler sind aufgetreten
</div>
<ul class="list">
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
{% for msg in errors %}
<li>{{ msg }}</li>
{% endfor -%}
</ul>
</div>
</div>
{% endif %}
{% endwith %}
{% with warns = get_flashed_messages(category_filter=["warn"]) %}
{% if warns %}
<div class="tablebox">
<div class="ui warning message">
<i class="close icon"></i>
<div class="header">
Ein oder Mehrere Warnungen sind aufgetreten
</div>
<ul class="list">
{% for msg in warns %}
<li>{{ msg }}</li>
{% endfor -%}
</ul>
</div>
</div>
{% endif %}
{% endwith %}
{% with info = get_flashed_messages(category_filter=["info"]) %}
{% if info %}
<div class="tablebox">
<div class="ui message">
<i class="close icon"></i>
<div class="header">
Folgende Informationen sind vorhanden
</div>
<ul class="list">
{% for msg in info %}
<li>{{ msg }}</li>
{% endfor -%}
</ul>
</div>
</div>
{% endif %}
{% endwith %}
{% with pos = get_flashed_messages(category_filter=["positive"]) %}
{% if pos %}
<div class="tablebox">
<div class="ui positive message">
<i class="close icon"></i>
<div class="header">
Folgendes wurde erfolgreich abgeschlossen
</div>
<ul class="list">
{% for msg in pos %}
<li>{{ msg }}</li>
{% endfor -%}
</ul>
</div>
</div>
{% endif %}
{% endwith %}
{% block body %}
{% endblock %}
</body>
<script>
$('.message .close')
.on('click', function () {
@ -57,6 +114,4 @@
})
;
</script>
</body>
</html>