""" Валидация данных """ import re def validate_apartment(apartment: str) -> bool: """ Проверка номера квартиры Допустимы: цифры, буквы (корпус/строение), дефисы Примеры: 45, 12А, 100-1, 5к1 """ if not apartment: return False # Убираем пробелы и приводим к верхнему регистру apartment = apartment.strip().upper() # Простая проверка: от 1 до 10 символов, есть хотя бы цифра if len(apartment) > 10 or len(apartment) < 1: return False if not any(c.isdigit() for c in apartment): return False # Разрешённые символы: цифры, буквы, дефис, пробел, к/к (корпус) pattern = r'^[0-9А-ЯA-Z\s\-/]+$' return bool(re.match(pattern, apartment)) def validate_phone(phone: str) -> bool: """ Проверка телефона Допустимы: +7, 8, скобки, дефисы, пробелы """ if not phone: return False # Убираем всё кроме цифр и + cleaned = re.sub(r'[^\d+]', '', phone) # Российские номера: +7 или 8, потом 10 цифр if len(cleaned) == 11 and cleaned[0] in ('7', '8'): return True if len(cleaned) == 12 and cleaned[0] == '+' and cleaned[1] == '7': return True # Короткие номера (103, 112 и т.д.) if len(cleaned) in (2, 3) and cleaned.isdigit(): return True return False def normalize_phone(phone: str) -> str: """Нормализация телефона к единому формату""" cleaned = re.sub(r'[^\d+]', '', phone) if len(cleaned) == 11 and cleaned[0] == '8': return '+7' + cleaned[1:] if len(cleaned) == 11 and cleaned[0] == '7': return '+' + cleaned if len(cleaned) == 12 and cleaned[0] == '+': return cleaned return phone # Короткие номера оставляем как есть def is_generic_username(username: str) -> bool: """ Проверка, является ли никнейм «стандартным» user12345, user_abc123 и т.п. """ if not username: return True # Паттерны стандартных ников patterns = [ r'^user\d+$', r'^user_\w+$', r'^id\d+$', r'^\d+$', # Просто цифры ] return any(re.match(p, username.lower()) for p in patterns)