|
|
@@ -212,6 +212,10 @@ PERMISSIONS = {
|
|
|
|
"label": "Kunden",
|
|
|
|
"label": "Kunden",
|
|
|
|
"rows": {"view": "customers.view", "create": "customers.create", "edit": "customers.edit"},
|
|
|
|
"rows": {"view": "customers.view", "create": "customers.create", "edit": "customers.edit"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
"tickets": {
|
|
|
|
|
|
|
|
"label": "Tickets",
|
|
|
|
|
|
|
|
"rows": {"view": "tickets.view", "create": "tickets.create", "edit": "tickets.edit"},
|
|
|
|
|
|
|
|
},
|
|
|
|
"licenses": {
|
|
|
|
"licenses": {
|
|
|
|
"label": "Lizenzen",
|
|
|
|
"label": "Lizenzen",
|
|
|
|
"rows": {"view": "licenses.view", "create": "licenses.create", "edit": "licenses.edit"},
|
|
|
|
"rows": {"view": "licenses.view", "create": "licenses.create", "edit": "licenses.edit"},
|
|
|
@@ -251,6 +255,10 @@ PERMISSIONS = {
|
|
|
|
"label": "Systemeinstellungen",
|
|
|
|
"label": "Systemeinstellungen",
|
|
|
|
"rows": {"view": "settings_system.view", "edit": "settings_system.edit"},
|
|
|
|
"rows": {"view": "settings_system.view", "edit": "settings_system.edit"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
"settings_license": {
|
|
|
|
|
|
|
|
"label": "Lizenz",
|
|
|
|
|
|
|
|
"rows": {"view": "settings_license.view", "edit": "settings_license.edit"},
|
|
|
|
|
|
|
|
},
|
|
|
|
"settings_importexport": {
|
|
|
|
"settings_importexport": {
|
|
|
|
"label": "Im-/Export",
|
|
|
|
"label": "Im-/Export",
|
|
|
|
"rows": {
|
|
|
|
"rows": {
|
|
|
@@ -275,6 +283,8 @@ PERMISSION_LABELS = {
|
|
|
|
"licensing_group.view": "Lizenzierung-Bereich anzeigen",
|
|
|
|
"licensing_group.view": "Lizenzierung-Bereich anzeigen",
|
|
|
|
"customers.view": "Kunden lesen", "customers.create": "Kunden anlegen",
|
|
|
|
"customers.view": "Kunden lesen", "customers.create": "Kunden anlegen",
|
|
|
|
"customers.edit": "Kunden ändern (inkl. Löschen)",
|
|
|
|
"customers.edit": "Kunden ändern (inkl. Löschen)",
|
|
|
|
|
|
|
|
"tickets.view": "Tickets lesen", "tickets.create": "Tickets anlegen",
|
|
|
|
|
|
|
|
"tickets.edit": "Tickets ändern (Eckdaten, Sperren/Entsperren, Löschen)",
|
|
|
|
"licenses.view": "Lizenzen und Aktivierungsstatus lesen",
|
|
|
|
"licenses.view": "Lizenzen und Aktivierungsstatus lesen",
|
|
|
|
"licenses.create": "Lizenzen ausstellen",
|
|
|
|
"licenses.create": "Lizenzen ausstellen",
|
|
|
|
"licenses.edit": "Lizenzen ändern (Deaktivieren/Widerrufen, erneut versenden)",
|
|
|
|
"licenses.edit": "Lizenzen ändern (Deaktivieren/Widerrufen, erneut versenden)",
|
|
|
@@ -288,6 +298,8 @@ PERMISSION_LABELS = {
|
|
|
|
"groups.view": "Gruppen lesen", "groups.create": "Gruppen anlegen",
|
|
|
|
"groups.view": "Gruppen lesen", "groups.create": "Gruppen anlegen",
|
|
|
|
"groups.edit": "Gruppen ändern (inkl. Löschen)",
|
|
|
|
"groups.edit": "Gruppen ändern (inkl. Löschen)",
|
|
|
|
"settings_system.view": "Systemeinstellungen lesen", "settings_system.edit": "Systemeinstellungen ändern",
|
|
|
|
"settings_system.view": "Systemeinstellungen lesen", "settings_system.edit": "Systemeinstellungen ändern",
|
|
|
|
|
|
|
|
"settings_license.view": "Lizenzstatus ansehen",
|
|
|
|
|
|
|
|
"settings_license.edit": "Lizenzdatei hochladen sowie Lizenz aktivieren/deaktivieren (online oder per Code)",
|
|
|
|
"settings_importexport.view": "Im-/Export-Seite ansehen",
|
|
|
|
"settings_importexport.view": "Im-/Export-Seite ansehen",
|
|
|
|
"settings_importexport.edit": "Daten importieren",
|
|
|
|
"settings_importexport.edit": "Daten importieren",
|
|
|
|
"settings_importexport.export": "Daten exportieren (Export-Datei enthält Passwörter im Klartext)",
|
|
|
|
"settings_importexport.export": "Daten exportieren (Export-Datei enthält Passwörter im Klartext)",
|
|
|
@@ -349,7 +361,7 @@ def _nav_key_visible(key, user):
|
|
|
|
if key == "index":
|
|
|
|
if key == "index":
|
|
|
|
return True
|
|
|
|
return True
|
|
|
|
if key == "tickets":
|
|
|
|
if key == "tickets":
|
|
|
|
return user.has_permission("licenses.view")
|
|
|
|
return user.has_permission("tickets.view")
|
|
|
|
if key == "licenses":
|
|
|
|
if key == "licenses":
|
|
|
|
return user.has_permission("licenses.view")
|
|
|
|
return user.has_permission("licenses.view")
|
|
|
|
if key == "customers":
|
|
|
|
if key == "customers":
|
|
|
@@ -361,10 +373,11 @@ def _nav_key_visible(key, user):
|
|
|
|
if key == "settings_system":
|
|
|
|
if key == "settings_system":
|
|
|
|
return user.can_view_settings_system
|
|
|
|
return user.can_view_settings_system
|
|
|
|
if key == "settings_license":
|
|
|
|
if key == "settings_license":
|
|
|
|
# Immer erreichbar für jeden mit Systemeinstellungen-Leserecht --
|
|
|
|
# Eigenes Recht (settings_license.view), unabhängig von
|
|
|
|
# muss auch OHNE Lizenz sichtbar bleiben, sonst könnte niemand
|
|
|
|
# settings_system -- muss auch OHNE eine aktive Lizenz sichtbar
|
|
|
|
# jemals eine erste Lizenz hochladen/aktivieren.
|
|
|
|
# bleiben (das ist eine andere Prüfung, siehe license_active()),
|
|
|
|
return user.can_view_settings_system
|
|
|
|
# sonst könnte niemand jemals eine erste Lizenz hochladen/aktivieren.
|
|
|
|
|
|
|
|
return user.can_view_settings_license
|
|
|
|
if key == "settings_importexport":
|
|
|
|
if key == "settings_importexport":
|
|
|
|
return user.can_view_settings_importexport
|
|
|
|
return user.can_view_settings_importexport
|
|
|
|
if key == "settings_ldap":
|
|
|
|
if key == "settings_ldap":
|
|
|
@@ -537,6 +550,12 @@ class User(UserMixin):
|
|
|
|
["customers.view", "customers.create", "customers.edit"]
|
|
|
|
["customers.view", "customers.create", "customers.edit"]
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
|
|
|
def can_manage_tickets(self):
|
|
|
|
|
|
|
|
return self.has_any_permission(
|
|
|
|
|
|
|
|
["tickets.view", "tickets.create", "tickets.edit"]
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
@property
|
|
|
|
def can_manage_licenses(self):
|
|
|
|
def can_manage_licenses(self):
|
|
|
|
return self.has_any_permission(
|
|
|
|
return self.has_any_permission(
|
|
|
@@ -559,6 +578,10 @@ class User(UserMixin):
|
|
|
|
def can_view_settings_system(self):
|
|
|
|
def can_view_settings_system(self):
|
|
|
|
return self.has_permission("settings_system.view")
|
|
|
|
return self.has_permission("settings_system.view")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
|
|
|
def can_view_settings_license(self):
|
|
|
|
|
|
|
|
return self.has_permission("settings_license.view")
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
@property
|
|
|
|
def can_view_settings_importexport(self):
|
|
|
|
def can_view_settings_importexport(self):
|
|
|
|
return self.has_any_permission([
|
|
|
|
return self.has_any_permission([
|
|
|
@@ -877,6 +900,64 @@ def _ensure_schema():
|
|
|
|
conn.execute("UPDATE licenses SET ticket_id=? WHERE license_id=?", (ticket_id, lic["license_id"]))
|
|
|
|
conn.execute("UPDATE licenses SET ticket_id=? WHERE license_id=?", (ticket_id, lic["license_id"]))
|
|
|
|
conn.execute("INSERT OR IGNORE INTO settings (key, value) VALUES (?, '1')", (_migration_key_tickets,))
|
|
|
|
conn.execute("INSERT OR IGNORE INTO settings (key, value) VALUES (?, '1')", (_migration_key_tickets,))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_migration_key_license_perm = "_migrated_settings_license_permission_v1"
|
|
|
|
|
|
|
|
if not conn.execute("SELECT 1 FROM settings WHERE key=?", (_migration_key_license_perm,)).fetchone():
|
|
|
|
|
|
|
|
# "Lizenz" (settings_license) hatte bislang KEIN eigenes Recht --
|
|
|
|
|
|
|
|
# die Seite lief komplett über settings_system.view/.edit mit.
|
|
|
|
|
|
|
|
# Backfill: jede Gruppe, die settings_system.view/.edit bereits
|
|
|
|
|
|
|
|
# hatte, bekommt automatisch das neue, gespiegelte
|
|
|
|
|
|
|
|
# settings_license.view/.edit dazu -- ohne diesen Schritt würden
|
|
|
|
|
|
|
|
# bestehende Gruppen beim Update stillschweigend den Zugriff auf
|
|
|
|
|
|
|
|
# die Lizenzseite verlieren, den sie vorher implizit hatten.
|
|
|
|
|
|
|
|
_system_to_license = {
|
|
|
|
|
|
|
|
"settings_system.view": "settings_license.view",
|
|
|
|
|
|
|
|
"settings_system.edit": "settings_license.edit",
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
for system_perm, license_perm in _system_to_license.items():
|
|
|
|
|
|
|
|
rows = conn.execute(
|
|
|
|
|
|
|
|
"SELECT DISTINCT group_id FROM group_permissions WHERE permission=?", (system_perm,)
|
|
|
|
|
|
|
|
).fetchall()
|
|
|
|
|
|
|
|
for row in rows:
|
|
|
|
|
|
|
|
conn.execute(
|
|
|
|
|
|
|
|
"INSERT OR IGNORE INTO group_permissions (group_id, permission) VALUES (?, ?)",
|
|
|
|
|
|
|
|
(row["group_id"], license_perm),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
conn.execute(
|
|
|
|
|
|
|
|
"INSERT OR IGNORE INTO settings (key, value) VALUES (?, '1')", (_migration_key_license_perm,)
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_migration_key_tickets_perm = "_migrated_tickets_permission_v1"
|
|
|
|
|
|
|
|
if not conn.execute("SELECT 1 FROM settings WHERE key=?", (_migration_key_tickets_perm,)).fetchone():
|
|
|
|
|
|
|
|
# "Tickets" hatte bislang KEIN eigenes Recht -- Ticketverwaltung
|
|
|
|
|
|
|
|
# (anlegen/bearbeiten/sperren/loeschen) lief komplett ueber
|
|
|
|
|
|
|
|
# licenses.view/.create/.edit mit, obwohl Tickets ein eigener,
|
|
|
|
|
|
|
|
# gleichberechtigter Navigationspunkt neben Kunden und Lizenzen
|
|
|
|
|
|
|
|
# ist (genau wie bei TESM Clients/Switche/Zugangsdaten trotz enger
|
|
|
|
|
|
|
|
# fachlicher Verwandtschaft jeweils eigene Rechte haben). Backfill:
|
|
|
|
|
|
|
|
# jede Gruppe mit licenses.view/.create/.edit bekommt automatisch
|
|
|
|
|
|
|
|
# das gespiegelte tickets.view/.create/.edit dazu -- das
|
|
|
|
|
|
|
|
# Ausstellen einer Lizenz AUS einem Ticket heraus bleibt bewusst
|
|
|
|
|
|
|
|
# weiterhin an licenses.edit gebunden (siehe ticket_detail()),
|
|
|
|
|
|
|
|
# nur Sperren/Entsperren/Bearbeiten/Loeschen des Tickets selbst
|
|
|
|
|
|
|
|
# wandert auf das neue, unabhaengige Recht.
|
|
|
|
|
|
|
|
_license_to_ticket = {
|
|
|
|
|
|
|
|
"licenses.view": "tickets.view",
|
|
|
|
|
|
|
|
"licenses.create": "tickets.create",
|
|
|
|
|
|
|
|
"licenses.edit": "tickets.edit",
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
for license_perm, ticket_perm in _license_to_ticket.items():
|
|
|
|
|
|
|
|
rows = conn.execute(
|
|
|
|
|
|
|
|
"SELECT DISTINCT group_id FROM group_permissions WHERE permission=?", (license_perm,)
|
|
|
|
|
|
|
|
).fetchall()
|
|
|
|
|
|
|
|
for row in rows:
|
|
|
|
|
|
|
|
conn.execute(
|
|
|
|
|
|
|
|
"INSERT OR IGNORE INTO group_permissions (group_id, permission) VALUES (?, ?)",
|
|
|
|
|
|
|
|
(row["group_id"], ticket_perm),
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
conn.execute(
|
|
|
|
|
|
|
|
"INSERT OR IGNORE INTO settings (key, value) VALUES (?, '1')", (_migration_key_tickets_perm,)
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
_migration_key_old_logs = "_cleaned_up_legacy_rpi_log_files_v1"
|
|
|
|
_migration_key_old_logs = "_cleaned_up_legacy_rpi_log_files_v1"
|
|
|
|
if not conn.execute("SELECT 1 FROM settings WHERE key=?", (_migration_key_old_logs,)).fetchone():
|
|
|
|
if not conn.execute("SELECT 1 FROM settings WHERE key=?", (_migration_key_old_logs,)).fetchone():
|
|
|
|
for stale_log in glob.glob("/var/log/rpi-*.log"):
|
|
|
|
for stale_log in glob.glob("/var/log/rpi-*.log"):
|
|
|
@@ -2528,7 +2609,7 @@ def ticket_new():
|
|
|
|
Lizenz mit bestimmten Eckdaten. Erstellt bewusst noch KEINE Lizenz;
|
|
|
|
Lizenz mit bestimmten Eckdaten. Erstellt bewusst noch KEINE Lizenz;
|
|
|
|
das übernimmt ein separater Schritt auf der Ticket-Detailseite (durch
|
|
|
|
das übernimmt ein separater Schritt auf der Ticket-Detailseite (durch
|
|
|
|
Admin ODER Kunde per Self-Service)."""
|
|
|
|
Admin ODER Kunde per Self-Service)."""
|
|
|
|
if not current_user.has_permission("licenses.create"):
|
|
|
|
if not current_user.has_permission("tickets.create"):
|
|
|
|
flash("Keine Berechtigung, Tickets anzulegen.", "danger")
|
|
|
|
flash("Keine Berechtigung, Tickets anzulegen.", "danger")
|
|
|
|
return redirect(url_for("index"))
|
|
|
|
return redirect(url_for("index"))
|
|
|
|
conn = get_db_connection()
|
|
|
|
conn = get_db_connection()
|
|
|
@@ -2599,7 +2680,7 @@ def ticket_new():
|
|
|
|
@app.route("/tickets/<ticket_id>", methods=["GET", "POST"])
|
|
|
|
@app.route("/tickets/<ticket_id>", methods=["GET", "POST"])
|
|
|
|
@login_required
|
|
|
|
@login_required
|
|
|
|
def ticket_detail(ticket_id):
|
|
|
|
def ticket_detail(ticket_id):
|
|
|
|
if not current_user.can_manage_licenses:
|
|
|
|
if not current_user.can_manage_tickets:
|
|
|
|
flash("Keine Berechtigung.", "danger")
|
|
|
|
flash("Keine Berechtigung.", "danger")
|
|
|
|
return redirect(url_for("index"))
|
|
|
|
return redirect(url_for("index"))
|
|
|
|
conn = get_db_connection()
|
|
|
|
conn = get_db_connection()
|
|
|
@@ -2610,10 +2691,14 @@ def ticket_detail(ticket_id):
|
|
|
|
return redirect(url_for("index"))
|
|
|
|
return redirect(url_for("index"))
|
|
|
|
|
|
|
|
|
|
|
|
if request.method == "POST":
|
|
|
|
if request.method == "POST":
|
|
|
|
|
|
|
|
if "issue_license" in request.form:
|
|
|
|
|
|
|
|
# Ausstellen erzeugt eine LIZENZ (nicht nur eine Ticket-Aenderung)
|
|
|
|
|
|
|
|
# -- bewusst weiterhin ueber das Lizenz-Recht gegated, nicht ueber
|
|
|
|
|
|
|
|
# tickets.edit, damit sich "Tickets verwalten" und "Lizenzen
|
|
|
|
|
|
|
|
# ausstellen" unabhaengig voneinander vergeben lassen.
|
|
|
|
if not current_user.has_permission("licenses.edit"):
|
|
|
|
if not current_user.has_permission("licenses.edit"):
|
|
|
|
flash("Keine Berechtigung.", "danger")
|
|
|
|
flash("Keine Berechtigung, Lizenzen auszustellen.", "danger")
|
|
|
|
elif "issue_license" in request.form:
|
|
|
|
elif not license_active():
|
|
|
|
if not license_active():
|
|
|
|
|
|
|
|
flash("Der Lizenzserver selbst hat keine gültige Lizenz -- Ausstellen ist deaktiviert.", "danger")
|
|
|
|
flash("Der Lizenzserver selbst hat keine gültige Lizenz -- Ausstellen ist deaktiviert.", "danger")
|
|
|
|
elif ticket["status"] != "open":
|
|
|
|
elif ticket["status"] != "open":
|
|
|
|
flash("Ticket ist gesperrt.", "danger")
|
|
|
|
flash("Ticket ist gesperrt.", "danger")
|
|
|
@@ -2626,6 +2711,9 @@ def ticket_detail(ticket_id):
|
|
|
|
flash("Lizenz ausgestellt.", "success")
|
|
|
|
flash("Lizenz ausgestellt.", "success")
|
|
|
|
return redirect(url_for("license_detail", license_id=license_file["license_id"]))
|
|
|
|
return redirect(url_for("license_detail", license_id=license_file["license_id"]))
|
|
|
|
elif "toggle_block" in request.form:
|
|
|
|
elif "toggle_block" in request.form:
|
|
|
|
|
|
|
|
if not current_user.has_permission("tickets.edit"):
|
|
|
|
|
|
|
|
flash("Keine Berechtigung, Tickets zu sperren/entsperren.", "danger")
|
|
|
|
|
|
|
|
else:
|
|
|
|
new_status = "blocked" if ticket["status"] == "open" else "open"
|
|
|
|
new_status = "blocked" if ticket["status"] == "open" else "open"
|
|
|
|
conn.execute("UPDATE license_tickets SET status=? WHERE id=?", (new_status, ticket_id))
|
|
|
|
conn.execute("UPDATE license_tickets SET status=? WHERE id=?", (new_status, ticket_id))
|
|
|
|
conn.commit()
|
|
|
|
conn.commit()
|
|
|
@@ -2654,7 +2742,8 @@ def ticket_detail(ticket_id):
|
|
|
|
master_licensed=license_active(),
|
|
|
|
master_licensed=license_active(),
|
|
|
|
self_service_url=_customer_facing_url("self_service", ticket_id=ticket_id),
|
|
|
|
self_service_url=_customer_facing_url("self_service", ticket_id=ticket_id),
|
|
|
|
portal_request_url=_customer_facing_url("portal_request"),
|
|
|
|
portal_request_url=_customer_facing_url("portal_request"),
|
|
|
|
can_edit=current_user.has_permission("licenses.edit"),
|
|
|
|
can_edit_ticket=current_user.has_permission("tickets.edit"),
|
|
|
|
|
|
|
|
can_issue_license=current_user.has_permission("licenses.edit"),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -2670,7 +2759,7 @@ def ticket_edit(ticket_id):
|
|
|
|
hier bewusst nicht vorgesehen (das Self-Service-Ticket ist an genau
|
|
|
|
hier bewusst nicht vorgesehen (das Self-Service-Ticket ist an genau
|
|
|
|
diesen Kunden gebunden, u.a. weil er ueber dessen Portal-Token
|
|
|
|
diesen Kunden gebunden, u.a. weil er ueber dessen Portal-Token
|
|
|
|
erreichbar ist)."""
|
|
|
|
erreichbar ist)."""
|
|
|
|
if not current_user.has_permission("licenses.edit"):
|
|
|
|
if not current_user.has_permission("tickets.edit"):
|
|
|
|
flash("Keine Berechtigung, Tickets zu bearbeiten.", "danger")
|
|
|
|
flash("Keine Berechtigung, Tickets zu bearbeiten.", "danger")
|
|
|
|
return redirect(url_for("tickets_list"))
|
|
|
|
return redirect(url_for("tickets_list"))
|
|
|
|
conn = get_db_connection()
|
|
|
|
conn = get_db_connection()
|
|
|
@@ -2723,7 +2812,7 @@ def ticket_delete(ticket_id):
|
|
|
|
System verschwinden). Etwaige bereits widerrufene/deaktivierte
|
|
|
|
System verschwinden). Etwaige bereits widerrufene/deaktivierte
|
|
|
|
Lizenzen darunter sind reine Historie und werden mitgeloescht, sonst
|
|
|
|
Lizenzen darunter sind reine Historie und werden mitgeloescht, sonst
|
|
|
|
blieben verwaiste Zeilen mit einer toten ticket_id zurueck."""
|
|
|
|
blieben verwaiste Zeilen mit einer toten ticket_id zurueck."""
|
|
|
|
if not current_user.has_permission("licenses.edit"):
|
|
|
|
if not current_user.has_permission("tickets.edit"):
|
|
|
|
flash("Keine Berechtigung, Tickets zu löschen.", "danger")
|
|
|
|
flash("Keine Berechtigung, Tickets zu löschen.", "danger")
|
|
|
|
return redirect(url_for("tickets_list"))
|
|
|
|
return redirect(url_for("tickets_list"))
|
|
|
|
conn = get_db_connection()
|
|
|
|
conn = get_db_connection()
|
|
|
@@ -3675,7 +3764,7 @@ def tickets_list():
|
|
|
|
Dashboards auf eine rein informative Kacheluebersicht (siehe index())
|
|
|
|
Dashboards auf eine rein informative Kacheluebersicht (siehe index())
|
|
|
|
lebt die eigentliche Verwaltung hier, eigenstaendig ueber die
|
|
|
|
lebt die eigentliche Verwaltung hier, eigenstaendig ueber die
|
|
|
|
Navigation erreichbar."""
|
|
|
|
Navigation erreichbar."""
|
|
|
|
if not current_user.has_permission("licenses.view"):
|
|
|
|
if not current_user.has_permission("tickets.view"):
|
|
|
|
flash("Keine Berechtigung, Tickets anzusehen.", "danger")
|
|
|
|
flash("Keine Berechtigung, Tickets anzusehen.", "danger")
|
|
|
|
return redirect(url_for("index"))
|
|
|
|
return redirect(url_for("index"))
|
|
|
|
conn = get_db_connection()
|
|
|
|
conn = get_db_connection()
|
|
|
@@ -3708,8 +3797,8 @@ def tickets_list():
|
|
|
|
return render_template(
|
|
|
|
return render_template(
|
|
|
|
"tickets.html", tickets=tickets_view, type_labels=LICENSE_TYPE_LABELS, module_labels=MODULE_LABELS,
|
|
|
|
"tickets.html", tickets=tickets_view, type_labels=LICENSE_TYPE_LABELS, module_labels=MODULE_LABELS,
|
|
|
|
all_modules=licensing.ALL_MODULES, license_types=licensing.LICENSE_TYPES,
|
|
|
|
all_modules=licensing.ALL_MODULES, license_types=licensing.LICENSE_TYPES,
|
|
|
|
can_create=current_user.has_permission("licenses.create"),
|
|
|
|
can_create=current_user.has_permission("tickets.create"),
|
|
|
|
can_edit=current_user.has_permission("licenses.edit"),
|
|
|
|
can_edit=current_user.has_permission("tickets.edit"),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -4699,7 +4788,7 @@ def settings():
|
|
|
|
@app.route("/settings/license")
|
|
|
|
@app.route("/settings/license")
|
|
|
|
@login_required
|
|
|
|
@login_required
|
|
|
|
def settings_license():
|
|
|
|
def settings_license():
|
|
|
|
if not current_user.can_view_settings_system:
|
|
|
|
if not current_user.can_view_settings_license:
|
|
|
|
flash("Keine Berechtigung, die Lizenz anzusehen.", "danger")
|
|
|
|
flash("Keine Berechtigung, die Lizenz anzusehen.", "danger")
|
|
|
|
return redirect(url_for("index"))
|
|
|
|
return redirect(url_for("index"))
|
|
|
|
pending_raw = get_setting("license_pending_request", "")
|
|
|
|
pending_raw = get_setting("license_pending_request", "")
|
|
|
@@ -4722,7 +4811,7 @@ def settings_license():
|
|
|
|
@app.route("/settings/license/upload", methods=["POST"])
|
|
|
|
@app.route("/settings/license/upload", methods=["POST"])
|
|
|
|
@login_required
|
|
|
|
@login_required
|
|
|
|
def license_upload():
|
|
|
|
def license_upload():
|
|
|
|
if not current_user.has_permission("settings_system.edit"):
|
|
|
|
if not current_user.has_permission("settings_license.edit"):
|
|
|
|
flash("Keine Berechtigung, die Lizenz zu ändern.", "danger")
|
|
|
|
flash("Keine Berechtigung, die Lizenz zu ändern.", "danger")
|
|
|
|
return redirect(url_for("settings_license"))
|
|
|
|
return redirect(url_for("settings_license"))
|
|
|
|
uploaded = request.files.get("license_file")
|
|
|
|
uploaded = request.files.get("license_file")
|
|
|
@@ -4815,7 +4904,7 @@ def _license_handshake_confirm(action, success_setting_fn, success_log_action, s
|
|
|
|
@app.route("/settings/license/activate", methods=["POST"])
|
|
|
|
@app.route("/settings/license/activate", methods=["POST"])
|
|
|
|
@login_required
|
|
|
|
@login_required
|
|
|
|
def license_activate():
|
|
|
|
def license_activate():
|
|
|
|
if not current_user.has_permission("settings_system.edit"):
|
|
|
|
if not current_user.has_permission("settings_license.edit"):
|
|
|
|
flash("Keine Berechtigung, die Lizenz zu aktivieren.", "danger")
|
|
|
|
flash("Keine Berechtigung, die Lizenz zu aktivieren.", "danger")
|
|
|
|
return redirect(url_for("settings_license"))
|
|
|
|
return redirect(url_for("settings_license"))
|
|
|
|
if not _license_state.get("file") or not _license_state.get("valid"):
|
|
|
|
if not _license_state.get("file") or not _license_state.get("valid"):
|
|
|
@@ -4832,7 +4921,7 @@ def license_activate():
|
|
|
|
@app.route("/settings/license/activate/confirm", methods=["POST"])
|
|
|
|
@app.route("/settings/license/activate/confirm", methods=["POST"])
|
|
|
|
@login_required
|
|
|
|
@login_required
|
|
|
|
def license_activate_confirm():
|
|
|
|
def license_activate_confirm():
|
|
|
|
if not current_user.has_permission("settings_system.edit"):
|
|
|
|
if not current_user.has_permission("settings_license.edit"):
|
|
|
|
flash("Keine Berechtigung, die Lizenz zu aktivieren.", "danger")
|
|
|
|
flash("Keine Berechtigung, die Lizenz zu aktivieren.", "danger")
|
|
|
|
return redirect(url_for("settings_license"))
|
|
|
|
return redirect(url_for("settings_license"))
|
|
|
|
|
|
|
|
|
|
|
@@ -4846,7 +4935,7 @@ def license_activate_confirm():
|
|
|
|
@app.route("/settings/license/deactivate", methods=["POST"])
|
|
|
|
@app.route("/settings/license/deactivate", methods=["POST"])
|
|
|
|
@login_required
|
|
|
|
@login_required
|
|
|
|
def license_deactivate():
|
|
|
|
def license_deactivate():
|
|
|
|
if not current_user.has_permission("settings_system.edit"):
|
|
|
|
if not current_user.has_permission("settings_license.edit"):
|
|
|
|
flash("Keine Berechtigung, die Lizenz zu deaktivieren.", "danger")
|
|
|
|
flash("Keine Berechtigung, die Lizenz zu deaktivieren.", "danger")
|
|
|
|
return redirect(url_for("settings_license"))
|
|
|
|
return redirect(url_for("settings_license"))
|
|
|
|
if not _license_state.get("file") or not license_activated():
|
|
|
|
if not _license_state.get("file") or not license_activated():
|
|
|
@@ -4866,7 +4955,7 @@ def license_deactivate():
|
|
|
|
@app.route("/settings/license/deactivate/confirm", methods=["POST"])
|
|
|
|
@app.route("/settings/license/deactivate/confirm", methods=["POST"])
|
|
|
|
@login_required
|
|
|
|
@login_required
|
|
|
|
def license_deactivate_confirm():
|
|
|
|
def license_deactivate_confirm():
|
|
|
|
if not current_user.has_permission("settings_system.edit"):
|
|
|
|
if not current_user.has_permission("settings_license.edit"):
|
|
|
|
flash("Keine Berechtigung, die Lizenz zu deaktivieren.", "danger")
|
|
|
|
flash("Keine Berechtigung, die Lizenz zu deaktivieren.", "danger")
|
|
|
|
return redirect(url_for("settings_license"))
|
|
|
|
return redirect(url_for("settings_license"))
|
|
|
|
|
|
|
|
|
|
|
|