brewman/brewman/brewman/routers/__init__.py

70 lines
2.0 KiB
Python
Raw Normal View History

import re
import uuid
2020-10-07 15:18:43 +00:00
from datetime import date, timedelta
from decimal import Decimal
from io import BytesIO
from typing import Optional
2020-10-07 15:18:43 +00:00
from fastapi import APIRouter
from sqlalchemy.orm import Session
2020-10-07 15:18:43 +00:00
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):
2020-10-07 16:59:24 +00:00
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