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
+60
View File
@@ -0,0 +1,60 @@
"""Aplicatia Flask: fabrica, blueprint-uri, filtre Jinja."""
from __future__ import annotations
from datetime import datetime
from pathlib import Path
from flask import Flask
from . import db
from .config import Config
from .labels import _format_datetime, _format_weight
from .logging_setup import configure_logging
from .scale import create_scale
def create_app(test_config: dict | None = None) -> Flask:
app = Flask(__name__, instance_relative_config=False)
app.config.from_object(Config)
if test_config:
app.config.update(test_config)
instance_dir = Path(app.config["INSTANCE_DIR"])
instance_dir.mkdir(parents=True, exist_ok=True)
Path(app.config["DATABASE"]).parent.mkdir(parents=True, exist_ok=True)
db.register(app)
create_scale(app)
if not app.config.get("TESTING"):
configure_logging()
with app.app_context():
db.init_db()
from .routes import (api, components, fields, history, label_templates, main, monitor,
printing, recipes)
app.register_blueprint(main.bp)
app.register_blueprint(components.bp)
app.register_blueprint(recipes.bp)
app.register_blueprint(label_templates.bp)
app.register_blueprint(fields.bp)
app.register_blueprint(printing.bp)
app.register_blueprint(history.bp)
app.register_blueprint(monitor.bp)
app.register_blueprint(api.bp)
app.jinja_env.filters["weight"] = _format_weight
app.jinja_env.filters["dt"] = _format_datetime
@app.context_processor
def inject_globals():
from .db import all_settings
return {
"app_settings": all_settings(),
"current_year": datetime.now().year,
"app_version": "0.1.0",
}
return app