from flask import Blueprint, render_template, request, redirect, flash, session from database import get_db from i18n import t docs_bp = Blueprint("docs", __name__) def _admin_required(): if not session.get("is_admin"): flash(t("admin_required"), "error") return False return True @docs_bp.route("/") def index(): db = get_db() lang = request.args.get("lang", "") or "pl" docs = db.execute("SELECT * FROM docs WHERE lang=? ORDER BY title", (lang,)).fetchall() db.close() return render_template("docs/index.html", docs=docs, lang=lang) @docs_bp.route("/getting-started") def getting_started(): """Strona startowa docs. Jeśli jest w bazie (po migracji) → widok z DB (z edycją i lang=). Inaczej → statyczny szablon (fallback).""" db = get_db() lang = request.args.get("lang", "") or "pl" doc = db.execute("SELECT * FROM docs WHERE slug='getting-started' AND lang=?", (lang,)).fetchone() if not doc: doc = db.execute("SELECT * FROM docs WHERE slug='getting-started'").fetchone() if doc: db.close() return redirect(f"/docs/getting-started?lang={doc['lang']}") if not doc: db.close() return render_template("docs/getting_started.html") other = db.execute("SELECT lang FROM docs WHERE slug='getting-started' AND lang!=?", (lang,)).fetchall() db.close() return render_template("docs/view.html", doc=doc, other_langs=[r["lang"] for r in other]) @docs_bp.route("/") def view(slug): db = get_db() lang = request.args.get("lang", "") or "pl" doc = db.execute("SELECT * FROM docs WHERE slug=? AND lang=?", (slug, lang)).fetchone() if not doc: # Spróbuj innego języka doc = db.execute("SELECT * FROM docs WHERE slug=?", (slug,)).fetchone() if not doc: db.close() return render_template("404.html"), 404 return redirect(f"/docs/{slug}?lang={doc['lang']}") # Znajdź wersję w innym języku other = db.execute("SELECT lang FROM docs WHERE slug=? AND lang!=?", (slug, lang)).fetchall() db.close() return render_template("docs/view.html", doc=doc, other_langs=[r["lang"] for r in other]) @docs_bp.route("/new", methods=["GET", "POST"]) def new(): if not _admin_required(): return redirect("/docs") if request.method == "POST": slug = request.form.get("slug", "").strip().lower().replace(" ", "-") lang = request.form.get("lang", "pl") title = request.form.get("title", "").strip() content = request.form.get("content", "").strip() if not slug or not title: flash("Slug i tytuł są wymagane", "error") else: db = get_db() try: db.execute("INSERT INTO docs (slug, lang, title, content, author) VALUES (?,?,?,?,?)", (slug, lang, title, content, session.get("username", "admin"))) db.commit() flash(f"✅ Dokumentacja {slug} ({lang}) utworzona", "ok") db.close() return redirect(f"/docs/{slug}?lang={lang}") except Exception: flash("Taki slug + lang już istnieje", "error") db.close() return render_template("docs/edit.html", doc=None) @docs_bp.route("//edit", methods=["GET", "POST"]) def edit(slug): if not _admin_required(): return redirect("/docs") db = get_db() lang = request.args.get("lang", "") or "pl" doc = db.execute("SELECT * FROM docs WHERE slug=? AND lang=?", (slug, lang)).fetchone() if not doc: db.close() return render_template("404.html"), 404 if request.method == "POST": title = request.form.get("title", "").strip() content = request.form.get("content", "").strip() if not title: flash("Tytuł jest wymagany", "error") else: db.execute("UPDATE docs SET title=?, content=?, updated_at=CURRENT_TIMESTAMP WHERE id=?", (title, content, doc["id"])) db.commit() flash("✅ Zapisano", "ok") db.close() return redirect(f"/docs/{slug}?lang={lang}") db.close() return render_template("docs/edit.html", doc=doc) @docs_bp.route("//delete", methods=["POST"]) def delete(slug): if not _admin_required(): return redirect("/docs") db = get_db() lang = request.args.get("lang", "") or "pl" db.execute("DELETE FROM docs WHERE slug=? AND lang=?", (slug, lang)) db.commit() db.close() flash(f"Usunięto {slug} ({lang})", "ok") return redirect("/docs")