✅ Регистрация и верификация жильцов ✅ Рейтинг активности (уровни) ✅ Детект шпионов (Score 0-100) ✅ Анти-мат система (3 предупреждения → бан) ✅ Админ-панель с рассылкой ✅ Учёт квартир (несколько жильцов) ✅ Телефоны экстренных служб и мастеров ✅ Еженедельный экспорт JSON ✅ Прокси (socks5) для обхода РКН Бекап: backups/versions/v1.0_mvp_2026-02-26/ Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
85 lines
2.6 KiB
Python
85 lines
2.6 KiB
Python
"""
|
||
Валидация данных
|
||
"""
|
||
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)
|