brewman/brewman/brewman/routers/__init__.py

70 lines
2.0 KiB
Python

import re
import uuid
from datetime import date, timedelta
from decimal import Decimal
from io import BytesIO
from typing import Optional
from fastapi import APIRouter
from sqlalchemy.orm import Session
from ..models.master import DbSetting
from ..models.voucher import DbImage
router = APIRouter()
def get_lock_info(db: Session) -> (Optional[date], Optional[date]):
start: Optional[date]
finish: Optional[date]
data = db.query(DbSetting).filter(DbSetting.name == "Lock Info").first()
if data is None:
return None, None
data = data.data
if not data["Start"]["Locked"]:
start = None
elif data["Start"]["Rolling"]:
start: date = date.today() - timedelta(days=data["Start"]["Days"])
else:
start = data["Start"]["Date"].date()
if not data["Finish"]["Locked"]:
finish = None
elif data["Finish"]["Rolling"]:
finish = date.today() + timedelta(days=data["Finish"]["Days"])
else:
finish = data["Finish"]["Date"].date()
return start, finish
def to_uuid(value):
p = re.compile(
"^[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$"
)
return uuid.UUID(value) if p.match(value) else None
def to_decimal(value, default=0):
import re
_parser = re.compile(
r""" # A numeric string consists of:
(?P<sign>[-+])? # an optional sign, followed by either...
(
(?=\d|\.\d) # ...a number (with at least one digit)
(?P<int>\d*) # having a (possibly empty) integer part
(\.(?P<frac>\d*))? # followed by an optional fractional part
|
(?P<signal>s)? # ...an (optionally signaling)
NaN # NaN
(?P<diag>\d*) # with (possibly empty) diagnostic info.
)
\Z
""",
re.VERBOSE | re.IGNORECASE,
).match
return Decimal(value) if _parser(value.strip()) is not None else default