🔒 Repository is read-only – file editing is disabled.

PaganLinux/pagan-web-v2/blueprints/docs.py main

117 linii Raw ← Powrót
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
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("/<slug>")
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("/<slug>/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("/<slug>/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")