Добавлена функциональность системного клиента для анонимных покупок

- Добавлено поле is_system_customer в модель Customer с индексом
- Системный клиент создается автоматически при создании нового тенанта
- Реализована защита системного клиента от редактирования и удаления:
  - Защита на уровне модели (save/delete методы)
  - Защита на уровне формы (валидация)
  - Защита на уровне представлений (проверки с дружественными сообщениями)
  - Защита в админке (readonly поля, запрет удаления)
- Системный клиент скрыт из списков и поиска на фронтенде
- Создан информационный шаблон для отображения системного клиента
- Исправлена обработка NULL значений для полей email/phone (Django best practice)
- Добавлено отображение "Не указано" вместо None в карточке клиента

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-20 00:07:38 +03:00
parent 755e4fc9d9
commit 685c06d94d
8 changed files with 215 additions and 65 deletions

View File

@@ -285,6 +285,20 @@ class TenantRegistrationAdmin(admin.ModelAdmin):
else:
logger.warning(f"Пользователь с email {settings.TENANT_ADMIN_EMAIL} уже существует в тенанте")
# Создаем системного клиента для анонимных продаж
logger.info(f"Создание системного клиента для тенанта: {client.id}")
from customers.models import Customer
try:
system_customer, created = Customer.get_or_create_system_customer()
if created:
logger.info(f"Системный клиент создан: {system_customer.id} ({system_customer.name})")
else:
logger.info(f"Системный клиент уже существует: {system_customer.id} ({system_customer.name})")
except Exception as e:
logger.error(f"Ошибка при создании системного клиента: {e}", exc_info=True)
# Не прерываем процесс, т.к. это не критично
# Возвращаемся в public схему
connection.set_schema_to_public()