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[-+])? # an optional sign, followed by either... ( (?=\d|\.\d) # ...a number (with at least one digit) (?P\d*) # having a (possibly empty) integer part (\.(?P\d*))? # followed by an optional fractional part | (?Ps)? # ...an (optionally signaling) NaN # NaN (?P\d*) # with (possibly empty) diagnostic info. ) \Z """, re.VERBOSE | re.IGNORECASE, ).match return Decimal(value) if _parser(value.strip()) is not None else default