160 lines
4.5 KiB
Python
160 lines
4.5 KiB
Python
"""
|
|
Publishing Models
|
|
Phase 5: Sites Renderer & Publishing
|
|
"""
|
|
from django.db import models
|
|
from igny8_core.auth.models import SiteSectorBaseModel
|
|
|
|
|
|
class PublishingRecord(SiteSectorBaseModel):
|
|
"""
|
|
Track content publishing to various destinations.
|
|
"""
|
|
|
|
STATUS_CHOICES = [
|
|
('pending', 'Pending'),
|
|
('publishing', 'Publishing'),
|
|
('published', 'Published'),
|
|
('failed', 'Failed'),
|
|
]
|
|
|
|
# Content or SiteBlueprint reference (one must be set)
|
|
content = models.ForeignKey(
|
|
'content.Content',
|
|
on_delete=models.CASCADE,
|
|
null=True,
|
|
blank=True,
|
|
related_name='publishing_records',
|
|
help_text="Content being published (if publishing content)"
|
|
)
|
|
site_blueprint = models.ForeignKey(
|
|
'site_building.SiteBlueprint',
|
|
on_delete=models.CASCADE,
|
|
null=True,
|
|
blank=True,
|
|
related_name='publishing_records',
|
|
help_text="Site blueprint being published (if publishing site)"
|
|
)
|
|
|
|
# Destination information
|
|
destination = models.CharField(
|
|
max_length=50,
|
|
db_index=True,
|
|
help_text="Destination platform: 'wordpress', 'sites', 'shopify'"
|
|
)
|
|
destination_id = models.CharField(
|
|
max_length=255,
|
|
blank=True,
|
|
null=True,
|
|
help_text="External ID in destination platform"
|
|
)
|
|
destination_url = models.URLField(
|
|
blank=True,
|
|
null=True,
|
|
help_text="URL of published content/site"
|
|
)
|
|
|
|
# Status tracking
|
|
status = models.CharField(
|
|
max_length=20,
|
|
choices=STATUS_CHOICES,
|
|
default='pending',
|
|
db_index=True
|
|
)
|
|
published_at = models.DateTimeField(null=True, blank=True)
|
|
error_message = models.TextField(blank=True, null=True)
|
|
|
|
# Metadata
|
|
metadata = models.JSONField(
|
|
default=dict,
|
|
help_text="Platform-specific metadata"
|
|
)
|
|
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
app_label = 'publishing'
|
|
db_table = 'igny8_publishing_records'
|
|
ordering = ['-created_at']
|
|
indexes = [
|
|
models.Index(fields=['destination', 'status']),
|
|
models.Index(fields=['content', 'destination']),
|
|
models.Index(fields=['site_blueprint', 'destination']),
|
|
models.Index(fields=['account', 'status']),
|
|
]
|
|
|
|
def __str__(self):
|
|
target = self.content or self.site_blueprint
|
|
return f"{target} → {self.destination} ({self.get_status_display()})"
|
|
|
|
|
|
class DeploymentRecord(SiteSectorBaseModel):
|
|
"""
|
|
Track site deployments to Sites renderer.
|
|
"""
|
|
|
|
STATUS_CHOICES = [
|
|
('pending', 'Pending'),
|
|
('deploying', 'Deploying'),
|
|
('deployed', 'Deployed'),
|
|
('failed', 'Failed'),
|
|
('rolled_back', 'Rolled Back'),
|
|
]
|
|
|
|
site_blueprint = models.ForeignKey(
|
|
'site_building.SiteBlueprint',
|
|
on_delete=models.CASCADE,
|
|
related_name='deployments',
|
|
help_text="Site blueprint being deployed"
|
|
)
|
|
|
|
# Version tracking
|
|
version = models.IntegerField(
|
|
help_text="Blueprint version being deployed"
|
|
)
|
|
deployed_version = models.IntegerField(
|
|
null=True,
|
|
blank=True,
|
|
help_text="Currently deployed version (after successful deployment)"
|
|
)
|
|
|
|
# Status tracking
|
|
status = models.CharField(
|
|
max_length=20,
|
|
choices=STATUS_CHOICES,
|
|
default='pending',
|
|
db_index=True
|
|
)
|
|
deployed_at = models.DateTimeField(null=True, blank=True)
|
|
deployment_url = models.URLField(
|
|
blank=True,
|
|
null=True,
|
|
help_text="Public URL of deployed site"
|
|
)
|
|
error_message = models.TextField(blank=True, null=True)
|
|
|
|
# Metadata
|
|
metadata = models.JSONField(
|
|
default=dict,
|
|
help_text="Deployment metadata (build info, file paths, etc.)"
|
|
)
|
|
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
app_label = 'publishing'
|
|
db_table = 'igny8_deployment_records'
|
|
ordering = ['-created_at']
|
|
indexes = [
|
|
models.Index(fields=['site_blueprint', 'status']),
|
|
models.Index(fields=['site_blueprint', 'version']),
|
|
models.Index(fields=['status']),
|
|
models.Index(fields=['account', 'status']),
|
|
]
|
|
|
|
def __str__(self):
|
|
return f"{self.site_blueprint.name} v{self.version} ({self.get_status_display()})"
|
|
|