40 lines
1.0 KiB
Python
40 lines
1.0 KiB
Python
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
|