from __future__ import annotations from decimal import Decimal, InvalidOperation, ROUND_HALF_UP from flask import Flask from app.config import Config from app.extensions import db, migrate from app import models from app.routes.api import api_bp from app.routes.web import web_bp def _format_decimal(value: object, digits: int = 4) -> str: if value is None: return "-" try: decimal_value = Decimal(str(value)) except (InvalidOperation, ValueError, TypeError): return str(value) quantized = decimal_value.quantize(Decimal(f"1.{'0' * digits}"), rounding=ROUND_HALF_UP) normalized = format(quantized, "f").rstrip("0").rstrip(".") return normalized or "0" def create_app(config_object: type[Config] = Config) -> Flask: app = Flask(__name__, instance_relative_config=True) app.config.from_object(config_object) db.init_app(app) migrate.init_app(app, db) app.register_blueprint(web_bp) app.register_blueprint(api_bp) app.jinja_env.filters["fmt_decimal"] = _format_decimal return app