{{ meldung }}
+ {% endif %} + {% block inhalt %}{% endblock %} +diff --git a/Dockerfile b/Dockerfile index f1371f4..6d9da36 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,20 @@ +# --------------------------------------------------------------- CSS --- +# Tailwind über die Standalone-Binärdatei - kein Node.js, kein npm. Das +# Ergebnis ist eine einzige style.css; die Binärdatei bleibt in dieser +# Stufe und landet nicht im fertigen Image. +FROM debian:bookworm-slim AS css +RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates \ + && rm -rf /var/lib/apt/lists/* +WORKDIR /build +ARG TAILWIND_VERSION=v3.4.17 +RUN curl -sSLo /usr/local/bin/tailwindcss \ + "https://github.com/tailwindlabs/tailwindcss/releases/download/${TAILWIND_VERSION}/tailwindcss-linux-x64" \ + && chmod +x /usr/local/bin/tailwindcss +COPY tailwind.config.js tailwind-input.css ./ +COPY app/templates ./app/templates +RUN tailwindcss -c tailwind.config.js -i tailwind-input.css -o /build/style.css --minify + +# ----------------------------------------------------------- Anwendung --- FROM python:3.11-slim # libheif wird von pillow-heif mitgeliefert; hier nur die Laufzeit-Bibliotheken, @@ -14,6 +31,7 @@ RUN pip install --no-cache-dir -r requirements.txt COPY alembic.ini ./ COPY alembic/ ./alembic/ COPY app/ ./app/ +COPY --from=css /build/style.css ./app/static/style.css COPY docker-entrypoint.sh /usr/local/bin/kleiderboerse-entrypoint.sh RUN chmod +x /usr/local/bin/kleiderboerse-entrypoint.sh diff --git a/app/main.py b/app/main.py index 0b5d7cc..e12ad0a 100644 --- a/app/main.py +++ b/app/main.py @@ -19,7 +19,7 @@ from starlette.middleware.sessions import SessionMiddleware from app.config import einstellungen from app.database import SessionLocal, engine -from app.routers import auth, categories, images, items +from app.routers import auth, categories, images, items, pages from app.security import limiter from app.seed import stammdaten_anlegen @@ -120,6 +120,7 @@ app.include_router(auth.router) app.include_router(categories.router) app.include_router(items.router) app.include_router(images.router) +app.include_router(pages.router) app.mount("/static", StaticFiles(directory=Path(__file__).parent / "static"), name="static") @@ -144,33 +145,6 @@ def swagger_ui(): ) -@app.get("/", include_in_schema=False) -def startseite(): - """Platzhalter, bis die Galerie steht (Phase 4). - - Ohne diese Route liefert die Wurzel ein nacktes 404-JSON - im Browser - sieht das aus wie eine kaputte Anwendung. - """ - return HTMLResponse( - """ -
- - -Die Anwendung läuft. Die Oberfläche entsteht noch – bis dahin lässt sich -alles über die API-Oberfläche ausprobieren.
-Zum Erfassen zuerst POST /api/v1/auth/login ausführen.
-Ohne Anmeldung sind Galerie und Reservierung nutzbar.
+ Leer lassen genügt – dann steht dort automatisch Kategorie und Grösse. +
+{{ item.anzeige_titel }}
++ {{ groesse_text(item) }} +
+ {% if item.status == 'reserved' %} + {# Bewusst ohne Namen: die Galerie ist öffentlich, der Name steht + nur in der Verwaltung. #} + reserviert + {% elif item.status == 'given_away' %} + abgegeben + {% endif %} +{{ gesamt }} Stück
++ Hier ist gerade nichts. Vielleicht mit einem anderen Filter? +
+ {% endif %} +{{ meldung }}
+ {% endif %} + {% block inhalt %}{% endblock %} +{{ item.description }}
+ {% endif %} + ++ Ist bereits reserviert. +
+ {% if betreiber %} ++ Reserviert von: {{ item.reserved_by }} +
+ + {% endif %} + + {% elif item.status == 'given_away' %} ++ Schon abgegeben. +
+ {% endif %} ++ Aus dem Stapel-Import. Erst wenn Grösse und Kategorie eingetragen sind, + erscheint ein Teil in der Galerie. +
+ +{% if items %} +Nachtragen →
+ + {% endfor %} ++ Nichts offen. Neue Fotos hochladen +
+{% endif %} + +{% endblock %} diff --git a/app/templates/erfassen.html b/app/templates/erfassen.html new file mode 100644 index 0000000..a0aec9c --- /dev/null +++ b/app/templates/erfassen.html @@ -0,0 +1,41 @@ +{% extends "basis.html" %} +{% block titel %}Erfassen{% endblock %} +{% block inhalt %} + +oder einzeln erfassen
+ + + +{% endblock %} diff --git a/app/templates/galerie.html b/app/templates/galerie.html new file mode 100644 index 0000000..30cd1b1 --- /dev/null +++ b/app/templates/galerie.html @@ -0,0 +1,49 @@ +{% extends "basis.html" %} +{% block inhalt %} + + + +{% include "_liste.html" %} + +{% endblock %} diff --git a/app/templates/reserviert.html b/app/templates/reserviert.html new file mode 100644 index 0000000..2579b1b --- /dev/null +++ b/app/templates/reserviert.html @@ -0,0 +1,27 @@ +{% extends "basis.html" %} +{% block titel %}Reserviert{% endblock %} +{% block inhalt %} ++ {{ item.anzeige_titel }} ist jetzt für dich zurückgelegt. +
+ +Link zum Aufheben – bitte aufbewahren
+ {# Nur hier sichtbar: mit diesem Link kann die Reservierung + zurückgenommen werden, ohne dass jemand ein Konto braucht. #} + ++ Ohne diesen Link kannst du die Reservierung nicht selbst aufheben – + dann hilft nur eine kurze Nachricht. +
+