taxonomy fix

This commit is contained in:
IGNY8 VPS (Salman)
2025-12-01 05:13:53 +00:00
parent 9f82a11c56
commit 6f449c32c1
2 changed files with 64 additions and 26 deletions

View File

@@ -242,24 +242,24 @@ class GenerateContentFunction(BaseAIFunction):
tag_name = tag_name.strip()
if tag_name:
try:
# Get or create tag taxonomy term
tag_slug = slugify(tag_name)
# Get or create tag taxonomy term using site + slug + type for uniqueness
tag_obj, created = ContentTaxonomy.objects.get_or_create(
site=task.site,
name=tag_name,
slug=tag_slug,
taxonomy_type='tag',
defaults={
'slug': slugify(tag_name),
'name': tag_name,
'sector': task.sector,
'account': task.account,
'description': '', # Required by database
'external_taxonomy': '', # Required by database
'sync_status': '', # Required by database
'count': 0, # Required by database
'metadata': {}, # Required by database
'description': '',
'external_taxonomy': '',
'count': 0,
'metadata': {},
}
)
content_record.taxonomy_terms.add(tag_obj)
logger.info(f"{'Created' if created else 'Found'} and linked tag: {tag_name} (ID: {tag_obj.id})")
logger.info(f"{'Created' if created else 'Found'} and linked tag: {tag_name} (ID: {tag_obj.id}, Slug: {tag_slug})")
except Exception as e:
logger.error(f"Failed to add tag '{tag_name}': {e}", exc_info=True)
@@ -271,24 +271,24 @@ class GenerateContentFunction(BaseAIFunction):
category_name = category_name.strip()
if category_name:
try:
# Get or create category taxonomy term
category_slug = slugify(category_name)
# Get or create category taxonomy term using site + slug + type for uniqueness
category_obj, created = ContentTaxonomy.objects.get_or_create(
site=task.site,
name=category_name,
slug=category_slug,
taxonomy_type='category',
defaults={
'slug': slugify(category_name),
'name': category_name,
'sector': task.sector,
'account': task.account,
'description': '', # Required by database
'external_taxonomy': '', # Required by database
'sync_status': '', # Required by database
'count': 0, # Required by database
'metadata': {}, # Required by database
'description': '',
'external_taxonomy': '',
'count': 0,
'metadata': {},
}
)
content_record.taxonomy_terms.add(category_obj)
logger.info(f"{'Created' if created else 'Found'} and linked category: {category_name} (ID: {category_obj.id})")
logger.info(f"{'Created' if created else 'Found'} and linked category: {category_name} (ID: {category_obj.id}, Slug: {category_slug})")
except Exception as e:
logger.error(f"Failed to add category '{category_name}': {e}", exc_info=True)

View File

@@ -1,7 +1,16 @@
from django.contrib import admin
from igny8_core.admin.base import SiteSectorAdminMixin
from .models import Tasks, Images, Content
from igny8_core.business.content.models import ContentTaxonomy, ContentAttribute
from igny8_core.business.content.models import ContentTaxonomy, ContentAttribute, ContentTaxonomyRelation
class ContentTaxonomyInline(admin.TabularInline):
"""Inline admin for managing content taxonomy relationships"""
model = ContentTaxonomyRelation
extra = 1
autocomplete_fields = ['taxonomy']
verbose_name = 'Taxonomy Term'
verbose_name_plural = 'Taxonomy Terms (Tags & Categories)'
@admin.register(Tasks)
@@ -90,8 +99,8 @@ class ContentAdmin(SiteSectorAdminMixin, admin.ModelAdmin):
list_filter = ['content_type', 'content_structure', 'source', 'status', 'site', 'sector', 'created_at']
search_fields = ['title', 'content_html', 'external_url']
ordering = ['-created_at']
readonly_fields = ['created_at', 'updated_at', 'word_count']
# Note: taxonomy_terms removed from filter_horizontal because it uses a through model
readonly_fields = ['created_at', 'updated_at', 'word_count', 'get_tags_display', 'get_categories_display']
inlines = [ContentTaxonomyInline]
fieldsets = (
('Basic Info', {
@@ -100,8 +109,11 @@ class ContentAdmin(SiteSectorAdminMixin, admin.ModelAdmin):
('Content Classification', {
'fields': ('content_type', 'content_structure', 'source')
}),
# Note: taxonomy_terms field removed from fieldsets because it uses ContentTaxonomyAssociation through model
# Taxonomy associations can be managed via the inline admin or separately
('Taxonomies (Read-only - manage below)', {
'fields': ('get_tags_display', 'get_categories_display'),
'classes': ('collapse',),
'description': 'View tags and categories. To add/remove, use the Taxonomy Terms section below.'
}),
('Content', {
'fields': ('content_html', 'word_count')
}),
@@ -124,6 +136,22 @@ class ContentAdmin(SiteSectorAdminMixin, admin.ModelAdmin):
return obj.taxonomy_terms.count()
get_taxonomy_count.short_description = 'Taxonomy Count'
def get_tags_display(self, obj):
"""Display tags"""
tags = obj.taxonomy_terms.filter(taxonomy_type='tag')
if tags.exists():
return ', '.join([tag.name for tag in tags])
return 'No tags'
get_tags_display.short_description = 'Tags'
def get_categories_display(self, obj):
"""Display categories"""
categories = obj.taxonomy_terms.filter(taxonomy_type='category')
if categories.exists():
return ', '.join([cat.name for cat in categories])
return 'No categories'
get_categories_display.short_description = 'Categories'
def get_site_display(self, obj):
"""Safely get site name"""
try:
@@ -142,17 +170,27 @@ class ContentAdmin(SiteSectorAdminMixin, admin.ModelAdmin):
@admin.register(ContentTaxonomy)
class ContentTaxonomyAdmin(SiteSectorAdminMixin, admin.ModelAdmin):
list_display = ['name', 'taxonomy_type', 'slug', 'external_id', 'external_taxonomy', 'site', 'sector']
list_display = ['name', 'taxonomy_type', 'slug', 'count', 'external_id', 'external_taxonomy', 'site', 'sector']
list_filter = ['taxonomy_type', 'site', 'sector']
search_fields = ['name', 'slug', 'external_taxonomy']
ordering = ['taxonomy_type', 'name']
readonly_fields = ['count', 'created_at', 'updated_at']
fieldsets = (
('Basic Info', {
'fields': ('name', 'slug', 'taxonomy_type', 'site', 'sector')
'fields': ('name', 'slug', 'taxonomy_type', 'description', 'site', 'sector')
}),
('Usage', {
'fields': ('count',),
'description': 'Number of content items using this term'
}),
('WordPress Sync', {
'fields': ('external_id', 'external_taxonomy')
'fields': ('external_id', 'external_taxonomy', 'metadata'),
'classes': ('collapse',)
}),
('Timestamps', {
'fields': ('created_at', 'updated_at'),
'classes': ('collapse',)
}),
)