Initial commit: aplicatie de cantarire si etichetare

Aplicatie Flask + SQLite pentru productie alimentara: cantarirea
componentelor unui produs finit si tiparirea etichetei prin QZ Tray.

- produse finite (retete) formate din componente cantarite
- designer vizual de etichete (mm/px, zona sigura, campuri variabile,
  cod QR cu continut din mai multe bucati)
- legare produs finit -> sablon de eticheta
- navigare pe doua taburi: Cantarire / Setari
- administrare: componente, produse finite, sabloane, campuri, istoric
- backup, resetare baza de date, checklist de pregatire, /healthz
- CLI de administrare si serviciu systemd pentru productie
- vendor/syncpulse-scale-bridge (GPL-3.0-or-later) pentru citirea cantarului
This commit is contained in:
2026-10-18 23:38:45 +03:00
commit bff6d70b17
107 changed files with 21428 additions and 0 deletions
+40
View File
@@ -0,0 +1,40 @@
"""Configurarea aplicatiei (variabile de mediu, fara secrete in cod)."""
from __future__ import annotations
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
# Cheia folosita cand nu exista CANTARIRE_SECRET_KEY; NU se foloseste in productie.
DEV_SECRET_KEY = "dev-only-change-me"
def _env_flag(name: str, default: bool = False) -> bool:
value = os.environ.get(name)
if value is None:
return default
return value.strip().lower() in {"1", "true", "yes", "on"}
class Config:
# Flask
SECRET_KEY = os.environ.get("CANTARIRE_SECRET_KEY", DEV_SECRET_KEY)
MAX_CONTENT_LENGTH = 2 * 1024 * 1024
# Date de rulare: baza SQLite, bridge.json, jurnale de etichete
INSTANCE_DIR = Path(os.environ.get("CANTARIRE_INSTANCE", BASE_DIR / "instance"))
DATABASE = INSTANCE_DIR / "cantarire.db"
BRIDGE_CONFIG = Path(os.environ.get("CANTARIRE_BRIDGE_CONFIG", INSTANCE_DIR / "bridge.json"))
# CANTARIRE_SIMULATE="mahak_mds,toledo_cont:4800:7E1" porneste cantoare simulate
SIMULATE = os.environ.get("CANTARIRE_SIMULATE", "").strip()
# Cat de proaspata / cat de mult asteptam o citire de la cantar
WEIGHT_MAX_AGE_MS = int(os.environ.get("CANTARIRE_MAX_AGE_MS", "1500"))
WEIGHT_WAIT_MS = int(os.environ.get("CANTARIRE_WAIT_MS", "2500"))
# Printarea automata din browser (plugin extern); se poate dezactiva global
AUTO_PRINT = _env_flag("CANTARIRE_AUTO_PRINT", True)
JSON_AS_ASCII = False