# Generated by Django 4.2.30 on 2026-09-15 11:57 from django.conf import settings from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): initial = True dependencies = [ ('profiles', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='KanbanColumn', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=100, verbose_name='Column Name')), ('code', models.CharField(default='todo', max_length=50, verbose_name='Column Code Identifier')), ('order', models.IntegerField(default=0, verbose_name='Display Order')), ('color', models.CharField(blank=True, default='#6366f1', max_length=20, null=True, verbose_name='Badge / Header Color')), ], options={ 'verbose_name': 'Kanban Column', 'verbose_name_plural': 'Kanban Columns', 'ordering': ('order', 'id'), }, ), migrations.CreateModel( name='Project', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=255, verbose_name='Project Title')), ('slug', models.SlugField(allow_unicode=True, blank=True, max_length=255, null=True, unique=True, verbose_name='Slug / URL Identifier')), ('description', models.TextField(blank=True, null=True, verbose_name='Project Description & Objectives')), ('category', models.CharField(blank=True, help_text='e.g. Cultural Diplomacy, Educational Academy, Interfaith Dialogue, Humanitarian Relief', max_length=100, null=True, verbose_name='Project Category')), ('status', models.CharField(choices=[('planning', 'Planning'), ('active', 'Active / In Progress'), ('on_hold', 'On Hold'), ('completed', 'Completed')], default='active', max_length=20, verbose_name='Project Status')), ('progress_percentage', models.PositiveSmallIntegerField(default=0, verbose_name='Progress Percentage (0-100)')), ('budget', models.CharField(blank=True, help_text='e.g. $50,000 or €35,000', max_length=100, null=True, verbose_name='Estimated Budget')), ('team_size', models.PositiveIntegerField(default=1, verbose_name='Team Size')), ('cover_image', models.ImageField(blank=True, null=True, upload_to='projects/covers/%Y/%m/', verbose_name='Cover Image')), ('start_date', models.DateField(blank=True, null=True, verbose_name='Start Date')), ('estimated_end_date', models.DateField(blank=True, null=True, verbose_name='Estimated End Date')), ('actual_end_date', models.DateField(blank=True, null=True, verbose_name='Actual Completion Date')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), ('collaborating_institutions', models.ManyToManyField(blank=True, related_name='collaborative_projects', to='profiles.institution', verbose_name='Collaborating Institutions')), ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_projects', to=settings.AUTH_USER_MODEL, verbose_name='Created By')), ('owner_institution', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='owned_projects', to='profiles.institution', verbose_name='Lead / Owner Institution')), ], options={ 'verbose_name': 'Collaborative Project', 'verbose_name_plural': 'Collaborative Projects', 'ordering': ('-created_at',), }, ), migrations.CreateModel( name='ProjectDocument', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=255, verbose_name='Document Title')), ('file', models.FileField(upload_to='projects/docs/%Y/%m/', verbose_name='Document File')), ('doc_type', models.CharField(choices=[('mou', 'MOU / Bilateral Agreement'), ('report', 'Progress / Milestone Report'), ('contract', 'Contract / Agreement'), ('other', 'Other Document')], default='mou', max_length=50, verbose_name='Document Type')), ('uploaded_at', models.DateTimeField(auto_now_add=True, verbose_name='Uploaded At')), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='documents', to='projects.project', verbose_name='Project')), ('uploaded_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='uploaded_project_documents', to=settings.AUTH_USER_MODEL, verbose_name='Uploaded By')), ], options={ 'verbose_name': 'Project Document', 'verbose_name_plural': 'Project Documents', 'ordering': ('-uploaded_at',), }, ), migrations.CreateModel( name='KanbanTask', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('title', models.CharField(max_length=255, verbose_name='Task Title')), ('description', models.TextField(blank=True, null=True, verbose_name='Task Description')), ('priority', models.CharField(choices=[('low', 'Low'), ('medium', 'Medium'), ('high', 'High'), ('urgent', 'Urgent')], default='medium', max_length=20, verbose_name='Priority')), ('due_date', models.DateField(blank=True, null=True, verbose_name='Due Date')), ('labels', models.JSONField(blank=True, default=list, verbose_name='Task Labels')), ('order', models.IntegerField(default=0, verbose_name='Display Order within Column')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), ('assignee', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned_tasks', to=settings.AUTH_USER_MODEL, verbose_name='Assignee User')), ('column', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tasks', to='projects.kanbancolumn', verbose_name='Kanban Column')), ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='tasks', to='projects.project', verbose_name='Project')), ], options={ 'verbose_name': 'Kanban Task', 'verbose_name_plural': 'Kanban Tasks', 'ordering': ('order', '-updated_at'), }, ), migrations.AddField( model_name='kanbancolumn', name='project', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='columns', to='projects.project', verbose_name='Project'), ), ]