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.
119 lines
8.7 KiB
119 lines
8.7 KiB
# 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')},
|
|
},
|
|
),
|
|
]
|