52 lines
2.5 KiB
Python
52 lines
2.5 KiB
Python
from loguru import logger
|
||
import re
|
||
import dateparser
|
||
from datetime import datetime
|
||
from core.models import ValidationResult
|
||
from config import settings
|
||
|
||
|
||
def validate_fio(text: str) -> ValidationResult:
|
||
"""Проверка ФИ: 2 слова, кириллица, возможен дефис"""
|
||
text = text.strip()
|
||
words = text.split()
|
||
if len(words) != 2:
|
||
return ValidationResult(is_valid=False, error_message="Должно быть 2 слова")
|
||
pattern = r'^[А-ЯЁа-яё\-]+$'
|
||
for word in words:
|
||
if not re.match(pattern, word):
|
||
return ValidationResult(is_valid=False, error_message="Только буквы кириллицы и дефис")
|
||
return ValidationResult(is_valid=True, value=text)
|
||
|
||
|
||
def validate_phone(phone: str) -> ValidationResult:
|
||
"""Принимает +7 (XXX) XXX-XX-XX или просто 10 цифр после 7/8"""
|
||
cleaned = re.sub(r'\D', '', phone)
|
||
if len(cleaned) == 11 and cleaned.startswith('7'):
|
||
cleaned = '8' + cleaned[1:]
|
||
if len(cleaned) == 10:
|
||
cleaned = '8' + cleaned
|
||
if len(cleaned) == 11 and cleaned.startswith('8'):
|
||
formatted = f"+7 ({cleaned[1:4]}) {cleaned[4:7]}-{cleaned[7:9]}-{cleaned[9:]}"
|
||
return ValidationResult(is_valid=True, value=formatted)
|
||
return ValidationResult(is_valid=False, error_message="Некорректный номер")
|
||
|
||
|
||
def parse_time(text: str) -> ValidationResult:
|
||
"""Парсит естественно-языковое время, возвращает строку для отображения"""
|
||
text_lower = text.lower().strip()
|
||
if any(phrase in text_lower for phrase in ["любое время", "не важно", "в любое", "когда удобно"]):
|
||
return ValidationResult(is_valid=True, value="Любое удобное время")
|
||
|
||
try:
|
||
parsed = dateparser.parse(
|
||
text,
|
||
settings={'TIMEZONE': settings.TIMEZONE, 'RETURN_AS_TIMEZONE_AWARE': False}
|
||
)
|
||
if parsed and parsed > datetime.now():
|
||
formatted = parsed.strftime("%d.%m.%Y в %H:%M")
|
||
return ValidationResult(is_valid=True, value=formatted)
|
||
except Exception as e:
|
||
logger.warning(f"Failed to parse time '{text}': {e}")
|
||
|
||
return ValidationResult(is_valid=False, error_message="Не удалось распознать время. Укажите, например: 'завтра после 18', 'в среду утром' или 'любое время'.") |