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:
2026-01-12 00:29:04 +03:00
parent 4629369823
commit 37394121e1
14 changed files with 804 additions and 200 deletions

View File

@@ -611,5 +611,23 @@ CELERY_BEAT_SCHEDULE = {
# ============================================
# Увеличиваем лимиты для загрузки больших списков (10 000+ клиентов)
DATA_UPLOAD_MAX_NUMBER_FIELDS = 50000
DATA_UPLOAD_MAX_NUMBER_FIELDS = 50000
DATA_UPLOAD_MAX_MEMORY_SIZE = 104857600 # 100MB
# ============================================
# ENCRYPTION SETTINGS (for sensitive data like API tokens)
# ============================================
# Ключ шифрования для EncryptedCharField (Fernet AES-128)
# ВАЖНО: Сгенерировать один раз и сохранить в .env!
# python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
ENCRYPTION_KEY = env('ENCRYPTION_KEY', default=None)
# Проверка наличия ключа в production
if not DEBUG and not ENCRYPTION_KEY:
import warnings
warnings.warn(
"ENCRYPTION_KEY not set! Encrypted fields will fail. "
"Generate with: python -c \"from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())\""
)