Initial commit: igny8 project

This commit is contained in:
igny8
2025-11-09 10:27:02 +00:00
commit 60b8188111
27265 changed files with 4360521 additions and 0 deletions

View File

@@ -0,0 +1,150 @@
"""
System module models - for global settings and prompts
"""
from django.db import models
from igny8_core.auth.models import AccountBaseModel
# Import settings models
from .settings_models import (
SystemSettings, AccountSettings, UserSettings, ModuleSettings, AISettings
)
class AIPrompt(AccountBaseModel):
"""AI Prompt templates for various AI operations"""
PROMPT_TYPE_CHOICES = [
('clustering', 'Clustering'),
('ideas', 'Ideas Generation'),
('content_generation', 'Content Generation'),
('image_prompt_extraction', 'Image Prompt Extraction'),
('image_prompt_template', 'Image Prompt Template'),
('negative_prompt', 'Negative Prompt'),
]
prompt_type = models.CharField(max_length=50, choices=PROMPT_TYPE_CHOICES, db_index=True)
prompt_value = models.TextField(help_text="The prompt template text")
default_prompt = models.TextField(help_text="Default prompt value (for reset)")
is_active = models.BooleanField(default=True)
updated_at = models.DateTimeField(auto_now=True)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'igny8_ai_prompts'
ordering = ['prompt_type']
unique_together = [['account', 'prompt_type']] # Each account can have one prompt per type
indexes = [
models.Index(fields=['prompt_type']),
models.Index(fields=['account', 'prompt_type']),
]
def __str__(self):
return f"{self.get_prompt_type_display()}"
class IntegrationSettings(AccountBaseModel):
"""Integration settings for OpenAI, Runware, GSC, etc."""
INTEGRATION_TYPE_CHOICES = [
('openai', 'OpenAI'),
('runware', 'Runware'),
('gsc', 'Google Search Console'),
('image_generation', 'Image Generation Service'),
]
integration_type = models.CharField(max_length=50, choices=INTEGRATION_TYPE_CHOICES, db_index=True)
config = models.JSONField(default=dict, help_text="Integration configuration (API keys, settings, etc.)")
is_active = models.BooleanField(default=True)
updated_at = models.DateTimeField(auto_now=True)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'igny8_integration_settings'
unique_together = [['account', 'integration_type']]
ordering = ['integration_type']
indexes = [
models.Index(fields=['integration_type']),
models.Index(fields=['account', 'integration_type']),
]
def __str__(self):
account = getattr(self, 'account', None)
return f"{self.get_integration_type_display()} - {account.name if account else 'No Account'}"
class AuthorProfile(AccountBaseModel):
"""
Writing style profiles - tone, language, structure templates.
Examples: "SaaS B2B Informative", "E-commerce Product Descriptions", etc.
"""
name = models.CharField(max_length=255, help_text="Profile name (e.g., 'SaaS B2B Informative')")
description = models.TextField(blank=True, help_text="Description of the writing style")
tone = models.CharField(
max_length=100,
help_text="Writing tone (e.g., 'Professional', 'Casual', 'Technical', 'Conversational')"
)
language = models.CharField(max_length=50, default='en', help_text="Language code (e.g., 'en', 'es', 'fr')")
structure_template = models.JSONField(
default=dict,
help_text="Structure template defining content sections and their order"
)
is_active = models.BooleanField(default=True, db_index=True)
updated_at = models.DateTimeField(auto_now=True)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'igny8_author_profiles'
ordering = ['name']
verbose_name = 'Author Profile'
verbose_name_plural = 'Author Profiles'
indexes = [
models.Index(fields=['account', 'is_active']),
models.Index(fields=['name']),
]
def __str__(self):
account = getattr(self, 'account', None)
return f"{self.name} ({account.name if account else 'No Account'})"
class Strategy(AccountBaseModel):
"""
Defined content strategies per sector, integrating prompt types, section logic, etc.
Links together prompts, author profiles, and sector-specific content strategies.
"""
name = models.CharField(max_length=255, help_text="Strategy name")
description = models.TextField(blank=True, help_text="Description of the content strategy")
sector = models.ForeignKey(
'igny8_core_auth.Sector',
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='strategies',
help_text="Optional: Link strategy to a specific sector"
)
prompt_types = models.JSONField(
default=list,
help_text="List of prompt types to use (e.g., ['clustering', 'ideas', 'content_generation'])"
)
section_logic = models.JSONField(
default=dict,
help_text="Section logic configuration defining content structure and flow"
)
is_active = models.BooleanField(default=True, db_index=True)
updated_at = models.DateTimeField(auto_now=True)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'igny8_strategies'
ordering = ['name']
verbose_name = 'Strategy'
verbose_name_plural = 'Strategies'
indexes = [
models.Index(fields=['account', 'is_active']),
models.Index(fields=['account', 'sector']),
models.Index(fields=['name']),
]
def __str__(self):
sector_name = self.sector.name if self.sector else 'Global'
return f"{self.name} ({sector_name})"