Benutzer Bearbeitung hinzugefügt
This commit is contained in:
91
app.py
91
app.py
@@ -12,7 +12,7 @@ from werkzeug.security import check_password_hash, generate_password_hash
|
|||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
app.config["SECRET_KEY"] = "dev-secret-key"
|
app.config["SECRET_KEY"] = "dev-secret-key"
|
||||||
APP_VERSION = "2.1.0"
|
APP_VERSION = "2.2.0"
|
||||||
DATABASE = Path(__file__).with_name("inventory.db")
|
DATABASE = Path(__file__).with_name("inventory.db")
|
||||||
LOGFILE = Path(__file__).with_name("inventory.log")
|
LOGFILE = Path(__file__).with_name("inventory.log")
|
||||||
|
|
||||||
@@ -46,7 +46,8 @@ INPUT_PLACEHOLDERS = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
IMPORT_ACTIONS = {"import", "ausgabe", "assign"}
|
IMPORT_ACTIONS = {"import", "ausgabe", "assign"}
|
||||||
IMPORT_HEADER = ["user", "typ", "kennung", "aktion"]
|
IMPORT_HEADER_4 = ["user", "typ", "kennung", "aktion"]
|
||||||
|
IMPORT_HEADER_5 = ["vorname", "nachname", "typ", "kennung", "aktion"]
|
||||||
|
|
||||||
|
|
||||||
def get_db() -> sqlite3.Connection:
|
def get_db() -> sqlite3.Connection:
|
||||||
@@ -261,7 +262,7 @@ def normalize_asset_type(value: str) -> str | None:
|
|||||||
|
|
||||||
def is_import_header(parts: list[str]) -> bool:
|
def is_import_header(parts: list[str]) -> bool:
|
||||||
normalized = [part.strip().lower() for part in parts]
|
normalized = [part.strip().lower() for part in parts]
|
||||||
return normalized == IMPORT_HEADER
|
return normalized == IMPORT_HEADER_4 or normalized == IMPORT_HEADER_5
|
||||||
|
|
||||||
|
|
||||||
def get_transaction_for_print(transaction_id: int) -> sqlite3.Row | None:
|
def get_transaction_for_print(transaction_id: int) -> sqlite3.Row | None:
|
||||||
@@ -477,11 +478,14 @@ def import_data() -> str:
|
|||||||
parts = [part.strip() for part in row.split(";")]
|
parts = [part.strip() for part in row.split(";")]
|
||||||
if is_import_header(parts):
|
if is_import_header(parts):
|
||||||
continue
|
continue
|
||||||
if len(parts) != 4:
|
if len(parts) == 4:
|
||||||
errors.append(f"Zeile {index}: ungueltig. Erwartet wird: User;Typ;Kennung;Aktion")
|
full_name, raw_asset_type, asset_code, raw_action = parts
|
||||||
|
elif len(parts) == 5:
|
||||||
|
first_name, last_name, raw_asset_type, asset_code, raw_action = parts
|
||||||
|
full_name = f"{first_name} {last_name}"
|
||||||
|
else:
|
||||||
|
errors.append(f"Zeile {index}: ungueltig. Erwartet wird: User;Typ;Kennung;Aktion oder Vorname;Nachname;Typ;Kennung;Aktion")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
full_name, raw_asset_type, asset_code, raw_action = parts
|
|
||||||
asset_type = normalize_asset_type(raw_asset_type)
|
asset_type = normalize_asset_type(raw_asset_type)
|
||||||
action = raw_action.strip().lower()
|
action = raw_action.strip().lower()
|
||||||
|
|
||||||
@@ -654,7 +658,7 @@ def index() -> str:
|
|||||||
"""
|
"""
|
||||||
params = (like_value, like_value, like_value, like_value, like_value)
|
params = (like_value, like_value, like_value, like_value, like_value)
|
||||||
|
|
||||||
user_query += " ORDER BY full_name COLLATE NOCASE"
|
user_query += " ORDER BY SUBSTR(full_name, INSTR(full_name, ' ') + 1) COLLATE NOCASE, full_name COLLATE NOCASE"
|
||||||
users = db.execute(user_query, params).fetchall()
|
users = db.execute(user_query, params).fetchall()
|
||||||
|
|
||||||
stats = db.execute(
|
stats = db.execute(
|
||||||
@@ -701,14 +705,16 @@ def index() -> str:
|
|||||||
@login_required
|
@login_required
|
||||||
def create_user() -> str:
|
def create_user() -> str:
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
full_name = request.form.get("full_name", "").strip()
|
first_name = request.form.get("first_name", "").strip()
|
||||||
|
last_name = request.form.get("last_name", "").strip()
|
||||||
email = request.form.get("email", "").strip() or None
|
email = request.form.get("email", "").strip() or None
|
||||||
department = request.form.get("department", "").strip() or None
|
department = request.form.get("department", "").strip() or None
|
||||||
|
|
||||||
if not full_name:
|
if not first_name or not last_name:
|
||||||
flash("Bitte einen Namen eingeben.")
|
flash("Bitte Vor- und Nachname eingeben.")
|
||||||
return redirect(url_for("create_user"))
|
return redirect(url_for("create_user"))
|
||||||
|
|
||||||
|
full_name = f"{first_name} {last_name}"
|
||||||
db = get_db()
|
db = get_db()
|
||||||
db.execute(
|
db.execute(
|
||||||
"INSERT INTO users (full_name, email, department) VALUES (?, ?, ?)",
|
"INSERT INTO users (full_name, email, department) VALUES (?, ?, ?)",
|
||||||
@@ -721,6 +727,65 @@ def create_user() -> str:
|
|||||||
return render_template("create_user.html")
|
return render_template("create_user.html")
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/users/<int:user_id>/edit", methods=["GET", "POST"])
|
||||||
|
@login_required
|
||||||
|
def edit_user(user_id: int) -> str:
|
||||||
|
db = get_db()
|
||||||
|
user = db.execute("SELECT * FROM users WHERE id = ?", (user_id,)).fetchone()
|
||||||
|
if user is None:
|
||||||
|
flash("User wurde nicht gefunden.")
|
||||||
|
return redirect(url_for("index"))
|
||||||
|
|
||||||
|
if request.method == "POST":
|
||||||
|
first_name = request.form.get("first_name", "").strip()
|
||||||
|
last_name = request.form.get("last_name", "").strip()
|
||||||
|
email = request.form.get("email", "").strip() or None
|
||||||
|
department = request.form.get("department", "").strip() or None
|
||||||
|
|
||||||
|
if not first_name or not last_name:
|
||||||
|
flash("Bitte Vor- und Nachname eingeben.")
|
||||||
|
return redirect(url_for("edit_user", user_id=user_id))
|
||||||
|
|
||||||
|
full_name = f"{first_name} {last_name}"
|
||||||
|
db.execute(
|
||||||
|
"UPDATE users SET full_name = ?, email = ?, department = ? WHERE id = ?",
|
||||||
|
(full_name, email, department, user_id),
|
||||||
|
)
|
||||||
|
db.commit()
|
||||||
|
flash("User wurde aktualisiert.")
|
||||||
|
return redirect(url_for("index"))
|
||||||
|
|
||||||
|
parts = user["full_name"].rsplit(" ", 1)
|
||||||
|
first_name = parts[0] if len(parts) > 1 else ""
|
||||||
|
last_name = parts[1] if len(parts) > 1 else parts[0]
|
||||||
|
return render_template(
|
||||||
|
"edit_user.html",
|
||||||
|
user=user,
|
||||||
|
first_name=first_name,
|
||||||
|
last_name=last_name,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/users/<int:user_id>/delete", methods=["POST"])
|
||||||
|
@login_required
|
||||||
|
def delete_user(user_id: int) -> str:
|
||||||
|
db = get_db()
|
||||||
|
user = db.execute("SELECT * FROM users WHERE id = ?", (user_id,)).fetchone()
|
||||||
|
if user is None:
|
||||||
|
flash("User wurde nicht gefunden.")
|
||||||
|
return redirect(url_for("index"))
|
||||||
|
|
||||||
|
if user["chip_code"] or user["parking_card_code"] or user["pool_vehicle_code"]:
|
||||||
|
flash("Der User hat noch aktive Medien. Bitte zuerst alle Medien zuruecknehmen.")
|
||||||
|
return redirect(url_for("edit_user", user_id=user_id))
|
||||||
|
|
||||||
|
db.execute("DELETE FROM transactions WHERE user_id = ?", (user_id,))
|
||||||
|
db.execute("DELETE FROM users WHERE id = ?", (user_id,))
|
||||||
|
db.commit()
|
||||||
|
flash(f"User '{user['full_name']}' wurde geloescht.")
|
||||||
|
return redirect(url_for("index"))
|
||||||
|
|
||||||
|
|
||||||
@app.route("/assign", methods=["GET", "POST"])
|
@app.route("/assign", methods=["GET", "POST"])
|
||||||
@login_required
|
@login_required
|
||||||
def assign_asset() -> str:
|
def assign_asset() -> str:
|
||||||
@@ -785,7 +850,7 @@ def assign_asset() -> str:
|
|||||||
flash("Ausgabe wurde gespeichert.")
|
flash("Ausgabe wurde gespeichert.")
|
||||||
return redirect(url_for("print_transaction", transaction_id=transaction_id))
|
return redirect(url_for("print_transaction", transaction_id=transaction_id))
|
||||||
|
|
||||||
users = db.execute("SELECT id, full_name FROM users ORDER BY full_name COLLATE NOCASE").fetchall()
|
users = db.execute("SELECT id, full_name FROM users ORDER BY SUBSTR(full_name, INSTR(full_name, ' ') + 1) COLLATE NOCASE, full_name COLLATE NOCASE").fetchall()
|
||||||
return render_template(
|
return render_template(
|
||||||
"assign_asset.html",
|
"assign_asset.html",
|
||||||
users=users,
|
users=users,
|
||||||
@@ -852,7 +917,7 @@ def return_asset() -> str:
|
|||||||
flash("Rueckgabe wurde gespeichert.")
|
flash("Rueckgabe wurde gespeichert.")
|
||||||
return redirect(url_for("print_transaction", transaction_id=transaction_id))
|
return redirect(url_for("print_transaction", transaction_id=transaction_id))
|
||||||
|
|
||||||
users = db.execute("SELECT id, full_name FROM users ORDER BY full_name COLLATE NOCASE").fetchall()
|
users = db.execute("SELECT id, full_name FROM users ORDER BY SUBSTR(full_name, INSTR(full_name, ' ') + 1) COLLATE NOCASE, full_name COLLATE NOCASE").fetchall()
|
||||||
return render_template(
|
return render_template(
|
||||||
"return_asset.html",
|
"return_asset.html",
|
||||||
users=users,
|
users=users,
|
||||||
|
|||||||
BIN
inventory.db
BIN
inventory.db
Binary file not shown.
312
inventory.log
312
inventory.log
@@ -1122,3 +1122,315 @@
|
|||||||
2026-05-19 22:42:50,836 INFO * Restarting with stat
|
2026-05-19 22:42:50,836 INFO * Restarting with stat
|
||||||
2026-05-19 22:42:51,090 WARNING * Debugger is active!
|
2026-05-19 22:42:51,090 WARNING * Debugger is active!
|
||||||
2026-05-19 22:42:51,115 INFO * Debugger PIN: 428-899-358
|
2026-05-19 22:42:51,115 INFO * Debugger PIN: 428-899-358
|
||||||
|
2026-05-26 09:29:47,942 INFO [31m[1mWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.[0m
|
||||||
|
* Running on all addresses (0.0.0.0)
|
||||||
|
* Running on http://127.0.0.1:5006
|
||||||
|
* Running on http://10.2.200.72:5006
|
||||||
|
2026-05-26 09:29:47,943 INFO [33mPress CTRL+C to quit[0m
|
||||||
|
2026-05-26 09:29:47,947 INFO * Restarting with stat
|
||||||
|
2026-05-26 09:29:48,095 WARNING * Debugger is active!
|
||||||
|
2026-05-26 09:29:48,123 INFO * Debugger PIN: 120-749-271
|
||||||
|
2026-05-26 09:30:32,960 INFO 127.0.0.1 - - [26/May/2026 09:30:32] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:30:33,169 INFO 127.0.0.1 - - [26/May/2026 09:30:33] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:31:48,540 INFO 127.0.0.1 - - [26/May/2026 09:31:48] "GET /users/new HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:31:48,573 INFO 127.0.0.1 - - [26/May/2026 09:31:48] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:32:45,582 INFO * Detected change in '/Users/erik/Documents/DEV/Key Verwaltung/app.py', reloading
|
||||||
|
2026-05-26 09:32:45,621 INFO * Restarting with stat
|
||||||
|
2026-05-26 09:32:45,895 WARNING * Debugger is active!
|
||||||
|
2026-05-26 09:32:45,911 INFO * Debugger PIN: 120-749-271
|
||||||
|
2026-05-26 09:33:20,454 INFO 127.0.0.1 - - [26/May/2026 09:33:20] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:33:20,486 INFO 127.0.0.1 - - [26/May/2026 09:33:20] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:33:21,481 INFO 127.0.0.1 - - [26/May/2026 09:33:21] "GET /users/new HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:33:21,507 INFO 127.0.0.1 - - [26/May/2026 09:33:21] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:33:31,401 INFO 127.0.0.1 - - [26/May/2026 09:33:31] "GET /assign HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:33:31,429 INFO 127.0.0.1 - - [26/May/2026 09:33:31] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:33:41,231 INFO 127.0.0.1 - - [26/May/2026 09:33:41] "GET /users/new HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:33:41,253 INFO 127.0.0.1 - - [26/May/2026 09:33:41] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:34:11,757 INFO 127.0.0.1 - - [26/May/2026 09:34:11] "[32mPOST /users/new HTTP/1.1[0m" 302 -
|
||||||
|
2026-05-26 09:34:11,787 INFO 127.0.0.1 - - [26/May/2026 09:34:11] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:34:11,813 INFO 127.0.0.1 - - [26/May/2026 09:34:11] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:34:11,819 INFO 127.0.0.1 - - [26/May/2026 09:34:11] "[36mGET /static/favicon.ico HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:35:27,415 INFO * Detected change in '/Users/erik/Documents/DEV/Key Verwaltung/app.py', reloading
|
||||||
|
2026-05-26 09:35:27,446 INFO * Restarting with stat
|
||||||
|
2026-05-26 09:35:27,690 WARNING * Debugger is active!
|
||||||
|
2026-05-26 09:35:27,705 INFO * Debugger PIN: 120-749-271
|
||||||
|
2026-05-26 09:36:41,161 INFO * Detected change in '/Users/erik/Documents/DEV/Key Verwaltung/app.py', reloading
|
||||||
|
2026-05-26 09:36:41,192 INFO * Restarting with stat
|
||||||
|
2026-05-26 09:36:41,430 WARNING * Debugger is active!
|
||||||
|
2026-05-26 09:36:41,444 INFO * Debugger PIN: 120-749-271
|
||||||
|
2026-05-26 09:36:42,560 INFO * Detected change in '/Users/erik/Documents/DEV/Key Verwaltung/app.py', reloading
|
||||||
|
2026-05-26 09:36:42,588 INFO * Restarting with stat
|
||||||
|
2026-05-26 09:36:42,764 WARNING * Debugger is active!
|
||||||
|
2026-05-26 09:36:42,775 INFO * Debugger PIN: 120-749-271
|
||||||
|
2026-05-26 09:36:57,620 INFO 127.0.0.1 - - [26/May/2026 09:36:57] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:36:57,654 INFO 127.0.0.1 - - [26/May/2026 09:36:57] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:37:02,150 INFO 127.0.0.1 - - [26/May/2026 09:37:02] "GET /users/new HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:37:02,177 INFO 127.0.0.1 - - [26/May/2026 09:37:02] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:37:03,443 INFO 127.0.0.1 - - [26/May/2026 09:37:03] "GET /assign HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:37:03,481 INFO 127.0.0.1 - - [26/May/2026 09:37:03] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:37:12,103 INFO 127.0.0.1 - - [26/May/2026 09:37:12] "GET /return HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:37:12,123 INFO 127.0.0.1 - - [26/May/2026 09:37:12] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:37:15,722 INFO 127.0.0.1 - - [26/May/2026 09:37:15] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:37:15,744 INFO 127.0.0.1 - - [26/May/2026 09:37:15] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:37:36,657 INFO 127.0.0.1 - - [26/May/2026 09:37:36] "GET /admin/import HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:37:36,679 INFO 127.0.0.1 - - [26/May/2026 09:37:36] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:37:42,057 INFO 127.0.0.1 - - [26/May/2026 09:37:42] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:37:42,082 INFO 127.0.0.1 - - [26/May/2026 09:37:42] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:39:01,302 INFO * Detected change in '/Users/erik/Documents/DEV/Key Verwaltung/app.py', reloading
|
||||||
|
2026-05-26 09:39:01,337 INFO * Restarting with stat
|
||||||
|
2026-05-26 09:39:02,981 WARNING * Debugger is active!
|
||||||
|
2026-05-26 09:39:03,011 INFO * Debugger PIN: 120-749-271
|
||||||
|
2026-05-26 09:39:04,145 INFO * Detected change in '/Users/erik/Documents/DEV/Key Verwaltung/app.py', reloading
|
||||||
|
2026-05-26 09:39:04,196 INFO * Restarting with stat
|
||||||
|
2026-05-26 09:39:04,514 WARNING * Debugger is active!
|
||||||
|
2026-05-26 09:39:04,531 INFO * Debugger PIN: 120-749-271
|
||||||
|
2026-05-26 09:39:09,836 INFO * Detected change in '/Users/erik/Documents/DEV/Key Verwaltung/app.py', reloading
|
||||||
|
2026-05-26 09:39:09,860 INFO * Restarting with stat
|
||||||
|
2026-05-26 09:39:10,040 WARNING * Debugger is active!
|
||||||
|
2026-05-26 09:39:10,051 INFO * Debugger PIN: 120-749-271
|
||||||
|
2026-05-26 09:39:25,999 INFO 127.0.0.1 - - [26/May/2026 09:39:25] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:39:26,044 INFO 127.0.0.1 - - [26/May/2026 09:39:26] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:39:27,940 INFO 127.0.0.1 - - [26/May/2026 09:39:27] "GET /admin/import HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:39:27,971 INFO 127.0.0.1 - - [26/May/2026 09:39:27] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:39:54,151 INFO 127.0.0.1 - - [26/May/2026 09:39:54] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:39:54,171 INFO 127.0.0.1 - - [26/May/2026 09:39:54] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:39:57,003 INFO 127.0.0.1 - - [26/May/2026 09:39:57] "GET /users/new HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:39:57,024 INFO 127.0.0.1 - - [26/May/2026 09:39:57] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:41:02,435 INFO * Detected change in '/Users/erik/Documents/DEV/Key Verwaltung/app.py', reloading
|
||||||
|
2026-05-26 09:41:02,469 INFO * Restarting with stat
|
||||||
|
2026-05-26 09:41:02,732 WARNING * Debugger is active!
|
||||||
|
2026-05-26 09:41:02,752 INFO * Debugger PIN: 120-749-271
|
||||||
|
2026-05-26 09:41:43,649 INFO 127.0.0.1 - - [26/May/2026 09:41:43] "[35m[1mGET / HTTP/1.1[0m" 500 -
|
||||||
|
2026-05-26 09:41:43,697 INFO 127.0.0.1 - - [26/May/2026 09:41:43] "GET /?__debugger__=yes&cmd=resource&f=style.css HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:41:43,705 INFO 127.0.0.1 - - [26/May/2026 09:41:43] "GET /?__debugger__=yes&cmd=resource&f=debugger.js HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:41:43,710 INFO 127.0.0.1 - - [26/May/2026 09:41:43] "GET /?__debugger__=yes&cmd=resource&f=console.png HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:41:43,713 INFO 127.0.0.1 - - [26/May/2026 09:41:43] "GET /?__debugger__=yes&cmd=resource&f=console.png&s=L3AK89IbPCI5lW5l4bmf HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:42:51,765 INFO * Detected change in '/Users/erik/Documents/DEV/Key Verwaltung/app.py', reloading
|
||||||
|
2026-05-26 09:42:51,809 INFO * Restarting with stat
|
||||||
|
2026-05-26 09:42:52,092 WARNING * Debugger is active!
|
||||||
|
2026-05-26 09:42:52,117 INFO * Debugger PIN: 120-749-271
|
||||||
|
2026-05-26 09:43:02,764 INFO 127.0.0.1 - - [26/May/2026 09:43:02] "[33mGET /favicon.ico HTTP/1.1[0m" 404 -
|
||||||
|
2026-05-26 09:43:05,542 INFO 127.0.0.1 - - [26/May/2026 09:43:05] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:43:05,567 INFO 127.0.0.1 - - [26/May/2026 09:43:05] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:43:08,539 INFO 127.0.0.1 - - [26/May/2026 09:43:08] "GET /users/new HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:43:08,562 INFO 127.0.0.1 - - [26/May/2026 09:43:08] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:43:17,991 INFO 127.0.0.1 - - [26/May/2026 09:43:17] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:43:18,016 INFO 127.0.0.1 - - [26/May/2026 09:43:18] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:43:26,062 INFO 127.0.0.1 - - [26/May/2026 09:43:26] "GET /users/1/edit HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:43:26,085 INFO 127.0.0.1 - - [26/May/2026 09:43:26] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:43:41,891 INFO 127.0.0.1 - - [26/May/2026 09:43:41] "[32mPOST /users/1/edit HTTP/1.1[0m" 302 -
|
||||||
|
2026-05-26 09:43:41,916 INFO 127.0.0.1 - - [26/May/2026 09:43:41] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:43:41,938 INFO 127.0.0.1 - - [26/May/2026 09:43:41] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:43:41,950 INFO 127.0.0.1 - - [26/May/2026 09:43:41] "[36mGET /static/favicon.ico HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:43:46,667 INFO 127.0.0.1 - - [26/May/2026 09:43:46] "GET /users/1/edit HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:43:46,688 INFO 127.0.0.1 - - [26/May/2026 09:43:46] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:43:49,793 INFO 127.0.0.1 - - [26/May/2026 09:43:49] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:43:49,820 INFO 127.0.0.1 - - [26/May/2026 09:43:49] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:43:51,867 INFO 127.0.0.1 - - [26/May/2026 09:43:51] "GET /users/2/edit HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:43:51,889 INFO 127.0.0.1 - - [26/May/2026 09:43:51] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:44:02,825 INFO 127.0.0.1 - - [26/May/2026 09:44:02] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:44:02,851 INFO 127.0.0.1 - - [26/May/2026 09:44:02] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:44:09,620 INFO 127.0.0.1 - - [26/May/2026 09:44:09] "GET /admin/import HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:44:09,641 INFO 127.0.0.1 - - [26/May/2026 09:44:09] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:46:57,637 INFO 127.0.0.1 - - [26/May/2026 09:46:57] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:46:57,662 INFO 127.0.0.1 - - [26/May/2026 09:46:57] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:47:01,864 INFO 127.0.0.1 - - [26/May/2026 09:47:01] "GET /users/new HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:47:01,885 INFO 127.0.0.1 - - [26/May/2026 09:47:01] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:47:02,952 INFO 127.0.0.1 - - [26/May/2026 09:47:02] "GET /assign HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:47:02,972 INFO 127.0.0.1 - - [26/May/2026 09:47:02] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:47:04,065 INFO 127.0.0.1 - - [26/May/2026 09:47:04] "GET /admin/import HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:47:04,088 INFO 127.0.0.1 - - [26/May/2026 09:47:04] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:51:09,481 INFO 127.0.0.1 - - [26/May/2026 09:51:09] "GET /users/new HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:51:09,524 INFO 127.0.0.1 - - [26/May/2026 09:51:09] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:51:09,909 INFO 127.0.0.1 - - [26/May/2026 09:51:09] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:51:09,942 INFO 127.0.0.1 - - [26/May/2026 09:51:09] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:51:12,450 INFO 127.0.0.1 - - [26/May/2026 09:51:12] "GET /users/2/edit HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:51:12,472 INFO 127.0.0.1 - - [26/May/2026 09:51:12] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:51:57,605 INFO * Detected change in '/Users/erik/Documents/DEV/Key Verwaltung/app.py', reloading
|
||||||
|
2026-05-26 09:51:57,636 INFO * Restarting with stat
|
||||||
|
2026-05-26 09:51:57,992 WARNING * Debugger is active!
|
||||||
|
2026-05-26 09:51:58,020 INFO * Debugger PIN: 120-749-271
|
||||||
|
2026-05-26 09:52:35,598 INFO 127.0.0.1 - - [26/May/2026 09:52:35] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:52:35,630 INFO 127.0.0.1 - - [26/May/2026 09:52:35] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:52:40,242 INFO 127.0.0.1 - - [26/May/2026 09:52:40] "GET /users/1/edit HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:52:40,269 INFO 127.0.0.1 - - [26/May/2026 09:52:40] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:52:46,923 INFO 127.0.0.1 - - [26/May/2026 09:52:46] "[32mPOST /users/1/delete HTTP/1.1[0m" 302 -
|
||||||
|
2026-05-26 09:52:46,932 INFO 127.0.0.1 - - [26/May/2026 09:52:46] "GET /users/1/edit HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:52:46,958 INFO 127.0.0.1 - - [26/May/2026 09:52:46] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:52:46,967 INFO 127.0.0.1 - - [26/May/2026 09:52:46] "[36mGET /static/favicon.ico HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:53:18,318 INFO 127.0.0.1 - - [26/May/2026 09:53:18] "GET /return HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:53:18,345 INFO 127.0.0.1 - - [26/May/2026 09:53:18] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 09:53:25,571 INFO 127.0.0.1 - - [26/May/2026 09:53:25] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 09:53:25,592 INFO 127.0.0.1 - - [26/May/2026 09:53:25] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:33:39,758 INFO 127.0.0.1 - - [26/May/2026 10:33:39] "GET /admin/import HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:33:39,814 INFO 127.0.0.1 - - [26/May/2026 10:33:39] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:37:03,373 INFO 127.0.0.1 - - [26/May/2026 10:37:03] "[32mPOST /admin/import HTTP/1.1[0m" 302 -
|
||||||
|
2026-05-26 10:37:03,380 INFO 127.0.0.1 - - [26/May/2026 10:37:03] "GET /admin/import HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:37:03,398 INFO 127.0.0.1 - - [26/May/2026 10:37:03] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:37:03,405 INFO 127.0.0.1 - - [26/May/2026 10:37:03] "[36mGET /static/favicon.ico HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:37:56,357 INFO import | user= Generalschluessel | typ=Tuerchip | kennung=1 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Ralf Binder | typ=Tuerchip | kennung=2 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Julia Bechtle | typ=Tuerchip | kennung=3 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Benedict Scheller | typ=Tuerchip | kennung=5 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user= Wachdienst | typ=Tuerchip | kennung=6 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Mario Klar | typ=Tuerchip | kennung=7 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Thomas Schirmer | typ=Tuerchip | kennung=8 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Helene Abrahams | typ=Tuerchip | kennung=9 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Dusanka Panic | typ=Tuerchip | kennung=16 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Martin Layh | typ=Tuerchip | kennung=18 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Daniele Cannata | typ=Tuerchip | kennung=20 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Marcus Schnizer | typ=Tuerchip | kennung=21 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Oliver Frank | typ=Tuerchip | kennung=22 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Alexander Gier | typ=Tuerchip | kennung=23 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Philipp Goedrich | typ=Tuerchip | kennung=24 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Tobias Beller | typ=Tuerchip | kennung=25 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Thorsten Micha | typ=Tuerchip | kennung=26 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Stefan Renz | typ=Tuerchip | kennung=27 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Harald Hagenlocher | typ=Tuerchip | kennung=28 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Mohammed Rami | typ=Tuerchip | kennung=29 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=FrauSchnorr ReinigungsdienstBauer | typ=Tuerchip | kennung=31 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Jochen Porep | typ=Tuerchip | kennung=34 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,358 INFO import | user=Christian Maurer | typ=Tuerchip | kennung=36 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Turker Kaleburun | typ=Tuerchip | kennung=42 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Marc Hofmann | typ=Tuerchip | kennung=46 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Klaus Treiber | typ=Tuerchip | kennung=47 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Andreas Pyter | typ=Tuerchip | kennung=48 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Christian Glück | typ=Tuerchip | kennung=49 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Dennis Steck | typ=Tuerchip | kennung=50 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Yannik Neuberth | typ=Tuerchip | kennung=52 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Sebastian Buchholz | typ=Tuerchip | kennung=53 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Andreas Edelmann | typ=Tuerchip | kennung=54 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Sascha Almer | typ=Tuerchip | kennung=58 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Stefan Schäfer | typ=Tuerchip | kennung=59 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Frank Raith | typ=Tuerchip | kennung=60 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Sebastian Otte | typ=Tuerchip | kennung=62 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Blind Reinigung | typ=Tuerchip | kennung=65 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Katrin Lindemann | typ=Tuerchip | kennung=67 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Martin Schmid | typ=Tuerchip | kennung=69 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Christoph Linhart | typ=Tuerchip | kennung=74 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Thomas Kranert | typ=Tuerchip | kennung=76 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user= Guttmann,Henry | typ=Tuerchip | kennung=77 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user= Brandt,Thomas | typ=Tuerchip | kennung=78 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user= Litschewsky,Daniel | typ=Tuerchip | kennung=81 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Michelle Roth | typ=Tuerchip | kennung=83 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user= Freitag,Alina | typ=Tuerchip | kennung=84 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Felix Aldinger | typ=Tuerchip | kennung=85 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user= Sturm,Stefan | typ=Tuerchip | kennung=86 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user= Hoffmann,Philip | typ=Tuerchip | kennung=87 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user= Schmidt,Achim | typ=Tuerchip | kennung=88 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user= Schnaidt,Christoph | typ=Tuerchip | kennung=89 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user= Augustin,Nikola | typ=Tuerchip | kennung=90 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user= Frerichs,Uwe | typ=Tuerchip | kennung=91 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user= Ullrich,Felix | typ=Tuerchip | kennung=92 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Jacqueline Decker | typ=Tuerchip | kennung=93 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=ICT Catal,Selcuk | typ=Tuerchip | kennung=94 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Paul Kern | typ=Tuerchip | kennung=100 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Marius Angeli | typ=Tuerchip | kennung=111 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Richter Jannik | typ=Tuerchip | kennung=114 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Noah Schmidt | typ=Tuerchip | kennung=118 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Goran Vugrinec | typ=Tuerchip | kennung=119 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Erik Thiele | typ=Tuerchip | kennung=120 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,359 INFO import | user=Leonard Mitrovic | typ=Tuerchip | kennung=124 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user= Maier,Adrian | typ=Tuerchip | kennung=127 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Massimo Esposito | typ=Tuerchip | kennung=130 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Joachim Braeuer | typ=Tuerchip | kennung=133 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Jannis Schulze | typ=Tuerchip | kennung=138 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Patrick Prettl | typ=Tuerchip | kennung=139 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Patrick Laux | typ=Tuerchip | kennung=141 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Stipan Saran | typ=Tuerchip | kennung=146 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Sabrina Woodson | typ=Tuerchip | kennung=149 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Christos Karalis | typ=Tuerchip | kennung=151 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Filip Mitrovic | typ=Tuerchip | kennung=157 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=David Schreiber | typ=Tuerchip | kennung=160 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Linus Wachter | typ=Tuerchip | kennung=167 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Joel Hirsch | typ=Tuerchip | kennung=168 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Henrik Stieben | typ=Tuerchip | kennung=169 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Patrick Schaefer | typ=Tuerchip | kennung=170 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Linus Kempfle | typ=Tuerchip | kennung=171 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Jan Kirchner | typ=Tuerchip | kennung=173 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Lorenzo Lima | typ=Tuerchip | kennung=174 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Sebastian Noack | typ=Tuerchip | kennung=175 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Michael Gebert | typ=Tuerchip | kennung=176 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Svenja Janssen | typ=Tuerchip | kennung=180 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Manuela Herberich | typ=Tuerchip | kennung=183 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Peter Weickenmeier | typ=Tuerchip | kennung=196 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Clemens Eberhardt | typ=Tuerchip | kennung=197 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Kundenzugang Alarmloeschen | typ=Tuerchip | kennung=201 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Katharina Keiss | typ=Tuerchip | kennung=210 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Robert Reiter | typ=Tuerchip | kennung=215 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Mathias Litzinger | typ=Tuerchip | kennung=216 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Mike Matis | typ=Tuerchip | kennung=217 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=David Pipus | typ=Tuerchip | kennung=218 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Leandro Ribeiro | typ=Tuerchip | kennung=219 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=Ronald Zinn | typ=Tuerchip | kennung=220 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,360 INFO import | user=1 Reinigungsdienst | typ=Tuerchip | kennung=221 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,361 INFO import | user=2 Reinigungsdienst | typ=Tuerchip | kennung=222 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,361 INFO import | user=3 Reinigungsdienst | typ=Tuerchip | kennung=223 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,361 INFO import | user=4 Reinigungsdienst | typ=Tuerchip | kennung=224 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,361 INFO import | user=5 Reinigungsdienst | typ=Tuerchip | kennung=225 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,361 INFO import | user=6 Reinigungsdienst | typ=Tuerchip | kennung=226 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,361 INFO import | user=Bedeinteile ErrichterZugang | typ=Tuerchip | kennung=63 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,361 INFO import | user=Reinigung Ersatz | typ=Tuerchip | kennung=145 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,361 INFO import | user=Ersatz B¸rots | typ=Tuerchip | kennung=227 | bearbeiter=Import
|
||||||
|
2026-05-26 10:37:56,364 INFO 127.0.0.1 - - [26/May/2026 10:37:56] "[32mPOST /admin/import HTTP/1.1[0m" 302 -
|
||||||
|
2026-05-26 10:37:56,391 INFO 127.0.0.1 - - [26/May/2026 10:37:56] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:37:56,420 INFO 127.0.0.1 - - [26/May/2026 10:37:56] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:37:56,450 INFO 127.0.0.1 - - [26/May/2026 10:37:56] "[36mGET /static/favicon.ico HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:38:50,088 INFO 127.0.0.1 - - [26/May/2026 10:38:50] "GET /users/95/edit HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:38:50,111 INFO 127.0.0.1 - - [26/May/2026 10:38:50] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:39:00,010 INFO 127.0.0.1 - - [26/May/2026 10:39:00] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:39:00,036 INFO 127.0.0.1 - - [26/May/2026 10:39:00] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:39:14,743 INFO 127.0.0.1 - - [26/May/2026 10:39:14] "GET /?q=224 HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:39:14,764 INFO 127.0.0.1 - - [26/May/2026 10:39:14] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:39:26,622 INFO 127.0.0.1 - - [26/May/2026 10:39:26] "GET /?q=Reinigung HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:39:26,648 INFO 127.0.0.1 - - [26/May/2026 10:39:26] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:39:56,959 INFO 127.0.0.1 - - [26/May/2026 10:39:56] "GET /?q= HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:39:56,981 INFO 127.0.0.1 - - [26/May/2026 10:39:56] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:41:22,855 INFO 127.0.0.1 - - [26/May/2026 10:41:22] "GET /assign HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:41:22,879 INFO 127.0.0.1 - - [26/May/2026 10:41:22] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:41:41,945 INFO 127.0.0.1 - - [26/May/2026 10:41:41] "GET /return HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:41:41,968 INFO 127.0.0.1 - - [26/May/2026 10:41:41] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:41:52,001 INFO rueckgabe | user=Erik Thiele | typ=Poolfahrzeug | kennung=GZ-CC-433E | bearbeiter=Administrator
|
||||||
|
2026-05-26 10:41:52,001 INFO 127.0.0.1 - - [26/May/2026 10:41:52] "[32mPOST /return HTTP/1.1[0m" 302 -
|
||||||
|
2026-05-26 10:41:52,023 INFO 127.0.0.1 - - [26/May/2026 10:41:52] "GET /transactions/108/print HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:41:52,046 INFO 127.0.0.1 - - [26/May/2026 10:41:52] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:41:52,049 INFO 127.0.0.1 - - [26/May/2026 10:41:52] "[36mGET /static/favicon.ico HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:41:54,972 INFO 127.0.0.1 - - [26/May/2026 10:41:54] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:41:54,996 INFO 127.0.0.1 - - [26/May/2026 10:41:54] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:41:55,029 INFO 127.0.0.1 - - [26/May/2026 10:41:55] "[36mGET /static/favicon.ico HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:42:49,823 INFO 127.0.0.1 - - [26/May/2026 10:42:49] "GET /users/new HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:42:49,846 INFO 127.0.0.1 - - [26/May/2026 10:42:49] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:42:52,036 INFO 127.0.0.1 - - [26/May/2026 10:42:52] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:42:52,059 INFO 127.0.0.1 - - [26/May/2026 10:42:52] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:42:59,705 INFO 127.0.0.1 - - [26/May/2026 10:42:59] "GET /users/9/edit HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:42:59,730 INFO 127.0.0.1 - - [26/May/2026 10:42:59] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 10:43:12,497 INFO 127.0.0.1 - - [26/May/2026 10:43:12] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 10:43:12,519 INFO 127.0.0.1 - - [26/May/2026 10:43:12] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 13:05:35,439 INFO 127.0.0.1 - - [26/May/2026 13:05:35] "GET /?q=laux HTTP/1.1" 200 -
|
||||||
|
2026-05-26 13:05:35,496 INFO 127.0.0.1 - - [26/May/2026 13:05:35] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 13:05:47,475 INFO 127.0.0.1 - - [26/May/2026 13:05:47] "GET /assign HTTP/1.1" 200 -
|
||||||
|
2026-05-26 13:05:47,499 INFO 127.0.0.1 - - [26/May/2026 13:05:47] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 13:06:14,663 INFO ausgabe | user=Patrick Laux | typ=Parkkarte | kennung=151 | bearbeiter=Administrator
|
||||||
|
2026-05-26 13:06:14,664 INFO 127.0.0.1 - - [26/May/2026 13:06:14] "[32mPOST /assign HTTP/1.1[0m" 302 -
|
||||||
|
2026-05-26 13:06:14,677 INFO 127.0.0.1 - - [26/May/2026 13:06:14] "GET /transactions/109/print HTTP/1.1" 200 -
|
||||||
|
2026-05-26 13:06:14,698 INFO 127.0.0.1 - - [26/May/2026 13:06:14] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 13:06:14,711 INFO 127.0.0.1 - - [26/May/2026 13:06:14] "[36mGET /static/favicon.ico HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 13:08:47,255 INFO 127.0.0.1 - - [26/May/2026 13:08:47] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 13:08:47,283 INFO 127.0.0.1 - - [26/May/2026 13:08:47] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 13:08:47,312 INFO 127.0.0.1 - - [26/May/2026 13:08:47] "[36mGET /static/favicon.ico HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 13:08:48,765 INFO 127.0.0.1 - - [26/May/2026 13:08:48] "GET /admin/import HTTP/1.1" 200 -
|
||||||
|
2026-05-26 13:08:48,794 INFO 127.0.0.1 - - [26/May/2026 13:08:48] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 13:08:58,882 INFO 127.0.0.1 - - [26/May/2026 13:08:58] "GET /return HTTP/1.1" 200 -
|
||||||
|
2026-05-26 13:08:58,914 INFO 127.0.0.1 - - [26/May/2026 13:08:58] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 13:27:05,420 INFO 127.0.0.1 - - [26/May/2026 13:27:05] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 13:27:05,464 INFO 127.0.0.1 - - [26/May/2026 13:27:05] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
2026-05-26 16:49:45,930 INFO [31m[1mWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.[0m
|
||||||
|
* Running on all addresses (0.0.0.0)
|
||||||
|
* Running on http://127.0.0.1:5006
|
||||||
|
* Running on http://10.2.200.72:5006
|
||||||
|
2026-05-26 16:49:45,933 INFO [33mPress CTRL+C to quit[0m
|
||||||
|
2026-05-26 16:49:45,939 INFO * Restarting with stat
|
||||||
|
2026-05-26 16:49:46,092 WARNING * Debugger is active!
|
||||||
|
2026-05-26 16:49:46,119 INFO * Debugger PIN: 428-899-358
|
||||||
|
2026-05-26 16:50:22,034 INFO 127.0.0.1 - - [26/May/2026 16:50:22] "GET / HTTP/1.1" 200 -
|
||||||
|
2026-05-26 16:50:22,070 INFO 127.0.0.1 - - [26/May/2026 16:50:22] "[36mGET /static/cancom.svg HTTP/1.1[0m" 304 -
|
||||||
|
|||||||
4415
session-ses_1c38.md
Normal file
4415
session-ses_1c38.md
Normal file
File diff suppressed because it is too large
Load Diff
@@ -15,7 +15,7 @@
|
|||||||
<select class="form-select" name="user_id" required>
|
<select class="form-select" name="user_id" required>
|
||||||
<option value="">Bitte waehlen</option>
|
<option value="">Bitte waehlen</option>
|
||||||
{% for user in users %}
|
{% for user in users %}
|
||||||
<option value="{{ user.id }}">{{ user.full_name }}</option>
|
<option value="{{ user.id }}">{{ user.full_name.rsplit(' ', 1)[1] }}, {{ user.full_name.rsplit(' ', 1)[0] }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -11,8 +11,16 @@
|
|||||||
<h2 class="card-title"><i class="ti ti-user-plus me-1"></i>Neuen User anlegen</h2>
|
<h2 class="card-title"><i class="ti ti-user-plus me-1"></i>Neuen User anlegen</h2>
|
||||||
<form method="post" action="{{ url_for('create_user') }}">
|
<form method="post" action="{{ url_for('create_user') }}">
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label">Vollständiger Name</label>
|
<div class="row">
|
||||||
<input class="form-control" type="text" name="full_name" required>
|
<div class="col">
|
||||||
|
<label class="form-label">Vorname</label>
|
||||||
|
<input class="form-control" type="text" name="first_name" required>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<label class="form-label">Nachname</label>
|
||||||
|
<input class="form-control" type="text" name="last_name" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label">E-Mail</label>
|
<label class="form-label">E-Mail</label>
|
||||||
|
|||||||
72
templates/edit_user.html
Normal file
72
templates/edit_user.html
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="page-section-title">
|
||||||
|
<h1>User bearbeiten</h1>
|
||||||
|
<p>Stammdaten des Users aktualisieren.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<section class="card form-card">
|
||||||
|
<div class="card-body">
|
||||||
|
<h2 class="card-title"><i class="ti ti-user-edit me-1"></i>Userdaten</h2>
|
||||||
|
<form method="post" action="{{ url_for('edit_user', user_id=user.id) }}">
|
||||||
|
<div class="row mb-3">
|
||||||
|
<div class="col">
|
||||||
|
<label class="form-label">Vorname</label>
|
||||||
|
<input class="form-control" type="text" name="first_name" value="{{ first_name }}" required>
|
||||||
|
</div>
|
||||||
|
<div class="col">
|
||||||
|
<label class="form-label">Nachname</label>
|
||||||
|
<input class="form-control" type="text" name="last_name" value="{{ last_name }}" required>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label class="form-label">E-Mail</label>
|
||||||
|
<input class="form-control" type="email" name="email" value="{{ user.email or '' }}">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label class="form-label">Abteilung</label>
|
||||||
|
<input class="form-control" type="text" name="department" value="{{ user.department or '' }}">
|
||||||
|
</div>
|
||||||
|
<button class="btn btn-primary" type="submit"><i class="ti ti-device-floppy me-1"></i>Speichern</button>
|
||||||
|
<a class="btn btn-outline-secondary" href="{{ url_for('index') }}">Abbrechen</a>
|
||||||
|
<button class="btn btn-danger float-end" type="button" onclick="if(confirm('User wirklich loeschen?')){document.getElementById('delete-form').submit();}"><i class="ti ti-trash me-1"></i>Loeschen</button>
|
||||||
|
</form>
|
||||||
|
<form id="delete-form" method="post" action="{{ url_for('delete_user', user_id=user.id) }}"></form>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="card mt-4">
|
||||||
|
<div class="card-header">
|
||||||
|
<h2 class="card-title"><i class="ti ti-key me-1"></i>Zugeordnete Medien</h2>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<table class="table table-vcenter">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Typ</th>
|
||||||
|
<th>Kennung</th>
|
||||||
|
<th>Vergeben seit</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>Türchip</td>
|
||||||
|
<td>{{ user.chip_code or "-" }}</td>
|
||||||
|
<td>{{ user.chip_assigned_at or "-" }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Parkkarte</td>
|
||||||
|
<td>{{ user.parking_card_code or "-" }}</td>
|
||||||
|
<td>{{ user.parking_card_assigned_at or "-" }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Poolfahrzeug</td>
|
||||||
|
<td>{{ user.pool_vehicle_code or "-" }}</td>
|
||||||
|
<td>{{ user.pool_vehicle_assigned_at or "-" }}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
{% endblock %}
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
<section class="card form-card">
|
<section class="card form-card">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h2 class="card-title"><i class="ti ti-file-import me-1"></i>Importdaten einfügen</h2>
|
<h2 class="card-title"><i class="ti ti-file-import me-1"></i>Importdaten einfügen</h2>
|
||||||
<p class="muted">CSV-Format pro Zeile: <code>User;Typ;Kennung;Aktion</code>. Für die Aktion ist <code>Import</code> vorgesehen.</p>
|
<p class="muted">CSV-Formate: <code>User;Typ;Kennung;Aktion</code> oder <code>Vorname;Nachname;Typ;Kennung;Aktion</code>. Für die Aktion ist <code>Import</code> vorgesehen.</p>
|
||||||
<form method="post" action="{{ url_for('import_data') }}" enctype="multipart/form-data">
|
<form method="post" action="{{ url_for('import_data') }}" enctype="multipart/form-data">
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label">CSV-Datei</label>
|
<label class="form-label">CSV-Datei</label>
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label class="form-label">Importzeilen alternativ direkt einfügen</label>
|
<label class="form-label">Importzeilen alternativ direkt einfügen</label>
|
||||||
<textarea class="form-control" name="import_rows" rows="12" placeholder="Max Mustermann;Tuerchip;CHIP-1001;Import Erika Muster;Parkkarte;PARK-2001;Import"></textarea>
|
<textarea class="form-control" name="import_rows" rows="12" placeholder="Max;Mustermann;Tuerchip;CHIP-1001;Import Erika;Muster;Parkkarte;PARK-2001;Import"></textarea>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-primary" type="submit"><i class="ti ti-database-import me-1"></i>Import ausfuehren</button>
|
<button class="btn btn-primary" type="submit"><i class="ti ti-database-import me-1"></i>Import ausfuehren</button>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -80,12 +80,13 @@
|
|||||||
<th>Türchip</th>
|
<th>Türchip</th>
|
||||||
<th>Parkkarte</th>
|
<th>Parkkarte</th>
|
||||||
<th>Poolfahrzeug</th>
|
<th>Poolfahrzeug</th>
|
||||||
|
<th></th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for user in users %}
|
{% for user in users %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ user.full_name }}</td>
|
<td>{% set parts = user.full_name.rsplit(' ', 1) %}{{ parts[1] }}, {{ parts[0] }}</td>
|
||||||
<td>{{ user.email or "-" }}</td>
|
<td>{{ user.email or "-" }}</td>
|
||||||
<td>{{ user.department or "-" }}</td>
|
<td>{{ user.department or "-" }}</td>
|
||||||
<td>
|
<td>
|
||||||
@@ -112,6 +113,7 @@
|
|||||||
-
|
-
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
|
<td><a class="btn btn-sm btn-outline-secondary" href="{{ url_for('edit_user', user_id=user.id) }}"><i class="ti ti-edit"></i></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
<select class="form-select" name="user_id" required>
|
<select class="form-select" name="user_id" required>
|
||||||
<option value="">Bitte waehlen</option>
|
<option value="">Bitte waehlen</option>
|
||||||
{% for user in users %}
|
{% for user in users %}
|
||||||
<option value="{{ user.id }}">{{ user.full_name }}</option>
|
<option value="{{ user.id }}">{{ user.full_name.rsplit(' ', 1)[1] }}, {{ user.full_name.rsplit(' ', 1)[0] }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user