feat(integrations): архитектура включения/выключения интеграций
- Удалена лишняя модель IntegrationConfig из system_settings - Singleton-паттерн: одна запись на интеграцию с is_active тумблером - Добавлено шифрование токенов (EncryptedCharField с Fernet AES-128) - UI: тумблеры слева, форма настроек справа - API endpoints: toggle, settings, form_data - Модель Recommerce: store_url + api_token (x-auth-token) - Модель WooCommerce: store_url + consumer_key/secret Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,3 +1,2 @@
|
||||
from .integration_config import IntegrationConfig
|
||||
|
||||
__all__ = ['IntegrationConfig']
|
||||
# Models for system_settings app
|
||||
# IntegrationConfig removed - using integrations app models directly
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
from django.db import models
|
||||
|
||||
|
||||
class IntegrationConfig(models.Model):
|
||||
"""
|
||||
Глобальные тумблеры для включения/выключения интеграций.
|
||||
Одна запись на доступную интеграцию.
|
||||
"""
|
||||
|
||||
INTEGRATION_CHOICES = [
|
||||
('woocommerce', 'WooCommerce'),
|
||||
('recommerce', 'Recommerce'),
|
||||
# Здесь добавлять новые интеграции:
|
||||
# ('shopify', 'Shopify'),
|
||||
# ('telegram', 'Telegram'),
|
||||
]
|
||||
|
||||
integration_id = models.CharField(
|
||||
max_length=50,
|
||||
choices=INTEGRATION_CHOICES,
|
||||
unique=True,
|
||||
verbose_name="Интеграция"
|
||||
)
|
||||
|
||||
is_enabled = models.BooleanField(
|
||||
default=False,
|
||||
verbose_name="Включена",
|
||||
help_text="Глобальное включение интеграции для тенанта"
|
||||
)
|
||||
|
||||
last_sync_at = models.DateTimeField(
|
||||
null=True,
|
||||
blank=True,
|
||||
verbose_name="Последняя синхронизация"
|
||||
)
|
||||
|
||||
created_at = models.DateTimeField(
|
||||
auto_now_add=True,
|
||||
verbose_name="Дата создания"
|
||||
)
|
||||
|
||||
updated_at = models.DateTimeField(
|
||||
auto_now=True,
|
||||
verbose_name="Дата обновления"
|
||||
)
|
||||
|
||||
class Meta:
|
||||
verbose_name = "Настройка интеграции"
|
||||
verbose_name_plural = "Настройки интеграций"
|
||||
ordering = ['integration_id']
|
||||
|
||||
def __str__(self):
|
||||
status = "вкл" if self.is_enabled else "выкл"
|
||||
return f"{self.get_integration_id_display()}: {status}"
|
||||
Reference in New Issue
Block a user