Files
octopus/myproject/customers/management/commands/clear_anatol_customers.py
Andrey Smakotin b201c71311 Улучшение импорта клиентов: предобработка данных, умное слияние, прогресс-бар
- Добавлена предобработка 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 с примерами исправляемых ошибок
2026-01-03 14:30:18 +03:00

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})')