HH/apps/presentations/migrations/0001_initial.py
ismail fd19216b0d
All checks were successful
Build and Push Docker Image / build (push) Successful in 1m5s
track migrations in git, regenerate fresh initial migrations, add staging-test compose, fix .gitignore
2026-05-11 23:34:39 +03:00

135 lines
9.3 KiB
Python

# Generated by Django 6.0.1 on 2026-05-11 20:32
import django.db.models.deletion
import uuid
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('organizations', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Presentation',
fields=[
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('title', models.CharField(max_length=300)),
('subtitle', models.CharField(blank=True, max_length=500)),
('description', models.TextField(blank=True)),
('theme', models.CharField(choices=[('healthcare_modern', 'Healthcare Modern'), ('corporate_navy', 'Corporate Navy'), ('dark_command', 'Dark Command Center')], default='healthcare_modern', max_length=30)),
('status', models.CharField(choices=[('draft', 'Draft'), ('published', 'Published'), ('archived', 'Archived')], default='draft', max_length=20)),
('presentation_type', models.CharField(blank=True, help_text='Type of report (e.g., quarterly, monthly, custom)', max_length=50)),
('thumbnail', models.ImageField(blank=True, null=True, upload_to='presentations/thumbnails/')),
('presentation_date', models.DateField(blank=True, null=True)),
('is_shared', models.BooleanField(default=False)),
('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='presentations', to=settings.AUTH_USER_MODEL)),
('hospital', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='presentations', to='organizations.hospital')),
],
options={
'ordering': ['-created_at'],
},
),
migrations.CreateModel(
name='ReportTemplate',
fields=[
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('name', models.CharField(max_length=200)),
('slug', models.SlugField(max_length=220, unique=True)),
('description', models.TextField(blank=True)),
('data_source', models.CharField(help_text='Key in REPORT_DATA_SOURCES registry', max_length=50)),
('reference_pdf', models.FileField(blank=True, null=True, upload_to='report_templates/')),
('parsed_structure', models.JSONField(blank=True, default=dict, help_text='Raw AI analysis of the reference PDF')),
('style_config', models.JSONField(blank=True, default=dict, help_text='Theme colors, row colors, fonts')),
('ai_prompt_template', models.TextField(blank=True, help_text='Prompt template for AI insight generation. Use {{ data_summary }} placeholder.')),
('active', models.BooleanField(default=True)),
('created_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='report_templates', to=settings.AUTH_USER_MODEL)),
('hospital', models.ForeignKey(blank=True, help_text='Null = available for all hospitals', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='report_templates', to='organizations.hospital')),
],
options={
'ordering': ['name'],
},
),
migrations.CreateModel(
name='ReportTemplateSlide',
fields=[
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('order', models.PositiveIntegerField(default=0)),
('layout', models.CharField(choices=[('cover', 'Cover'), ('section_divider', 'Section Divider'), ('kpi_dashboard', 'KPI Dashboard'), ('full_chart', 'Full Chart'), ('chart_metrics', 'Chart + Metrics'), ('data_table', 'Data Table'), ('two_column', 'Two Column'), ('quote', 'Quote / Callout'), ('timeline', 'Timeline'), ('comparison', 'Comparison'), ('team_grid', 'Team / Department Grid'), ('closing', 'Closing')], default='cover', max_length=30)),
('section_label', models.CharField(blank=True, help_text='For section dividers: e.g. "01", "02"', max_length=50)),
('title_template', models.CharField(blank=True, help_text='Supports {{ variable }} substitution', max_length=300)),
('subtitle_template', models.CharField(blank=True, help_text='Supports {{ variable }} substitution', max_length=500)),
('content_mapping', models.JSONField(blank=True, default=dict, help_text='How data maps to slide content. Structure depends on layout type.')),
('repeat_source', models.CharField(blank=True, help_text='Data key to repeat over, e.g. "by_department". Creates one slide per item.', max_length=100)),
('repeat_title_key', models.CharField(blank=True, default='name', help_text='Key in repeat item for slide title, e.g. "department_name"', max_length=100)),
('repeat_subtitle_template', models.CharField(blank=True, help_text='Subtitle template for repeated slides. {{ item.X }} available.', max_length=300)),
('max_rows', models.PositiveIntegerField(default=18, help_text='Max data rows per slide (tables split across slides)')),
('style_overrides', models.JSONField(blank=True, default=dict, help_text='Per-slide style overrides (row colors, etc.)')),
('speaker_notes_template', models.TextField(blank=True, help_text='Speaker notes template with {{ variable }} support')),
('template', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='template_slides', to='presentations.reporttemplate')),
],
options={
'ordering': ['order'],
},
),
migrations.CreateModel(
name='Slide',
fields=[
('created_at', models.DateTimeField(auto_now_add=True, db_index=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('layout', models.CharField(choices=[('cover', 'Cover'), ('section_divider', 'Section Divider'), ('kpi_dashboard', 'KPI Dashboard'), ('full_chart', 'Full Chart'), ('chart_metrics', 'Chart + Metrics'), ('data_table', 'Data Table'), ('two_column', 'Two Column'), ('quote', 'Quote / Callout'), ('timeline', 'Timeline'), ('comparison', 'Comparison'), ('team_grid', 'Team / Department Grid'), ('closing', 'Closing')], default='cover', max_length=30)),
('order', models.PositiveIntegerField(default=0)),
('title', models.CharField(blank=True, max_length=300)),
('subtitle', models.CharField(blank=True, max_length=500)),
('content', models.JSONField(blank=True, default=dict, help_text='Layout-specific content. Structure varies by slide type: kpi_dashboard={metrics:[...]}, full_chart={chart_config:{...}}, data_table={headers:[...], rows:[...]}, etc.')),
('background_color', models.CharField(blank=True, max_length=20)),
('speaker_notes', models.TextField(blank=True)),
('presentation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='slides', to='presentations.presentation')),
],
options={
'ordering': ['order'],
},
),
migrations.AddIndex(
model_name='presentation',
index=models.Index(fields=['status', '-created_at'], name='presentatio_status_796dc2_idx'),
),
migrations.AddIndex(
model_name='presentation',
index=models.Index(fields=['hospital', '-created_at'], name='presentatio_hospita_440c35_idx'),
),
migrations.AddIndex(
model_name='presentation',
index=models.Index(fields=['created_by', '-created_at'], name='presentatio_created_8f92d8_idx'),
),
migrations.AddIndex(
model_name='reporttemplate',
index=models.Index(fields=['active', '-created_at'], name='presentatio_active_9f6871_idx'),
),
migrations.AddIndex(
model_name='reporttemplate',
index=models.Index(fields=['data_source'], name='presentatio_data_so_3f9155_idx'),
),
migrations.AddIndex(
model_name='reporttemplateslide',
index=models.Index(fields=['template', 'order'], name='presentatio_templat_377148_idx'),
),
migrations.AddIndex(
model_name='slide',
index=models.Index(fields=['presentation', 'order'], name='presentatio_present_0069fe_idx'),
),
]