- Добавлена предобработка email перед валидацией: * Исправление типичных опечаток (mail ru -> mail.ru, .ry -> .ru) * Удаление пробелов и двойных @@ * Умное добавление @ для популярных доменов * Исправление доменов без точки (gmail -> gmail.com) - Улучшена нормализация телефонов: * Умное добавление кода страны (+375, +7, +380) * Конверсия старого формата 8XXXXXXXXXX -> +7XXXXXXXXXX * Проверка длины номера (10-15 символов) * Поддержка локальных белорусских номеров (9 цифр) - Реализована идемпотентность импорта: * Notes не раздуваются при повторных импортах (метод _append_unique_note) * ContactChannel не дублируется для одного клиента * Проверка существования альтернативных контактов по customer+type+value - Добавлен прогресс-бар и защита от закрытия: * Визуальный прогресс-бар с анимацией и динамическим текстом * Блокировка формы во время импорта * Предупреждение браузера при попытке закрыть страницу - Создана команда clear_anatol_customers для тестирования - Добавлен тестовый файл test_customer_preprocess.csv с примерами исправляемых ошибок
39 lines
1.7 KiB
Python
39 lines
1.7 KiB
Python
from django.core.management.base import BaseCommand
|
|
from django_tenants.utils import schema_context
|
|
from tenants.models import Client
|
|
from customers.models import Customer
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = 'Удаляет всех клиентов (кроме системного) в тенанте anatol'
|
|
|
|
def handle(self, *args, **options):
|
|
tenant_schema = 'anatol'
|
|
|
|
try:
|
|
tenant = Client.objects.get(schema_name=tenant_schema)
|
|
except Client.DoesNotExist:
|
|
self.stdout.write(self.style.ERROR(f'Тенант {tenant_schema} не найден'))
|
|
return
|
|
|
|
with schema_context(tenant_schema):
|
|
# Удаляем всех клиентов кроме системного
|
|
customers_to_delete = Customer.objects.filter(is_system_customer=False)
|
|
count = customers_to_delete.count()
|
|
|
|
if count == 0:
|
|
self.stdout.write(self.style.WARNING('Нет клиентов для удаления'))
|
|
return
|
|
|
|
customers_to_delete.delete()
|
|
|
|
# Проверяем что остался только системный
|
|
remaining = Customer.objects.count()
|
|
system_customer = Customer.objects.filter(is_system_customer=True).first()
|
|
|
|
self.stdout.write(self.style.SUCCESS(f'Удалено клиентов: {count}'))
|
|
self.stdout.write(self.style.SUCCESS(f'Осталось клиентов: {remaining}'))
|
|
|
|
if system_customer:
|
|
self.stdout.write(f'Системный клиент: {system_customer.name} ({system_customer.email})')
|