# Generated by Django 4.2.7 on 2026-01-09 21:47

from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='District',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=150)),
                ('code', models.CharField(blank=True, max_length=50, null=True)),
                ('slug', models.SlugField(blank=True, max_length=120, null=True)),
            ],
            options={
                'db_table': 'geo_district',
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='ExamCandidate',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('year', models.PositiveIntegerField(db_index=True)),
                ('cand_no', models.CharField(max_length=20)),
                ('prem_no', models.CharField(blank=True, max_length=20, null=True)),
                ('sex', models.CharField(max_length=1)),
                ('name', models.CharField(max_length=255)),
                ('division', models.CharField(blank=True, max_length=20, null=True)),
                ('points', models.CharField(blank=True, max_length=20, null=True)),
                ('cand_comb', models.CharField(blank=True, max_length=20, null=True)),
                ('position', models.CharField(blank=True, max_length=20, null=True)),
                ('avg_grade', models.CharField(blank=True, max_length=3, null=True)),
                ('avg_numeric', models.FloatField(default=0)),
                ('status', models.CharField(blank=True, max_length=20, null=True)),
                ('full_results', models.TextField(blank=True, null=True)),
            ],
            options={
                'db_table': 'exam_candidate',
            },
        ),
        migrations.CreateModel(
            name='ExamSubject',
            fields=[
                ('subject_id', models.AutoField(primary_key=True, serialize=False)),
                ('subject_code', models.CharField(db_index=True, max_length=50, unique=True)),
                ('subject_name_sw', models.CharField(max_length=255)),
                ('subject_name_eng', models.CharField(max_length=255)),
                ('subject_level', models.CharField(max_length=255, null=True)),
                ('subject_shortname', models.CharField(max_length=255, null=True)),
                ('is_active', models.BooleanField(default=True)),
                ('color_code', models.CharField(default='#FFFFFF', help_text='HEX color code, e.g. #FFD700', max_length=7)),
            ],
            options={
                'db_table': 'exams_subject',
                'ordering': ['subject_code'],
            },
        ),
        migrations.CreateModel(
            name='ExamType',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('code', models.CharField(max_length=20, unique=True)),
                ('name', models.CharField(max_length=100)),
                ('description', models.TextField(blank=True, null=True)),
                ('year', models.PositiveIntegerField(db_index=True, null=True)),
                ('is_active', models.BooleanField(default=True)),
            ],
            options={
                'db_table': 'exam_type',
            },
        ),
        migrations.CreateModel(
            name='Region',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=150, unique=True)),
                ('code', models.CharField(blank=True, max_length=50, null=True)),
                ('slug', models.SlugField(blank=True, max_length=120, null=True)),
            ],
            options={
                'db_table': 'geo_region',
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='School',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('school_code', models.CharField(db_index=True, max_length=20, unique=True)),
                ('school_regno', models.CharField(blank=True, max_length=50, null=True, unique=True)),
                ('name', models.CharField(max_length=255)),
                ('ownership', models.CharField(choices=[('GVT', 'Government'), ('NON-GVT', 'Private')], max_length=20)),
                ('latitude', models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True)),
                ('longitude', models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True)),
                ('district', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='exams.district')),
                ('region', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='exams.region')),
            ],
            options={
                'db_table': 'geo_school',
                'ordering': ['school_code'],
            },
        ),
        migrations.CreateModel(
            name='SchoolClass',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=10)),
            ],
        ),
        migrations.CreateModel(
            name='Stream',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=5)),
                ('school', models.ForeignKey(blank=True, db_column='school_code', null=True, on_delete=django.db.models.deletion.CASCADE, to='exams.school', to_field='school_code')),
                ('school_class', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='exams.schoolclass')),
            ],
        ),
        migrations.CreateModel(
            name='Teacher',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=100)),
                ('school', models.ForeignKey(blank=True, db_column='school_code', null=True, on_delete=django.db.models.deletion.CASCADE, to='exams.school', to_field='school_code')),
            ],
        ),
        migrations.CreateModel(
            name='Ward',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=150)),
                ('district', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='wards', to='exams.district')),
            ],
            options={
                'db_table': 'geo_ward',
                'ordering': ['name'],
            },
        ),
        migrations.CreateModel(
            name='UserProfile',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('role', models.CharField(choices=[('super', 'Super Admin'), ('region', 'Region Officer'), ('district', 'District Officer'), ('ward', 'Ward Officer'), ('school', 'School Officer')], db_index=True, max_length=20)),
                ('photo', models.ImageField(blank=True, null=True, upload_to='profile_images/')),
                ('phone', models.CharField(blank=True, max_length=50, null=True)),
                ('district', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='exams.district')),
                ('region', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='exams.region')),
                ('school', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='exams.school')),
                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL)),
                ('ward', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='exams.ward')),
            ],
            options={
                'db_table': 'user_profile',
            },
        ),
        migrations.CreateModel(
            name='TimetableSubject',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('weekly_periods', models.IntegerField()),
                ('morning_priority', models.BooleanField(default=False)),
                ('exam_subject', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='timetable_config', to='exams.examsubject')),
                ('school', models.ForeignKey(blank=True, db_column='school_code', null=True, on_delete=django.db.models.deletion.CASCADE, to='exams.school', to_field='school_code')),
            ],
        ),
        migrations.CreateModel(
            name='TeacherSubject',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('school', models.ForeignKey(blank=True, db_column='school_code', null=True, on_delete=django.db.models.deletion.CASCADE, to='exams.school', to_field='school_code')),
                ('stream', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='exams.stream')),
                ('subject', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='exams.examsubject')),
                ('teacher', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='exams.teacher')),
            ],
        ),
        migrations.CreateModel(
            name='StudentSubjectMark',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('year', models.PositiveIntegerField(db_index=True)),
                ('cand_no', models.CharField(db_index=True, max_length=20)),
                ('subject_code', models.CharField(db_index=True, max_length=50)),
                ('numeric_score', models.FloatField(blank=True, null=True)),
                ('grade', models.CharField(blank=True, max_length=3, null=True)),
                ('exam_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='exams.examtype')),
                ('school', models.ForeignKey(db_column='school_code', on_delete=django.db.models.deletion.CASCADE, to='exams.school', to_field='school_code')),
            ],
            options={
                'db_table': 'student_subject_mark',
            },
        ),
        migrations.CreateModel(
            name='SchoolYearSummary',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('year', models.PositiveIntegerField(db_index=True)),
                ('candidates', models.IntegerField(default=0)),
                ('avg_numeric', models.FloatField(default=0)),
                ('avg_gpa', models.FloatField(default=0)),
                ('avg_grade', models.CharField(blank=True, max_length=3, null=True)),
                ('pass_rate', models.FloatField(default=0)),
                ('fail_rate', models.FloatField(default=0)),
                ('status', models.CharField(blank=True, max_length=20, null=True)),
                ('exam_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='exams.examtype')),
                ('school', models.ForeignKey(db_column='school_code', on_delete=django.db.models.deletion.CASCADE, to='exams.school', to_field='school_code')),
            ],
            options={
                'db_table': 'school_year_summary',
            },
        ),
        migrations.CreateModel(
            name='SchoolSubjectPerformance',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('school_code', models.CharField(db_index=True, max_length=20)),
                ('year', models.PositiveIntegerField(db_index=True)),
                ('subject_code', models.CharField(db_index=True, max_length=10)),
                ('total_std', models.PositiveIntegerField(default=0)),
                ('total_pass', models.PositiveIntegerField(default=0)),
                ('subj_gpa', models.DecimalField(decimal_places=4, default=0, max_digits=7)),
                ('subj_avg', models.DecimalField(decimal_places=4, default=0, max_digits=6)),
                ('subj_grade', models.CharField(blank=True, max_length=2, null=True)),
                ('subj_status', models.CharField(blank=True, max_length=20, null=True)),
                ('exam_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='exams.examtype')),
            ],
            options={
                'db_table': 'school_subject_performance',
                'ordering': ['school_code', 'subject_code'],
            },
        ),
        migrations.AddField(
            model_name='school',
            name='ward',
            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='exams.ward'),
        ),
        migrations.AddIndex(
            model_name='examtype',
            index=models.Index(fields=['is_active'], name='exam_type_is_acti_7d65e5_idx'),
        ),
        migrations.AddIndex(
            model_name='examsubject',
            index=models.Index(fields=['subject_code'], name='exams_subje_subject_5de235_idx'),
        ),
        migrations.AddIndex(
            model_name='examsubject',
            index=models.Index(fields=['is_active'], name='exams_subje_is_acti_d4c6c2_idx'),
        ),
        migrations.AddField(
            model_name='examcandidate',
            name='exam_type',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='exams.examtype'),
        ),
        migrations.AddField(
            model_name='examcandidate',
            name='school',
            field=models.ForeignKey(db_column='school_code', on_delete=django.db.models.deletion.CASCADE, to='exams.school', to_field='school_code'),
        ),
        migrations.AddField(
            model_name='district',
            name='region',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='districts', to='exams.region'),
        ),
        migrations.AddIndex(
            model_name='ward',
            index=models.Index(fields=['district', 'name'], name='geo_ward_distric_9b4d00_idx'),
        ),
        migrations.AlterUniqueTogether(
            name='ward',
            unique_together={('district', 'name')},
        ),
        migrations.AddIndex(
            model_name='userprofile',
            index=models.Index(fields=['role'], name='user_profil_role_c7e6f1_idx'),
        ),
        migrations.AlterUniqueTogether(
            name='teachersubject',
            unique_together={('teacher', 'subject', 'stream')},
        ),
        migrations.AddIndex(
            model_name='studentsubjectmark',
            index=models.Index(fields=['exam_type', 'year'], name='student_sub_exam_ty_be73cf_idx'),
        ),
        migrations.AddIndex(
            model_name='studentsubjectmark',
            index=models.Index(fields=['school', 'year', 'exam_type'], name='student_sub_school__47c537_idx'),
        ),
        migrations.AddIndex(
            model_name='studentsubjectmark',
            index=models.Index(fields=['cand_no', 'year', 'exam_type'], name='student_sub_cand_no_038cb1_idx'),
        ),
        migrations.AddIndex(
            model_name='studentsubjectmark',
            index=models.Index(fields=['subject_code', 'year', 'exam_type'], name='student_sub_subject_544ee8_idx'),
        ),
        migrations.AddIndex(
            model_name='studentsubjectmark',
            index=models.Index(fields=['school', 'subject_code', 'year', 'exam_type'], name='student_sub_school__8f8cbc_idx'),
        ),
        migrations.AlterUniqueTogether(
            name='studentsubjectmark',
            unique_together={('school', 'year', 'exam_type', 'cand_no', 'subject_code')},
        ),
        migrations.AddIndex(
            model_name='schoolyearsummary',
            index=models.Index(fields=['exam_type', 'year'], name='school_year_exam_ty_59e035_idx'),
        ),
        migrations.AddIndex(
            model_name='schoolyearsummary',
            index=models.Index(fields=['school', 'year', 'exam_type'], name='school_year_school__2eab64_idx'),
        ),
        migrations.AlterUniqueTogether(
            name='schoolyearsummary',
            unique_together={('school', 'exam_type', 'year')},
        ),
        migrations.AddIndex(
            model_name='schoolsubjectperformance',
            index=models.Index(fields=['exam_type', 'year'], name='school_subj_exam_ty_8a9d3c_idx'),
        ),
        migrations.AddIndex(
            model_name='schoolsubjectperformance',
            index=models.Index(fields=['school_code', 'year', 'exam_type'], name='school_subj_school__64723f_idx'),
        ),
        migrations.AddIndex(
            model_name='schoolsubjectperformance',
            index=models.Index(fields=['subject_code', 'year', 'exam_type'], name='school_subj_subject_f8d5f1_idx'),
        ),
        migrations.AlterUniqueTogether(
            name='schoolsubjectperformance',
            unique_together={('school_code', 'year', 'subject_code', 'exam_type')},
        ),
        migrations.AddIndex(
            model_name='school',
            index=models.Index(fields=['region', 'district'], name='geo_school_region__0e0c36_idx'),
        ),
        migrations.AddIndex(
            model_name='school',
            index=models.Index(fields=['district', 'ward'], name='geo_school_distric_c319d6_idx'),
        ),
        migrations.AddIndex(
            model_name='examcandidate',
            index=models.Index(fields=['exam_type', 'year'], name='exam_candid_exam_ty_b01dd0_idx'),
        ),
        migrations.AddIndex(
            model_name='examcandidate',
            index=models.Index(fields=['school', 'year', 'exam_type'], name='exam_candid_school__9d0048_idx'),
        ),
        migrations.AddIndex(
            model_name='examcandidate',
            index=models.Index(fields=['cand_no', 'year', 'exam_type'], name='exam_candid_cand_no_9ab4e8_idx'),
        ),
        migrations.AlterUniqueTogether(
            name='examcandidate',
            unique_together={('cand_no', 'year', 'exam_type')},
        ),
        migrations.AddIndex(
            model_name='district',
            index=models.Index(fields=['region', 'name'], name='geo_distric_region__d8979e_idx'),
        ),
        migrations.AlterUniqueTogether(
            name='district',
            unique_together={('region', 'name')},
        ),
    ]
