""" Integration Models Phase 6: Site Integration & Multi-Destination Publishing """ from django.db import models from django.core.validators import MinValueValidator from igny8_core.auth.models import AccountBaseModel class SiteIntegration(AccountBaseModel): """ Store integration configurations for sites. Each site can have multiple integrations (WordPress, Shopify, etc.). """ PLATFORM_CHOICES = [ ('wordpress', 'WordPress'), ('shopify', 'Shopify'), ('custom', 'Custom API'), ] PLATFORM_TYPE_CHOICES = [ ('cms', 'CMS'), ('ecommerce', 'Ecommerce'), ('custom_api', 'Custom API'), ] SYNC_STATUS_CHOICES = [ ('success', 'Success'), ('failed', 'Failed'), ('pending', 'Pending'), ('syncing', 'Syncing'), ] site = models.ForeignKey( 'igny8_core_auth.Site', on_delete=models.CASCADE, related_name='integrations', help_text="Site this integration belongs to" ) platform = models.CharField( max_length=50, choices=PLATFORM_CHOICES, db_index=True, help_text="Platform name: 'wordpress', 'shopify', 'custom'" ) platform_type = models.CharField( max_length=50, choices=PLATFORM_TYPE_CHOICES, default='cms', help_text="Platform type: 'cms', 'ecommerce', 'custom_api'" ) config_json = models.JSONField( default=dict, help_text="Platform-specific configuration (URLs, endpoints, etc.)" ) # Credentials stored as JSON (encryption handled at application level) credentials_json = models.JSONField( default=dict, help_text="Encrypted credentials (API keys, tokens, etc.)" ) is_active = models.BooleanField( default=True, db_index=True, help_text="Whether this integration is active" ) sync_enabled = models.BooleanField( default=False, help_text="Whether two-way sync is enabled" ) last_sync_at = models.DateTimeField( null=True, blank=True, help_text="Last successful sync timestamp" ) sync_status = models.CharField( max_length=20, choices=SYNC_STATUS_CHOICES, default='pending', db_index=True, help_text="Current sync status" ) sync_error = models.TextField( blank=True, null=True, help_text="Last sync error message" ) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: app_label = 'integration' db_table = 'igny8_site_integrations' ordering = ['-created_at'] unique_together = [['site', 'platform']] indexes = [ models.Index(fields=['site', 'platform']), models.Index(fields=['site', 'is_active']), models.Index(fields=['account', 'platform']), models.Index(fields=['sync_status']), ] def __str__(self): return f"{self.site.name} - {self.get_platform_display()}" def get_credentials(self) -> dict: """ Get decrypted credentials. In production, this should decrypt credentials_json. For now, return as-is (encryption to be implemented). """ return self.credentials_json or {} def set_credentials(self, credentials: dict): """ Set encrypted credentials. In production, this should encrypt before storing. For now, store as-is (encryption to be implemented). """ self.credentials_json = credentials