diff --git a/Dockerfile.frontend b/Dockerfile.frontend index 53f6a1b..d6696f2 100644 --- a/Dockerfile.frontend +++ b/Dockerfile.frontend @@ -47,6 +47,13 @@ WORKDIR /app/flask_app RUN uv run --project /app pybabel compile -d translations && \ chown -R app:app /app /tmp/uv-cache +# Commit mostrato nel piede di pagina (#70). .git e' escluso dal contesto di +# build (.dockerignore), quindi lo passa chi costruisce; facoltativo, senza il +# piede mostra solo la versione. Uso: +# APP_COMMIT=$(git rev-parse --short HEAD) docker compose build client +ARG APP_COMMIT="" +ENV APP_COMMIT=${APP_COMMIT} + USER app EXPOSE 5000 diff --git a/README.md b/README.md index c65e55d..c57b662 100644 --- a/README.md +++ b/README.md @@ -333,6 +333,7 @@ TieMeasureFlow/ |---|---| | `docker compose -f docker-compose.dev.yml up -d --build` | Avvia servizi in sviluppo (build incluso) | | `docker compose -f docker-compose.dev.yml down` | Ferma e rimuove i container | +| `APP_COMMIT=$(git rev-parse --short HEAD) docker compose build client` | Ricostruisci il client mostrando nel piè di pagina il commit (oltre alla versione di `pyproject.toml`); senza `APP_COMMIT` compare solo la versione | | `docker compose logs -f server` | Segui log server in tempo reale | | `docker compose logs -f client` | Segui log client in tempo reale | | `docker compose ps` | Stato di tutti i servizi | diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 342173f..d91046d 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -75,6 +75,9 @@ services: build: context: . dockerfile: Dockerfile.frontend + args: + # Commit nel piede di pagina (#70); facoltativo, vuoto = solo versione + APP_COMMIT: ${APP_COMMIT:-} container_name: tmflow-client restart: unless-stopped env_file: diff --git a/docker-compose.yml b/docker-compose.yml index 440743a..fdf1a8e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -89,6 +89,9 @@ services: build: context: . dockerfile: Dockerfile.frontend + args: + # Commit nel piede di pagina (#70); facoltativo, vuoto = solo versione + APP_COMMIT: ${APP_COMMIT:-} container_name: tmflow-client restart: unless-stopped env_file: diff --git a/src/frontend/flask_app/app.py b/src/frontend/flask_app/app.py index 6a096b0..3855651 100644 --- a/src/frontend/flask_app/app.py +++ b/src/frontend/flask_app/app.py @@ -242,6 +242,9 @@ def create_app() -> Flask: "company_logo": session.get("company_logo"), "auto_logout_minutes": session.get("auto_logout_minutes"), "current_year": date.today().year, + # Versione/commit nel piede di pagina (#70) + "app_version": Config.APP_VERSION, + "app_commit": Config.APP_COMMIT, } return app diff --git a/src/frontend/flask_app/config.py b/src/frontend/flask_app/config.py index 6533c08..be4286d 100644 --- a/src/frontend/flask_app/config.py +++ b/src/frontend/flask_app/config.py @@ -1,5 +1,7 @@ """TieMeasureFlow Client Configuration.""" import os +import tomllib +from pathlib import Path from dotenv import load_dotenv load_dotenv(os.path.join(os.path.dirname(__file__), '..', '.env')) @@ -10,6 +12,25 @@ load_dotenv(os.path.join(os.path.dirname(__file__), '..', '.env')) DEFAULT_SECRET_KEY = "change-this-to-another-random-secret-key" +def _read_app_version() -> str: + """Versione del prodotto = `[project] version` di pyproject.toml (#70). + + Si risale dalla cartella del modulo: nel container il file sta in + /app/pyproject.toml (Dockerfile.frontend), nel repo alla radice. Se non + si trova o e' illeggibile torna "dev": il piede di pagina non deve mai + rompere l'avvio. + """ + for parent in Path(__file__).resolve().parents: + candidate = parent / "pyproject.toml" + if candidate.is_file(): + try: + with candidate.open("rb") as fh: + return str(tomllib.load(fh)["project"]["version"]) + except (OSError, tomllib.TOMLDecodeError, KeyError): + return "dev" + return "dev" + + class Config: """Flask client configuration.""" @@ -17,6 +38,12 @@ class Config: SECRET_KEY = os.getenv("CLIENT_SECRET_KEY", DEFAULT_SECRET_KEY) DEBUG = os.getenv("FLASK_DEBUG", "0") == "1" + # Versione e commit mostrati nel piede di pagina (#70). Letti una volta + # all'import. Il commit arriva dal build arg APP_COMMIT (.git non e' nel + # contesto di build, vedi .dockerignore); facoltativo: vuoto = non mostrato. + APP_VERSION: str = _read_app_version() + APP_COMMIT: str = os.environ.get("APP_COMMIT", "")[:7] + # API Server connection API_SERVER_URL = os.getenv("API_SERVER_URL", "http://localhost:8000") diff --git a/src/frontend/flask_app/templates/auth/login.html b/src/frontend/flask_app/templates/auth/login.html index 98775e7..7d2104e 100644 --- a/src/frontend/flask_app/templates/auth/login.html +++ b/src/frontend/flask_app/templates/auth/login.html @@ -157,7 +157,7 @@
TieMeasureFlow © {{ current_year }} - {{ _('Sistema di misurazione industriale') }}
+TieMeasureFlow © {{ current_year }} - {{ _('Sistema di misurazione industriale') }}{# versione e commit (#70) #} · v{{ app_version }}{% if app_commit %} · {{ app_commit }}{% endif %}