# Generated by Django 4.2.30 on 2026-09-15 10:52 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='Institution', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(help_text='Official name of the mosque, center, or institute.', max_length=255, verbose_name='Institution Name')), ('slug', models.SlugField(allow_unicode=True, blank=True, max_length=255, null=True, unique=True, verbose_name='Slug / URL Identifier')), ('type', models.CharField(choices=[('mosque', 'Mosque'), ('hussainiya', 'Hussainiya / Islamic Center'), ('cultural_center', 'Cultural Center'), ('library', 'Islamic Library'), ('institute', 'Seminary & Institute'), ('charity', 'Charity & Foundation'), ('other', 'Other Organization')], default='cultural_center', max_length=50, verbose_name='Institution Type')), ('country', models.CharField(max_length=255, verbose_name='Country')), ('city', models.CharField(max_length=255, verbose_name='City')), ('address', models.TextField(blank=True, null=True, verbose_name='Full Address')), ('latitude', models.FloatField(blank=True, null=True, verbose_name='Latitude')), ('longitude', models.FloatField(blank=True, null=True, verbose_name='Longitude')), ('description', models.TextField(blank=True, null=True, verbose_name='Description & Background')), ('website', models.URLField(blank=True, max_length=500, null=True, verbose_name='Website')), ('email', models.EmailField(blank=True, max_length=254, null=True, verbose_name='Official Email')), ('phone', models.CharField(blank=True, max_length=50, null=True, verbose_name='Official Phone')), ('established_year', models.IntegerField(blank=True, null=True, verbose_name='Established Year (CE)')), ('cover_image', models.ImageField(blank=True, null=True, upload_to='institutions/covers/%Y/%m/', verbose_name='Cover Image')), ('avatar', models.ImageField(blank=True, null=True, upload_to='institutions/avatars/%Y/%m/', verbose_name='Logo / Avatar')), ('social_media', models.JSONField(blank=True, default=dict, help_text='Dictionary with keys: facebook, twitter, instagram, linkedin, youtube, telegram', verbose_name='Social Media Links')), ('working_hours', models.JSONField(blank=True, default=dict, verbose_name='Working Hours / Prayer Times Schedule')), ('tags', models.JSONField(blank=True, default=list, verbose_name='Tags & Specializations')), ('verification_status', models.CharField(choices=[('pending', 'Pending Review'), ('approved', 'Approved & Verified'), ('rejected', 'Rejected')], default='pending', max_length=20, verbose_name='Verification Status')), ('follower_count', models.PositiveIntegerField(default=0, verbose_name='Followers Count')), ('is_featured', models.BooleanField(default=False, verbose_name='Is Featured')), ('is_active', models.BooleanField(default=True, verbose_name='Is Active')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_institutions', to=settings.AUTH_USER_MODEL, verbose_name='Created By')), ], options={ 'verbose_name': 'Institution', 'verbose_name_plural': 'Institutions', 'ordering': ('-is_featured', '-created_at'), }, ), migrations.CreateModel( name='InstitutionTimeline', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('year', models.CharField(help_text='e.g. 1995, 1416 AH, or 2020-Present', max_length=50, verbose_name='Year / Period')), ('title', models.CharField(max_length=255, verbose_name='Milestone Title')), ('description', models.TextField(blank=True, null=True, verbose_name='Milestone Description')), ('order', models.IntegerField(default=0, verbose_name='Display Order')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), ('institution', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='timeline_entries', to='profiles.institution', verbose_name='Institution')), ], options={ 'verbose_name': 'Timeline Milestone', 'verbose_name_plural': 'Timeline Milestones', 'ordering': ('order', 'id'), }, ), migrations.CreateModel( name='InstitutionMedia', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('file', models.FileField(upload_to='institutions/gallery/%Y/%m/', verbose_name='Media File')), ('media_type', models.CharField(choices=[('image', 'Image'), ('video', 'Video'), ('document', 'Document / Publication')], default='image', max_length=20, verbose_name='Media Type')), ('title', models.CharField(blank=True, max_length=255, null=True, verbose_name='Media Title')), ('caption', models.TextField(blank=True, null=True, verbose_name='Caption / Notes')), ('uploaded_at', models.DateTimeField(auto_now_add=True, verbose_name='Uploaded At')), ('institution', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='media_items', to='profiles.institution', verbose_name='Institution')), ], options={ 'verbose_name': 'Institution Media', 'verbose_name_plural': 'Institution Media Gallery', 'ordering': ('-uploaded_at',), }, ), migrations.CreateModel( name='InstitutionMember', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('role', models.CharField(choices=[('admin', 'Administrator'), ('editor', 'Content & Project Editor'), ('viewer', 'Viewer / Member')], default='viewer', max_length=20, verbose_name='Role')), ('title', models.CharField(blank=True, help_text='e.g., Director, Media Manager, Cultural Affairs Officer', max_length=150, null=True, verbose_name='Organizational Title')), ('joined_at', models.DateTimeField(auto_now_add=True, verbose_name='Joined At')), ('institution', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='members', to='profiles.institution', verbose_name='Institution')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='institution_memberships', to=settings.AUTH_USER_MODEL, verbose_name='User')), ], options={ 'verbose_name': 'Institution Member', 'verbose_name_plural': 'Institution Members', 'ordering': ('-joined_at',), 'unique_together': {('institution', 'user')}, }, ), migrations.CreateModel( name='InstitutionFollower', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Followed At')), ('institution', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='followers', to='profiles.institution', verbose_name='Institution')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='followed_institutions', to=settings.AUTH_USER_MODEL, verbose_name='User')), ], options={ 'verbose_name': 'Institution Follower', 'verbose_name_plural': 'Institution Followers', 'ordering': ('-created_at',), 'unique_together': {('institution', 'user')}, }, ), ]