automation and ai and some planning and fixes adn docs reorg
This commit is contained in:
@@ -119,10 +119,40 @@ class Tasks(SoftDeletableModel, SiteSectorBaseModel):
|
||||
|
||||
objects = SoftDeleteManager()
|
||||
all_objects = models.Manager()
|
||||
|
||||
|
||||
def __str__(self):
|
||||
return self.title
|
||||
|
||||
def soft_delete(self, user=None, reason=None, retention_days=None):
|
||||
"""
|
||||
Override soft_delete to cascade to related models.
|
||||
This ensures Images and ContentClusterMap are also deleted when a Task is deleted.
|
||||
"""
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Soft-delete related Images (which are also SoftDeletable)
|
||||
related_images = self.images.filter(is_deleted=False)
|
||||
images_count = related_images.count()
|
||||
for image in related_images:
|
||||
image.soft_delete(user=user, reason=f"Parent task deleted: {reason or 'No reason'}")
|
||||
|
||||
# Hard-delete ContentClusterMap (not soft-deletable)
|
||||
cluster_maps_count = self.cluster_mappings.count()
|
||||
self.cluster_mappings.all().delete()
|
||||
|
||||
# Hard-delete ContentAttribute (not soft-deletable)
|
||||
attributes_count = self.attribute_mappings.count()
|
||||
self.attribute_mappings.all().delete()
|
||||
|
||||
logger.info(
|
||||
f"[Tasks.soft_delete] Task {self.id} '{self.title}' cascade delete: "
|
||||
f"{images_count} images, {cluster_maps_count} cluster maps, {attributes_count} attributes"
|
||||
)
|
||||
|
||||
# Call parent soft_delete
|
||||
super().soft_delete(user=user, reason=reason, retention_days=retention_days)
|
||||
|
||||
|
||||
class ContentTaxonomyRelation(models.Model):
|
||||
"""Through model for Content-Taxonomy many-to-many relationship"""
|
||||
@@ -326,6 +356,61 @@ class Content(SoftDeletableModel, SiteSectorBaseModel):
|
||||
logger = logging.getLogger(__name__)
|
||||
logger.error(f"Error incrementing word usage for content {self.id}: {str(e)}")
|
||||
|
||||
def soft_delete(self, user=None, reason=None, retention_days=None):
|
||||
"""
|
||||
Override soft_delete to cascade to related models.
|
||||
This ensures Images, ContentClusterMap, ContentAttribute are also deleted.
|
||||
"""
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Soft-delete related Images (which are also SoftDeletable)
|
||||
related_images = self.images.filter(is_deleted=False)
|
||||
images_count = related_images.count()
|
||||
for image in related_images:
|
||||
image.soft_delete(user=user, reason=f"Parent content deleted: {reason or 'No reason'}")
|
||||
|
||||
# Hard-delete ContentClusterMap (not soft-deletable)
|
||||
cluster_maps_count = self.cluster_mappings.count()
|
||||
self.cluster_mappings.all().delete()
|
||||
|
||||
# Hard-delete ContentAttribute (not soft-deletable)
|
||||
attributes_count = self.attributes.count()
|
||||
self.attributes.all().delete()
|
||||
|
||||
# Hard-delete ContentTaxonomyRelation (through model for many-to-many)
|
||||
taxonomy_relations_count = ContentTaxonomyRelation.objects.filter(content=self).count()
|
||||
ContentTaxonomyRelation.objects.filter(content=self).delete()
|
||||
|
||||
logger.info(
|
||||
f"[Content.soft_delete] Content {self.id} '{self.title}' cascade delete: "
|
||||
f"{images_count} images, {cluster_maps_count} cluster maps, "
|
||||
f"{attributes_count} attributes, {taxonomy_relations_count} taxonomy relations"
|
||||
)
|
||||
|
||||
# Call parent soft_delete
|
||||
super().soft_delete(user=user, reason=reason, retention_days=retention_days)
|
||||
|
||||
def hard_delete(self, using=None, keep_parents=False):
|
||||
"""
|
||||
Override hard_delete to cascade to related models.
|
||||
Django CASCADE should handle this, but we explicitly clean up for safety.
|
||||
"""
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# Hard-delete related Images (including soft-deleted ones)
|
||||
images_count = Images.all_objects.filter(content=self).count()
|
||||
Images.all_objects.filter(content=self).delete()
|
||||
|
||||
logger.info(
|
||||
f"[Content.hard_delete] Content {self.id} '{self.title}' hard delete: "
|
||||
f"{images_count} images removed"
|
||||
)
|
||||
|
||||
# Call parent hard_delete (Django CASCADE will handle the rest)
|
||||
return super().hard_delete(using=using, keep_parents=keep_parents)
|
||||
|
||||
|
||||
class ContentTaxonomy(SiteSectorBaseModel):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user