mirror of
https://github.com/vale981/dirkules
synced 2025-03-05 09:21:38 -05:00
Improved design of samba index, rewrote flask flash, some validation
This commit is contained in:
parent
4ef5a16abd
commit
3cf012283b
7 changed files with 116 additions and 89 deletions
|
@ -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.
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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'))
|
||||
|
|
|
@ -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 %}
|
|
@ -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>
|
||||
|
|
Loading…
Add table
Reference in a new issue