финальная версия Finance Control

This commit is contained in:
2026-05-25 22:06:16 +03:00
parent 7dcb1a23a7
commit 5890e4ae64
22 changed files with 1441 additions and 927 deletions

40
app/utils/validators.py Normal file
View File

@@ -0,0 +1,40 @@
def normalize_text(value: str, field_name: str, max_length: int = 80) -> str:
"""Strip and validate a required text value."""
text = value.strip()
if not text:
raise ValueError(f"Поле «{field_name}» не должно быть пустым.")
if len(text) > max_length:
raise ValueError(
f"Поле «{field_name}» должно быть не длиннее {max_length} символов."
)
return text
def parse_float(value: str, field_name: str) -> float:
"""Parse a float from Russian-style user input."""
prepared = value.strip().replace(" ", "").replace(",", ".")
try:
number = float(prepared)
except ValueError as error:
raise ValueError(f"Поле «{field_name}» должно быть числом.") from error
return number
def parse_positive_float(value: str, field_name: str) -> float:
"""Parse a strictly positive float."""
number = parse_float(value, field_name)
if number <= 0:
raise ValueError(f"Поле «{field_name}» должно быть больше нуля.")
return number
def parse_billing_day(value: str) -> int:
"""Parse subscription billing day."""
try:
day = int(value.strip())
except ValueError as error:
raise ValueError("День списания должен быть целым числом от 1 до 31.") from error
if not 1 <= day <= 31:
raise ValueError("День списания должен быть в диапазоне от 1 до 31.")
return day