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,96 @@
# Generated by Django 5.2.7 on 2025-11-03 13:22
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('igny8_core_auth', '0003_alter_user_role'),
('planner', '0003_alter_clusters_sector_alter_clusters_site_and_more'),
]
operations = [
migrations.CreateModel(
name='Tasks',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(db_index=True, max_length=255)),
('description', models.TextField(blank=True, null=True)),
('keywords', models.CharField(blank=True, max_length=500)),
('content_structure', models.CharField(choices=[('cluster_hub', 'Cluster Hub'), ('landing_page', 'Landing Page'), ('pillar_page', 'Pillar Page'), ('supporting_page', 'Supporting Page')], default='blog_post', max_length=50)),
('content_type', models.CharField(choices=[('blog_post', 'Blog Post'), ('article', 'Article'), ('guide', 'Guide'), ('tutorial', 'Tutorial')], default='blog_post', max_length=50)),
('status', models.CharField(choices=[('queued', 'Queued'), ('in_progress', 'In Progress'), ('draft', 'Draft'), ('review', 'Review'), ('published', 'Published'), ('completed', 'Completed')], default='queued', max_length=50)),
('content', models.TextField(blank=True, null=True)),
('word_count', models.IntegerField(default=0)),
('meta_title', models.CharField(blank=True, max_length=255, null=True)),
('meta_description', models.TextField(blank=True, null=True)),
('assigned_post_id', models.IntegerField(blank=True, null=True)),
('post_url', models.URLField(blank=True, null=True)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('cluster', models.ForeignKey(blank=True, limit_choices_to={'sector': models.F('sector')}, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tasks', to='planner.clusters')),
('idea', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tasks', to='planner.contentideas')),
('sector', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_set', to='igny8_core_auth.sector')),
('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_set', to='igny8_core_auth.site')),
('tenant', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_set', to='igny8_core_auth.tenant')),
],
options={
'db_table': 'igny8_tasks',
'ordering': ['-created_at'],
},
),
migrations.CreateModel(
name='TaskImages',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('image_type', models.CharField(choices=[('featured', 'Featured Image'), ('desktop', 'Desktop Image'), ('mobile', 'Mobile Image'), ('in_article', 'In-Article Image')], default='featured', max_length=50)),
('image_url', models.URLField(blank=True, null=True)),
('image_path', models.CharField(blank=True, max_length=500, null=True)),
('prompt', models.TextField(blank=True, null=True)),
('status', models.CharField(default='pending', max_length=50)),
('position', models.IntegerField(default=0)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('sector', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_set', to='igny8_core_auth.sector')),
('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_set', to='igny8_core_auth.site')),
('tenant', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_set', to='igny8_core_auth.tenant')),
('task', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='writer.tasks')),
],
options={
'db_table': 'igny8_task_images',
'ordering': ['task', 'position', '-created_at'],
},
),
migrations.AddIndex(
model_name='tasks',
index=models.Index(fields=['title'], name='igny8_tasks_title_adc50b_idx'),
),
migrations.AddIndex(
model_name='tasks',
index=models.Index(fields=['status'], name='igny8_tasks_status_706869_idx'),
),
migrations.AddIndex(
model_name='tasks',
index=models.Index(fields=['cluster'], name='igny8_tasks_cluster_ac6cd4_idx'),
),
migrations.AddIndex(
model_name='tasks',
index=models.Index(fields=['content_type'], name='igny8_tasks_content_343539_idx'),
),
migrations.AddIndex(
model_name='tasks',
index=models.Index(fields=['site', 'sector'], name='igny8_tasks_site_id_9880f4_idx'),
),
migrations.AddIndex(
model_name='taskimages',
index=models.Index(fields=['task', 'image_type'], name='igny8_task__task_id_143db4_idx'),
),
migrations.AddIndex(
model_name='taskimages',
index=models.Index(fields=['status'], name='igny8_task__status_4f869f_idx'),
),
]

View File

@@ -0,0 +1,63 @@
"""Rename TaskImages, add Content model, and keyword links"""
from django.core.validators import MinValueValidator
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('planner', '0004_add_keyword_objects_to_contentideas'),
('writer', '0001_initial'),
]
operations = [
migrations.RenameModel(
old_name='TaskImages',
new_name='Images',
),
migrations.AlterModelTable(
name='images',
table='igny8_images',
),
migrations.AlterModelOptions(
name='images',
options={'ordering': ['task', 'position', '-created_at']},
),
migrations.AddField(
model_name='tasks',
name='keyword_objects',
field=models.ManyToManyField(blank=True, help_text='Individual keywords linked to this task', related_name='tasks', to='planner.keywords'),
),
migrations.CreateModel(
name='Content',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('html_content', models.TextField(help_text='Final AI-generated HTML content')),
('word_count', models.IntegerField(default=0, help_text='Word count of generated content', validators=[MinValueValidator(0)])),
('metadata', models.JSONField(default=dict, help_text='Additional metadata (SEO, structure, etc.)')),
('generated_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('sector', models.ForeignKey(on_delete=models.CASCADE, related_name='content_set', to='igny8_core_auth.sector')),
('site', models.ForeignKey(on_delete=models.CASCADE, related_name='content_set', to='igny8_core_auth.site')),
('task', models.OneToOneField(help_text='The task this content belongs to', on_delete=models.CASCADE, related_name='content_record', to='writer.tasks')),
('tenant', models.ForeignKey(on_delete=models.CASCADE, related_name='content_set', to='igny8_core_auth.tenant')),
],
options={
'db_table': 'igny8_content',
'ordering': ['-generated_at'],
},
),
migrations.AddIndex(
model_name='images',
index=models.Index(fields=['task', 'position'], name='igny8_images_task_id_pos_idx'),
),
migrations.AddIndex(
model_name='content',
index=models.Index(fields=['task'], name='igny8_content_task_id_idx'),
),
migrations.AddIndex(
model_name='content',
index=models.Index(fields=['generated_at'], name='igny8_content_generated_idx'),
),
]

View File

@@ -0,0 +1,110 @@
# Generated by Django 5.2.8 on 2025-11-07 10:06
import django.core.validators
import django.db.models.deletion
import django.utils.timezone
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('igny8_core_auth', '0008_passwordresettoken_alter_industry_options_and_more'),
('writer', '0002_rename_taskimages_add_content_and_keywords'),
]
operations = [
migrations.AlterModelOptions(
name='content',
options={'ordering': ['-generated_at'], 'verbose_name': 'Content', 'verbose_name_plural': 'Contents'},
),
migrations.AlterModelOptions(
name='images',
options={'ordering': ['task', 'position', '-created_at'], 'verbose_name': 'Image', 'verbose_name_plural': 'Images'},
),
migrations.AlterModelOptions(
name='tasks',
options={'ordering': ['-created_at'], 'verbose_name': 'Task', 'verbose_name_plural': 'Tasks'},
),
migrations.RenameIndex(
model_name='content',
new_name='igny8_conte_task_id_712988_idx',
old_name='igny8_content_task_id_idx',
),
migrations.RenameIndex(
model_name='content',
new_name='igny8_conte_generat_7128df_idx',
old_name='igny8_content_generated_idx',
),
migrations.RenameIndex(
model_name='images',
new_name='igny8_image_task_id_c80e87_idx',
old_name='igny8_task__task_id_143db4_idx',
),
migrations.RenameIndex(
model_name='images',
new_name='igny8_image_status_4a4de2_idx',
old_name='igny8_task__status_4f869f_idx',
),
migrations.RenameIndex(
model_name='images',
new_name='igny8_image_task_id_6340e6_idx',
old_name='igny8_images_task_id_pos_idx',
),
migrations.AddField(
model_name='content',
name='created_at',
field=models.DateTimeField(auto_now_add=True, db_index=True, default=django.utils.timezone.now),
preserve_default=False,
),
migrations.AlterField(
model_name='content',
name='sector',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_set', to='igny8_core_auth.sector'),
),
migrations.AlterField(
model_name='content',
name='site',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_set', to='igny8_core_auth.site'),
),
migrations.AlterField(
model_name='content',
name='tenant',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_set', to='igny8_core_auth.tenant'),
),
migrations.AlterField(
model_name='content',
name='word_count',
field=models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(0)]),
),
migrations.AlterField(
model_name='images',
name='image_path',
field=models.CharField(blank=True, help_text='Local path if stored locally', max_length=500, null=True),
),
migrations.AlterField(
model_name='images',
name='image_url',
field=models.URLField(blank=True, help_text='URL of the generated/stored image', null=True),
),
migrations.AlterField(
model_name='images',
name='position',
field=models.IntegerField(default=0, help_text='Position for in-article images ordering'),
),
migrations.AlterField(
model_name='images',
name='prompt',
field=models.TextField(blank=True, help_text='Image generation prompt used', null=True),
),
migrations.AlterField(
model_name='images',
name='status',
field=models.CharField(default='pending', help_text='Status: pending, generated, failed', max_length=50),
),
migrations.AlterField(
model_name='images',
name='task',
field=models.ForeignKey(help_text='The task this image belongs to', on_delete=django.db.models.deletion.CASCADE, related_name='images', to='writer.tasks'),
),
]