You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
7.4 KiB
105 lines
7.4 KiB
# 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'),
|
|
),
|
|
]
|