diff --git a/app/flask-postgres/app/app.py b/app/flask-postgres/app/app.py index 0d3fac0..9f86f1f 100644 --- a/app/flask-postgres/app/app.py +++ b/app/flask-postgres/app/app.py @@ -1487,4 +1487,119 @@ def admin_checklist(): form_error=form_error, form_values=form_values, **get_current_user() + ) + +@app.route("/admin/courses", methods=["GET", "POST"]) +@admin_required +def admin_courses(): + conn = get_connection() + cur = conn.cursor() + + form_error = None + form_values = None + + video_dir = os.path.join("/app/images/videos") + video_files = [] + if os.path.isdir(video_dir): + video_files = sorted([ + f for f in os.listdir(video_dir) + if f.lower().endswith(".mp4") + ]) + + if request.method == "POST": + action = request.form.get("action") + + code = request.form.get("code", "").strip().upper() + title = request.form.get("title", "").strip() + description = request.form.get("description", "").strip() + min_level = request.form.get("min_level", "").strip() + video_file = request.form.get("video_file", "").strip() + sort_order = request.form.get("sort_order", "0").strip() + + form_values = { + "code": code, + "title": title, + "description": description, + "min_level": min_level, + "video_file": video_file, + "sort_order": sort_order + } + + if action == "create": + if not code: + form_error = "Code ist Pflicht." + elif not title: + form_error = "Titel ist Pflicht." + elif not min_level: + form_error = "Level ist Pflicht." + elif not video_file: + form_error = "Video-Datei ist Pflicht." + else: + cur.execute(""" + INSERT INTO course (code, title, description, min_level, video_file, sort_order) + VALUES (%s, %s, %s, %s, %s, %s) + """, ( + code, + title, + description or None, + int(min_level), + video_file, + int(sort_order or 0) + )) + conn.commit() + + elif action == "update": + course_id = request.form.get("id") + + if not code: + form_error = "Code ist Pflicht." + elif not title: + form_error = "Titel ist Pflicht." + elif not min_level: + form_error = "Level ist Pflicht." + elif not video_file: + form_error = "Video-Datei ist Pflicht." + else: + cur.execute(""" + UPDATE course + SET code=%s, + title=%s, + description=%s, + min_level=%s, + video_file=%s, + sort_order=%s + WHERE id=%s + """, ( + code, + title, + description or None, + int(min_level), + video_file, + int(sort_order or 0), + int(course_id) + )) + conn.commit() + + elif action == "delete": + course_id = request.form.get("id") + cur.execute("DELETE FROM course WHERE id=%s", (int(course_id),)) + conn.commit() + + cur.execute(""" + SELECT id, code, title, description, min_level, video_file, sort_order + FROM course + ORDER BY min_level, sort_order, id + """) + courses = fetchall_dict(cur) + + cur.close() + conn.close() + + return render_template( + "admin_courses.html", + courses=courses, + video_files=video_files, + form_error=form_error, + form_values=form_values, + **get_current_user() ) \ No newline at end of file diff --git a/app/flask-postgres/app/templates/admin_courses.html b/app/flask-postgres/app/templates/admin_courses.html new file mode 100644 index 0000000..89bfe44 --- /dev/null +++ b/app/flask-postgres/app/templates/admin_courses.html @@ -0,0 +1,131 @@ +{% extends "base.html" %} + +{% block content %} + +
| ID | +Code | +Titel | +Level | +Video | +Sort | +Aktionen | +
|---|---|---|---|---|---|---|