blurpritn adn site builde cleanup
This commit is contained in:
258
docs/TAXONOMY-RELATIONSHIP-DIAGRAM.md
Normal file
258
docs/TAXONOMY-RELATIONSHIP-DIAGRAM.md
Normal file
@@ -0,0 +1,258 @@
|
||||
# Content Taxonomy Relationship Diagram
|
||||
|
||||
## Current Architecture (Simplified)
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────────────┐
|
||||
│ IGNY8 Content System │
|
||||
└─────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
┌──────────────────────────────────────────────────────────────────────┐
|
||||
│ Multi-Tenant Hierarchy │
|
||||
│ │
|
||||
│ Account ──┬── Site ──┬── Sector ──┬── Keywords │
|
||||
│ │ │ ├── Clusters │
|
||||
│ │ │ ├── Ideas │
|
||||
│ │ │ ├── Tasks │
|
||||
│ │ │ ├── Content │
|
||||
│ │ │ └── ContentTaxonomy │
|
||||
│ │ └── Sector 2 │
|
||||
│ └── Site 2 │
|
||||
└──────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
|
||||
┌──────────────────────────────────────────────────────────────────────┐
|
||||
│ Planner → Writer → Publisher Workflow │
|
||||
│ │
|
||||
│ Phase 1-3: PLANNER │
|
||||
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
|
||||
│ │ Keywords │ ──> │ Clusters │ ──> │ Ideas │ │
|
||||
│ └──────────┘ └──────────┘ └──────────┘ │
|
||||
│ │ │ │ │
|
||||
│ │ │ │ │
|
||||
│ Phase 4: WRITER │
|
||||
│ │ │ │ │
|
||||
│ └─────────────────┴─────────────────┘ │
|
||||
│ │ │
|
||||
│ v │
|
||||
│ ┌──────────┐ ┌──────────┐ │
|
||||
│ │ Tasks │ ──> │ Content │ │
|
||||
│ └──────────┘ └──────────┘ │
|
||||
│ │ │
|
||||
│ │ │
|
||||
│ Phase 5: PUBLISHER │ │
|
||||
│ v │
|
||||
│ ┌─────────────┐ │
|
||||
│ │ WordPress │ │
|
||||
│ │ Shopify │ │
|
||||
│ │ Sites │ │
|
||||
│ └─────────────┘ │
|
||||
└──────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
|
||||
┌──────────────────────────────────────────────────────────────────────┐
|
||||
│ Content ↔ Taxonomy Relationship (Many-to-Many) │
|
||||
└──────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
┌─────────────────────────────────┐
|
||||
│ Content Model │
|
||||
│─────────────────────────────────│
|
||||
│ PK: id │
|
||||
│ FK: site_id ──────┐ │
|
||||
│ FK: sector_id │ │
|
||||
│ FK: cluster_id │ │
|
||||
│ │ │
|
||||
│ title │ │
|
||||
│ content_html │ │
|
||||
│ word_count │ │
|
||||
│ meta_title │ │
|
||||
│ meta_description │ │
|
||||
│ │ │
|
||||
│ content_type │ │
|
||||
│ content_structure │ │
|
||||
│ │ │
|
||||
│ external_id │ │
|
||||
│ external_url │ │
|
||||
│ sync_status │ │
|
||||
│ │ │
|
||||
│ source │ │
|
||||
│ status │ │
|
||||
└───────────┬───────┘ │
|
||||
│ │
|
||||
│ Many-to-Many │
|
||||
│ (via ContentTaxonomyRelation)
|
||||
│ │
|
||||
v │
|
||||
┌─────────────────────────────────┐│
|
||||
│ ContentTaxonomyRelation Model ││
|
||||
│─────────────────────────────────││
|
||||
│ PK: id ││
|
||||
│ FK: content_id ──────────────────┘
|
||||
│ FK: taxonomy_id ────────────┐
|
||||
│ │
|
||||
│ created_at │
|
||||
│ updated_at │
|
||||
│ │
|
||||
│ UNIQUE(content, taxonomy) │
|
||||
└─────────────────────────────┘
|
||||
│
|
||||
│
|
||||
v
|
||||
┌─────────────────────────────────┐
|
||||
│ ContentTaxonomy Model │
|
||||
│─────────────────────────────────│
|
||||
│ PK: id │
|
||||
│ FK: site_id ─────┐ │
|
||||
│ FK: sector_id │ │
|
||||
│ │ │
|
||||
│ name │ │
|
||||
│ slug │ │
|
||||
│ taxonomy_type │ ◄─── "category" or "tag"
|
||||
│ description │ │
|
||||
│ count │ │
|
||||
│ │ │
|
||||
│ WordPress Sync: │ │
|
||||
│ external_taxonomy│ ◄─── "category", "post_tag"
|
||||
│ external_id │ ◄─── WordPress term_id
|
||||
│ │ │
|
||||
│ metadata (JSON) │ │
|
||||
└──────────────────┘ │
|
||||
│ │
|
||||
│ │
|
||||
UNIQUE(site, slug, taxonomy_type)│
|
||||
UNIQUE(site, external_id, external_taxonomy)
|
||||
│ │
|
||||
└──────────────┘
|
||||
|
||||
|
||||
┌──────────────────────────────────────────────────────────────────────┐
|
||||
│ Usage Example │
|
||||
└──────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
# Get all categories for a content piece
|
||||
categories = content.taxonomy_terms.filter(taxonomy_type='category')
|
||||
|
||||
# Get all tags for a content piece
|
||||
tags = content.taxonomy_terms.filter(taxonomy_type='tag')
|
||||
|
||||
# Add a category to content
|
||||
tech_category = ContentTaxonomy.objects.get(name='Technology')
|
||||
content.taxonomy_terms.add(tech_category)
|
||||
|
||||
# Get all content with a specific tag
|
||||
tutorial_tag = ContentTaxonomy.objects.get(name='Tutorial')
|
||||
contents = tutorial_tag.contents.all()
|
||||
|
||||
# WordPress publishing (automatic)
|
||||
wp_categories = [term.name for term in content.taxonomy_terms.filter(taxonomy_type='category')]
|
||||
wp_tags = [term.name for term in content.taxonomy_terms.filter(taxonomy_type='tag')]
|
||||
|
||||
|
||||
┌──────────────────────────────────────────────────────────────────────┐
|
||||
│ WordPress Integration (Bidirectional Sync) │
|
||||
└──────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
IGNY8 → WordPress:
|
||||
─────────────────
|
||||
1. Content created in IGNY8
|
||||
2. Categories/tags assigned via taxonomy_terms M2M
|
||||
3. Publishing task created
|
||||
4. wordpress_publishing.py extracts:
|
||||
- categories = content.taxonomy_terms.filter(taxonomy_type='category')
|
||||
- tags = content.taxonomy_terms.filter(taxonomy_type='tag')
|
||||
5. REST API creates WordPress post with terms
|
||||
6. external_id saved back to Content model
|
||||
7. Log: [5-homeg8.com] [POST] Published: "Article Title" (ID: 123)
|
||||
|
||||
WordPress → IGNY8:
|
||||
─────────────────
|
||||
1. WordPress plugin detects post update
|
||||
2. REST API sends post data + terms to IGNY8
|
||||
3. Content updated/created with external_id
|
||||
4. ContentTaxonomy created/updated with external_id
|
||||
5. ContentTaxonomyRelation created linking them
|
||||
6. Log: [5-homeg8.com] [SYNC] Imported: "Article Title"
|
||||
|
||||
|
||||
┌──────────────────────────────────────────────────────────────────────┐
|
||||
│ Database Tables Summary │
|
||||
└──────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
igny8_content
|
||||
├─ id (PK)
|
||||
├─ site_id (FK → sites)
|
||||
├─ sector_id (FK → sectors)
|
||||
├─ cluster_id (FK → clusters)
|
||||
├─ title, content_html, word_count
|
||||
├─ meta_title, meta_description, keywords
|
||||
├─ content_type, content_structure
|
||||
├─ external_id, external_url, sync_status
|
||||
└─ source, status, timestamps
|
||||
|
||||
igny8_content_taxonomy_relations (Through Table)
|
||||
├─ id (PK)
|
||||
├─ content_id (FK → igny8_content)
|
||||
├─ taxonomy_id (FK → igny8_content_taxonomy_terms)
|
||||
└─ timestamps
|
||||
UNIQUE(content_id, taxonomy_id)
|
||||
|
||||
igny8_content_taxonomy_terms
|
||||
├─ id (PK)
|
||||
├─ site_id (FK → sites)
|
||||
├─ sector_id (FK → sectors)
|
||||
├─ name, slug
|
||||
├─ taxonomy_type ('category' | 'tag')
|
||||
├─ description, count
|
||||
├─ external_taxonomy ('category' | 'post_tag')
|
||||
├─ external_id (WordPress term_id)
|
||||
├─ metadata (JSON)
|
||||
└─ timestamps
|
||||
UNIQUE(site_id, slug, taxonomy_type)
|
||||
UNIQUE(site_id, external_id, external_taxonomy)
|
||||
|
||||
|
||||
┌──────────────────────────────────────────────────────────────────────┐
|
||||
│ Before vs After Comparison │
|
||||
└──────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
BEFORE (Complex - with SiteBlueprint):
|
||||
────────────────────────────────────
|
||||
SiteBlueprint ──┬── SiteBlueprintCluster ──> Clusters
|
||||
├── SiteBlueprintTaxonomy ──> ContentTaxonomy
|
||||
└── PageBlueprint ──> Content
|
||||
|
||||
Content ──> ContentTaxonomyMap ──> ContentTaxonomy
|
||||
(separate table with FK)
|
||||
|
||||
PublishingRecord ──┬── content_id
|
||||
└── site_blueprint_id
|
||||
|
||||
DeploymentRecord ──┬── content_id
|
||||
└── site_blueprint_id
|
||||
|
||||
|
||||
AFTER (Simple - SiteBlueprint Removed):
|
||||
──────────────────────────────────────
|
||||
Keywords ──> Clusters ──> Ideas ──> Tasks ──> Content
|
||||
|
||||
Content ↔ ContentTaxonomy
|
||||
(M2M via ContentTaxonomyRelation)
|
||||
|
||||
PublishingRecord ──> content_id
|
||||
|
||||
DeploymentRecord ──> content_id
|
||||
|
||||
|
||||
┌──────────────────────────────────────────────────────────────────────┐
|
||||
│ Key Benefits │
|
||||
└──────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
✅ Simpler architecture - removed 4 models
|
||||
✅ Direct M2M relationship - easier to query
|
||||
✅ Less database joins - better performance
|
||||
✅ Clear taxonomy model in Django admin
|
||||
✅ WordPress sync unchanged - still works perfectly
|
||||
✅ Planner-Writer-Publisher workflow intact
|
||||
✅ Multi-tenant security maintained
|
||||
✅ No circular dependencies
|
||||
✅ Clean codebase - no legacy blueprint code
|
||||
Reference in New Issue
Block a user