diff --git a/apps/account/migrations/0001_initial.py b/apps/account/migrations/0001_initial.py index 1c35550..98b41ed 100644 --- a/apps/account/migrations/0001_initial.py +++ b/apps/account/migrations/0001_initial.py @@ -1,151 +1,431 @@ -# Generated by Django 5.1.8 on 2025-04-03 00:05 +# Generated by Django 4.2.27 on 2026-01-22 10:48 import dj_language.field +from django.conf import settings +from django.db import migrations, models import django.db.models.deletion import phonenumber_field.modelfields import utils.validators -from django.conf import settings -from django.db import migrations, models class Migration(migrations.Migration): - initial = True dependencies = [ - ('auth', '0012_alter_user_first_name_max_length'), - ('dj_language', '0002_auto_20220120_1344'), + ("dj_language", "0002_auto_20220120_1344"), + ("auth", "0012_alter_user_first_name_max_length"), ] operations = [ migrations.CreateModel( - name='User', + name="User", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), - ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('username', models.CharField(blank=True, max_length=150, null=True, unique=True)), - ('email', models.EmailField(blank=True, help_text="Enter the user's email address.", max_length=254, null=True, unique=True, verbose_name='Email Address')), - ('fullname', models.CharField(blank=True, help_text='Enter the full name of the user.', max_length=255, null=True, verbose_name='Full Name')), - ('birthdate', models.DateField(blank=True, null=True, verbose_name='birthdate')), - ('avatar', models.ImageField(blank=True, null=True, upload_to='users/avatars/%Y/%m/')), - ('phone_number', phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=128, null=True, region=None, validators=[utils.validators.validate_possible_number], verbose_name='phone')), - ('gender', models.CharField(blank=True, choices=[('male', 'Male'), ('female', 'Female')], help_text="Select the user's gender.", max_length=20, null=True, verbose_name='Gender')), - ('user_type', models.CharField(choices=[('professor', 'Professor'), ('client', 'Client'), ('student', 'Student'), ('admin', 'Admin'), ('super_admin', 'Super Admin')], default='client', help_text='Type of the user.', max_length=20, verbose_name='User Type')), - ('date_joined', models.DateTimeField(auto_now_add=True, help_text='The date and time the user registered.', verbose_name='Date Joined')), - ('city', models.CharField(blank=True, max_length=255, null=True, verbose_name='City')), - ('country', models.CharField(blank=True, max_length=255, null=True, verbose_name='country')), - ('device_id', models.CharField(blank=True, max_length=255, null=True, verbose_name='device id')), - ('device_os', models.CharField(choices=[('android', 'android'), ('apple', 'apple')], max_length=16, null=True)), - ('fcm', models.CharField(blank=True, max_length=512, null=True)), - ('is_staff', models.BooleanField(default=False)), - ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='Active')), - ('deleted_at', models.DateTimeField(blank=True, null=True)), - ('info', models.TextField(blank=True, null=True, verbose_name='Info')), - ('skill', models.CharField(blank=True, max_length=512, null=True)), - ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), - ('language', dj_language.field.LanguageField(default=69, limit_choices_to={'status': True}, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='dj_language.language', verbose_name='language')), - ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("password", models.CharField(max_length=128, verbose_name="password")), + ( + "last_login", + models.DateTimeField( + blank=True, null=True, verbose_name="last login" + ), + ), + ( + "is_superuser", + models.BooleanField( + default=False, + help_text="Designates that this user has all permissions without explicitly assigning them.", + verbose_name="superuser status", + ), + ), + ( + "username", + models.CharField( + blank=True, max_length=150, null=True, unique=True + ), + ), + ( + "email", + models.EmailField( + blank=True, + help_text="Enter the user's email address.", + max_length=254, + null=True, + unique=True, + verbose_name="Email Address", + ), + ), + ( + "fullname", + models.CharField( + blank=True, + help_text="Enter the full name of the user.", + max_length=255, + null=True, + verbose_name="Full Name", + ), + ), + ( + "birthdate", + models.DateField(blank=True, null=True, verbose_name="birthdate"), + ), + ( + "avatar", + models.ImageField( + blank=True, + max_length=512, + null=True, + upload_to="users/avatars/%Y/%m/", + ), + ), + ( + "phone_number", + phonenumber_field.modelfields.PhoneNumberField( + blank=True, + help_text="e.g., +49 151 12345678", + max_length=128, + null=True, + region=None, + validators=[utils.validators.validate_possible_number], + verbose_name="Phone Number", + ), + ), + ( + "gender", + models.CharField( + blank=True, + choices=[("male", "Male"), ("female", "Female")], + help_text="Select the user's gender.", + max_length=20, + null=True, + verbose_name="Gender", + ), + ), + ( + "user_type", + models.CharField( + choices=[ + ("professor", "Professor"), + ("client", "Client"), + ("student", "Student"), + ("admin", "Admin"), + ("super_admin", "Super Admin"), + ], + default="client", + help_text="Type of the user.", + max_length=20, + verbose_name="User Type", + ), + ), + ( + "date_joined", + models.DateTimeField( + auto_now_add=True, + help_text="The date and time the user registered.", + verbose_name="Date Joined", + ), + ), + ( + "city", + models.CharField( + blank=True, max_length=255, null=True, verbose_name="City" + ), + ), + ( + "country", + models.CharField( + blank=True, max_length=255, null=True, verbose_name="country" + ), + ), + ( + "device_id", + models.CharField( + blank=True, max_length=255, null=True, verbose_name="device id" + ), + ), + ( + "device_os", + models.CharField( + choices=[ + ("android", "android"), + ("apple", "apple"), + ("web", "web"), + ], + max_length=16, + null=True, + ), + ), + ( + "user_agent", + models.TextField(blank=True, null=True, verbose_name="user agent"), + ), + ( + "client_ip", + models.TextField(blank=True, null=True, verbose_name="client ip"), + ), + ("fcm", models.CharField(blank=True, max_length=512, null=True)), + ( + "slug", + models.SlugField( + blank=True, max_length=255, null=True, unique=True + ), + ), + ( + "experience_years", + models.PositiveIntegerField( + default=0, verbose_name="Experience years" + ), + ), + ("is_staff", models.BooleanField(default=False)), + ( + "is_active", + models.BooleanField( + default=True, + help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.", + verbose_name="Active", + ), + ), + ("deleted_at", models.DateTimeField(blank=True, null=True)), + ("info", models.TextField(blank=True, null=True, verbose_name="Info")), + ("skill", models.CharField(blank=True, max_length=512, null=True)), + ( + "groups", + models.ManyToManyField( + blank=True, + help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.", + related_name="user_set", + related_query_name="user", + to="auth.group", + verbose_name="groups", + ), + ), + ( + "language", + dj_language.field.LanguageField( + default=69, + limit_choices_to={"status": True}, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="+", + to="dj_language.language", + verbose_name="language", + ), + ), + ( + "user_permissions", + models.ManyToManyField( + blank=True, + help_text="Specific permissions for this user.", + related_name="user_set", + related_query_name="user", + to="auth.permission", + verbose_name="user permissions", + ), + ), ], options={ - 'verbose_name': 'All Users', - 'verbose_name_plural': 'All Users', - 'ordering': ('-id',), - 'unique_together': {('email', 'device_id')}, + "verbose_name": "All Users", + "verbose_name_plural": "All Users", + "ordering": ("-id",), + "unique_together": {("email",)}, }, ), migrations.CreateModel( - name='AdminUser', + name="Notification", fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("message", models.TextField(max_length=512, verbose_name="message")), + ("is_read", models.BooleanField(default=False, verbose_name="is read")), + ( + "service", + models.CharField( + choices=[("imam-javad", "Imam Javad"), ("doboodi", "Doboodi")], + default="imam-javad", + max_length=20, + verbose_name="service", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="created at" + ), + ), + ( + "updated_at", + models.DateTimeField( + auto_now=True, null=True, verbose_name="updated at" + ), + ), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="notifications", + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), + ), ], - options={ - 'verbose_name': 'Admin User', - 'verbose_name_plural': 'Admin Users', - 'proxy': True, - 'indexes': [], - 'constraints': [], - }, - bases=('account.user',), ), migrations.CreateModel( - name='ClientUser', + name="LoginHistory", fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("lat", models.FloatField(blank=True, null=True, verbose_name="lat")), + ("lon", models.FloatField(blank=True, null=True, verbose_name="lon")), + ( + "country", + models.CharField( + blank=True, max_length=255, null=True, verbose_name="country" + ), + ), + ( + "city", + models.CharField( + blank=True, max_length=255, null=True, verbose_name="city" + ), + ), + ("ip", models.CharField(max_length=255, null=True)), + ("timezone", models.CharField(blank=True, max_length=100, null=True)), + ( + "user_agent", + models.TextField(blank=True, null=True, verbose_name="user agent"), + ), + ("device_os", models.CharField(blank=True, max_length=16, null=True)), + ("at_time", models.DateTimeField(auto_now_add=True)), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="login_history", + to=settings.AUTH_USER_MODEL, + ), + ), ], - options={ - 'verbose_name': 'user', - 'verbose_name_plural': 'users', - 'ordering': ('-id',), - 'proxy': True, - 'indexes': [], - 'constraints': [], - }, - bases=('account.user',), ), migrations.CreateModel( - name='ProfessorUser', + name="LocationHistory", fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("lat", models.FloatField(verbose_name="lat")), + ("lon", models.FloatField(verbose_name="lon")), + ( + "country", + models.CharField( + blank=True, max_length=255, null=True, verbose_name="country" + ), + ), + ( + "city", + models.CharField( + blank=True, max_length=255, null=True, verbose_name="city" + ), + ), + ("selected_manually", models.BooleanField(blank=True, null=True)), + ("ip", models.CharField(blank=True, max_length=255, null=True)), + ("timezone", models.CharField(blank=True, max_length=60, null=True)), + ("at_time", models.DateTimeField(auto_now_add=True)), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="location_history", + to=settings.AUTH_USER_MODEL, + ), + ), ], + ), + migrations.CreateModel( + name="AdminUser", + fields=[], options={ - 'verbose_name': 'Professor User', - 'verbose_name_plural': 'Professor Users', - 'proxy': True, - 'indexes': [], - 'constraints': [], + "verbose_name": "Admin User", + "verbose_name_plural": "Admin Users", + "proxy": True, + "indexes": [], + "constraints": [], }, - bases=('account.user',), + bases=("account.user",), ), migrations.CreateModel( - name='StudentUser', - fields=[ - ], + name="ClientUser", + fields=[], options={ - 'verbose_name': 'Student User', - 'verbose_name_plural': 'Student Users', - 'proxy': True, - 'indexes': [], - 'constraints': [], + "verbose_name": "user", + "verbose_name_plural": "users", + "ordering": ("-id",), + "proxy": True, + "indexes": [], + "constraints": [], }, - bases=('account.user',), + bases=("account.user",), ), migrations.CreateModel( - name='SuperAdminUser', - fields=[ - ], + name="ProfessorUser", + fields=[], options={ - 'verbose_name': 'Super Admin User', - 'verbose_name_plural': 'Super Admin Users', - 'proxy': True, - 'indexes': [], - 'constraints': [], + "verbose_name": "Professor User", + "verbose_name_plural": "Professor Users", + "proxy": True, + "indexes": [], + "constraints": [], }, - bases=('account.user',), + bases=("account.user",), ), migrations.CreateModel( - name='LoginHistory', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('lat', models.FloatField(blank=True, null=True, verbose_name='lat')), - ('lon', models.FloatField(blank=True, null=True, verbose_name='lon')), - ('country', models.CharField(blank=True, max_length=255, null=True, verbose_name='country')), - ('city', models.CharField(blank=True, max_length=255, null=True, verbose_name='city')), - ('ip', models.CharField(max_length=255, null=True)), - ('timezone', models.CharField(blank=True, max_length=100, null=True)), - ('at_time', models.DateTimeField(auto_now_add=True)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='login_history', to=settings.AUTH_USER_MODEL)), - ], + name="StudentUser", + fields=[], + options={ + "verbose_name": "Student User", + "verbose_name_plural": "Student Users", + "proxy": True, + "indexes": [], + "constraints": [], + }, + bases=("account.user",), ), migrations.CreateModel( - name='Notification', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('message', models.TextField(max_length=512, verbose_name='message')), - ('is_read', models.BooleanField(default=False, verbose_name='is read')), - ('service', models.CharField(choices=[('imam-javad', 'Imam Javad'), ('doboodi', 'Doboodi')], default='imam-javad', max_length=20, verbose_name='service')), - ('created_at', models.DateTimeField(auto_now_add=True, null=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, null=True, verbose_name='updated at')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notifications', to=settings.AUTH_USER_MODEL, verbose_name='user')), - ], + name="SuperAdminUser", + fields=[], + options={ + "verbose_name": "Super Admin User", + "verbose_name_plural": "Super Admin Users", + "proxy": True, + "indexes": [], + "constraints": [], + }, + bases=("account.user",), ), ] diff --git a/apps/account/migrations/0002_alter_user_birthdate.py b/apps/account/migrations/0002_alter_user_birthdate.py deleted file mode 100644 index 0e0350f..0000000 --- a/apps/account/migrations/0002_alter_user_birthdate.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2024-11-19 08:50 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='user', - name='birthdate', - field=models.DateField(blank=True, null=True, verbose_name='birthdate'), - ), - ] diff --git a/apps/account/migrations/0002_alter_user_phone_number.py b/apps/account/migrations/0002_alter_user_phone_number.py deleted file mode 100644 index 5dba363..0000000 --- a/apps/account/migrations/0002_alter_user_phone_number.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 5.1.8 on 2025-04-04 00:09 - -import phonenumber_field.modelfields -import utils.validators -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='user', - name='phone_number', - field=phonenumber_field.modelfields.PhoneNumberField(blank=True, help_text='e.g., +49 151 12345678', max_length=128, null=True, region=None, validators=[utils.validators.validate_possible_number], verbose_name='Phone Number'), - ), - ] diff --git a/apps/account/migrations/0003_auto_20241120_1741.py b/apps/account/migrations/0003_auto_20241120_1741.py deleted file mode 100644 index fd0f54b..0000000 --- a/apps/account/migrations/0003_auto_20241120_1741.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 3.2.4 on 2024-11-20 17:41 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0002_alter_user_birthdate'), - ] - - operations = [ - migrations.AlterModelOptions( - name='user', - options={'ordering': ('-id',), 'verbose_name': 'All Users', 'verbose_name_plural': 'All Users'}, - ), - migrations.AddField( - model_name='user', - name='info', - field=models.TextField(blank=True, null=True, verbose_name='Info'), - ), - ] diff --git a/apps/account/migrations/0003_locationhistory.py b/apps/account/migrations/0003_locationhistory.py deleted file mode 100644 index 432503b..0000000 --- a/apps/account/migrations/0003_locationhistory.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 5.1.8 on 2025-05-01 15:54 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0002_alter_user_phone_number'), - ] - - operations = [ - migrations.CreateModel( - name='LocationHistory', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('lat', models.FloatField(verbose_name='lat')), - ('lon', models.FloatField(verbose_name='lon')), - ('country', models.CharField(blank=True, max_length=255, null=True, verbose_name='country')), - ('city', models.CharField(blank=True, max_length=255, null=True, verbose_name='city')), - ('selected_manually', models.BooleanField(blank=True, null=True)), - ('ip', models.CharField(blank=True, max_length=255, null=True)), - ('timezone', models.CharField(blank=True, max_length=60, null=True)), - ('at_time', models.DateTimeField(auto_now_add=True)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='location_history', to=settings.AUTH_USER_MODEL)), - ], - ), - ] diff --git a/apps/account/migrations/0004_alter_user_avatar.py b/apps/account/migrations/0004_alter_user_avatar.py deleted file mode 100644 index d25d658..0000000 --- a/apps/account/migrations/0004_alter_user_avatar.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.8 on 2025-09-02 18:36 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0003_locationhistory'), - ] - - operations = [ - migrations.AlterField( - model_name='user', - name='avatar', - field=models.ImageField(blank=True, max_length=512, null=True, upload_to='users/avatars/%Y/%m/'), - ), - ] diff --git a/apps/account/migrations/0004_user_skill.py b/apps/account/migrations/0004_user_skill.py deleted file mode 100644 index 0b1ade8..0000000 --- a/apps/account/migrations/0004_user_skill.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2024-11-22 10:19 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0003_auto_20241120_1741'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='skill', - field=models.CharField(blank=True, max_length=512, null=True), - ), - ] diff --git a/apps/account/migrations/0005_alter_user_unique_together.py b/apps/account/migrations/0005_alter_user_unique_together.py deleted file mode 100644 index cfed362..0000000 --- a/apps/account/migrations/0005_alter_user_unique_together.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.4 on 2025-09-22 17:18 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0004_alter_user_avatar'), - ] - - operations = [ - migrations.AlterUniqueTogether( - name='user', - unique_together={('email',)}, - ), - ] diff --git a/apps/account/migrations/0005_user_city.py b/apps/account/migrations/0005_user_city.py deleted file mode 100644 index 9de7e74..0000000 --- a/apps/account/migrations/0005_user_city.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2024-11-30 23:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0004_user_skill'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='city', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='City'), - ), - ] diff --git a/apps/account/migrations/0006_auto_20251006_1101.py b/apps/account/migrations/0006_auto_20251006_1101.py deleted file mode 100644 index c4ae8fc..0000000 --- a/apps/account/migrations/0006_auto_20251006_1101.py +++ /dev/null @@ -1,45 +0,0 @@ -# Generated by Django 3.2.4 on 2025-10-06 11:01 - -from django.db import migrations, models -from django.utils.text import slugify - - -def generate_professor_slugs(apps, schema_editor): - User = apps.get_model('account', 'User') - qs = User.objects.filter(user_type='professor').filter(models.Q(slug__isnull=True) | models.Q(slug='')) - for user in qs.iterator(): - base = slugify(user.fullname, allow_unicode=True) if user.fullname else '' - base = base[:250] or f"professor-{user.pk}" - slug = base - counter = 1 - while User.objects.filter(slug=slug).exclude(pk=user.pk).exists(): - slug = f"{base}-{counter}"[:255] - counter += 1 - user.slug = slug - user.save(update_fields=['slug']) - - -def remove_professor_slugs(apps, schema_editor): - User = apps.get_model('account', 'User') - User.objects.filter(user_type='professor').update(slug=None) - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0005_alter_user_unique_together'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='experience_years', - field=models.PositiveIntegerField(default=0, verbose_name='Experience years'), - ), - migrations.AddField( - model_name='user', - name='slug', - field=models.SlugField(blank=True, max_length=255, null=True, unique=True), - ), - migrations.RunPython(generate_professor_slugs, remove_professor_slugs), - ] diff --git a/apps/account/migrations/0006_user_country.py b/apps/account/migrations/0006_user_country.py deleted file mode 100644 index ebb3aac..0000000 --- a/apps/account/migrations/0006_user_country.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.7 on 2024-12-17 16:30 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0005_user_city'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='country', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='country'), - ), - ] diff --git a/apps/account/migrations/0007_notification.py b/apps/account/migrations/0007_notification.py deleted file mode 100644 index b67ec2a..0000000 --- a/apps/account/migrations/0007_notification.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 3.2.7 on 2025-02-12 16:27 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0006_user_country'), - ] - - operations = [ - migrations.CreateModel( - name='Notification', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('message', models.TextField(max_length=512, verbose_name='message')), - ('is_read', models.BooleanField(default=False, verbose_name='is read')), - ('created_at', models.DateTimeField(auto_now_add=True, null=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, null=True, verbose_name='updated at')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notifications', to=settings.AUTH_USER_MODEL, verbose_name='user')), - ], - ), - ] diff --git a/apps/account/migrations/0007_user_user_agent.py b/apps/account/migrations/0007_user_user_agent.py deleted file mode 100644 index 5e8d0b3..0000000 --- a/apps/account/migrations/0007_user_user_agent.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-09 15:13 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("account", "0006_auto_20251006_1101"), - ] - - operations = [ - migrations.AddField( - model_name="user", - name="user_agent", - field=models.TextField(blank=True, null=True, verbose_name="user agent"), - ), - ] diff --git a/apps/account/migrations/0008_auto_20250316_1247.py b/apps/account/migrations/0008_auto_20250316_1247.py deleted file mode 100644 index fe07d37..0000000 --- a/apps/account/migrations/0008_auto_20250316_1247.py +++ /dev/null @@ -1,57 +0,0 @@ -# Generated by Django 3.2.7 on 2025-03-16 12:47 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0007_notification'), - ] - - operations = [ - migrations.AddField( - model_name='notification', - name='service', - field=models.CharField(choices=[('imam-javad', 'Imam Javad'), ('doboodi', 'Doboodi')], default='imam-javad', max_length=20, verbose_name='service'), - ), - migrations.AddField( - model_name='user', - name='device_os', - field=models.CharField(choices=[('android', 'android'), ('apple', 'apple')], max_length=16, null=True), - ), - migrations.AddField( - model_name='user', - name='username', - field=models.CharField(blank=True, max_length=150, null=True, unique=True), - ), - migrations.AlterField( - model_name='user', - name='email', - field=models.EmailField(blank=True, help_text="Enter the user's email address.", max_length=254, null=True, unique=True, verbose_name='Email Address'), - ), - migrations.AlterField( - model_name='user', - name='fullname', - field=models.CharField(blank=True, help_text='Enter the full name of the user.', max_length=255, null=True, verbose_name='Full Name'), - ), - migrations.AlterUniqueTogether( - name='user', - unique_together={('email', 'device_id')}, - ), - migrations.CreateModel( - name='LocationHistory', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('lat', models.FloatField(blank=True, null=True, verbose_name='lat')), - ('lon', models.FloatField(blank=True, null=True, verbose_name='lon')), - ('country', models.CharField(blank=True, max_length=255, null=True, verbose_name='country')), - ('city', models.CharField(blank=True, max_length=255, null=True, verbose_name='city')), - ('ip', models.CharField(max_length=255, null=True)), - ('at_time', models.DateTimeField(auto_now_add=True)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='location_history', to=settings.AUTH_USER_MODEL)), - ], - ), - ] diff --git a/apps/account/migrations/0008_loginhistory_device_os_loginhistory_user_agent.py b/apps/account/migrations/0008_loginhistory_device_os_loginhistory_user_agent.py deleted file mode 100644 index 9a70df9..0000000 --- a/apps/account/migrations/0008_loginhistory_device_os_loginhistory_user_agent.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-09 15:13 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("account", "0007_user_user_agent"), - ] - - operations = [ - migrations.AddField( - model_name="loginhistory", - name="device_os", - field=models.CharField(blank=True, max_length=16, null=True), - ), - migrations.AddField( - model_name="loginhistory", - name="user_agent", - field=models.TextField(blank=True, null=True, verbose_name="user agent"), - ), - ] diff --git a/apps/account/migrations/0009_auto_20250316_1319.py b/apps/account/migrations/0009_auto_20250316_1319.py deleted file mode 100644 index 05d18a3..0000000 --- a/apps/account/migrations/0009_auto_20250316_1319.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 3.2.7 on 2025-03-16 13:19 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0008_auto_20250316_1247'), - ] - - operations = [ - migrations.CreateModel( - name='LoginHistory', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('lat', models.FloatField(blank=True, null=True, verbose_name='lat')), - ('lon', models.FloatField(blank=True, null=True, verbose_name='lon')), - ('country', models.CharField(blank=True, max_length=255, null=True, verbose_name='country')), - ('city', models.CharField(blank=True, max_length=255, null=True, verbose_name='city')), - ('ip', models.CharField(max_length=255, null=True)), - ('at_time', models.DateTimeField(auto_now_add=True)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='login_history', to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.DeleteModel( - name='LocationHistory', - ), - ] diff --git a/apps/account/migrations/0009_user_client_ip.py b/apps/account/migrations/0009_user_client_ip.py deleted file mode 100644 index 5488aed..0000000 --- a/apps/account/migrations/0009_user_client_ip.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-09 15:37 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("account", "0008_loginhistory_device_os_loginhistory_user_agent"), - ] - - operations = [ - migrations.AddField( - model_name="user", - name="client_ip", - field=models.TextField(blank=True, null=True, verbose_name="client ip"), - ), - ] diff --git a/apps/account/migrations/0010_alter_user_device_os.py b/apps/account/migrations/0010_alter_user_device_os.py deleted file mode 100644 index 72fa771..0000000 --- a/apps/account/migrations/0010_alter_user_device_os.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-09 15:52 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("account", "0009_user_client_ip"), - ] - - operations = [ - migrations.AlterField( - model_name="user", - name="device_os", - field=models.CharField( - choices=[("android", "android"), ("apple", "apple"), ("web", "web")], - max_length=16, - null=True, - ), - ), - ] diff --git a/apps/account/migrations/0010_loginhistory_timezone.py b/apps/account/migrations/0010_loginhistory_timezone.py deleted file mode 100644 index a18c319..0000000 --- a/apps/account/migrations/0010_loginhistory_timezone.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.7 on 2025-03-16 13:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0009_auto_20250316_1319'), - ] - - operations = [ - migrations.AddField( - model_name='loginhistory', - name='timezone', - field=models.CharField(blank=True, max_length=100, null=True), - ), - ] diff --git a/apps/account/migrations/0011_merge_20260104_1114.py b/apps/account/migrations/0011_merge_20260104_1114.py deleted file mode 100644 index cb7cd43..0000000 --- a/apps/account/migrations/0011_merge_20260104_1114.py +++ /dev/null @@ -1,12 +0,0 @@ -# Generated by Django 4.2.27 on 2026-01-04 11:14 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("account", "0010_alter_user_device_os"), - ("account", "0010_loginhistory_timezone"), - ] - - operations = [] diff --git a/apps/api/migrations/0001_initial.py b/apps/api/migrations/0001_initial.py index 0b77e11..f390a15 100644 --- a/apps/api/migrations/0001_initial.py +++ b/apps/api/migrations/0001_initial.py @@ -1,31 +1,189 @@ -# Generated by Django 3.2.4 on 2025-09-09 16:27 +# Generated by Django 4.2.27 on 2026-01-22 10:48 +import dj_language.field +import django.core.validators from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): - initial = True dependencies = [ + ("dj_language", "0002_auto_20220120_1344"), ] operations = [ migrations.CreateModel( - name='Comment', + name="AppVersion", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "version", + models.CharField( + help_text="Application version in format X.Y.Z (e.g., 1.0.0)", + max_length=20, + unique=True, + validators=[ + django.core.validators.RegexValidator( + message="Version must be in format X.Y.Z (e.g., 1.0.0)", + regex="^\\d+\\.\\d+\\.\\d+$", + ) + ], + verbose_name="Version", + ), + ), + ( + "apk_file", + models.FileField( + help_text="Application APK file", + upload_to="app_versions/", + verbose_name="APK File", + ), + ), + ( + "description", + models.TextField( + blank=True, + help_text="Release notes and changes for this version", + verbose_name="Description", + ), + ), + ( + "app_type", + models.CharField( + choices=[ + ("google_play", "Google Play"), + ("app_store", "App Store"), + ], + default="google_play", + help_text="App distribution platform", + max_length=20, + verbose_name="App Type", + ), + ), + ( + "app_store_downloads", + models.PositiveBigIntegerField( + default=0, + help_text="Total number of downloads on Apple App Store", + verbose_name="App Store Downloads", + ), + ), + ( + "google_play_downloads", + models.PositiveBigIntegerField( + default=0, + help_text="Total number of downloads on Google Play", + verbose_name="Google Play Downloads", + ), + ), + ( + "is_active", + models.BooleanField( + default=True, + help_text="Is this version active?", + verbose_name="Active", + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created At"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated At"), + ), + ], + options={ + "verbose_name": "App Version", + "verbose_name_plural": "App Versions", + "ordering": ["-created_at"], + }, + ), + migrations.CreateModel( + name="Comment", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('user_avatar', models.ImageField(blank=True, null=True, upload_to='comments/avatars/%Y/%m/', verbose_name='User Avatar')), - ('user_fullname', models.CharField(help_text='Full name of the user who made the comment', max_length=255, verbose_name='User Full Name')), - ('user_slogan', models.CharField(blank=True, help_text='User slogan or bio', max_length=500, null=True, verbose_name='User Slogan')), - ('comment_text', models.TextField(help_text='The actual comment content', verbose_name='Comment Text')), - ('order', models.PositiveIntegerField(default=0, help_text='Order for sorting comments', verbose_name='Order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "user_avatar", + models.ImageField( + blank=True, + null=True, + upload_to="comments/avatars/%Y/%m/", + verbose_name="User Avatar", + ), + ), + ( + "user_fullname", + models.CharField( + help_text="Full name of the user who made the comment", + max_length=255, + verbose_name="User Full Name", + ), + ), + ( + "user_slogan", + models.CharField( + blank=True, + help_text="User slogan or bio", + max_length=500, + null=True, + verbose_name="User Slogan", + ), + ), + ( + "comment_text", + models.TextField( + help_text="The actual comment content", + verbose_name="Comment Text", + ), + ), + ( + "order", + models.PositiveIntegerField( + default=0, + help_text="Order for sorting comments", + verbose_name="Order", + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created At"), + ), + ( + "language", + dj_language.field.LanguageField( + default=69, + limit_choices_to={"status": True}, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="+", + to="dj_language.language", + verbose_name="language", + ), + ), ], options={ - 'verbose_name': 'Comment', - 'verbose_name_plural': 'Comments', - 'ordering': ['order', '-created_at'], + "verbose_name": "Comment", + "verbose_name_plural": "Comments", + "ordering": ["order", "-created_at"], }, ), ] diff --git a/apps/api/migrations/0002_auto_20250911_1217.py b/apps/api/migrations/0002_auto_20250911_1217.py deleted file mode 100644 index 0525771..0000000 --- a/apps/api/migrations/0002_auto_20250911_1217.py +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by Django 3.2.4 on 2025-09-11 12:17 - -import dj_language.field -import django.core.validators -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('dj_language', '0002_auto_20220120_1344'), - ('api', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='AppVersion', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('version', models.CharField(help_text='Application version in format X.Y.Z (e.g., 1.0.0)', max_length=20, unique=True, validators=[django.core.validators.RegexValidator(message='Version must be in format X.Y.Z (e.g., 1.0.0)', regex='^\\d+\\.\\d+\\.\\d+$')], verbose_name='Version')), - ('apk_file', models.FileField(help_text='Application APK file', upload_to='app_versions/', verbose_name='APK File')), - ('description', models.TextField(blank=True, help_text='Release notes and changes for this version', verbose_name='Description')), - ('app_type', models.CharField(choices=[('google_play', 'Google Play'), ('app_store', 'App Store')], default='google_play', help_text='App distribution platform', max_length=20, verbose_name='App Type')), - ('app_store_downloads', models.PositiveBigIntegerField(default=0, help_text='Total number of downloads on Apple App Store', verbose_name='App Store Downloads')), - ('google_play_downloads', models.PositiveBigIntegerField(default=0, help_text='Total number of downloads on Google Play', verbose_name='Google Play Downloads')), - ('is_active', models.BooleanField(default=True, help_text='Is this version active?', verbose_name='Active')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), - ], - options={ - 'verbose_name': 'App Version', - 'verbose_name_plural': 'App Versions', - 'ordering': ['-created_at'], - }, - ), - migrations.AddField( - model_name='comment', - name='language', - field=dj_language.field.LanguageField(default=69, limit_choices_to={'status': True}, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='dj_language.language', verbose_name='language'), - ), - ] diff --git a/apps/article/migrations/0001_initial.py b/apps/article/migrations/0001_initial.py index 46004ac..a8358a2 100755 --- a/apps/article/migrations/0001_initial.py +++ b/apps/article/migrations/0001_initial.py @@ -1,161 +1,392 @@ -# Generated by Django 5.1.8 on 2025-05-06 12:35 +# Generated by Django 4.2.27 on 2026-01-22 10:48 -import django.db.models.deletion from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): - initial = True - dependencies = [ - ] + dependencies = [] operations = [ migrations.CreateModel( - name='ArticleCategory', + name="Article", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('slug', models.SlugField(allow_unicode=True, unique=True, verbose_name='slug')), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('order', models.PositiveIntegerField(default=0, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255, null=True)), + ("slug", models.SlugField(allow_unicode=True, unique=True)), + ( + "thumbnail", + models.ImageField( + blank=True, + help_text="image allowed", + null=True, + upload_to="article_thumbnails/", + ), + ), + ("description", models.TextField(null=True)), + ("content", models.TextField(null=True)), + ( + "article_file", + models.FileField( + blank=True, + help_text="PDF or other document files", + null=True, + upload_to="article/files/", + ), + ), + ( + "download_count", + models.PositiveBigIntegerField( + default=0, verbose_name="view count" + ), + ), + ( + "view_count", + models.PositiveBigIntegerField( + default=0, verbose_name="view count" + ), + ), + ("status", models.BooleanField(default=True, verbose_name="status")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), ], options={ - 'verbose_name': 'Article Category', - 'verbose_name_plural': 'Article Categories', - 'ordering': ['order'], + "verbose_name": "Article", + "verbose_name_plural": "Articles", }, ), migrations.CreateModel( - name='ArticleCollection', + name="ArticleCategory", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(help_text='This title will not be displayed anywhere', max_length=255)), - ('slug', models.SlugField(max_length=255, unique=True)), - ('summary', models.CharField(blank=True, help_text='could be null', max_length=512, null=True)), - ('pin_top', models.BooleanField(default=True, verbose_name='pin top')), - ('thumbnail', models.ImageField(blank=True, help_text='image allowed', null=True, upload_to='article/collection/')), - ('order', models.IntegerField(default=0, verbose_name='order')), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('display_position', models.CharField(choices=[('pinned', 'Pinned'), ('middle', 'Middle Section')], default='pinned', max_length=20, verbose_name='Display Position')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255, verbose_name="title")), + ( + "slug", + models.SlugField( + allow_unicode=True, unique=True, verbose_name="slug" + ), + ), + ("status", models.BooleanField(default=True, verbose_name="status")), + ("order", models.PositiveIntegerField(default=0, verbose_name="order")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), ], options={ - 'verbose_name': 'Article Collection', - 'verbose_name_plural': 'Articles Collections', + "verbose_name": "Article Category", + "verbose_name_plural": "Article Categories", + "ordering": ["order"], }, ), migrations.CreateModel( - name='Article', + name="ArticleCollection", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, null=True)), - ('slug', models.SlugField(allow_unicode=True, unique=True)), - ('thumbnail', models.ImageField(blank=True, help_text='image allowed', null=True, upload_to='article_thumbnails/')), - ('description', models.TextField(null=True)), - ('content', models.TextField(null=True)), - ('article_file', models.FileField(blank=True, help_text='PDF or other document files', null=True, upload_to='article/files/')), - ('view_count', models.PositiveBigIntegerField(default=0, verbose_name='view count')), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('categories', models.ManyToManyField(blank=True, related_name='articles', to='article.articlecategory', verbose_name='categories')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "title", + models.CharField( + help_text="This title will not be displayed anywhere", + max_length=255, + ), + ), + ("slug", models.SlugField(max_length=255, unique=True)), + ( + "summary", + models.CharField( + blank=True, help_text="could be null", max_length=512, null=True + ), + ), + ("pin_top", models.BooleanField(default=True, verbose_name="pin top")), + ( + "thumbnail", + models.ImageField( + blank=True, + help_text="image allowed", + null=True, + upload_to="article/collection/", + ), + ), + ("order", models.IntegerField(default=0, verbose_name="order")), + ("status", models.BooleanField(default=True, verbose_name="status")), + ( + "display_position", + models.CharField( + choices=[("pinned", "Pinned"), ("middle", "Middle Section")], + default="pinned", + max_length=20, + verbose_name="Display Position", + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), ], options={ - 'verbose_name': 'Article', - 'verbose_name_plural': 'Articles', + "verbose_name": "Article Collection", + "verbose_name_plural": "Articles Collections", }, ), migrations.CreateModel( - name='MiddleArticleCollection', + name="ArticleContent", fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("content", models.TextField(blank=True, verbose_name="content")), + ( + "priority", + models.PositiveIntegerField(default=0, verbose_name="priority"), + ), + ("status", models.BooleanField(default=True, verbose_name="status")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "article", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="contents", + to="article.article", + verbose_name="article", + ), + ), ], options={ - 'verbose_name': 'Middle Section Article Collection', - 'verbose_name_plural': 'Middle Section Article Collections', - 'proxy': True, - 'indexes': [], - 'constraints': [], + "verbose_name": "Article Content", + "verbose_name_plural": "Article Contents", + "ordering": ["priority"], }, - bases=('article.articlecollection',), ), migrations.CreateModel( - name='PinnedArticleCollection', + name="ContentPart", fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("order", models.PositiveIntegerField(default=0, verbose_name="order")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "article_content", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="parts", + to="article.articlecontent", + verbose_name="article content", + ), + ), ], options={ - 'verbose_name': 'Pinned Article Collection', - 'verbose_name_plural': 'Pinned Article Collections', - 'proxy': True, - 'indexes': [], - 'constraints': [], + "verbose_name": "Content Part", + "verbose_name_plural": "Content Parts", + "ordering": ["order"], }, - bases=('article.articlecollection',), ), migrations.CreateModel( - name='ArticleContent', + name="TextSection", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('content', models.TextField(blank=True, verbose_name='content')), - ('priority', models.PositiveIntegerField(default=0, verbose_name='priority')), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contents', to='article.article', verbose_name='article')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("arabic_text", models.TextField(verbose_name="Arabic text")), + ("translation", models.TextField(verbose_name="Translation")), + ("order", models.PositiveIntegerField(default=0, verbose_name="order")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "content_part", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="text_sections", + to="article.contentpart", + verbose_name="content part", + ), + ), ], options={ - 'verbose_name': 'Article Content', - 'verbose_name_plural': 'Article Contents', - 'ordering': ['priority'], + "verbose_name": "Text Section", + "verbose_name_plural": "Text Sections", + "ordering": ["order"], }, ), migrations.CreateModel( - name='ArticleInCollection', + name="ArticleInCollection", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.PositiveIntegerField(default=0, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='article_collections', to='article.article', verbose_name='article')), - ('collection', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='collection_articles', to='article.articlecollection', verbose_name='collection')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("order", models.PositiveIntegerField(default=0, verbose_name="order")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "article", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="article_collections", + to="article.article", + verbose_name="article", + ), + ), + ( + "collection", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="collection_articles", + to="article.articlecollection", + verbose_name="collection", + ), + ), ], options={ - 'verbose_name': 'Article in Collection', - 'verbose_name_plural': 'Articles in Collections', - 'ordering': ['order'], - 'unique_together': {('collection', 'article')}, + "verbose_name": "Article in Collection", + "verbose_name_plural": "Articles in Collections", + "ordering": ["order"], + "unique_together": {("collection", "article")}, }, ), migrations.AddField( - model_name='articlecollection', - name='articles', - field=models.ManyToManyField(related_name='related_collections_article', through='article.ArticleInCollection', to='article.article', verbose_name='articles'), + model_name="articlecollection", + name="articles", + field=models.ManyToManyField( + related_name="related_collections_article", + through="article.ArticleInCollection", + to="article.article", + verbose_name="articles", + ), + ), + migrations.AddField( + model_name="article", + name="categories", + field=models.ManyToManyField( + blank=True, + related_name="articles", + to="article.articlecategory", + verbose_name="categories", + ), ), migrations.AddField( - model_name='article', - name='collections', - field=models.ManyToManyField(blank=True, related_name='related_articles', through='article.ArticleInCollection', to='article.articlecollection', verbose_name='collections'), + model_name="article", + name="collections", + field=models.ManyToManyField( + blank=True, + related_name="related_articles", + through="article.ArticleInCollection", + to="article.articlecollection", + verbose_name="collections", + ), ), migrations.CreateModel( - name='ContentPart', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('arabic_text', models.TextField(verbose_name='Arabic text')), - ('translation', models.TextField(verbose_name='Translation')), - ('order', models.PositiveIntegerField(default=0, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('article_content', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='parts', to='article.articlecontent', verbose_name='article content')), - ], + name="MiddleArticleCollection", + fields=[], + options={ + "verbose_name": "Regular Collection (Middle Section)", + "verbose_name_plural": "Regular Collections (Middle Section)", + "proxy": True, + "indexes": [], + "constraints": [], + }, + bases=("article.articlecollection",), + ), + migrations.CreateModel( + name="PinnedArticleCollection", + fields=[], options={ - 'verbose_name': 'Content Part', - 'verbose_name_plural': 'Content Parts', - 'ordering': ['order'], + "verbose_name": "Pinned Collection (Top Section)", + "verbose_name_plural": "Pinned Collections (Top Section)", + "proxy": True, + "indexes": [], + "constraints": [], }, + bases=("article.articlecollection",), ), ] diff --git a/apps/article/migrations/0002_article_download_count.py b/apps/article/migrations/0002_article_download_count.py deleted file mode 100644 index 981b0df..0000000 --- a/apps/article/migrations/0002_article_download_count.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.8 on 2025-05-07 11:19 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('article', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='article', - name='download_count', - field=models.PositiveBigIntegerField(default=0, verbose_name='view count'), - ), - ] diff --git a/apps/article/migrations/0003_alter_middlearticlecollection_options_and_more.py b/apps/article/migrations/0003_alter_middlearticlecollection_options_and_more.py deleted file mode 100644 index e99eab8..0000000 --- a/apps/article/migrations/0003_alter_middlearticlecollection_options_and_more.py +++ /dev/null @@ -1,47 +0,0 @@ -# Generated by Django 5.1.8 on 2025-12-02 16:17 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('article', '0002_article_download_count'), - ] - - operations = [ - migrations.AlterModelOptions( - name='middlearticlecollection', - options={'verbose_name': 'Regular Collection (Middle Section)', 'verbose_name_plural': 'Regular Collections (Middle Section)'}, - ), - migrations.AlterModelOptions( - name='pinnedarticlecollection', - options={'verbose_name': 'Pinned Collection (Top Section)', 'verbose_name_plural': 'Pinned Collections (Top Section)'}, - ), - migrations.RemoveField( - model_name='contentpart', - name='arabic_text', - ), - migrations.RemoveField( - model_name='contentpart', - name='translation', - ), - migrations.CreateModel( - name='TextSection', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('arabic_text', models.TextField(verbose_name='Arabic text')), - ('translation', models.TextField(verbose_name='Translation')), - ('order', models.PositiveIntegerField(default=0, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('content_part', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='text_sections', to='article.contentpart', verbose_name='content part')), - ], - options={ - 'verbose_name': 'Text Section', - 'verbose_name_plural': 'Text Sections', - 'ordering': ['order'], - }, - ), - ] diff --git a/apps/blog/migrations/0001_initial.py b/apps/blog/migrations/0001_initial.py index a30b226..d8ba500 100644 --- a/apps/blog/migrations/0001_initial.py +++ b/apps/blog/migrations/0001_initial.py @@ -1,53 +1,238 @@ -# Generated by Django 3.2.4 on 2025-09-10 20:47 +# Generated by Django 4.2.27 on 2026-01-22 10:48 +import dj_language.field from django.db import migrations, models import django.db.models.deletion class Migration(migrations.Migration): - initial = True dependencies = [ + ("dj_language", "0002_auto_20220120_1344"), ] operations = [ migrations.CreateModel( - name='Blog', + name="Blog", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "title", + models.JSONField( + blank=True, default=list, null=True, verbose_name="title" + ), + ), + ( + "thumbnail", + models.ImageField( + help_text="Blog thumbnail image", + upload_to="blog/thumbnails/%Y/%m/", + verbose_name="Thumbnail", + ), + ), + ( + "slogan", + models.JSONField( + blank=True, default=list, null=True, verbose_name="slogan" + ), + ), + ( + "summary", + models.JSONField( + blank=True, default=list, null=True, verbose_name="summary" + ), + ), + ( + "views_count", + models.PositiveIntegerField( + default=0, + help_text="Number of times this blog was viewed", + verbose_name="Views Count", + ), + ), + ( + "slug", + models.JSONField( + blank=True, + default=list, + help_text="URL slug for the blog", + null=True, + verbose_name="slug", + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created At"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated At"), + ), + ], + options={ + "verbose_name": "Blog", + "verbose_name_plural": "Blogs", + "ordering": ["-created_at"], + }, + ), + migrations.CreateModel( + name="BlogSeo", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.JSONField(blank=True, default=list, null=True, verbose_name='title')), - ('thumbnail', models.ImageField(help_text='Blog thumbnail image', upload_to='blog/thumbnails/%Y/%m/', verbose_name='Thumbnail')), - ('slogan', models.JSONField(blank=True, default=list, null=True, verbose_name='slogan')), - ('summary', models.JSONField(blank=True, default=list, null=True, verbose_name='summary')), - ('views_count', models.PositiveIntegerField(default=0, help_text='Number of times this blog was viewed', verbose_name='Views Count')), - ('slug', models.JSONField(blank=True, default=list, help_text='URL slug for the blog', null=True, verbose_name='slug')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "title", + models.CharField( + blank=True, + help_text="maximum length of page title is 70 characters and minimum length is 30", + max_length=140, + null=True, + verbose_name="seo title", + ), + ), + ( + "keywords", + models.CharField( + blank=True, + help_text="keywords in the content that make it possible for people to find the site via search engines", + max_length=700, + null=True, + ), + ), + ( + "description", + models.CharField( + blank=True, + help_text="describes and summarizes the contents of the page for the benefit of users and search engines", + max_length=170, + null=True, + ), + ), + ( + "blog", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="seos", + to="blog.blog", + verbose_name="blog", + ), + ), + ( + "language", + dj_language.field.LanguageField( + default=69, + limit_choices_to={"status": True}, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="+", + to="dj_language.language", + verbose_name="language", + ), + ), ], options={ - 'verbose_name': 'Blog', - 'verbose_name_plural': 'Blogs', - 'ordering': ['-created_at'], + "verbose_name": "Blog SEO", + "verbose_name_plural": "Blog SEOs", }, ), migrations.CreateModel( - name='BlogContent', + name="BlogContent", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.JSONField(blank=True, default=list, help_text='Title of this content section', null=True, verbose_name='Content title')), - ('content', models.JSONField(blank=True, default=list, help_text='The main content text', null=True, verbose_name='content')), - ('slug', models.JSONField(blank=True, default=list, help_text='URL slug for this content (optional)', null=True, verbose_name='slug')), - ('image', models.ImageField(blank=True, help_text='Optional image for this content section', null=True, upload_to='blog/content_images/%Y/%m/', verbose_name='Image')), - ('order', models.PositiveIntegerField(default=0, help_text='Order of this content within the blog', verbose_name='Order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), - ('blog', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contents', to='blog.blog', verbose_name='Blog')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "title", + models.JSONField( + blank=True, + default=list, + help_text="Title of this content section", + null=True, + verbose_name="Content title", + ), + ), + ( + "content", + models.JSONField( + blank=True, + default=list, + help_text="The main content text", + null=True, + verbose_name="content", + ), + ), + ( + "slug", + models.JSONField( + blank=True, + default=list, + help_text="URL slug for this content (optional)", + null=True, + verbose_name="slug", + ), + ), + ( + "image", + models.ImageField( + blank=True, + help_text="Optional image for this content section", + null=True, + upload_to="blog/content_images/%Y/%m/", + verbose_name="Image", + ), + ), + ( + "order", + models.PositiveIntegerField( + default=0, + help_text="Order of this content within the blog", + verbose_name="Order", + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created At"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated At"), + ), + ( + "blog", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="contents", + to="blog.blog", + verbose_name="Blog", + ), + ), ], options={ - 'verbose_name': 'Blog Content', - 'verbose_name_plural': 'Blog Contents', - 'ordering': ['order', 'created_at'], + "verbose_name": "Blog Content", + "verbose_name_plural": "Blog Contents", + "ordering": ["order", "created_at"], }, ), ] diff --git a/apps/blog/migrations/0002_blogseo.py b/apps/blog/migrations/0002_blogseo.py deleted file mode 100644 index 9426a87..0000000 --- a/apps/blog/migrations/0002_blogseo.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 3.2.4 on 2025-09-11 12:17 - -import dj_language.field -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('dj_language', '0002_auto_20220120_1344'), - ('blog', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='BlogSeo', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(blank=True, help_text='maximum length of page title is 70 characters and minimum length is 30', max_length=140, null=True, verbose_name='seo title')), - ('keywords', models.CharField(blank=True, help_text='keywords in the content that make it possible for people to find the site via search engines', max_length=700, null=True)), - ('description', models.CharField(blank=True, help_text='describes and summarizes the contents of the page for the benefit of users and search engines', max_length=170, null=True)), - ('blog', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='seos', to='blog.blog', verbose_name='blog')), - ('language', dj_language.field.LanguageField(default=69, limit_choices_to={'status': True}, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='dj_language.language', verbose_name='language')), - ], - options={ - 'verbose_name': 'Blog SEO', - 'verbose_name_plural': 'Blog SEOs', - }, - ), - ] diff --git a/apps/blog/migrations/0003_convert_varchar_to_jsonb.py b/apps/blog/migrations/0003_convert_varchar_to_jsonb.py deleted file mode 100644 index 75c34d6..0000000 --- a/apps/blog/migrations/0003_convert_varchar_to_jsonb.py +++ /dev/null @@ -1,39 +0,0 @@ -# Generated manually to convert varchar fields to jsonb - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('blog', '0002_blogseo'), - ] - - operations = [ - migrations.RunSQL( - sql=""" - -- Step 1: Drop constraints and indexes on slug fields - ALTER TABLE blog_blog DROP CONSTRAINT IF EXISTS blog_blog_slug_key; - DROP INDEX IF EXISTS blog_blog_slug_4812aa2c_like; - DROP INDEX IF EXISTS blog_blogcontent_slug_4842a829; - DROP INDEX IF EXISTS blog_blogcontent_slug_4842a829_like; - - -- Step 2: Convert Blog table fields to jsonb - ALTER TABLE blog_blog ALTER COLUMN title TYPE jsonb USING '[]'::jsonb; - ALTER TABLE blog_blog ALTER COLUMN slogan TYPE jsonb USING '[]'::jsonb; - ALTER TABLE blog_blog ALTER COLUMN slug TYPE jsonb USING '[]'::jsonb; - - -- Step 3: Convert BlogContent table fields to jsonb - ALTER TABLE blog_blogcontent ALTER COLUMN title TYPE jsonb USING '[]'::jsonb; - ALTER TABLE blog_blogcontent ALTER COLUMN slug TYPE jsonb USING '[]'::jsonb; - """, - reverse_sql=""" - ALTER TABLE blog_blog ALTER COLUMN title TYPE varchar(255); - ALTER TABLE blog_blog ALTER COLUMN slogan TYPE varchar(500); - ALTER TABLE blog_blog ALTER COLUMN slug TYPE varchar(255); - ALTER TABLE blog_blogcontent ALTER COLUMN title TYPE varchar(255); - ALTER TABLE blog_blogcontent ALTER COLUMN slug TYPE varchar(255); - """ - ), - ] - diff --git a/apps/bookmark/migrations/0001_initial.py b/apps/bookmark/migrations/0001_initial.py index 55a1ee1..328a02b 100644 --- a/apps/bookmark/migrations/0001_initial.py +++ b/apps/bookmark/migrations/0001_initial.py @@ -1,12 +1,12 @@ -# Generated by Django 5.1.8 on 2025-04-23 10:30 +# Generated by Django 4.2.27 on 2026-01-22 10:48 -import django.db.models.deletion from django.conf import settings +import django.core.validators from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): - initial = True dependencies = [ @@ -15,20 +15,121 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='Bookmark', + name="Rate", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "service", + models.CharField( + choices=[ + ("library", "Library"), + ("podcast", "Podcast"), + ("podcast_playlist", "Podcast Playlist"), + ("hadith", "Hadith"), + ("video", "Video"), + ("video_playlist", "Video Playlist"), + ], + max_length=20, + verbose_name="Service", + ), + ), + ("content_id", models.PositiveIntegerField(verbose_name="Content ID")), + ( + "rate", + models.PositiveSmallIntegerField( + validators=[ + django.core.validators.MinValueValidator(1), + django.core.validators.MaxValueValidator(5), + ], + verbose_name="Rate", + ), + ), + ("status", models.BooleanField(default=True, verbose_name="Status")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created At"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated At"), + ), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="rates", + to=settings.AUTH_USER_MODEL, + verbose_name="User", + ), + ), + ], + options={ + "verbose_name": "Rate", + "verbose_name_plural": "Rates", + "unique_together": {("user", "service", "content_id")}, + }, + ), + migrations.CreateModel( + name="Bookmark", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('service', models.CharField(choices=[('library', 'Library'), ('podcast', 'Podcast'), ('hadith', 'Hadith'), ('video', 'Video')], max_length=20, verbose_name='Service')), - ('content_id', models.PositiveIntegerField(verbose_name='Content ID')), - ('status', models.BooleanField(default=True, verbose_name='Status')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bookmarks', to=settings.AUTH_USER_MODEL, verbose_name='User')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "service", + models.CharField( + choices=[ + ("library", "Library"), + ("podcast", "Podcast"), + ("podcast_playlist", "Podcast Playlist"), + ("hadith", "Hadith"), + ("hadith_correction", "Hadith Correction"), + ("video", "Video"), + ("video_playlist", "Video Playlist"), + ("article", "Article"), + ], + max_length=20, + verbose_name="Service", + ), + ), + ("content_id", models.PositiveIntegerField(verbose_name="Content ID")), + ("status", models.BooleanField(default=True, verbose_name="Status")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created At"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated At"), + ), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="bookmarks", + to=settings.AUTH_USER_MODEL, + verbose_name="User", + ), + ), ], options={ - 'verbose_name': 'Bookmark', - 'verbose_name_plural': 'Bookmarks', - 'unique_together': {('user', 'service', 'content_id')}, + "verbose_name": "Bookmark", + "verbose_name_plural": "Bookmarks", + "unique_together": {("user", "service", "content_id")}, }, ), ] diff --git a/apps/bookmark/migrations/0002_rate.py b/apps/bookmark/migrations/0002_rate.py deleted file mode 100644 index b651f5d..0000000 --- a/apps/bookmark/migrations/0002_rate.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 5.1.8 on 2025-05-04 15:36 - -import django.core.validators -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('bookmark', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Rate', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('service', models.CharField(choices=[('library', 'Library'), ('podcast', 'Podcast'), ('hadith', 'Hadith'), ('video', 'Video')], max_length=20, verbose_name='Service')), - ('content_id', models.PositiveIntegerField(verbose_name='Content ID')), - ('rate', models.PositiveSmallIntegerField(validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(5)], verbose_name='Rate')), - ('status', models.BooleanField(default=True, verbose_name='Status')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rates', to=settings.AUTH_USER_MODEL, verbose_name='User')), - ], - options={ - 'verbose_name': 'Rate', - 'verbose_name_plural': 'Rates', - 'unique_together': {('user', 'service', 'content_id')}, - }, - ), - ] diff --git a/apps/bookmark/migrations/0003_add_article_service_choice.py b/apps/bookmark/migrations/0003_add_article_service_choice.py deleted file mode 100644 index a3a1c45..0000000 --- a/apps/bookmark/migrations/0003_add_article_service_choice.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.8 on 2025-11-21 03:22 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('bookmark', '0002_rate'), - ] - - operations = [ - migrations.AlterField( - model_name='bookmark', - name='service', - field=models.CharField(choices=[('library', 'Library'), ('podcast', 'Podcast'), ('hadith', 'Hadith'), ('video', 'Video'), ('article', 'Article')], max_length=20, verbose_name='Service'), - ), - ] diff --git a/apps/bookmark/migrations/0004_auto_20251130_1758.py b/apps/bookmark/migrations/0004_auto_20251130_1758.py deleted file mode 100644 index 04cee5b..0000000 --- a/apps/bookmark/migrations/0004_auto_20251130_1758.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.4 on 2025-11-30 17:58 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('bookmark', '0003_add_article_service_choice'), - ] - - operations = [ - migrations.AlterField( - model_name='bookmark', - name='service', - field=models.CharField(choices=[('library', 'Library'), ('podcast', 'Podcast'), ('hadith', 'Hadith'), ('video', 'Video'), ('video_playlist', 'Video Playlist'), ('article', 'Article')], max_length=20, verbose_name='Service'), - ), - migrations.AlterField( - model_name='rate', - name='service', - field=models.CharField(choices=[('library', 'Library'), ('podcast', 'Podcast'), ('hadith', 'Hadith'), ('video', 'Video'), ('video_playlist', 'Video Playlist')], max_length=20, verbose_name='Service'), - ), - ] diff --git a/apps/bookmark/migrations/0005_auto_20251202_1245.py b/apps/bookmark/migrations/0005_auto_20251202_1245.py deleted file mode 100644 index 43097c5..0000000 --- a/apps/bookmark/migrations/0005_auto_20251202_1245.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.4 on 2025-12-02 12:45 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('bookmark', '0004_auto_20251130_1758'), - ] - - operations = [ - migrations.AlterField( - model_name='bookmark', - name='service', - field=models.CharField(choices=[('library', 'Library'), ('podcast', 'Podcast'), ('podcast_playlist', 'Podcast Playlist'), ('hadith', 'Hadith'), ('video', 'Video'), ('video_playlist', 'Video Playlist'), ('article', 'Article')], max_length=20, verbose_name='Service'), - ), - migrations.AlterField( - model_name='rate', - name='service', - field=models.CharField(choices=[('library', 'Library'), ('podcast', 'Podcast'), ('podcast_playlist', 'Podcast Playlist'), ('hadith', 'Hadith'), ('video', 'Video'), ('video_playlist', 'Video Playlist')], max_length=20, verbose_name='Service'), - ), - ] diff --git a/apps/certificate/migrations/0001_initial.py b/apps/certificate/migrations/0001_initial.py index cc3af2b..336915a 100644 --- a/apps/certificate/migrations/0001_initial.py +++ b/apps/certificate/migrations/0001_initial.py @@ -1,30 +1,69 @@ -# Generated by Django 5.1.8 on 2025-04-03 00:05 +# Generated by Django 4.2.27 on 2026-01-22 10:48 -import django.db.models.deletion -import filer.fields.file from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): - initial = True dependencies = [ - ('account', '0001_initial'), - ('course', '0001_initial'), + ("course", "0001_initial"), + ("account", "0001_initial"), ] operations = [ migrations.CreateModel( - name='Certificate', + name="Certificate", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('status', models.CharField(choices=[('pending', 'pending'), ('approved', 'approved'), ('canceled', 'canceled')], default='pending', max_length=10)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('certificate_file', filer.fields.file.FilerFileField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='filer.file', verbose_name='certificate_file')), - ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='course_certificates', to='course.course')), - ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='certificates', to='account.studentuser')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "status", + models.CharField( + choices=[ + ("pending", "pending"), + ("approved", "approved"), + ("canceled", "canceled"), + ], + default="pending", + max_length=10, + ), + ), + ( + "certificate_file", + models.FileField( + blank=True, + null=True, + upload_to="certificates/", + verbose_name="certificate_file", + ), + ), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("updated_at", models.DateTimeField(auto_now=True)), + ( + "course", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="course_certificates", + to="course.course", + ), + ), + ( + "student", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="certificates", + to="account.studentuser", + ), + ), ], ), ] diff --git a/apps/certificate/migrations/0002_alter_certificate_certificate_file.py b/apps/certificate/migrations/0002_alter_certificate_certificate_file.py deleted file mode 100644 index 1471ea1..0000000 --- a/apps/certificate/migrations/0002_alter_certificate_certificate_file.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.8 on 2025-04-03 01:24 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('certificate', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='certificate', - name='certificate_file', - field=models.FileField(blank=True, null=True, upload_to='certificates/', verbose_name='certificate_file'), - ), - ] diff --git a/apps/certificate/migrations/0002_alter_certificate_status.py b/apps/certificate/migrations/0002_alter_certificate_status.py deleted file mode 100644 index b7a186d..0000000 --- a/apps/certificate/migrations/0002_alter_certificate_status.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.7 on 2024-12-17 16:30 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('certificate', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='certificate', - name='status', - field=models.CharField(choices=[('pending', 'pending'), ('approved', 'approved'), ('canceled', 'canceled')], default='pending', max_length=10), - ), - ] diff --git a/apps/certificate/migrations/0003_merge_20260104_1114.py b/apps/certificate/migrations/0003_merge_20260104_1114.py deleted file mode 100644 index 9d42c96..0000000 --- a/apps/certificate/migrations/0003_merge_20260104_1114.py +++ /dev/null @@ -1,12 +0,0 @@ -# Generated by Django 4.2.27 on 2026-01-04 11:14 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("certificate", "0002_alter_certificate_certificate_file"), - ("certificate", "0002_alter_certificate_status"), - ] - - operations = [] diff --git a/apps/chat/migrations/0001_initial.py b/apps/chat/migrations/0001_initial.py index 6460652..cc82c51 100644 --- a/apps/chat/migrations/0001_initial.py +++ b/apps/chat/migrations/0001_initial.py @@ -1,62 +1,221 @@ -# Generated by Django 5.1.8 on 2025-04-03 00:05 +# Generated by Django 4.2.27 on 2026-01-22 10:48 -import django.db.models.deletion +import apps.chat.models from django.conf import settings from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): - initial = True dependencies = [ - ('course', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("course", "0001_initial"), ] operations = [ migrations.CreateModel( - name='RoomMessage', + name="RoomMessage", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='Room Name')), - ('description', models.TextField(blank=True, null=True, verbose_name='Description')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), - ('room_type', models.CharField(choices=[('group', 'Group'), ('private', 'Private')], default='group', max_length=10, verbose_name='Room Type')), - ('unread_messages_count', models.IntegerField(default=0)), - ('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='room_messages', to='course.course', verbose_name='Course')), - ('initiator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='initiated_rooms', to=settings.AUTH_USER_MODEL, verbose_name='Initiator')), - ('recipient', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='messages_received', to=settings.AUTH_USER_MODEL, verbose_name='Recipient')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=255, verbose_name="Room Name")), + ( + "description", + models.TextField(blank=True, null=True, verbose_name="Description"), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created At"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated At"), + ), + ( + "room_type", + models.CharField( + choices=[("group", "Group"), ("private", "Private")], + default="group", + max_length=10, + verbose_name="Room Type", + ), + ), + ("unread_messages_count", models.IntegerField(default=0)), + ( + "course", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="room_messages", + to="course.course", + verbose_name="Course", + ), + ), + ( + "initiator", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="initiated_rooms", + to=settings.AUTH_USER_MODEL, + verbose_name="Initiator", + ), + ), + ( + "recipient", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="messages_received", + to=settings.AUTH_USER_MODEL, + verbose_name="Recipient", + ), + ), ], ), migrations.CreateModel( - name='ChatMessage', + name="ChatMessage", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('content', models.TextField(verbose_name='Message Content')), - ('content_type', models.CharField(choices=[('text', 'Text'), ('file', 'File'), ('audio', 'Audio'), ('image', 'Image')], default='text', max_length=10, verbose_name='Chat Type')), - ('content_size', models.PositiveIntegerField(blank=True, null=True, verbose_name='Content Size (bytes)')), - ('is_read', models.BooleanField(default=False, verbose_name='Is Read')), - ('sent_at', models.DateTimeField(auto_now_add=True, verbose_name='Sent At')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), - ('deleted_at', models.DateTimeField(blank=True, null=True, verbose_name='Deleted At')), - ('is_deleted', models.BooleanField(default=False, verbose_name='Is deleted')), - ('sender', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages_sent', to=settings.AUTH_USER_MODEL, verbose_name='Sender')), - ('room', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='chat.roommessage', verbose_name='Room')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("content", models.TextField(verbose_name="Message Content")), + ( + "content_type", + models.CharField( + choices=[ + ("text", "Text"), + ("file", "File"), + ("audio", "Audio"), + ("image", "Image"), + ], + default="text", + max_length=10, + verbose_name="Chat Type", + ), + ), + ( + "content_size", + models.PositiveIntegerField( + blank=True, null=True, verbose_name="Content Size (bytes)" + ), + ), + ( + "file_attachment", + models.FileField( + blank=True, + help_text="For file and audio messages", + max_length=500, + null=True, + upload_to=apps.chat.models.chat_upload_path, + verbose_name="File Attachment", + ), + ), + ( + "image_attachment", + models.ImageField( + blank=True, + help_text="For image messages", + max_length=500, + null=True, + upload_to=apps.chat.models.chat_upload_path, + verbose_name="Image Attachment", + ), + ), + ("is_read", models.BooleanField(default=False, verbose_name="Is Read")), + ("message_metadata", models.JSONField(blank=True, null=True)), + ( + "sent_at", + models.DateTimeField(auto_now_add=True, verbose_name="Sent At"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated At"), + ), + ( + "deleted_at", + models.DateTimeField( + blank=True, null=True, verbose_name="Deleted At" + ), + ), + ( + "is_deleted", + models.BooleanField(default=False, verbose_name="Is deleted"), + ), + ( + "room", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="messages", + to="chat.roommessage", + verbose_name="Room", + ), + ), + ( + "sender", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="messages_sent", + to=settings.AUTH_USER_MODEL, + verbose_name="Sender", + ), + ), ], ), migrations.CreateModel( - name='MessageReadStatus', + name="MessageReadStatus", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_read', models.BooleanField(default=False, verbose_name='Is Read')), - ('read_at', models.DateTimeField(blank=True, null=True, verbose_name='Read At')), - ('message', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='read_statuses', to='chat.chatmessage', verbose_name='Message')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='read_statuses', to=settings.AUTH_USER_MODEL, verbose_name='User')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("is_read", models.BooleanField(default=False, verbose_name="Is Read")), + ( + "read_at", + models.DateTimeField(blank=True, null=True, verbose_name="Read At"), + ), + ( + "message", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="read_statuses", + to="chat.chatmessage", + verbose_name="Message", + ), + ), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="read_statuses", + to=settings.AUTH_USER_MODEL, + verbose_name="User", + ), + ), ], options={ - 'unique_together': {('user', 'message')}, + "unique_together": {("user", "message")}, }, ), - ] \ No newline at end of file + ] diff --git a/apps/chat/migrations/0002_auto_20241125_1219.py b/apps/chat/migrations/0002_auto_20241125_1219.py deleted file mode 100644 index 07e7546..0000000 --- a/apps/chat/migrations/0002_auto_20241125_1219.py +++ /dev/null @@ -1,49 +0,0 @@ -# Generated by Django 3.2.4 on 2024-11-25 12:19 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('course', '0003_alter_course_is_online_alter_course_timing_and_more'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('chat', '0001_initial'), - ] - - operations = [ - migrations.RemoveField( - model_name='chatmessage', - name='course', - ), - migrations.RemoveField( - model_name='chatmessage', - name='is_to_professor', - ), - migrations.RemoveField( - model_name='chatmessage', - name='recipient', - ), - migrations.CreateModel( - name='RoomMessage', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='Room Name')), - ('description', models.TextField(blank=True, null=True, verbose_name='Description')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), - ('room_type', models.CharField(choices=[('group', 'Group'), ('private', 'Private')], default='group', max_length=10, verbose_name='Room Type')), - ('course', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='room_messages', to='course.course', verbose_name='Course')), - ('initiator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='initiated_rooms', to=settings.AUTH_USER_MODEL, verbose_name='Initiator')), - ('recipient', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='messages_received', to=settings.AUTH_USER_MODEL, verbose_name='Recipient')), - ], - ), - migrations.AddField( - model_name='chatmessage', - name='room', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='chat.roommessage', verbose_name='Room'), - preserve_default=False, - ), - ] diff --git a/apps/chat/migrations/0002_chatmessage_metadata.py b/apps/chat/migrations/0002_chatmessage_metadata.py deleted file mode 100644 index 1f0c0ee..0000000 --- a/apps/chat/migrations/0002_chatmessage_metadata.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.8 on 2025-08-06 10:55 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('chat', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='chatmessage', - name='message_metadata', - field=models.JSONField(blank=True, null=True), - ), - ] diff --git a/apps/chat/migrations/0003_add_file_and_image_attachments.py b/apps/chat/migrations/0003_add_file_and_image_attachments.py deleted file mode 100644 index aef8937..0000000 --- a/apps/chat/migrations/0003_add_file_and_image_attachments.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 3.2.4 on 2025-10-23 11:57 - -import apps.chat.models -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('chat', '0002_chatmessage_metadata'), - ] - - operations = [ - migrations.AddField( - model_name='chatmessage', - name='file_attachment', - field=models.FileField(blank=True, help_text='For file and audio messages', max_length=500, null=True, upload_to=apps.chat.models.chat_upload_path, verbose_name='File Attachment'), - ), - migrations.AddField( - model_name='chatmessage', - name='image_attachment', - field=models.ImageField(blank=True, help_text='For image messages', max_length=500, null=True, upload_to=apps.chat.models.chat_upload_path, verbose_name='Image Attachment'), - ), - ] diff --git a/apps/chat/migrations/0003_auto_20241125_1737.py b/apps/chat/migrations/0003_auto_20241125_1737.py deleted file mode 100644 index 3b09247..0000000 --- a/apps/chat/migrations/0003_auto_20241125_1737.py +++ /dev/null @@ -1,34 +0,0 @@ -# Generated by Django 3.2.4 on 2024-11-25 17:37 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('chat', '0002_auto_20241125_1219'), - ] - - operations = [ - migrations.AddField( - model_name='chatmessage', - name='is_read', - field=models.BooleanField(default=False, verbose_name='Is Read'), - ), - migrations.CreateModel( - name='MessageReadStatus', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_read', models.BooleanField(default=False, verbose_name='Is Read')), - ('read_at', models.DateTimeField(blank=True, null=True, verbose_name='Read At')), - ('message', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='read_statuses', to='chat.chatmessage', verbose_name='Message')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='read_statuses', to=settings.AUTH_USER_MODEL, verbose_name='User')), - ], - options={ - 'unique_together': {('user', 'message')}, - }, - ), - ] diff --git a/apps/chat/migrations/0004_roommessage_unread_messages_count.py b/apps/chat/migrations/0004_roommessage_unread_messages_count.py deleted file mode 100644 index 5811ba2..0000000 --- a/apps/chat/migrations/0004_roommessage_unread_messages_count.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2024-11-26 01:30 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('chat', '0003_auto_20241125_1737'), - ] - - operations = [ - migrations.AddField( - model_name='roommessage', - name='unread_messages_count', - field=models.IntegerField(default=0), - ), - ] diff --git a/apps/chat/migrations/0005_merge_20260104_1114.py b/apps/chat/migrations/0005_merge_20260104_1114.py deleted file mode 100644 index 50f38b8..0000000 --- a/apps/chat/migrations/0005_merge_20260104_1114.py +++ /dev/null @@ -1,12 +0,0 @@ -# Generated by Django 4.2.27 on 2026-01-04 11:14 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("chat", "0003_add_file_and_image_attachments"), - ("chat", "0004_roommessage_unread_messages_count"), - ] - - operations = [] diff --git a/apps/course/migrations/0001_initial.py b/apps/course/migrations/0001_initial.py index 2b829ce..6195e4e 100644 --- a/apps/course/migrations/0001_initial.py +++ b/apps/course/migrations/0001_initial.py @@ -1,135 +1,1007 @@ -# Generated by Django 5.1.8 on 2025-04-03 00:05 +# Generated by Django 4.2.27 on 2026-01-22 10:48 import apps.course.models.course import apps.course.models.lesson -import django.db.models.deletion -import filer.fields.image -import utils.schema from django.conf import settings from django.db import migrations, models +import django.db.models.deletion +import utils.schema class Migration(migrations.Migration): - initial = True dependencies = [ - ('account', '0001_initial'), - migrations.swappable_dependency(settings.FILER_IMAGE_MODEL), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("account", "0001_initial"), ] operations = [ migrations.CreateModel( - name='CourseCategory', + name="Attachment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "title", + models.CharField(max_length=255, verbose_name="Attachment Title"), + ), + ( + "file", + models.FileField( + upload_to=apps.course.models.course.attachment_file_upload_to, + verbose_name="Attachment File", + ), + ), + ( + "file_size", + models.PositiveIntegerField( + blank=True, null=True, verbose_name="File Size (in bytes)" + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated At"), + ), + ], + options={ + "verbose_name": "Attachment", + "verbose_name_plural": "Attachments", + }, + ), + migrations.CreateModel( + name="Course", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "title", + models.CharField(max_length=255, verbose_name="Course Title"), + ), + ("slug", models.SlugField(allow_unicode=True, unique=True)), + ( + "thumbnail", + models.ImageField( + upload_to="courses/thumbnails/", verbose_name="Thumbnail" + ), + ), + ( + "video_type", + models.CharField( + choices=[ + ("youtube_link", "Youtube Link"), + ("video_file", "Video File"), + ], + max_length=20, + verbose_name="Preview Video Type (YouTube Link or File Upload)", + ), + ), + ( + "video_file", + models.FileField( + blank=True, + null=True, + upload_to=apps.course.models.course.course_file_upload_to, + ), + ), + ("video_link", models.CharField(blank=True, max_length=500, null=True)), + ( + "is_online", + models.BooleanField(default=False, verbose_name="Is Online Course"), + ), + ( + "online_link", + models.CharField( + blank=True, + max_length=500, + null=True, + verbose_name="Online Class Link", + ), + ), + ( + "level", + models.CharField( + choices=[ + ("beginner", "Beginner"), + ("mid", "Mid Level"), + ("advanced", "Advanced"), + ], + max_length=10, + verbose_name="Course Level", + ), + ), + ( + "duration", + models.PositiveIntegerField(verbose_name="Duration (in hours)"), + ), + ( + "lessons_count", + models.PositiveIntegerField(verbose_name="Number of Lessons"), + ), + ("description", models.TextField(verbose_name="Course Description")), + ( + "short_description", + models.CharField( + blank=True, + max_length=500, + null=True, + verbose_name="Short Description", + ), + ), + ( + "status", + models.CharField( + choices=[ + ("inactive", "Inactive"), + ("upcoming", "Upcoming"), + ("registering", "Registering"), + ("ongoing", "Ongoing"), + ("finished", "Finished"), + ], + default="inactive", + max_length=15, + verbose_name="Course Status", + ), + ), + ("is_free", models.BooleanField(default=True, verbose_name="Is Free")), + ( + "price", + models.DecimalField( + decimal_places=2, + default=0.0, + max_digits=10, + verbose_name="Course Price", + ), + ), + ( + "discount_percentage", + models.PositiveIntegerField( + default=0, verbose_name="Discount Percentage" + ), + ), + ( + "final_price", + models.DecimalField( + blank=True, + decimal_places=2, + default=0.0, + help_text="This field is automatically calculated based on the discount percentage.", + max_digits=10, + verbose_name="Course Final Price", + ), + ), + ( + "timing", + models.JSONField( + blank=True, + default=utils.schema.default_timing, + null=True, + verbose_name="Timing", + ), + ), + ( + "features", + models.JSONField( + blank=True, + default=dict, + null=True, + verbose_name="Course features", + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated At"), + ), + ], + options={ + "verbose_name": "Course", + "verbose_name_plural": "Courses", + }, + ), + migrations.CreateModel( + name="CourseCategory", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "name", + models.CharField(max_length=255, verbose_name="Category Name"), + ), + ("slug", models.SlugField(max_length=255, unique=True)), + ], + ), + migrations.CreateModel( + name="CourseLiveSession", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "room_id", + models.CharField( + blank=True, + help_text="Identifier of the PlugNMeet room.", + max_length=255, + null=True, + unique=True, + verbose_name="Room ID", + ), + ), + ( + "subject", + models.CharField( + help_text="Topic of the live session.", + max_length=255, + verbose_name="Subject", + ), + ), + ( + "started_at", + models.DateTimeField( + help_text="Start time of the live session.", + verbose_name="Started At", + ), + ), + ( + "ended_at", + models.DateTimeField( + blank=True, + help_text="End time of the live session.", + null=True, + verbose_name="Ended At", + ), + ), + ( + "recorded_file", + models.FileField( + blank=True, + help_text="Recorded file of the live session.", + null=True, + upload_to="live_session_recordings/", + verbose_name="Recorded File", + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created At"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated At"), + ), + ( + "course", + models.ForeignKey( + help_text="Course that this live session belongs to.", + on_delete=django.db.models.deletion.CASCADE, + related_name="live_sessions", + to="course.course", + verbose_name="Course", + ), + ), + ], + options={ + "verbose_name": "Course Live Session", + "verbose_name_plural": "Course Live Sessions", + "ordering": ("-started_at", "-id"), + }, + ), + migrations.CreateModel( + name="Glossary", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "title", + models.CharField(max_length=555, verbose_name="Glossary Title"), + ), + ("description", models.TextField(verbose_name="Description")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated At"), + ), + ], + options={ + "verbose_name": "Glossary", + "verbose_name_plural": "Glossaries", + }, + ), + migrations.CreateModel( + name="Lesson", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "title", + models.CharField(max_length=255, verbose_name="Lesson Title"), + ), + ( + "content_type", + models.CharField( + choices=[ + ("youtube_link", "Youtube Link"), + ("video_file", "Video File"), + ], + max_length=50, + verbose_name="Content Type", + ), + ), + ( + "content_file", + models.FileField( + blank=True, + null=True, + upload_to=apps.course.models.lesson.lesson_file_upload_to, + ), + ), + ( + "video_link", + models.CharField( + blank=True, max_length=500, null=True, verbose_name="Link" + ), + ), + ( + "duration", + models.PositiveIntegerField(verbose_name="Duration (in minutes)"), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated At"), + ), + ], + options={ + "verbose_name": "Lesson", + "verbose_name_plural": "Lessons", + "indexes": [ + models.Index( + fields=["content_type"], name="course_less_content_e1cf57_idx" + ), + models.Index( + fields=["created_at"], name="course_less_created_4efb58_idx" + ), + ], + }, + ), + migrations.CreateModel( + name="CourseLesson", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='Category Name')), - ('slug', models.SlugField(max_length=255, unique=True)), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "title", + models.CharField( + blank=True, + max_length=255, + null=True, + verbose_name="Course Lesson Title", + ), + ), + ( + "priority", + models.IntegerField(blank=True, null=True, verbose_name="Priority"), + ), + ( + "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"), + ), + ( + "course", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="lessons", + to="course.course", + verbose_name="Course", + ), + ), + ( + "lesson", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="course_lessons", + to="course.lesson", + verbose_name="Lesson", + ), + ), ], + options={ + "verbose_name": "Course Lesson", + "verbose_name_plural": "Course Lessons", + }, ), migrations.CreateModel( - name='Course', + name="CourseGlossary", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='Course Title')), - ('slug', models.SlugField(allow_unicode=True, unique=True)), - ('video_type', models.CharField(choices=[('video_file', 'Video File'), ('video_link', 'Video Link')], max_length=20, verbose_name='Vedio Type')), - ('video_file', models.FileField(blank=True, null=True, upload_to=apps.course.models.course.course_file_upload_to)), - ('video_link', models.CharField(blank=True, max_length=500, null=True, verbose_name='Video Link')), - ('is_online', models.BooleanField(default=True, verbose_name='Is Online Course')), - ('online_link', models.CharField(blank=True, max_length=500, null=True, verbose_name='Online Class Link')), - ('level', models.CharField(choices=[('beginner', 'Beginner'), ('mid', 'Mid Level'), ('advanced', 'Advanced')], max_length=10, verbose_name='Course Level')), - ('duration', models.PositiveIntegerField(verbose_name='Duration (in hours)')), - ('lessons_count', models.PositiveIntegerField(verbose_name='Number of Lessons')), - ('description', models.TextField(verbose_name='Course Description')), - ('short_description', models.CharField(blank=True, max_length=500, null=True, verbose_name='Short Description')), - ('status', models.CharField(choices=[('inactive', 'Inactive'), ('upcoming', 'Upcoming'), ('registering', 'Registering'), ('ongoing', 'Ongoing'), ('finished', 'Finished')], default='inactive', max_length=15, verbose_name='Course Status')), - ('is_free', models.BooleanField(default=True, verbose_name='Is Free')), - ('price', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='Course Price')), - ('discount_percentage', models.PositiveIntegerField(default=0, verbose_name='Discount Percentage')), - ('final_price', models.DecimalField(blank=True, decimal_places=2, default=0.0, help_text='This field is automatically calculated based on the discount percentage.', max_digits=10, verbose_name='Course Final Price')), - ('timing', models.JSONField(blank=True, default=utils.schema.default_timing, help_text='The Timing information in JSON format.', null=True, verbose_name='Timing')), - ('features', models.JSONField(blank=True, default=dict, null=True, verbose_name='Course features')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), - ('professor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='courses', to='account.professoruser')), - ('thumbnail', filer.fields.image.FilerImageField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.FILER_IMAGE_MODEL, verbose_name='thumbnail')), - ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='courses', to='course.coursecategory', verbose_name='Category')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated At"), + ), + ( + "course", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="glossaries", + to="course.course", + verbose_name="Course", + ), + ), + ( + "glossary", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="course_glossaries", + to="course.glossary", + verbose_name="Glossary", + ), + ), ], options={ - 'verbose_name': 'Course', - 'verbose_name_plural': 'Courses', + "verbose_name": "Course Glossary", + "verbose_name_plural": "Course Glossaries", + "ordering": ("-id",), }, ), migrations.CreateModel( - name='Attachment', + name="CourseAttachment", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='Attachment Title')), - ('file', models.FileField(upload_to=apps.course.models.course.attachment_file_upload_to, verbose_name='Attachment File')), - ('file_size', models.PositiveIntegerField(blank=True, null=True, verbose_name='File Size (in bytes)')), - ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attachments', to='course.course', verbose_name='Course')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated At"), + ), + ( + "attachment", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="course_attachments", + to="course.attachment", + verbose_name="Attachment", + ), + ), + ( + "course", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="attachments", + to="course.course", + verbose_name="Course", + ), + ), ], options={ - 'verbose_name': 'Attachment', - 'verbose_name_plural': 'Attachments', - 'ordering': ('-id',), + "verbose_name": "Course Attachment", + "verbose_name_plural": "Course Attachments", + "ordering": ("-id",), }, ), + migrations.AddField( + model_name="course", + name="category", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="courses", + to="course.coursecategory", + verbose_name="Category", + ), + ), + migrations.AddField( + model_name="course", + name="professor", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="courses", + to="account.professoruser", + ), + ), migrations.CreateModel( - name='Glossary', + name="Participant", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=555, verbose_name='Glossary Title')), - ('description', models.TextField(verbose_name='Description')), - ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='glossaries', to='course.course', verbose_name='Course')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("is_active", models.BooleanField(default=True)), + ("joined_date", models.DateTimeField(auto_now_add=True)), + ("unread_messages_count", models.IntegerField(default=0)), + ( + "course", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="participants", + to="course.course", + ), + ), + ( + "student", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="participated_courses", + to="account.studentuser", + ), + ), ], options={ - 'verbose_name': 'Glossary', - 'verbose_name_plural': 'Glossary', - 'ordering': ('-id',), + "indexes": [ + models.Index( + fields=["student"], name="course_part_student_566b08_idx" + ), + models.Index( + fields=["course"], name="course_part_course__7cbf7c_idx" + ), + models.Index( + fields=["joined_date"], name="course_part_joined__27eaa0_idx" + ), + models.Index( + fields=["student", "course"], + name="course_part_student_c97a97_idx", + ), + ], + "unique_together": {("student", "course")}, }, ), migrations.CreateModel( - name='Lesson', + name="LiveSessionUser", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='Lesson Title')), - ('priority', models.IntegerField(blank=True, null=True, verbose_name='Priority')), - ('is_active', models.BooleanField(default=True, verbose_name='Is Active')), - ('duration', models.PositiveIntegerField(verbose_name='Duration (in minutes)')), - ('content_type', models.CharField(choices=[('youtube_link', 'Youtube Link'), ('video_file', 'Video File'), ('audio_file', 'Audio File')], max_length=50, verbose_name='Content Type')), - ('content_file', models.FileField(blank=True, null=True, upload_to=apps.course.models.lesson.lesson_file_upload_to)), - ('video_link', models.CharField(blank=True, max_length=500, null=True, verbose_name='Link')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), - ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lessons', to='course.course', verbose_name='Course')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "role", + models.CharField( + choices=[ + ("participant", "Participant"), + ("moderator", "Moderator"), + ("observer", "Observer"), + ], + help_text="Role of the user in the session", + max_length=50, + verbose_name="Role", + ), + ), + ( + "entered_at", + models.DateTimeField( + help_text="Time the user entered the session", + verbose_name="Entered At", + ), + ), + ( + "exited_at", + models.DateTimeField( + blank=True, + default=None, + help_text="Time the user exited the session", + null=True, + verbose_name="Exited At", + ), + ), + ( + "is_online", + models.BooleanField( + default=True, + help_text="Is the user currently online?", + verbose_name="Is online", + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created At"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated At"), + ), + ( + "session", + models.ForeignKey( + help_text="Live session that the user joined.", + on_delete=django.db.models.deletion.CASCADE, + related_name="user_sessions", + to="course.courselivesession", + verbose_name="Live Session", + ), + ), + ( + "user", + models.ForeignKey( + help_text="User participating in the live session.", + on_delete=django.db.models.deletion.CASCADE, + related_name="live_session_entries", + to=settings.AUTH_USER_MODEL, + verbose_name="User", + ), + ), ], + options={ + "verbose_name": "User Session", + "verbose_name_plural": "User Sessions", + "ordering": ("-entered_at", "-id"), + "indexes": [ + models.Index( + fields=["session", "user"], + name="course_live_session_b1eaa5_idx", + ), + models.Index( + fields=["session", "is_online"], + name="course_live_session_5ef9bc_idx", + ), + models.Index( + fields=["user", "is_online"], + name="course_live_user_id_384830_idx", + ), + ], + "unique_together": {("session", "user", "entered_at")}, + }, ), migrations.CreateModel( - name='LessonCompletion', + name="LiveSessionRecording", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('completed_at', models.DateTimeField(auto_now_add=True)), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), - ('lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='completions', to='course.lesson')), - ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lesson_completions', to='account.studentuser')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "title", + models.CharField( + help_text="Title of the recording", + max_length=255, + verbose_name="Title", + ), + ), + ( + "file", + models.FileField( + help_text="File of the recorded session", + upload_to="recorded_sessions/", + verbose_name="Recording File", + ), + ), + ( + "file_time", + models.DurationField( + blank=True, + help_text="Duration of the recording file", + null=True, + verbose_name="File Duration", + ), + ), + ( + "recording_type", + models.CharField( + choices=[("voice", "Voice"), ("video", "Video")], + help_text="Type of the recording (voice or video)", + max_length=10, + verbose_name="Recording Type", + ), + ), + ( + "thumbnail", + models.ImageField( + blank=True, + help_text="Thumbnail image for video recordings", + null=True, + upload_to="recording_thumbnails/", + verbose_name="Thumbnail", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, + help_text="Time the recording was created", + verbose_name="Created At", + ), + ), + ( + "updated_at", + models.DateTimeField( + auto_now=True, + help_text="The datetime when the recording was last updated", + verbose_name="Updated At", + ), + ), + ( + "is_active", + models.BooleanField( + default=True, + help_text="Whether this recording is active or not", + verbose_name="Is Active", + ), + ), + ( + "session", + models.ForeignKey( + help_text="Live session that this recording belongs to.", + on_delete=django.db.models.deletion.CASCADE, + related_name="recordings", + to="course.courselivesession", + verbose_name="Live Session", + ), + ), ], options={ - 'unique_together': {('student', 'lesson')}, + "verbose_name": "Live Session Recording", + "verbose_name_plural": "Live Session Recordings", + "ordering": ("-created_at", "-id"), + "indexes": [ + models.Index( + fields=["session", "is_active"], + name="course_live_session_f35db0_idx", + ), + models.Index( + fields=["session", "recording_type"], + name="course_live_session_84b2bf_idx", + ), + ], }, ), migrations.CreateModel( - name='Participant', + name="LessonCompletion", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('joined_date', models.DateTimeField(auto_now_add=True)), - ('unread_messages_count', models.IntegerField(default=0)), - ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participants', to='course.course')), - ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participated_courses', to='account.studentuser')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("completed_at", models.DateTimeField(auto_now_add=True)), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created at"), + ), + ( + "course_lesson", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="completions", + to="course.courselesson", + ), + ), + ( + "student", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="lesson_completions", + to="account.studentuser", + ), + ), ], options={ - 'unique_together': {('student', 'course')}, + "indexes": [ + models.Index( + fields=["student"], name="course_less_student_f3c9b8_idx" + ), + models.Index( + fields=["course_lesson"], name="course_less_course__1f3841_idx" + ), + models.Index( + fields=["completed_at"], name="course_less_complet_8d2220_idx" + ), + models.Index( + fields=["student", "course_lesson"], + name="course_less_student_3b6367_idx", + ), + ], + "unique_together": {("student", "course_lesson")}, }, ), - ] \ No newline at end of file + migrations.AddIndex( + model_name="courselivesession", + index=models.Index( + fields=["course", "started_at"], name="course_cour_course__b8968b_idx" + ), + ), + migrations.AddIndex( + model_name="courselivesession", + index=models.Index( + fields=["course", "created_at"], name="course_cour_course__142085_idx" + ), + ), + migrations.AddIndex( + model_name="courselivesession", + index=models.Index( + fields=["room_id"], name="course_cour_room_id_ed0222_idx" + ), + ), + migrations.AddIndex( + model_name="courselesson", + index=models.Index( + fields=["course"], name="course_cour_course__4afa4c_idx" + ), + ), + migrations.AddIndex( + model_name="courselesson", + index=models.Index( + fields=["lesson"], name="course_cour_lesson__e5c835_idx" + ), + ), + migrations.AddIndex( + model_name="courselesson", + index=models.Index( + fields=["priority"], name="course_cour_priorit_dedac7_idx" + ), + ), + migrations.AddIndex( + model_name="courselesson", + index=models.Index( + fields=["is_active"], name="course_cour_is_acti_490c61_idx" + ), + ), + migrations.AddIndex( + model_name="courselesson", + index=models.Index( + fields=["course", "priority"], name="course_cour_course__192d2c_idx" + ), + ), + migrations.AddIndex( + model_name="courselesson", + index=models.Index( + fields=["course", "is_active"], name="course_cour_course__7c6f06_idx" + ), + ), + migrations.AddIndex( + model_name="courseattachment", + index=models.Index( + fields=["course"], name="course_cour_course__106cc8_idx" + ), + ), + migrations.AddIndex( + model_name="courseattachment", + index=models.Index( + fields=["attachment"], name="course_cour_attachm_2da12a_idx" + ), + ), + migrations.AddIndex( + model_name="course", + index=models.Index(fields=["status"], name="course_cour_status_57ffd9_idx"), + ), + migrations.AddIndex( + model_name="course", + index=models.Index( + fields=["is_free"], name="course_cour_is_free_9453a1_idx" + ), + ), + migrations.AddIndex( + model_name="course", + index=models.Index( + fields=["created_at"], name="course_cour_created_49f06e_idx" + ), + ), + migrations.AddIndex( + model_name="course", + index=models.Index(fields=["slug"], name="course_cour_slug_235a66_idx"), + ), + migrations.AddIndex( + model_name="course", + index=models.Index( + fields=["status", "created_at"], name="course_cour_status_bfcd24_idx" + ), + ), + migrations.AddIndex( + model_name="course", + index=models.Index( + fields=["category", "status"], name="course_cour_categor_26bb4d_idx" + ), + ), + migrations.AddIndex( + model_name="course", + index=models.Index( + fields=["professor", "status"], name="course_cour_profess_5eae9a_idx" + ), + ), + ] diff --git a/apps/course/migrations/0002_alter_course_thumbnail.py b/apps/course/migrations/0002_alter_course_thumbnail.py deleted file mode 100644 index bf66856..0000000 --- a/apps/course/migrations/0002_alter_course_thumbnail.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.8 on 2025-04-03 01:24 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('course', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='course', - name='thumbnail', - field=models.ImageField(blank=True, null=True, upload_to='courses/thumbnails/', verbose_name='Thumbnail'), - ), - ] diff --git a/apps/course/migrations/0002_auto_20241121_2238.py b/apps/course/migrations/0002_auto_20241121_2238.py deleted file mode 100644 index 49f4550..0000000 --- a/apps/course/migrations/0002_auto_20241121_2238.py +++ /dev/null @@ -1,32 +0,0 @@ -# Generated by Django 3.2.4 on 2024-11-21 22:38 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0003_auto_20241120_1741'), - ('course', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='lesson', - name='is_active', - field=models.BooleanField(default=True, verbose_name='Is Active'), - ), - migrations.CreateModel( - name='LessonCompletion', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('completed_at', models.DateTimeField(auto_now_add=True)), - ('lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='completions', to='course.lesson')), - ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lesson_completions', to='account.studentuser')), - ], - options={ - 'unique_together': {('student', 'lesson')}, - }, - ), - ] diff --git a/apps/course/migrations/0003_alter_course_is_online_alter_course_timing_and_more.py b/apps/course/migrations/0003_alter_course_is_online_alter_course_timing_and_more.py deleted file mode 100644 index fb1dc35..0000000 --- a/apps/course/migrations/0003_alter_course_is_online_alter_course_timing_and_more.py +++ /dev/null @@ -1,34 +0,0 @@ -# Generated by Django 5.1.8 on 2025-04-04 00:09 - -import utils.schema -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('course', '0002_alter_course_thumbnail'), - ] - - operations = [ - migrations.AlterField( - model_name='course', - name='is_online', - field=models.BooleanField(default=False, verbose_name='Is Online Course'), - ), - migrations.AlterField( - model_name='course', - name='timing', - field=models.JSONField(blank=True, default=utils.schema.default_timing, null=True, verbose_name='Timing'), - ), - migrations.AlterField( - model_name='course', - name='video_link', - field=models.CharField(blank=True, max_length=500, null=True), - ), - migrations.AlterField( - model_name='course', - name='video_type', - field=models.CharField(choices=[('youtube_link', 'Youtube Link'), ('video_file', 'Video File')], max_length=20, verbose_name='Preview Video Type (YouTube Link or File Upload)'), - ), - ] diff --git a/apps/course/migrations/0003_participant.py b/apps/course/migrations/0003_participant.py deleted file mode 100644 index 1583527..0000000 --- a/apps/course/migrations/0003_participant.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 3.2.4 on 2024-11-21 22:39 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0003_auto_20241120_1741'), - ('course', '0002_auto_20241121_2238'), - ] - - operations = [ - migrations.CreateModel( - name='Participant', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('joined_date', models.DateTimeField(auto_now_add=True)), - ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participants', to='course.course')), - ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participated_courses', to='account.studentuser')), - ], - options={ - 'unique_together': {('student', 'course')}, - }, - ), - ] diff --git a/apps/course/migrations/0005_add_database_indexes.py b/apps/course/migrations/0005_add_database_indexes.py deleted file mode 100644 index 838c640..0000000 --- a/apps/course/migrations/0005_add_database_indexes.py +++ /dev/null @@ -1,122 +0,0 @@ -# Generated by Django 5.1.8 on 2025-06-11 19:21 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('account', '0003_locationhistory'), - ('course', '0003_alter_course_is_online_alter_course_timing_and_more'), - ] - - operations = [ - migrations.AlterModelOptions( - name='courselesson', - options={'verbose_name': 'Course Lesson', 'verbose_name_plural': 'Course Lessons'}, - ), - migrations.AlterModelOptions( - name='lesson', - options={'verbose_name': 'Lesson', 'verbose_name_plural': 'Lessons'}, - ), - migrations.AddIndex( - model_name='course', - index=models.Index(fields=['status'], name='course_cour_status_57ffd9_idx'), - ), - migrations.AddIndex( - model_name='course', - index=models.Index(fields=['is_free'], name='course_cour_is_free_9453a1_idx'), - ), - migrations.AddIndex( - model_name='course', - index=models.Index(fields=['created_at'], name='course_cour_created_49f06e_idx'), - ), - migrations.AddIndex( - model_name='course', - index=models.Index(fields=['slug'], name='course_cour_slug_235a66_idx'), - ), - migrations.AddIndex( - model_name='course', - index=models.Index(fields=['status', 'created_at'], name='course_cour_status_bfcd24_idx'), - ), - migrations.AddIndex( - model_name='course', - index=models.Index(fields=['category', 'status'], name='course_cour_categor_26bb4d_idx'), - ), - migrations.AddIndex( - model_name='course', - index=models.Index(fields=['professor', 'status'], name='course_cour_profess_5eae9a_idx'), - ), - migrations.AddIndex( - model_name='courseattachment', - index=models.Index(fields=['course'], name='course_cour_course__106cc8_idx'), - ), - migrations.AddIndex( - model_name='courseattachment', - index=models.Index(fields=['attachment'], name='course_cour_attachm_2da12a_idx'), - ), - migrations.AddIndex( - model_name='courselesson', - index=models.Index(fields=['course'], name='course_cour_course__4afa4c_idx'), - ), - migrations.AddIndex( - model_name='courselesson', - index=models.Index(fields=['lesson'], name='course_cour_lesson__e5c835_idx'), - ), - migrations.AddIndex( - model_name='courselesson', - index=models.Index(fields=['priority'], name='course_cour_priorit_dedac7_idx'), - ), - migrations.AddIndex( - model_name='courselesson', - index=models.Index(fields=['is_active'], name='course_cour_is_acti_490c61_idx'), - ), - migrations.AddIndex( - model_name='courselesson', - index=models.Index(fields=['course', 'priority'], name='course_cour_course__192d2c_idx'), - ), - migrations.AddIndex( - model_name='courselesson', - index=models.Index(fields=['course', 'is_active'], name='course_cour_course__7c6f06_idx'), - ), - migrations.AddIndex( - model_name='lesson', - index=models.Index(fields=['content_type'], name='course_less_content_e1cf57_idx'), - ), - migrations.AddIndex( - model_name='lesson', - index=models.Index(fields=['created_at'], name='course_less_created_4efb58_idx'), - ), - migrations.AddIndex( - model_name='lessoncompletion', - index=models.Index(fields=['student'], name='course_less_student_f3c9b8_idx'), - ), - migrations.AddIndex( - model_name='lessoncompletion', - index=models.Index(fields=['course_lesson'], name='course_less_course__1f3841_idx'), - ), - migrations.AddIndex( - model_name='lessoncompletion', - index=models.Index(fields=['completed_at'], name='course_less_complet_8d2220_idx'), - ), - migrations.AddIndex( - model_name='lessoncompletion', - index=models.Index(fields=['student', 'course_lesson'], name='course_less_student_3b6367_idx'), - ), - migrations.AddIndex( - model_name='participant', - index=models.Index(fields=['student'], name='course_part_student_566b08_idx'), - ), - migrations.AddIndex( - model_name='participant', - index=models.Index(fields=['course'], name='course_part_course__7cbf7c_idx'), - ), - migrations.AddIndex( - model_name='participant', - index=models.Index(fields=['joined_date'], name='course_part_joined__27eaa0_idx'), - ), - migrations.AddIndex( - model_name='participant', - index=models.Index(fields=['student', 'course'], name='course_part_student_c97a97_idx'), - ), - ] diff --git a/apps/course/migrations/0005_participant_unread_messages_count.py b/apps/course/migrations/0005_participant_unread_messages_count.py deleted file mode 100644 index cad41db..0000000 --- a/apps/course/migrations/0005_participant_unread_messages_count.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2024-11-26 01:23 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('course', '0003_participant'), - ] - - operations = [ - migrations.AddField( - model_name='participant', - name='unread_messages_count', - field=models.IntegerField(default=0), - ), - ] diff --git a/apps/course/migrations/0006_auto_20250113_1337.py b/apps/course/migrations/0006_auto_20250113_1337.py deleted file mode 100644 index f6e31be..0000000 --- a/apps/course/migrations/0006_auto_20250113_1337.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.7 on 2025-01-13 13:37 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('course', '0005_participant_unread_messages_count'), - ] - - operations = [ - migrations.AlterField( - model_name='lesson', - name='content_type', - field=models.CharField(choices=[('youtube_link', 'Youtube Link'), ('video_file', 'Video File'), ('audio_file', 'Audio File')], max_length=50, verbose_name='Content Type'), - ), - migrations.AlterField( - model_name='lesson', - name='video_link', - field=models.CharField(blank=True, max_length=500, null=True, verbose_name='Link'), - ), - ] diff --git a/apps/course/migrations/0006_participant_is_active.py b/apps/course/migrations/0006_participant_is_active.py deleted file mode 100644 index 6c83fd3..0000000 --- a/apps/course/migrations/0006_participant_is_active.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.2.4 on 2025-08-07 14:41 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('course', '0005_add_database_indexes'), - ] - - operations = [ - migrations.AddField( - model_name='participant', - name='is_active', - field=models.BooleanField(default=True), - ), - ] diff --git a/apps/course/migrations/0007_alter_course_thumbnail.py b/apps/course/migrations/0007_alter_course_thumbnail.py deleted file mode 100644 index b8782d3..0000000 --- a/apps/course/migrations/0007_alter_course_thumbnail.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 3.2.4 on 2025-09-16 14:50 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('course', '0006_participant_is_active'), - ] - - operations = [ - migrations.AlterField( - model_name='course', - name='thumbnail', - field=models.ImageField(default='1', upload_to='courses/thumbnails/', verbose_name='Thumbnail'), - preserve_default=False, - ), - ] diff --git a/apps/course/migrations/0007_course_online_link.py b/apps/course/migrations/0007_course_online_link.py deleted file mode 100644 index 89eb2e0..0000000 --- a/apps/course/migrations/0007_course_online_link.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.7 on 2025-02-10 10:07 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('course', '0006_auto_20250113_1337'), - ] - - operations = [ - migrations.AddField( - model_name='course', - name='online_link', - field=models.CharField(blank=True, max_length=500, null=True, verbose_name='Online Class Link'), - ), - ] diff --git a/apps/course/migrations/0008_auto_20251013_1724.py b/apps/course/migrations/0008_auto_20251013_1724.py deleted file mode 100644 index ae55647..0000000 --- a/apps/course/migrations/0008_auto_20251013_1724.py +++ /dev/null @@ -1,104 +0,0 @@ -# Generated by Django 3.2.4 on 2025-10-13 17:24 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('course', '0007_alter_course_thumbnail'), - ] - - operations = [ - migrations.CreateModel( - name='CourseLiveSession', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('subject', models.CharField(help_text='Topic of the live session.', max_length=255, verbose_name='Subject')), - ('started_at', models.DateTimeField(help_text='Start time of the live session.', verbose_name='Started At')), - ('ended_at', models.DateTimeField(blank=True, help_text='End time of the live session.', null=True, verbose_name='Ended At')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), - ('course', models.ForeignKey(help_text='Course that this live session belongs to.', on_delete=django.db.models.deletion.CASCADE, related_name='live_sessions', to='course.course', verbose_name='Course')), - ], - options={ - 'verbose_name': 'Course Live Session', - 'verbose_name_plural': 'Course Live Sessions', - 'ordering': ('-started_at', '-id'), - }, - ), - migrations.CreateModel( - name='LiveSessionUser', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('role', models.CharField(choices=[('participant', 'Participant'), ('moderator', 'Moderator'), ('observer', 'Observer')], help_text='Role of the user in the session', max_length=50, verbose_name='Role')), - ('entered_at', models.DateTimeField(help_text='Time the user entered the session', verbose_name='Entered At')), - ('exited_at', models.DateTimeField(blank=True, default=None, help_text='Time the user exited the session', null=True, verbose_name='Exited At')), - ('is_online', models.BooleanField(default=True, help_text='Is the user currently online?', verbose_name='Is online')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created At')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated At')), - ('session', models.ForeignKey(help_text='Live session that the user joined.', on_delete=django.db.models.deletion.CASCADE, related_name='user_sessions', to='course.courselivesession', verbose_name='Live Session')), - ('user', models.ForeignKey(help_text='User participating in the live session.', on_delete=django.db.models.deletion.CASCADE, related_name='live_session_entries', to=settings.AUTH_USER_MODEL, verbose_name='User')), - ], - options={ - 'verbose_name': 'User Session', - 'verbose_name_plural': 'User Sessions', - 'ordering': ('-entered_at', '-id'), - }, - ), - migrations.CreateModel( - name='LiveSessionRecording', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(help_text='Title of the recording', max_length=255, verbose_name='Title')), - ('file', models.FileField(help_text='File of the recorded session', upload_to='recorded_sessions/', verbose_name='Recording File')), - ('file_time', models.DurationField(blank=True, help_text='Duration of the recording file', null=True, verbose_name='File Duration')), - ('recording_type', models.CharField(choices=[('voice', 'Voice'), ('video', 'Video')], help_text='Type of the recording (voice or video)', max_length=10, verbose_name='Recording Type')), - ('thumbnail', models.ImageField(blank=True, help_text='Thumbnail image for video recordings', null=True, upload_to='recording_thumbnails/', verbose_name='Thumbnail')), - ('created_at', models.DateTimeField(auto_now_add=True, help_text='Time the recording was created', verbose_name='Created At')), - ('updated_at', models.DateTimeField(auto_now=True, help_text='The datetime when the recording was last updated', verbose_name='Updated At')), - ('is_active', models.BooleanField(default=True, help_text='Whether this recording is active or not', verbose_name='Is Active')), - ('session', models.ForeignKey(help_text='Live session that this recording belongs to.', on_delete=django.db.models.deletion.CASCADE, related_name='recordings', to='course.courselivesession', verbose_name='Live Session')), - ], - options={ - 'verbose_name': 'Live Session Recording', - 'verbose_name_plural': 'Live Session Recordings', - 'ordering': ('-created_at', '-id'), - }, - ), - migrations.AddIndex( - model_name='livesessionuser', - index=models.Index(fields=['session', 'user'], name='course_live_session_b1eaa5_idx'), - ), - migrations.AddIndex( - model_name='livesessionuser', - index=models.Index(fields=['session', 'is_online'], name='course_live_session_5ef9bc_idx'), - ), - migrations.AddIndex( - model_name='livesessionuser', - index=models.Index(fields=['user', 'is_online'], name='course_live_user_id_384830_idx'), - ), - migrations.AlterUniqueTogether( - name='livesessionuser', - unique_together={('session', 'user', 'entered_at')}, - ), - migrations.AddIndex( - model_name='livesessionrecording', - index=models.Index(fields=['session', 'is_active'], name='course_live_session_f35db0_idx'), - ), - migrations.AddIndex( - model_name='livesessionrecording', - index=models.Index(fields=['session', 'recording_type'], name='course_live_session_84b2bf_idx'), - ), - migrations.AddIndex( - model_name='courselivesession', - index=models.Index(fields=['course', 'started_at'], name='course_cour_course__b8968b_idx'), - ), - migrations.AddIndex( - model_name='courselivesession', - index=models.Index(fields=['course', 'created_at'], name='course_cour_course__142085_idx'), - ), - ] diff --git a/apps/course/migrations/0009_auto_20251014_0051.py b/apps/course/migrations/0009_auto_20251014_0051.py deleted file mode 100644 index 3407766..0000000 --- a/apps/course/migrations/0009_auto_20251014_0051.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 3.2.4 on 2025-10-14 00:51 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('course', '0008_auto_20251013_1724'), - ] - - operations = [ - migrations.AddField( - model_name='courselivesession', - name='room_id', - field=models.CharField(blank=True, help_text='Identifier of the PlugNMeet room.', max_length=255, null=True, unique=True, verbose_name='Room ID'), - ), - migrations.AddIndex( - model_name='courselivesession', - index=models.Index(fields=['room_id'], name='course_cour_room_id_ed0222_idx'), - ), - ] diff --git a/apps/course/migrations/0010_courselivesession_recorded_file.py b/apps/course/migrations/0010_courselivesession_recorded_file.py deleted file mode 100644 index be623b1..0000000 --- a/apps/course/migrations/0010_courselivesession_recorded_file.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2025-10-18 12:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('course', '0009_auto_20251014_0051'), - ] - - operations = [ - migrations.AddField( - model_name='courselivesession', - name='recorded_file', - field=models.FileField(blank=True, help_text='Recorded file of the live session.', null=True, upload_to='live_session_recordings/', verbose_name='Recorded File'), - ), - ] diff --git a/apps/course/migrations/0011_merge_20260104_1114.py b/apps/course/migrations/0011_merge_20260104_1114.py deleted file mode 100644 index 565757f..0000000 --- a/apps/course/migrations/0011_merge_20260104_1114.py +++ /dev/null @@ -1,12 +0,0 @@ -# Generated by Django 4.2.27 on 2026-01-04 11:14 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("course", "0007_course_online_link"), - ("course", "0010_courselivesession_recorded_file"), - ] - - operations = [] diff --git a/apps/dobodbi_calendar/migrations/0001_initial.py b/apps/dobodbi_calendar/migrations/0001_initial.py index 197753b..2917730 100644 --- a/apps/dobodbi_calendar/migrations/0001_initial.py +++ b/apps/dobodbi_calendar/migrations/0001_initial.py @@ -1,31 +1,78 @@ -# Generated by Django 5.1.8 on 2025-05-04 08:31 +# Generated by Django 4.2.27 on 2026-01-22 10:48 from django.db import migrations, models class Migration(migrations.Migration): - initial = True - dependencies = [ - ] + dependencies = [] operations = [ migrations.CreateModel( - name='CalendarOccasions', + name="CalendarOccasions", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('is_global', models.BooleanField(default=False, help_text='check this field if event is global', verbose_name='is global')), - ('occasion_type', models.CharField(choices=[('georgian', 'georgian'), ('lunar', 'lunar')], default='georgian', help_text='Choose between georgian or lunar. default to georgian', max_length=12, verbose_name='occasion type')), - ('dates', models.JSONField(verbose_name='dates')), - ('is_yearly', models.BooleanField(default=True, help_text='check this field if event is annually', verbose_name='is yearly')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('event_type', models.CharField(choices=[('national', 'National'), ('international', 'International'), ('religious', 'Religious')], max_length=16, null=True, verbose_name='event type')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255, verbose_name="title")), + ( + "is_global", + models.BooleanField( + default=False, + help_text="check this field if event is global", + verbose_name="is global", + ), + ), + ( + "occasion_type", + models.CharField( + choices=[("georgian", "georgian"), ("lunar", "lunar")], + default="georgian", + help_text="Choose between georgian or lunar. default to georgian", + max_length=12, + verbose_name="occasion type", + ), + ), + ("dates", models.JSONField(verbose_name="dates")), + ( + "is_yearly", + models.BooleanField( + default=True, + help_text="check this field if event is annually", + verbose_name="is yearly", + ), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "event_type", + models.CharField( + choices=[ + ("national", "National"), + ("international", "International"), + ("religious", "Religious"), + ], + max_length=16, + null=True, + verbose_name="event type", + ), + ), ], options={ - 'ordering': ('-updated_at',), + "ordering": ("-updated_at",), }, ), ] diff --git a/apps/hadis/migrations/0001_initial.py b/apps/hadis/migrations/0001_initial.py index 6f16586..cb67312 100644 --- a/apps/hadis/migrations/0001_initial.py +++ b/apps/hadis/migrations/0001_initial.py @@ -1,141 +1,1254 @@ -# Generated by Django 5.1.8 on 2025-04-03 00:05 +# Generated by Django 4.2.27 on 2026-01-22 10:48 +from django.conf import settings +from django.db import migrations, models import django.db.models.deletion import filer.fields.image import mptt.fields -from django.conf import settings -from django.db import migrations, models class Migration(migrations.Migration): - initial = True dependencies = [ - ('library', '0001_initial'), migrations.swappable_dependency(settings.FILER_IMAGE_MODEL), ] operations = [ migrations.CreateModel( - name='HadisTag', + name="BookAttribute", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.JSONField(default=list, verbose_name="Title")), + ("value", models.JSONField(default=list, verbose_name="Value")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ], + options={ + "verbose_name": "Book Attribute", + "verbose_name_plural": "Book Attributes", + "ordering": ["title"], + }, + ), + migrations.CreateModel( + name="BookAuthor", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.JSONField(default=list, verbose_name="Name")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ], + options={ + "verbose_name": "Book Author", + "verbose_name_plural": "Book Authors", + "ordering": ["name"], + }, + ), + migrations.CreateModel( + name="BookReference", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.JSONField(default=list, verbose_name="Title")), + ( + "description", + models.JSONField(default=list, verbose_name="Description"), + ), + ("language", models.JSONField(default=list, verbose_name="Language")), + ( + "isbn", + models.CharField( + blank=True, max_length=100, null=True, verbose_name="ISBN" + ), + ), + ( + "volume", + models.CharField( + blank=True, max_length=100, null=True, verbose_name="volume" + ), + ), + ( + "year_of_publication", + models.CharField( + blank=True, + max_length=50, + null=True, + verbose_name="year of publication", + ), + ), + ( + "number_page", + models.PositiveIntegerField( + blank=True, null=True, verbose_name="number of pages" + ), + ), + ( + "slug", + models.SlugField( + blank=True, max_length=255, unique=True, verbose_name="slug" + ), + ), + ("publisher", models.JSONField(default=list, verbose_name="Publisher")), + ( + "rate", + models.DecimalField( + blank=True, + decimal_places=2, + help_text="Rating from 0 to 5", + max_digits=3, + null=True, + verbose_name="rate", + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ], + options={ + "verbose_name": "Book Reference", + "verbose_name_plural": "Book References", + "ordering": ("-created_at",), + }, + ), + migrations.CreateModel( + name="ContentRelease", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "version_name", + models.CharField(max_length=50, verbose_name="Version Name"), + ), + ( + "published_at", + models.DateTimeField( + auto_now_add=True, verbose_name="Published Date" + ), + ), + ( + "description", + models.TextField(blank=True, verbose_name="Release Description"), + ), + ("is_active", models.BooleanField(default=True, verbose_name="Active")), + ], + options={ + "ordering": ["-published_at"], + }, + ), + migrations.CreateModel( + name="Hadis", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "number", + models.PositiveIntegerField(default=1, verbose_name="number"), + ), + ( + "slug", + models.SlugField( + blank=True, max_length=255, unique=True, verbose_name="slug" + ), + ), + ( + "title_narrator", + models.JSONField(default=list, verbose_name="Title Narrator"), + ), + ("title", models.JSONField(default=list, verbose_name="Title")), + ( + "description", + models.JSONField(default=list, verbose_name="Description"), + ), + ("text", models.TextField(verbose_name="text")), + ( + "translation", + models.JSONField(default=list, verbose_name="translation"), + ), + ( + "status", + models.BooleanField(default=True, verbose_name="visibility"), + ), + ( + "hadis_status_text", + models.JSONField(default=list, verbose_name="Status text"), + ), + ("address", models.JSONField(default=list, verbose_name="Address")), + ( + "links", + models.JSONField( + blank=True, default=dict, null=True, verbose_name="links" + ), + ), + ( + "share_link", + models.CharField( + blank=True, max_length=255, null=True, verbose_name="share link" + ), + ), + ( + "explanation", + models.JSONField(default=list, verbose_name="Explanation"), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ], + options={ + "verbose_name": "hadis", + "verbose_name_plural": "hadises", + "ordering": ("category", "number"), + }, + ), + migrations.CreateModel( + name="HadisCollection", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=355, verbose_name='title')), - ('status', models.BooleanField(default=True, verbose_name='status')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.JSONField(default=list, verbose_name="Title")), + ( + "slug", + models.SlugField( + blank=True, max_length=255, unique=True, verbose_name="slug" + ), + ), + ("summary", models.JSONField(default=list, verbose_name="Summary")), + ("status", models.BooleanField(default=True, verbose_name="status")), + ("order", models.IntegerField(default=0, verbose_name="order")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "thumbnail", + filer.fields.image.FilerImageField( + blank=True, + help_text="thumbnail image", + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to=settings.FILER_IMAGE_MODEL, + verbose_name="thumbnail", + ), + ), ], + options={ + "verbose_name": "hadis collection", + "verbose_name_plural": "hadis collections", + "ordering": ("order",), + }, + ), + migrations.CreateModel( + name="HadisReference", + 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="created at"), + ), + ( + "description", + models.JSONField(default=list, verbose_name="Description"), + ), + ( + "book_reference", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="hadis_references", + to="hadis.bookreference", + verbose_name="book reference", + ), + ), + ( + "hadis", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="references", + to="hadis.hadis", + verbose_name="hadis", + ), + ), + ], + options={ + "verbose_name": "Hadis Reference", + "verbose_name_plural": "Hadis References", + }, ), migrations.CreateModel( - name='HadisCategory', + name="HadisSect", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_active', models.BooleanField(default=True, verbose_name='is active')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('source_type', models.CharField(blank=True, choices=[('shia', 'Shia'), ('sunni', 'Sunni')], default='shia', max_length=10, verbose_name='Source Type')), - ('category_type', models.CharField(blank=True, choices=[('quran', 'Quran'), ('hadith', 'Hadith')], max_length=10, null=True, verbose_name='Category Content Type')), - ('name', models.CharField(max_length=355, verbose_name='name')), - ('order', models.IntegerField(default=0, verbose_name='order')), - ('lft', models.PositiveIntegerField(editable=False)), - ('rght', models.PositiveIntegerField(editable=False)), - ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), - ('level', models.PositiveIntegerField(editable=False)), - ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='hadis.hadiscategory')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "sect_type", + models.CharField( + choices=[("shia", "Shia"), ("sunni", "Sunni")], + max_length=10, + unique=True, + verbose_name="Sect Name", + ), + ), + ("title", models.JSONField(default=list, verbose_name="Title")), + ( + "description", + models.JSONField(default=list, verbose_name="Description"), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("order", models.IntegerField(default=0, verbose_name="order")), ], options={ - 'verbose_name': 'Hadis Category', - 'verbose_name_plural': 'Hadis Categories', - 'ordering': ('order',), + "verbose_name": "Hadis Sect", + "verbose_name_plural": "Hadis Sects", + "ordering": ("order",), }, ), migrations.CreateModel( - name='Hadis', + name="HadisStatus", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('number', models.PositiveIntegerField(unique=True, verbose_name='number')), - ('title', models.CharField(max_length=355, verbose_name='title')), - ('text', models.TextField(verbose_name='text')), - ('translation', models.TextField(blank=True, default='', verbose_name='translation')), - ('status', models.BooleanField(default=True, verbose_name='visibility')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('category', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='hadis.hadiscategory', verbose_name='category')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.JSONField(default=list, verbose_name="Title")), + ( + "slug", + models.SlugField( + blank=True, max_length=255, unique=True, verbose_name="slug" + ), + ), + ( + "color", + models.CharField( + choices=[ + ("red", "Red"), + ("green", "Green"), + ("blue", "Blue"), + ("yellow", "Yellow"), + ("orange", "Orange"), + ("purple", "Purple"), + ("gray", "Gray"), + ], + max_length=20, + verbose_name="color", + ), + ), + ("order", models.IntegerField(default=0, verbose_name="order")), ], options={ - 'verbose_name': 'hadis', - 'verbose_name_plural': 'hadises', + "verbose_name": "hadis status", + "verbose_name_plural": "hadis statuses", + "ordering": ("order",), }, ), migrations.CreateModel( - name='HadisReference', + name="HadisTag", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('description', models.TextField(blank=True, null=True, verbose_name='description')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('book', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hadis_references', to='library.book', verbose_name='book')), - ('hadis', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='references', to='hadis.hadis', verbose_name='hadis')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.JSONField(default=list, verbose_name="Title")), + ("status", models.BooleanField(default=True, verbose_name="status")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ], + ), + migrations.CreateModel( + name="NarratorLayer", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.JSONField(default=list, verbose_name="Name")), + ( + "number", + models.PositiveIntegerField( + unique=True, verbose_name="layer number" + ), + ), + ( + "description", + models.JSONField(default=list, verbose_name="Description"), + ), + ( + "slug", + models.SlugField( + blank=True, max_length=255, unique=True, verbose_name="slug" + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), ], options={ - 'verbose_name': 'Hadis Reference', - 'verbose_name_plural': 'Hadis References', - 'unique_together': {('hadis', 'book')}, + "verbose_name": "Narrator Layer", + "verbose_name_plural": "Narrator Layers", + "ordering": ["number"], }, ), migrations.CreateModel( - name='ReferenceImage', + name="OpinionStatus", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('priority', models.IntegerField(default=0, help_text='Priority of the image, lower values mean higher priority.', verbose_name='Priority')), - ('reference', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='hadis.hadisreference', verbose_name='Hadis Reference')), - ('thumbnail', filer.fields.image.FilerImageField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.FILER_IMAGE_MODEL, verbose_name='thumbnail')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.JSONField(default=list, verbose_name="Title")), + ( + "slug", + models.SlugField( + blank=True, max_length=255, null=True, verbose_name="slug" + ), + ), + ( + "color", + models.CharField( + choices=[ + ("red", "Red"), + ("green", "Green"), + ("blue", "Blue"), + ("yellow", "Yellow"), + ("orange", "Orange"), + ("purple", "Purple"), + ("gray", "Gray"), + ], + max_length=20, + verbose_name="color", + ), + ), ], options={ - 'verbose_name': 'Reference Image', - 'verbose_name_plural': 'Reference Images', + "verbose_name": "Opinion Status", + "verbose_name_plural": "Opinion Statuses", }, ), migrations.CreateModel( - name='Transmitters', + name="TransmitterReliability", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('full_name', models.CharField(max_length=255)), - ('birth_year_hijri', models.IntegerField(verbose_name='Birth Year (Hijri)')), - ('death_year_hijri', models.IntegerField(verbose_name='Death Year (Hijri)')), - ('description', models.TextField(blank=True, null=True, verbose_name='Description')), - ('status', models.CharField(max_length=50, verbose_name='status')), - ('status_color', models.CharField(max_length=25, verbose_name='Display Status Color')), - ('thumbnail', filer.fields.image.FilerImageField(blank=True, help_text='image allowed', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.FILER_IMAGE_MODEL)), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.JSONField(default=list, verbose_name="Title")), + ( + "slug", + models.SlugField( + blank=True, max_length=255, null=True, verbose_name="slug" + ), + ), + ( + "color", + models.CharField( + choices=[ + ("red", "Red"), + ("green", "Green"), + ("blue", "Blue"), + ("yellow", "Yellow"), + ("orange", "Orange"), + ("purple", "Purple"), + ("gray", "Gray"), + ], + max_length=20, + verbose_name="color", + ), + ), ], + options={ + "verbose_name": "Transmitter Reliability", + "verbose_name_plural": "Transmitter Reliabilities", + }, ), migrations.CreateModel( - name='HadisOverview', + name="Transmitters", fields=[ - ('hadis', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='hadis.hadis')), - ('status', models.CharField(max_length=50, verbose_name='status')), - ('status_color', models.CharField(max_length=25, verbose_name='Display Status Color')), - ('status_text', models.TextField(blank=True, null=True, verbose_name='Status Text')), - ('address', models.TextField(blank=True, null=True, verbose_name='address')), - ('links', models.JSONField(blank=True, default=dict, null=True, verbose_name='title')), - ('share_link', models.CharField(blank=True, max_length=255, null=True, verbose_name='share link')), - ('explanation', models.TextField(blank=True, null=True, verbose_name='explanation')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('tags', models.ManyToManyField(blank=True, related_name='hadises', to='hadis.hadistag', verbose_name='tags')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("full_name", models.JSONField(default=list, verbose_name="Full Name")), + ("kunya", models.JSONField(default=list, verbose_name="Kunya")), + ("known_as", models.JSONField(default=list, verbose_name="Known as")), + ("nickname", models.JSONField(default=list, verbose_name="Nick Name")), + ( + "slug", + models.SlugField( + blank=True, max_length=255, unique=True, verbose_name="slug" + ), + ), + ("origin", models.JSONField(default=list, verbose_name="Origin")), + ("lived_in", models.JSONField(default=list, verbose_name="Lived in")), + ("died_in", models.JSONField(default=list, verbose_name="Died in")), + ( + "birth_year_hijri", + models.IntegerField( + blank=True, null=True, verbose_name="Birth Year (Hijri)" + ), + ), + ( + "death_year_hijri", + models.IntegerField( + blank=True, null=True, verbose_name="Death Year (Hijri)" + ), + ), + ( + "age_at_death", + models.PositiveIntegerField( + blank=True, null=True, verbose_name="Age at Death" + ), + ), + ( + "generation", + models.PositiveIntegerField( + blank=True, null=True, verbose_name="Generation" + ), + ), + ( + "madhhab", + models.CharField( + choices=[ + ("shia", "Shia"), + ("sunni", "Sunni"), + ("other", "Other"), + ("unknown", "Unknown"), + ], + default="unknown", + max_length=20, + verbose_name="Madhhab/School of Thought", + ), + ), + ( + "in_sahih_muslim", + models.BooleanField( + default=False, + help_text="Is this narrator present in Sahih Muslim?", + verbose_name="In Sahih Muslim", + ), + ), + ( + "in_sahih_bukhari", + models.BooleanField( + default=False, + help_text="Is this narrator present in Sahih Bukhari?", + verbose_name="In Sahih Bukhari", + ), + ), + ( + "description", + models.JSONField(default=list, verbose_name="Description"), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "reliability", + models.ForeignKey( + default=12, + on_delete=django.db.models.deletion.CASCADE, + related_name="transmitters", + to="hadis.transmitterreliability", + verbose_name="reliability", + ), + ), + ( + "thumbnail", + filer.fields.image.FilerImageField( + blank=True, + help_text="image allowed", + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="+", + to=settings.FILER_IMAGE_MODEL, + ), + ), ], + options={ + "verbose_name": "Transmitter", + "verbose_name_plural": "Transmitters", + "ordering": ("full_name",), + }, ), migrations.CreateModel( - name='HadisTransmitter', + name="TransmitterOriginalText", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('description', models.TextField(blank=True, null=True, verbose_name='description')), - ('order', models.PositiveIntegerField(default=0, help_text='Order in the chain of transmission', verbose_name='Order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('hadis', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transmitters', to='hadis.hadis', verbose_name='hadis')), - ('transmitter', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hadises', to='hadis.transmitters', verbose_name='transmitter')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "slug", + models.SlugField( + blank=True, max_length=255, unique=True, verbose_name="slug" + ), + ), + ("title", models.JSONField(default=list, verbose_name="Title")), + ("text", models.JSONField(default=list, verbose_name="Text")), + ( + "translation", + models.JSONField(default=list, verbose_name="translation"), + ), + ( + "share_link", + models.CharField( + blank=True, max_length=255, null=True, verbose_name="share link" + ), + ), + ( + "transmitter", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="originaltexts", + to="hadis.transmitters", + verbose_name="transmitter", + ), + ), ], options={ - 'verbose_name': 'Hadis Transmitter', - 'verbose_name_plural': 'Hadis Transmitters', - 'ordering': ('hadis', 'order'), - 'unique_together': {('hadis', 'transmitter', 'order')}, + "verbose_name": "Transmitter Original Text", + "verbose_name_plural": "Transmitter Original Text", }, ), - ] \ No newline at end of file + migrations.CreateModel( + name="TransmitterOpinion", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "scholar_name", + models.JSONField(default=list, verbose_name="Scholar Name"), + ), + ( + "opinion_text", + models.JSONField(default=list, verbose_name="Opinion Text"), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "status", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="opinions", + to="hadis.opinionstatus", + verbose_name="opinion status", + ), + ), + ( + "transmitter", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="opinions", + to="hadis.transmitters", + verbose_name="transmitter", + ), + ), + ], + options={ + "verbose_name": "Transmitter Opinion", + "verbose_name_plural": "Transmitter Opinions", + "ordering": ("-created_at",), + }, + ), + migrations.CreateModel( + name="ReferenceImage", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "thumbnail", + models.ImageField( + blank=True, + null=True, + upload_to="hadis/reference_images/", + verbose_name="thumbnail", + ), + ), + ( + "priority", + models.IntegerField( + default=0, + help_text="Priority of the image, lower values mean higher priority.", + verbose_name="Priority", + ), + ), + ( + "reference", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="images", + to="hadis.hadisreference", + verbose_name="Hadis Reference", + ), + ), + ], + options={ + "verbose_name": "Reference Image", + "verbose_name_plural": "Reference Images", + }, + ), + migrations.CreateModel( + name="HadisTransmitter", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "order", + models.PositiveIntegerField( + default=0, + help_text="Order in the chain of transmission", + verbose_name="Order", + ), + ), + ("is_gap", models.BooleanField(default=False, verbose_name="is gap")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "hadis", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="transmitters", + to="hadis.hadis", + verbose_name="hadis", + ), + ), + ( + "narrator_layer", + models.ForeignKey( + blank=True, + help_text="The layer/class (Tabaqah) this narrator belongs to", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="transmitters", + to="hadis.narratorlayer", + verbose_name="narrator layer", + ), + ), + ( + "status", + models.ForeignKey( + blank=True, + help_text="Reliability status of the narrator", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="hadis_transmitters", + to="hadis.transmitterreliability", + verbose_name="reliability status", + ), + ), + ( + "transmitter", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="hadises", + to="hadis.transmitters", + verbose_name="transmitter", + ), + ), + ], + options={ + "verbose_name": "Hadis Transmitter", + "verbose_name_plural": "Hadis Transmitters", + "ordering": ("hadis", "order"), + }, + ), + migrations.CreateModel( + name="HadisInCollection", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("order", models.IntegerField(default=0, verbose_name="order")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "collection", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="hadis_items", + to="hadis.hadiscollection", + verbose_name="collection", + ), + ), + ( + "hadis", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="collection_items", + to="hadis.hadis", + verbose_name="hadis", + ), + ), + ], + options={ + "verbose_name": "hadis in collection", + "verbose_name_plural": "hadis in collections", + "ordering": ("order",), + }, + ), + migrations.CreateModel( + name="HadisCorrection", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.JSONField(default=list, verbose_name="Title")), + ( + "slug", + models.SlugField( + blank=True, max_length=255, unique=True, verbose_name="slug" + ), + ), + ( + "description", + models.JSONField(default=list, verbose_name="Description"), + ), + ( + "translation", + models.JSONField(default=list, verbose_name="translation"), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "share_link", + models.CharField( + blank=True, max_length=255, null=True, verbose_name="share link" + ), + ), + ( + "hadis", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="hadis.hadis", + verbose_name="hadis correction", + ), + ), + ], + options={ + "verbose_name": "Hadis Correction", + "verbose_name_plural": "Hadis Corrections", + "ordering": ("-created_at",), + }, + ), + migrations.CreateModel( + name="HadisCategory", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "source_type", + models.CharField( + choices=[ + ("quran", "Quran"), + ("hadith", "Hadith"), + ("history", "History"), + ("fatwa", "Fatwa"), + ("quote", "Quote"), + ], + max_length=10, + verbose_name="Source Type", + ), + ), + ("title", models.JSONField(default=list, verbose_name="Title")), + ( + "description", + models.JSONField(default=list, verbose_name="Description"), + ), + ("order", models.IntegerField(default=0, verbose_name="order")), + ( + "xmind_file", + models.FileField( + blank=True, + null=True, + upload_to="hadis/xmind_files/", + verbose_name="xmind file", + ), + ), + ("slug", models.SlugField(blank=True, max_length=255, null=True)), + ("lft", models.PositiveIntegerField(editable=False)), + ("rght", models.PositiveIntegerField(editable=False)), + ("tree_id", models.PositiveIntegerField(db_index=True, editable=False)), + ("level", models.PositiveIntegerField(editable=False)), + ( + "parent", + mptt.fields.TreeForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="children", + to="hadis.hadiscategory", + ), + ), + ( + "sect", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="hadis.hadissect", + verbose_name="Sect", + ), + ), + ], + options={ + "verbose_name": "Hadis Category", + "verbose_name_plural": "Hadis Categories", + "ordering": ("order",), + }, + ), + migrations.AddField( + model_name="hadis", + name="category", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="hadis.hadiscategory", + verbose_name="category", + ), + ), + migrations.AddField( + model_name="hadis", + name="hadis_status", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="hadis.hadisstatus", + verbose_name="hadis status", + ), + ), + migrations.AddField( + model_name="hadis", + name="tags", + field=models.ManyToManyField( + blank=True, + related_name="hadis_overview", + to="hadis.hadistag", + verbose_name="tags", + ), + ), + migrations.CreateModel( + name="BookReferenceImage", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "image", + models.ImageField( + upload_to="hadis/book_reference_images/", verbose_name="image" + ), + ), + ("order", models.PositiveIntegerField(default=0, verbose_name="order")), + ( + "description", + models.JSONField(default=list, verbose_name="Description"), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "book_reference", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="images", + to="hadis.bookreference", + verbose_name="book reference", + ), + ), + ], + options={ + "verbose_name": "Book Reference Image", + "verbose_name_plural": "Book Reference Images", + "ordering": ["order", "-created_at"], + }, + ), + migrations.AddIndex( + model_name="bookreference", + index=models.Index(fields=["id"], name="hadis_bookr_id_1b53f6_idx"), + ), + migrations.AddField( + model_name="bookauthor", + name="book_references", + field=models.ManyToManyField( + blank=True, + related_name="authors", + to="hadis.bookreference", + verbose_name="book references", + ), + ), + migrations.AddField( + model_name="bookattribute", + name="book_reference", + field=models.ForeignKey( + default=None, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="attributes", + to="hadis.bookreference", + verbose_name="book attribute", + ), + ), + migrations.AddIndex( + model_name="transmitters", + index=models.Index(fields=["id"], name="hadis_trans_id_bd318c_idx"), + ), + migrations.AddIndex( + model_name="transmitteroriginaltext", + index=models.Index( + fields=["transmitter"], name="hadis_trans_transmi_fff93f_idx" + ), + ), + migrations.AddIndex( + model_name="transmitteropinion", + index=models.Index( + fields=["transmitter"], name="hadis_trans_transmi_0f1df2_idx" + ), + ), + migrations.AddIndex( + model_name="referenceimage", + index=models.Index( + fields=["reference", "priority"], name="hadis_refer_referen_a37840_idx" + ), + ), + migrations.AddIndex( + model_name="hadistransmitter", + index=models.Index( + fields=["hadis", "order"], name="hadis_hadis_hadis_i_d04e3a_idx" + ), + ), + migrations.AlterUniqueTogether( + name="hadistransmitter", + unique_together={("hadis", "transmitter", "order")}, + ), + migrations.AddIndex( + model_name="hadisreference", + index=models.Index( + fields=["book_reference"], name="hadis_hadis_book_re_3fb4f0_idx" + ), + ), + migrations.AlterUniqueTogether( + name="hadisincollection", + unique_together={("hadis", "collection")}, + ), + migrations.AddIndex( + model_name="hadiscategory", + index=models.Index( + fields=["parent", "sect"], name="hadis_hadis_parent__e7a217_idx" + ), + ), + migrations.AddIndex( + model_name="hadiscategory", + index=models.Index( + fields=["sect", "order"], name="hadis_hadis_sect_id_b57c1d_idx" + ), + ), + migrations.AddIndex( + model_name="hadis", + index=models.Index( + fields=["status", "id"], name="hadis_hadis_status_5e0de5_idx" + ), + ), + ] diff --git a/apps/hadis/migrations/0002_auto_20250317_0055.py b/apps/hadis/migrations/0002_auto_20250317_0055.py deleted file mode 100644 index 819cede..0000000 --- a/apps/hadis/migrations/0002_auto_20250317_0055.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 3.2.7 on 2025-03-17 00:55 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('hadis', '0001_initial'), - ] - - operations = [ - migrations.RemoveField( - model_name='hadiscategory', - name='name', - ), - migrations.AlterField( - model_name='hadiscategory', - name='source_type', - field=models.CharField(blank=True, choices=[('shia', 'Shia'), ('sunni', 'Sunni')], default='shia', max_length=10, verbose_name='Source Type'), - ), - ] diff --git a/apps/hadis/migrations/0002_bookauthor_birth_year_hijri_and_more.py b/apps/hadis/migrations/0002_bookauthor_birth_year_hijri_and_more.py new file mode 100644 index 0000000..308907b --- /dev/null +++ b/apps/hadis/migrations/0002_bookauthor_birth_year_hijri_and_more.py @@ -0,0 +1,40 @@ +# Generated by Django 4.2.27 on 2026-01-22 10:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("hadis", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="bookauthor", + name="birth_year_hijri", + field=models.IntegerField( + blank=True, null=True, verbose_name="Birth Year (Hijri)" + ), + ), + migrations.AddField( + model_name="bookauthor", + name="birth_year_miladi", + field=models.IntegerField( + blank=True, null=True, verbose_name="Birth Year (Miladi)" + ), + ), + migrations.AddField( + model_name="bookauthor", + name="death_year_hijri", + field=models.IntegerField( + blank=True, null=True, verbose_name="Death Year (Hijri)" + ), + ), + migrations.AddField( + model_name="bookauthor", + name="death_year_miladi", + field=models.IntegerField( + blank=True, null=True, verbose_name="Death Year (Miladi)" + ), + ), + ] diff --git a/apps/hadis/migrations/0002_hadissect_hadisstatus_alter_hadis_options_and_more.py b/apps/hadis/migrations/0002_hadissect_hadisstatus_alter_hadis_options_and_more.py deleted file mode 100644 index 77bc3f2..0000000 --- a/apps/hadis/migrations/0002_hadissect_hadisstatus_alter_hadis_options_and_more.py +++ /dev/null @@ -1,217 +0,0 @@ -# Generated by Django 5.1.8 on 2025-07-04 11:34 - -import django.db.models.deletion -import django.utils.timezone -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('hadis', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='HadisSect', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('sect_type', models.CharField(choices=[('shia', 'Shia'), ('sunni', 'Sunni')], max_length=10, unique=True, verbose_name='Sect Name')), - ('title', models.CharField(max_length=256, verbose_name='Name')), - ('is_active', models.BooleanField(default=True, verbose_name='Is Active')), - ('order', models.IntegerField(default=0, verbose_name='order')), - ], - options={ - 'verbose_name': 'Hadis Sect', - 'verbose_name_plural': 'Hadis Sects', - 'ordering': ('order',), - }, - ), - migrations.CreateModel( - name='HadisStatus', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=119, verbose_name='title')), - ('color', models.CharField(choices=[('red', 'Red'), ('green', 'Green'), ('blue', 'Blue'), ('yellow', 'Yellow'), ('orange', 'Orange'), ('purple', 'Purple'), ('gray', 'Gray')], max_length=20, verbose_name='color')), - ('order', models.IntegerField(default=0, verbose_name='order')), - ], - options={ - 'verbose_name': 'hadis status', - 'verbose_name_plural': 'hadis statuses', - 'ordering': ('order',), - }, - ), - migrations.AlterModelOptions( - name='hadis', - options={'ordering': ('category', 'number'), 'verbose_name': 'hadis', 'verbose_name_plural': 'hadises'}, - ), - migrations.AlterModelOptions( - name='transmitters', - options={'ordering': ('full_name',), 'verbose_name': 'Transmitter', 'verbose_name_plural': 'Transmitters'}, - ), - migrations.RemoveField( - model_name='hadiscategory', - name='category_type', - ), - migrations.RemoveField( - model_name='hadiscategory', - name='created_at', - ), - migrations.RemoveField( - model_name='hadiscategory', - name='is_active', - ), - migrations.RemoveField( - model_name='hadiscategory', - name='name', - ), - migrations.RemoveField( - model_name='hadistransmitter', - name='description', - ), - migrations.RemoveField( - model_name='transmitters', - name='status', - ), - migrations.RemoveField( - model_name='transmitters', - name='status_color', - ), - migrations.AddField( - model_name='hadis', - name='address', - field=models.TextField(blank=True, null=True, verbose_name='address'), - ), - migrations.AddField( - model_name='hadis', - name='explanation', - field=models.TextField(blank=True, null=True, verbose_name='explanation'), - ), - migrations.AddField( - model_name='hadis', - name='hadis_status_text', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='hadis status text'), - ), - migrations.AddField( - model_name='hadis', - name='links', - field=models.JSONField(blank=True, default=dict, null=True, verbose_name='links'), - ), - migrations.AddField( - model_name='hadis', - name='share_link', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='share link'), - ), - migrations.AddField( - model_name='hadis', - name='tags', - field=models.ManyToManyField(blank=True, related_name='hadis_overview', to='hadis.hadistag', verbose_name='tags'), - ), - migrations.AddField( - model_name='hadiscategory', - name='title', - field=models.CharField(default='Default Category', max_length=256, verbose_name='Title'), - preserve_default=False, - ), - migrations.AddField( - model_name='hadiscategory', - name='xmind_file', - field=models.FileField(blank=True, null=True, upload_to='hadis/xmind_files/', verbose_name='xmind file'), - ), - migrations.AddField( - model_name='hadistag', - name='created_at', - field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created at'), - preserve_default=False, - ), - migrations.AddField( - model_name='hadistag', - name='updated_at', - field=models.DateTimeField(auto_now=True, verbose_name='updated at'), - ), - migrations.AddField( - model_name='hadistransmitter', - name='is_gap', - field=models.BooleanField(default=False, help_text='Check this if this represents a gap in the transmission chain', verbose_name='Is Gap'), - ), - migrations.AddField( - model_name='transmitters', - name='created_at', - field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now, verbose_name='created at'), - preserve_default=False, - ), - migrations.AddField( - model_name='transmitters', - name='updated_at', - field=models.DateTimeField(auto_now=True, verbose_name='updated at'), - ), - migrations.AlterField( - model_name='hadis', - name='category', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='hadis.hadiscategory', verbose_name='category'), - ), - migrations.AlterField( - model_name='hadis', - name='number', - field=models.PositiveIntegerField(default=1, verbose_name='number'), - ), - migrations.AlterField( - model_name='hadis', - name='title', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='hadis', - name='translation', - field=models.JSONField(default=list, verbose_name='translation'), - ), - migrations.AlterField( - model_name='hadiscategory', - name='source_type', - field=models.CharField(choices=[('quran', 'Quran'), ('hadith', 'Hadith')], max_length=10, verbose_name='Source Type'), - ), - migrations.AlterField( - model_name='hadistransmitter', - name='transmitter', - field=models.ForeignKey(blank=True, help_text='Leave empty if this represents a gap in the chain', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='hadises', to='hadis.transmitters', verbose_name='transmitter'), - ), - migrations.AlterField( - model_name='referenceimage', - name='thumbnail', - field=models.ImageField(blank=True, null=True, upload_to='hadis/reference_images/', verbose_name='thumbnail'), - ), - migrations.AlterField( - model_name='transmitters', - name='birth_year_hijri', - field=models.IntegerField(blank=True, null=True, verbose_name='Birth Year (Hijri)'), - ), - migrations.AlterField( - model_name='transmitters', - name='death_year_hijri', - field=models.IntegerField(blank=True, null=True, verbose_name='Death Year (Hijri)'), - ), - migrations.AlterField( - model_name='transmitters', - name='full_name', - field=models.CharField(max_length=255, verbose_name='full name'), - ), - migrations.AddField( - model_name='hadiscategory', - name='sect', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.PROTECT, to='hadis.hadissect', verbose_name='Sect'), - preserve_default=False, - ), - migrations.AddField( - model_name='hadis', - name='hadis_status', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='hadis.hadisstatus', verbose_name='hadis status'), - ), - migrations.AddField( - model_name='hadistransmitter', - name='status', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transmitters', to='hadis.hadisstatus', verbose_name='status'), - ), - migrations.DeleteModel( - name='HadisOverview', - ), - ] diff --git a/apps/hadis/migrations/0003_auto_20250317_0102.py b/apps/hadis/migrations/0003_auto_20250317_0102.py deleted file mode 100644 index 12cabcb..0000000 --- a/apps/hadis/migrations/0003_auto_20250317_0102.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.7 on 2025-03-17 01:02 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('hadis', '0002_auto_20250317_0055'), - ] - - operations = [ - migrations.RemoveField( - model_name='hadiscategory', - name='title', - ), - migrations.AddField( - model_name='hadiscategory', - name='name', - field=models.CharField(default='1', max_length=355, verbose_name='name'), - preserve_default=False, - ), - ] diff --git a/apps/hadis/migrations/0003_bookreference_narratorlayer_and_more.py b/apps/hadis/migrations/0003_bookreference_narratorlayer_and_more.py deleted file mode 100644 index 2650a1b..0000000 --- a/apps/hadis/migrations/0003_bookreference_narratorlayer_and_more.py +++ /dev/null @@ -1,226 +0,0 @@ -# Generated by Django 5.1.8 on 2025-12-03 23:32 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('hadis', '0002_hadissect_hadisstatus_alter_hadis_options_and_more'), - ] - - operations = [ - migrations.CreateModel( - name='BookReference', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=500, verbose_name='title')), - ('description', models.TextField(blank=True, null=True, verbose_name='description')), - ('language', models.CharField(blank=True, max_length=100, null=True, verbose_name='language')), - ('isbn', models.CharField(blank=True, max_length=100, null=True, verbose_name='ISBN')), - ('volume', models.CharField(blank=True, max_length=100, null=True, verbose_name='volume')), - ('year_of_publication', models.CharField(blank=True, max_length=50, null=True, verbose_name='year of publication')), - ('number_page', models.PositiveIntegerField(blank=True, null=True, verbose_name='number of pages')), - ('rate', models.DecimalField(blank=True, decimal_places=2, help_text='Rating from 0 to 5', max_digits=3, null=True, verbose_name='rate')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ], - options={ - 'verbose_name': 'Book Reference', - 'verbose_name_plural': 'Book References', - 'ordering': ('-created_at',), - }, - ), - migrations.CreateModel( - name='NarratorLayer', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='name')), - ('number', models.PositiveIntegerField(unique=True, verbose_name='layer number')), - ('description', models.TextField(blank=True, null=True, verbose_name='description')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ], - options={ - 'verbose_name': 'Narrator Layer', - 'verbose_name_plural': 'Narrator Layers', - 'ordering': ['number'], - }, - ), - migrations.AlterUniqueTogether( - name='hadisreference', - unique_together=set(), - ), - migrations.RemoveField( - model_name='hadistransmitter', - name='is_gap', - ), - migrations.AddField( - model_name='hadis', - name='title_narrator', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='title narrator'), - ), - migrations.AddField( - model_name='hadiscategory', - name='description', - field=models.TextField(blank=True, null=True, verbose_name='Description'), - ), - migrations.AddField( - model_name='hadissect', - name='description', - field=models.TextField(blank=True, null=True, verbose_name='Description'), - ), - migrations.AddField( - model_name='transmitters', - name='age_at_death', - field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Age at Death'), - ), - migrations.AddField( - model_name='transmitters', - name='died_in', - field=models.CharField(blank=True, help_text='Place of death', max_length=255, null=True, verbose_name='Died In'), - ), - migrations.AddField( - model_name='transmitters', - name='in_sahih_bukhari', - field=models.BooleanField(default=False, help_text='Is this narrator present in Sahih Bukhari?', verbose_name='In Sahih Bukhari'), - ), - migrations.AddField( - model_name='transmitters', - name='in_sahih_muslim', - field=models.BooleanField(default=False, help_text='Is this narrator present in Sahih Muslim?', verbose_name='In Sahih Muslim'), - ), - migrations.AddField( - model_name='transmitters', - name='known_as', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Known As'), - ), - migrations.AddField( - model_name='transmitters', - name='kunya', - field=models.CharField(blank=True, help_text='e.g., Abu Abdullah', max_length=255, null=True, verbose_name='Kunya'), - ), - migrations.AddField( - model_name='transmitters', - name='lived_in', - field=models.CharField(blank=True, help_text='Places where they lived', max_length=255, null=True, verbose_name='Lived In'), - ), - migrations.AddField( - model_name='transmitters', - name='madhhab', - field=models.CharField(choices=[('shia', 'Shia'), ('sunni', 'Sunni'), ('hanafi', 'Hanafi'), ('maliki', 'Maliki'), ('shafii', "Shafi'i"), ('hanbali', 'Hanbali'), ('other', 'Other'), ('unknown', 'Unknown')], default='unknown', max_length=20, verbose_name='Madhhab/School of Thought'), - ), - migrations.AddField( - model_name='transmitters', - name='nickname', - field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Nickname/Laqab'), - ), - migrations.AddField( - model_name='transmitters', - name='origin', - field=models.CharField(blank=True, help_text='Place of origin', max_length=255, null=True, verbose_name='Origin'), - ), - migrations.AddField( - model_name='transmitters', - name='reliability', - field=models.CharField(choices=[('very_reliable', 'Very Reliable'), ('reliable', 'Reliable'), ('acceptable', 'Acceptable'), ('weak', 'Weak'), ('very_weak', 'Very Weak'), ('unknown', 'Unknown')], default='unknown', max_length=20, verbose_name='Reliability Level'), - ), - migrations.AlterField( - model_name='hadiscategory', - name='source_type', - field=models.CharField(choices=[('quran', 'Quran'), ('hadith', 'Hadith'), ('history', 'History'), ('fatwa', 'Fatwa'), ('quote', 'Quote')], max_length=10, verbose_name='Source Type'), - ), - migrations.AlterField( - model_name='hadistransmitter', - name='status', - field=models.CharField(choices=[('reliable', 'Reliable'), ('weak', 'Weak'), ('unknown', 'Unknown')], default='unknown', help_text='Reliability status of the narrator', max_length=20, verbose_name='reliability status'), - ), - migrations.AlterField( - model_name='hadistransmitter', - name='transmitter', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hadises', to='hadis.transmitters', verbose_name='transmitter'), - ), - migrations.CreateModel( - name='BookAuthor', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='name')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('book_references', models.ManyToManyField(blank=True, related_name='authors', to='hadis.bookreference', verbose_name='book references')), - ], - options={ - 'verbose_name': 'Book Author', - 'verbose_name_plural': 'Book Authors', - 'ordering': ['name'], - }, - ), - migrations.CreateModel( - name='BookAttribute', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('value', models.CharField(max_length=500, verbose_name='value')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('book_references', models.ManyToManyField(blank=True, related_name='attributes', to='hadis.bookreference', verbose_name='book references')), - ], - options={ - 'verbose_name': 'Book Attribute', - 'verbose_name_plural': 'Book Attributes', - 'ordering': ['title'], - }, - ), - migrations.AddField( - model_name='hadisreference', - name='book_reference', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hadis_references', to='hadis.bookreference', verbose_name='book reference'), - ), - migrations.CreateModel( - name='BookReferenceImage', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('image', models.ImageField(upload_to='hadis/book_reference_images/', verbose_name='image')), - ('order', models.PositiveIntegerField(default=0, verbose_name='order')), - ('description', models.CharField(blank=True, max_length=255, null=True, verbose_name='description')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('book_reference', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='hadis.bookreference', verbose_name='book reference')), - ], - options={ - 'verbose_name': 'Book Reference Image', - 'verbose_name_plural': 'Book Reference Images', - 'ordering': ['order', '-created_at'], - }, - ), - migrations.AddField( - model_name='hadistransmitter', - name='narrator_layer', - field=models.ForeignKey(blank=True, help_text='The layer/class (Tabaqah) this narrator belongs to', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transmitters', to='hadis.narratorlayer', verbose_name='narrator layer'), - ), - migrations.CreateModel( - name='TransmitterOpinion', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('scholar_name', models.CharField(help_text='Name of the scholar who gave this opinion', max_length=255, verbose_name='Scholar Name')), - ('opinion_text', models.TextField(help_text="The scholar's opinion about this transmitter", verbose_name='Opinion Text')), - ('status', models.CharField(choices=[('confirmed', 'Confirmed'), ('mixed', 'Mixed'), ('rejected', 'Rejected')], default='confirmed', help_text='Status of the opinion', max_length=20, verbose_name='Opinion Status')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('transmitter', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='opinions', to='hadis.transmitters', verbose_name='transmitter')), - ], - options={ - 'verbose_name': 'Transmitter Opinion', - 'verbose_name_plural': 'Transmitter Opinions', - 'ordering': ('-created_at',), - }, - ), - migrations.RemoveField( - model_name='hadisreference', - name='book', - ), - migrations.RemoveField( - model_name='hadisreference', - name='description', - ), - ] diff --git a/apps/hadis/migrations/0004_auto_20250321_0119.py b/apps/hadis/migrations/0004_auto_20250321_0119.py deleted file mode 100644 index 1f4decf..0000000 --- a/apps/hadis/migrations/0004_auto_20250321_0119.py +++ /dev/null @@ -1,121 +0,0 @@ -# Generated by Django 3.2.7 on 2025-03-21 01:19 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import filer.fields.image - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.FILER_IMAGE_MODEL), - ('library', '0003_auto_20250321_0119'), - ('hadis', '0003_auto_20250317_0102'), - ] - - operations = [ - migrations.CreateModel( - name='HadisOverview', - fields=[ - ('hadis', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='hadis.hadis')), - ('status', models.CharField(max_length=50, verbose_name='status')), - ('status_color', models.CharField(max_length=25, verbose_name='Display Status Color')), - ('status_text', models.TextField(verbose_name='address')), - ('address', models.TextField(verbose_name='address')), - ('links', models.JSONField(blank=True, default=dict, null=True, verbose_name='title')), - ('share_link', models.CharField(blank=True, max_length=255, null=True, verbose_name='share link')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('book_reference', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='library.book', verbose_name='book reference')), - ], - ), - migrations.CreateModel( - name='HadisReference', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('description', models.TextField(blank=True, null=True, verbose_name='description')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('book', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hadis_references', to='library.book', verbose_name='book')), - ], - options={ - 'verbose_name': 'Hadis Reference', - 'verbose_name_plural': 'Hadis References', - }, - ), - migrations.CreateModel( - name='HadisTransmitter', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.PositiveIntegerField(default=0, help_text='Order in the chain of transmission', verbose_name='Order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ], - options={ - 'verbose_name': 'Hadis Transmitter', - 'verbose_name_plural': 'Hadis Transmitters', - 'ordering': ('hadis', 'order'), - }, - ), - migrations.CreateModel( - name='ReferenceImage', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('priority', models.IntegerField(default=0, help_text='Priority of the image, lower values mean higher priority.', verbose_name='Priority')), - ('reference', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='hadis.hadisreference', verbose_name='Hadis Reference')), - ('thumbnail', filer.fields.image.FilerImageField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.FILER_IMAGE_MODEL, verbose_name='thumbnail')), - ], - options={ - 'verbose_name': 'Reference Image', - 'verbose_name_plural': 'Reference Images', - 'ordering': ('priority',), - }, - ), - migrations.CreateModel( - name='Transmitters', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('full_name', models.CharField(max_length=255)), - ('birth_year_hijri', models.IntegerField(verbose_name='Birth Year (Hijri)')), - ('death_year_hijri', models.IntegerField(verbose_name='Death Year (Hijri)')), - ('description', models.TextField(blank=True, null=True, verbose_name='Description')), - ('status', models.CharField(max_length=50, verbose_name='status')), - ('status_color', models.CharField(max_length=25, verbose_name='Display Status Color')), - ('thumbnail', filer.fields.image.FilerImageField(blank=True, help_text='image allowed', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.FILER_IMAGE_MODEL)), - ], - ), - migrations.RemoveField( - model_name='hadis', - name='tags', - ), - migrations.AddField( - model_name='hadistag', - name='status', - field=models.BooleanField(default=True, verbose_name='status'), - ), - migrations.DeleteModel( - name='HadisTagRelation', - ), - migrations.AddField( - model_name='hadistransmitter', - name='hadis', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transmitters', to='hadis.hadis', verbose_name='hadis'), - ), - migrations.AddField( - model_name='hadistransmitter', - name='transmitter', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hadises', to='hadis.transmitters', verbose_name='transmitter'), - ), - migrations.AddField( - model_name='hadisreference', - name='hadis', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='references', to='hadis.hadis', verbose_name='hadis'), - ), - migrations.AddField( - model_name='hadisoverview', - name='tags', - field=models.ManyToManyField(blank=True, related_name='hadises', to='hadis.HadisTag', verbose_name='tags'), - ), - migrations.AlterUniqueTogether( - name='hadistransmitter', - unique_together={('hadis', 'transmitter', 'order')}, - ), - ] diff --git a/apps/hadis/migrations/0004_hadiscollection_hadisincollection.py b/apps/hadis/migrations/0004_hadiscollection_hadisincollection.py deleted file mode 100644 index 733ea2e..0000000 --- a/apps/hadis/migrations/0004_hadiscollection_hadisincollection.py +++ /dev/null @@ -1,52 +0,0 @@ -# Generated by Django 3.2.4 on 2025-12-05 17:07 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import filer.fields.image - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.FILER_IMAGE_MODEL), - ('hadis', '0003_bookreference_narratorlayer_and_more'), - ] - - operations = [ - migrations.CreateModel( - name='HadisCollection', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('slug', models.SlugField(blank=True, max_length=255, unique=True, verbose_name='slug')), - ('summary', models.TextField(blank=True, null=True, verbose_name='summary')), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('order', models.IntegerField(default=0, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('thumbnail', filer.fields.image.FilerImageField(blank=True, help_text='thumbnail image', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.FILER_IMAGE_MODEL, verbose_name='thumbnail')), - ], - options={ - 'verbose_name': 'hadis collection', - 'verbose_name_plural': 'hadis collections', - 'ordering': ('order',), - }, - ), - migrations.CreateModel( - name='HadisInCollection', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.IntegerField(default=0, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('collection', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='hadis_items', to='hadis.hadiscollection', verbose_name='collection')), - ('hadis', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='collection_items', to='hadis.hadis', verbose_name='hadis')), - ], - options={ - 'verbose_name': 'hadis in collection', - 'verbose_name_plural': 'hadis in collections', - 'ordering': ('order',), - 'unique_together': {('hadis', 'collection')}, - }, - ), - ] diff --git a/apps/hadis/migrations/0005_auto_20250321_1550.py b/apps/hadis/migrations/0005_auto_20250321_1550.py deleted file mode 100644 index 1a8af1e..0000000 --- a/apps/hadis/migrations/0005_auto_20250321_1550.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 3.2.7 on 2025-03-21 15:50 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('hadis', '0004_auto_20250321_0119'), - ] - - operations = [ - migrations.AlterModelOptions( - name='referenceimage', - options={'verbose_name': 'Reference Image', 'verbose_name_plural': 'Reference Images'}, - ), - migrations.RemoveField( - model_name='hadisoverview', - name='book_reference', - ), - ] diff --git a/apps/hadis/migrations/0005_auto_20251209_1620.py b/apps/hadis/migrations/0005_auto_20251209_1620.py deleted file mode 100644 index 60ec132..0000000 --- a/apps/hadis/migrations/0005_auto_20251209_1620.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-09 16:20 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0004_hadiscollection_hadisincollection"), - ] - - operations = [ - migrations.AddField( - model_name='hadiscategory', - name='description', - field=models.TextField(blank=True, null=True, verbose_name='Description'), - ), - migrations.AddField( - model_name='hadissect', - name='description', - field=models.TextField(blank=True, null=True, verbose_name='Description'), - ), - ] diff --git a/apps/hadis/migrations/0006_auto_20250321_1600.py b/apps/hadis/migrations/0006_auto_20250321_1600.py deleted file mode 100644 index d314b59..0000000 --- a/apps/hadis/migrations/0006_auto_20250321_1600.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 3.2.7 on 2025-03-21 16:00 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('hadis', '0005_auto_20250321_1550'), - ] - - operations = [ - migrations.AlterField( - model_name='hadisoverview', - name='address', - field=models.TextField(blank=True, null=True, verbose_name='address'), - ), - migrations.AlterField( - model_name='hadisoverview', - name='status_text', - field=models.TextField(blank=True, null=True, verbose_name='Status Text'), - ), - ] diff --git a/apps/hadis/migrations/0006_hadiscategory_slug.py b/apps/hadis/migrations/0006_hadiscategory_slug.py deleted file mode 100644 index 9520717..0000000 --- a/apps/hadis/migrations/0006_hadiscategory_slug.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-11 13:21 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0005_auto_20251209_1620"), - ] - - operations = [ - migrations.AddField( - model_name="hadiscategory", - name="slug", - field=models.SlugField(blank=True, max_length=255, null=True), - ), - ] diff --git a/apps/hadis/migrations/0007_auto_20250321_2007.py b/apps/hadis/migrations/0007_auto_20250321_2007.py deleted file mode 100644 index 5e4710f..0000000 --- a/apps/hadis/migrations/0007_auto_20250321_2007.py +++ /dev/null @@ -1,28 +0,0 @@ -# Generated by Django 3.2.7 on 2025-03-21 20:07 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('library', '0004_remove_category_books'), - ('hadis', '0006_auto_20250321_1600'), - ] - - operations = [ - migrations.AddField( - model_name='hadisoverview', - name='explanation', - field=models.TextField(blank=True, null=True, verbose_name='explanation'), - ), - migrations.AddField( - model_name='hadistransmitter', - name='description', - field=models.TextField(blank=True, null=True, verbose_name='description'), - ), - migrations.AlterUniqueTogether( - name='hadisreference', - unique_together={('hadis', 'book')}, - ), - ] diff --git a/apps/hadis/migrations/0007_auto_20251211_1313.py b/apps/hadis/migrations/0007_auto_20251211_1313.py deleted file mode 100644 index 2d5574c..0000000 --- a/apps/hadis/migrations/0007_auto_20251211_1313.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-11 13:13 - -from django.db import migrations -from django.utils.text import slugify - -def gen_slugs(apps, schema_editor): - MyModel = apps.get_model('hadis', 'HadisCategory') # Replace with your app/model name - for row in MyModel.objects.all(): - # 1. Basic slugify - base_slug = slugify(row.title) # Assuming you slugify the 'name' field - slug = base_slug - n = 1 - - # 2. Ensure uniqueness (if two rows have the same name) - while MyModel.objects.filter(slug=slug).exists(): - slug = f"{base_slug}-{n}" - n += 1 - - row.slug = slug - row.save() - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0005_auto_20251209_1620"), - ] - - operations = [ - migrations.RunPython(gen_slugs, reverse_code=migrations.RunPython.noop), - ] diff --git a/apps/hadis/migrations/0007_auto_20251211_1324.py b/apps/hadis/migrations/0007_auto_20251211_1324.py deleted file mode 100644 index 6171ad5..0000000 --- a/apps/hadis/migrations/0007_auto_20251211_1324.py +++ /dev/null @@ -1,29 +0,0 @@ -from django.db import migrations -from django.utils.text import slugify - -def gen_slugs(apps, schema_editor): - MyModel = apps.get_model('hadis', 'HadisCategory') # Replace with your app/model name - for row in MyModel.objects.all(): - # 1. Basic slugify - base_slug = slugify(row.title) # Assuming you slugify the 'name' field - slug = base_slug - n = 1 - - # 2. Ensure uniqueness (if two rows have the same name) - while MyModel.objects.filter(slug=slug).exists(): - slug = f"{base_slug}-{n}" - n += 1 - - row.slug = slug - row.save() - -class Migration(migrations.Migration): - - dependencies = [ - ('hadis', '0006_hadiscategory_slug'), - ] - - operations = [ - # Call the function - migrations.RunPython(gen_slugs, reverse_code=migrations.RunPython.noop), - ] \ No newline at end of file diff --git a/apps/hadis/migrations/0008_alter_hadiscategory_slug.py b/apps/hadis/migrations/0008_alter_hadiscategory_slug.py deleted file mode 100644 index 6ec70ff..0000000 --- a/apps/hadis/migrations/0008_alter_hadiscategory_slug.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-11 13:32 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0007_auto_20251211_1324"), - ] - - operations = [ - migrations.AlterField( - model_name="hadiscategory", - name="slug", - field=models.SlugField(blank=True, max_length=255, null=True, unique=True), - ), - ] diff --git a/apps/hadis/migrations/0009_alter_hadiscategory_slug.py b/apps/hadis/migrations/0009_alter_hadiscategory_slug.py deleted file mode 100644 index 4d2d53e..0000000 --- a/apps/hadis/migrations/0009_alter_hadiscategory_slug.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-11 13:40 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0008_alter_hadiscategory_slug"), - ] - - operations = [ - migrations.AlterField( - model_name="hadiscategory", - name="slug", - field=models.SlugField(blank=True, max_length=255, null=True), - ), - ] diff --git a/apps/hadis/migrations/0010_merge_20251211_1555.py b/apps/hadis/migrations/0010_merge_20251211_1555.py deleted file mode 100644 index 82d8247..0000000 --- a/apps/hadis/migrations/0010_merge_20251211_1555.py +++ /dev/null @@ -1,12 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-11 15:55 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0007_auto_20251211_1313"), - ("hadis", "0009_alter_hadiscategory_slug"), - ] - - operations = [] diff --git a/apps/hadis/migrations/0011_hadis_a.py b/apps/hadis/migrations/0011_hadis_a.py deleted file mode 100644 index 7da9edb..0000000 --- a/apps/hadis/migrations/0011_hadis_a.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-11 16:06 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0010_merge_20251211_1555"), - ] - - operations = [ - migrations.AddField( - model_name="hadis", - name="a", - field=models.IntegerField(blank=True, null=True), - ), - ] diff --git a/apps/hadis/migrations/0012_remove_hadis_title_narrator.py b/apps/hadis/migrations/0012_remove_hadis_title_narrator.py deleted file mode 100644 index 74dc3e7..0000000 --- a/apps/hadis/migrations/0012_remove_hadis_title_narrator.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-11 16:13 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0011_hadis_a"), - ] - - operations = [ - migrations.RemoveField( - model_name="hadis", - name="title_narrator", - ), - ] diff --git a/apps/hadis/migrations/0013_hadis_title_narrator.py b/apps/hadis/migrations/0013_hadis_title_narrator.py deleted file mode 100644 index 719b544..0000000 --- a/apps/hadis/migrations/0013_hadis_title_narrator.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-11 16:14 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0012_remove_hadis_title_narrator"), - ] - - operations = [ - migrations.AddField( - model_name="hadis", - name="title_narrator", - field=models.CharField( - blank=True, max_length=255, null=True, verbose_name="title narrator" - ), - ), - ] diff --git a/apps/hadis/migrations/0014_remove_hadistransmitter_narrator_layer.py b/apps/hadis/migrations/0014_remove_hadistransmitter_narrator_layer.py deleted file mode 100644 index 5262724..0000000 --- a/apps/hadis/migrations/0014_remove_hadistransmitter_narrator_layer.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 08:55 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0013_hadis_title_narrator"), - ] - - operations = [ - migrations.RemoveField( - model_name="hadistransmitter", - name="narrator_layer", - ), - ] diff --git a/apps/hadis/migrations/0015_hadistransmitter_narrator_layer.py b/apps/hadis/migrations/0015_hadistransmitter_narrator_layer.py deleted file mode 100644 index 2e955e2..0000000 --- a/apps/hadis/migrations/0015_hadistransmitter_narrator_layer.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 08:56 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0014_remove_hadistransmitter_narrator_layer"), - ] - - operations = [ - migrations.AddField( - model_name="hadistransmitter", - name="narrator_layer", - field=models.ForeignKey( - blank=True, - help_text="The layer/class (Tabaqah) this narrator belongs to", - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="transmitters", - to="hadis.narratorlayer", - verbose_name="narrator layer", - ), - ), - ] diff --git a/apps/hadis/migrations/0016_remove_hadistransmitter_narrator_layer_and_more.py b/apps/hadis/migrations/0016_remove_hadistransmitter_narrator_layer_and_more.py deleted file mode 100644 index 79cc759..0000000 --- a/apps/hadis/migrations/0016_remove_hadistransmitter_narrator_layer_and_more.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 08:57 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0015_hadistransmitter_narrator_layer"), - ] - - operations = [ - migrations.RemoveField( - model_name="hadistransmitter", - name="narrator_layer", - ), - migrations.DeleteModel( - name="NarratorLayer", - ), - ] diff --git a/apps/hadis/migrations/0017_narratorlayer_hadistransmitter_narrator_layer.py b/apps/hadis/migrations/0017_narratorlayer_hadistransmitter_narrator_layer.py deleted file mode 100644 index 19eeee9..0000000 --- a/apps/hadis/migrations/0017_narratorlayer_hadistransmitter_narrator_layer.py +++ /dev/null @@ -1,64 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 08:58 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0016_remove_hadistransmitter_narrator_layer_and_more"), - ] - - operations = [ - migrations.CreateModel( - name="NarratorLayer", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("name", models.CharField(max_length=255, verbose_name="name")), - ( - "number", - models.PositiveIntegerField( - unique=True, verbose_name="layer number" - ), - ), - ( - "description", - models.TextField(blank=True, null=True, verbose_name="description"), - ), - ( - "created_at", - models.DateTimeField(auto_now_add=True, verbose_name="created at"), - ), - ( - "updated_at", - models.DateTimeField(auto_now=True, verbose_name="updated at"), - ), - ], - options={ - "verbose_name": "Narrator Layer", - "verbose_name_plural": "Narrator Layers", - "ordering": ["number"], - }, - ), - migrations.AddField( - model_name="hadistransmitter", - name="narrator_layer", - field=models.ForeignKey( - blank=True, - help_text="The layer/class (Tabaqah) this narrator belongs to", - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="transmitters", - to="hadis.narratorlayer", - verbose_name="narrator layer", - ), - ), - ] diff --git a/apps/hadis/migrations/0018_remove_hadistransmitter_status.py b/apps/hadis/migrations/0018_remove_hadistransmitter_status.py deleted file mode 100644 index 622e121..0000000 --- a/apps/hadis/migrations/0018_remove_hadistransmitter_status.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 09:02 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0017_narratorlayer_hadistransmitter_narrator_layer"), - ] - - operations = [ - migrations.RemoveField( - model_name="hadistransmitter", - name="status", - ), - ] diff --git a/apps/hadis/migrations/0019_hadistransmitter_status.py b/apps/hadis/migrations/0019_hadistransmitter_status.py deleted file mode 100644 index 6d2cf04..0000000 --- a/apps/hadis/migrations/0019_hadistransmitter_status.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 09:03 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0018_remove_hadistransmitter_status"), - ] - - operations = [ - migrations.AddField( - model_name="hadistransmitter", - name="status", - field=models.CharField( - choices=[ - ("reliable", "Reliable"), - ("weak", "Weak"), - ("unknown", "Unknown"), - ], - default="unknown", - help_text="Reliability status of the narrator", - max_length=20, - verbose_name="reliability status", - ), - ), - ] diff --git a/apps/hadis/migrations/0020_hadisreference_description.py b/apps/hadis/migrations/0020_hadisreference_description.py deleted file mode 100644 index 1dd2842..0000000 --- a/apps/hadis/migrations/0020_hadisreference_description.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 09:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0019_hadistransmitter_status"), - ] - - operations = [ - migrations.AddField( - model_name="hadisreference", - name="description", - field=models.TextField(blank=True, null=True, verbose_name="description"), - ), - ] diff --git a/apps/hadis/migrations/0021_remove_hadisreference_book_reference_and_more.py b/apps/hadis/migrations/0021_remove_hadisreference_book_reference_and_more.py deleted file mode 100644 index 72df463..0000000 --- a/apps/hadis/migrations/0021_remove_hadisreference_book_reference_and_more.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 09:55 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0020_hadisreference_description"), - ] - - operations = [ - migrations.RemoveField( - model_name="hadisreference", - name="book_reference", - ), - migrations.RemoveField( - model_name="hadisreference", - name="description", - ), - ] diff --git a/apps/hadis/migrations/0022_hadisreference_book_reference_and_more.py b/apps/hadis/migrations/0022_hadisreference_book_reference_and_more.py deleted file mode 100644 index b08c1d9..0000000 --- a/apps/hadis/migrations/0022_hadisreference_book_reference_and_more.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 09:56 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0021_remove_hadisreference_book_reference_and_more"), - ] - - operations = [ - migrations.AddField( - model_name="hadisreference", - name="book_reference", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="hadis_references", - to="hadis.bookreference", - verbose_name="book reference", - ), - ), - migrations.AddField( - model_name="hadisreference", - name="description", - field=models.TextField(blank=True, null=True, verbose_name="description"), - ), - ] diff --git a/apps/hadis/migrations/0023_remove_hadisreference_book_reference_and_more.py b/apps/hadis/migrations/0023_remove_hadisreference_book_reference_and_more.py deleted file mode 100644 index 21fa282..0000000 --- a/apps/hadis/migrations/0023_remove_hadisreference_book_reference_and_more.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 10:00 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0022_hadisreference_book_reference_and_more"), - ] - - operations = [ - migrations.RemoveField( - model_name="hadisreference", - name="book_reference", - ), - migrations.AddField( - model_name="hadisreference", - name="book", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="hadis_references", - to="hadis.bookreference", - verbose_name="book reference", - ), - ), - ] diff --git a/apps/hadis/migrations/0024_remove_hadisreference_book.py b/apps/hadis/migrations/0024_remove_hadisreference_book.py deleted file mode 100644 index 82716e5..0000000 --- a/apps/hadis/migrations/0024_remove_hadisreference_book.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 10:01 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0023_remove_hadisreference_book_reference_and_more"), - ] - - operations = [ - migrations.RemoveField( - model_name="hadisreference", - name="book", - ), - ] diff --git a/apps/hadis/migrations/0025_hadisreference_book_reference.py b/apps/hadis/migrations/0025_hadisreference_book_reference.py deleted file mode 100644 index c8e4844..0000000 --- a/apps/hadis/migrations/0025_hadisreference_book_reference.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 10:02 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0024_remove_hadisreference_book"), - ] - - operations = [ - migrations.AddField( - model_name="hadisreference", - name="book_reference", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="hadis_references", - to="hadis.bookreference", - verbose_name="book reference", - ), - ), - ] diff --git a/apps/hadis/migrations/0026_remove_hadisreference_book_reference.py b/apps/hadis/migrations/0026_remove_hadisreference_book_reference.py deleted file mode 100644 index cdb9c5e..0000000 --- a/apps/hadis/migrations/0026_remove_hadisreference_book_reference.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 10:03 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0025_hadisreference_book_reference"), - ] - - operations = [ - migrations.RemoveField( - model_name="hadisreference", - name="book_reference", - ), - ] diff --git a/apps/hadis/migrations/0027_hadisreference_book_reference.py b/apps/hadis/migrations/0027_hadisreference_book_reference.py deleted file mode 100644 index c017d46..0000000 --- a/apps/hadis/migrations/0027_hadisreference_book_reference.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 10:05 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0026_remove_hadisreference_book_reference"), - ] - - operations = [ - migrations.AddField( - model_name="hadisreference", - name="book_reference", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="hadis_references", - to="hadis.bookreference", - verbose_name="book reference", - ), - ), - ] diff --git a/apps/hadis/migrations/0028_hadistransmitter_description.py b/apps/hadis/migrations/0028_hadistransmitter_description.py deleted file mode 100644 index 236aeed..0000000 --- a/apps/hadis/migrations/0028_hadistransmitter_description.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 10:19 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0027_hadisreference_book_reference"), - ] - - operations = [ - migrations.AddField( - model_name="hadistransmitter", - name="description", - field=models.TextField(blank=True, null=True, verbose_name="description"), - ), - ] diff --git a/apps/hadis/migrations/0029_remove_hadistransmitter_description_and_more.py b/apps/hadis/migrations/0029_remove_hadistransmitter_description_and_more.py deleted file mode 100644 index b0ab814..0000000 --- a/apps/hadis/migrations/0029_remove_hadistransmitter_description_and_more.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 10:39 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0028_hadistransmitter_description"), - ] - - operations = [ - migrations.RemoveField( - model_name="hadistransmitter", - name="description", - ), - migrations.AddField( - model_name="hadistransmitter", - name="is_gap", - field=models.BooleanField(default=False, verbose_name="is gap"), - ), - ] diff --git a/apps/hadis/migrations/0030_remove_hadistransmitter_is_gap.py b/apps/hadis/migrations/0030_remove_hadistransmitter_is_gap.py deleted file mode 100644 index 7b05eba..0000000 --- a/apps/hadis/migrations/0030_remove_hadistransmitter_is_gap.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 10:39 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0029_remove_hadistransmitter_description_and_more"), - ] - - operations = [ - migrations.RemoveField( - model_name="hadistransmitter", - name="is_gap", - ), - ] diff --git a/apps/hadis/migrations/0031_hadistransmitter_is_gap.py b/apps/hadis/migrations/0031_hadistransmitter_is_gap.py deleted file mode 100644 index 77a7f46..0000000 --- a/apps/hadis/migrations/0031_hadistransmitter_is_gap.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 10:40 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0030_remove_hadistransmitter_is_gap"), - ] - - operations = [ - migrations.AddField( - model_name="hadistransmitter", - name="is_gap", - field=models.BooleanField(default=False, verbose_name="is gap"), - ), - ] diff --git a/apps/hadis/migrations/0032_remove_hadis_a_hadis_description.py b/apps/hadis/migrations/0032_remove_hadis_a_hadis_description.py deleted file mode 100644 index 4cd1086..0000000 --- a/apps/hadis/migrations/0032_remove_hadis_a_hadis_description.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 10:45 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0031_hadistransmitter_is_gap"), - ] - - operations = [ - migrations.RemoveField( - model_name="hadis", - name="a", - ), - migrations.AddField( - model_name="hadis", - name="description", - field=models.TextField(blank=True, null=True, verbose_name="description"), - ), - ] diff --git a/apps/hadis/migrations/0033_hadiscorrection.py b/apps/hadis/migrations/0033_hadiscorrection.py deleted file mode 100644 index 84df46f..0000000 --- a/apps/hadis/migrations/0033_hadiscorrection.py +++ /dev/null @@ -1,57 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-13 11:39 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0032_remove_hadis_a_hadis_description"), - ] - - operations = [ - migrations.CreateModel( - name="HadisCorrection", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("title", models.CharField(max_length=255, verbose_name="title")), - ( - "description", - models.TextField(blank=True, null=True, verbose_name="description"), - ), - ( - "translation", - models.JSONField(default=list, verbose_name="translation"), - ), - ( - "created_at", - models.DateTimeField(auto_now_add=True, verbose_name="created at"), - ), - ( - "updated_at", - models.DateTimeField(auto_now=True, verbose_name="updated at"), - ), - ( - "hadis", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="hadis.hadis", - verbose_name="hadis correction", - ), - ), - ], - options={ - "verbose_name": "Hadis Correction", - "verbose_name_plural": "Hadis Corrections", - "ordering": ("-created_at",), - }, - ), - ] diff --git a/apps/hadis/migrations/0034_hadiscorrection_share_link.py b/apps/hadis/migrations/0034_hadiscorrection_share_link.py deleted file mode 100644 index 871cf59..0000000 --- a/apps/hadis/migrations/0034_hadiscorrection_share_link.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-14 10:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0033_hadiscorrection"), - ] - - operations = [ - migrations.AddField( - model_name="hadiscorrection", - name="share_link", - field=models.CharField( - blank=True, max_length=255, null=True, verbose_name="share link" - ), - ), - ] diff --git a/apps/hadis/migrations/0035_transmitteroriginaltext.py b/apps/hadis/migrations/0035_transmitteroriginaltext.py deleted file mode 100644 index 063edea..0000000 --- a/apps/hadis/migrations/0035_transmitteroriginaltext.py +++ /dev/null @@ -1,53 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-14 11:47 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0034_hadiscorrection_share_link"), - ] - - operations = [ - migrations.CreateModel( - name="TransmitterOriginalText", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "title", - models.CharField( - blank=True, max_length=255, null=True, verbose_name="title" - ), - ), - ("text", models.TextField(verbose_name="text")), - ( - "translation", - models.JSONField(default=list, verbose_name="translation"), - ), - ( - "share_link", - models.CharField( - blank=True, max_length=255, null=True, verbose_name="share link" - ), - ), - ( - "transmitter", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="originaltextes", - to="hadis.transmitters", - verbose_name="transmitter", - ), - ), - ], - ), - ] diff --git a/apps/hadis/migrations/0036_transmitters_generation_and_more.py b/apps/hadis/migrations/0036_transmitters_generation_and_more.py deleted file mode 100644 index 0d3d15b..0000000 --- a/apps/hadis/migrations/0036_transmitters_generation_and_more.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-14 14:53 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0035_transmitteroriginaltext"), - ] - - operations = [ - migrations.AddField( - model_name="transmitters", - name="generation", - field=models.PositiveIntegerField( - blank=True, null=True, verbose_name="Generation" - ), - ), - migrations.AlterField( - model_name="transmitteroriginaltext", - name="transmitter", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="originaltexts", - to="hadis.transmitters", - verbose_name="transmitter", - ), - ), - ] diff --git a/apps/hadis/migrations/0037_remove_bookattribute_book_references_and_more.py b/apps/hadis/migrations/0037_remove_bookattribute_book_references_and_more.py deleted file mode 100644 index c8410fb..0000000 --- a/apps/hadis/migrations/0037_remove_bookattribute_book_references_and_more.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-14 15:46 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0036_transmitters_generation_and_more"), - ] - - operations = [ - migrations.RemoveField( - model_name="bookattribute", - name="book_references", - ), - migrations.AddField( - model_name="bookattribute", - name="book_reference", - field=models.ForeignKey( - default=None, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="attributes", - to="hadis.bookreference", - verbose_name="book attribute", - ), - ), - ] diff --git a/apps/hadis/migrations/0038_narratorlayer_slug_alter_referenceimage_reference.py b/apps/hadis/migrations/0038_narratorlayer_slug_alter_referenceimage_reference.py deleted file mode 100644 index 3ac0326..0000000 --- a/apps/hadis/migrations/0038_narratorlayer_slug_alter_referenceimage_reference.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-16 10:14 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0037_remove_bookattribute_book_references_and_more"), - ] - - operations = [ - migrations.AddField( - model_name="narratorlayer", - name="slug", - field=models.SlugField( - blank=True, max_length=255, null=True, verbose_name="slug" - ), - ), - migrations.AlterField( - model_name="referenceimage", - name="reference", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="images", - to="hadis.hadisreference", - verbose_name="Hadis Reference", - ), - ), - ] diff --git a/apps/hadis/migrations/0039_alter_narratorlayer_slug.py b/apps/hadis/migrations/0039_alter_narratorlayer_slug.py deleted file mode 100644 index e88c8a8..0000000 --- a/apps/hadis/migrations/0039_alter_narratorlayer_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-16 10:21 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0038_narratorlayer_slug_alter_referenceimage_reference"), - ] - - operations = [ - migrations.AlterField( - model_name="narratorlayer", - name="slug", - field=models.SlugField( - blank=True, max_length=255, unique=True, verbose_name="slug" - ), - ), - ] diff --git a/apps/hadis/migrations/0040_bookreference_slug.py b/apps/hadis/migrations/0040_bookreference_slug.py deleted file mode 100644 index 628da2c..0000000 --- a/apps/hadis/migrations/0040_bookreference_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-16 12:24 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0039_alter_narratorlayer_slug"), - ] - - operations = [ - migrations.AddField( - model_name="bookreference", - name="slug", - field=models.SlugField( - blank=True, max_length=255, null=True, verbose_name="slug" - ), - ), - ] diff --git a/apps/hadis/migrations/0041_remove_bookreference_slug.py b/apps/hadis/migrations/0041_remove_bookreference_slug.py deleted file mode 100644 index b6ef66a..0000000 --- a/apps/hadis/migrations/0041_remove_bookreference_slug.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-16 12:25 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0040_bookreference_slug"), - ] - - operations = [ - migrations.RemoveField( - model_name="bookreference", - name="slug", - ), - ] diff --git a/apps/hadis/migrations/0042_bookreference_slug.py b/apps/hadis/migrations/0042_bookreference_slug.py deleted file mode 100644 index 93806e8..0000000 --- a/apps/hadis/migrations/0042_bookreference_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-16 12:26 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0041_remove_bookreference_slug"), - ] - - operations = [ - migrations.AddField( - model_name="bookreference", - name="slug", - field=models.SlugField( - blank=True, max_length=255, unique=True, verbose_name="slug" - ), - ), - ] diff --git a/apps/hadis/migrations/0043_bookreference_publisher.py b/apps/hadis/migrations/0043_bookreference_publisher.py deleted file mode 100644 index 074088a..0000000 --- a/apps/hadis/migrations/0043_bookreference_publisher.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-16 12:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0042_bookreference_slug"), - ] - - operations = [ - migrations.AddField( - model_name="bookreference", - name="publisher", - field=models.TextField(blank=True, null=True, verbose_name="publisher"), - ), - ] diff --git a/apps/hadis/migrations/0044_remove_bookreference_publisher.py b/apps/hadis/migrations/0044_remove_bookreference_publisher.py deleted file mode 100644 index 57bc5bc..0000000 --- a/apps/hadis/migrations/0044_remove_bookreference_publisher.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-16 12:54 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0043_bookreference_publisher"), - ] - - operations = [ - migrations.RemoveField( - model_name="bookreference", - name="publisher", - ), - ] diff --git a/apps/hadis/migrations/0045_bookreference_publisher.py b/apps/hadis/migrations/0045_bookreference_publisher.py deleted file mode 100644 index 245210c..0000000 --- a/apps/hadis/migrations/0045_bookreference_publisher.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-16 12:55 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0044_remove_bookreference_publisher"), - ] - - operations = [ - migrations.AddField( - model_name="bookreference", - name="publisher", - field=models.TextField(blank=True, null=True, verbose_name="publisher"), - ), - ] diff --git a/apps/hadis/migrations/0046_transmitters_slug.py b/apps/hadis/migrations/0046_transmitters_slug.py deleted file mode 100644 index 6ae908a..0000000 --- a/apps/hadis/migrations/0046_transmitters_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-17 13:25 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0045_bookreference_publisher"), - ] - - operations = [ - migrations.AddField( - model_name="transmitters", - name="slug", - field=models.SlugField( - blank=True, max_length=255, unique=True, verbose_name="slug" - ), - ), - ] diff --git a/apps/hadis/migrations/0047_remove_transmitters_slug.py b/apps/hadis/migrations/0047_remove_transmitters_slug.py deleted file mode 100644 index e4fd14e..0000000 --- a/apps/hadis/migrations/0047_remove_transmitters_slug.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-17 13:26 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0046_transmitters_slug"), - ] - - operations = [ - migrations.RemoveField( - model_name="transmitters", - name="slug", - ), - ] diff --git a/apps/hadis/migrations/0048_transmitters_slug.py b/apps/hadis/migrations/0048_transmitters_slug.py deleted file mode 100644 index 0980607..0000000 --- a/apps/hadis/migrations/0048_transmitters_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-17 13:26 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0047_remove_transmitters_slug"), - ] - - operations = [ - migrations.AddField( - model_name="transmitters", - name="slug", - field=models.SlugField( - blank=True, max_length=255, null=True, verbose_name="slug" - ), - ), - ] diff --git a/apps/hadis/migrations/0049_alter_transmitters_slug.py b/apps/hadis/migrations/0049_alter_transmitters_slug.py deleted file mode 100644 index d8c1263..0000000 --- a/apps/hadis/migrations/0049_alter_transmitters_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-17 13:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0048_transmitters_slug"), - ] - - operations = [ - migrations.AlterField( - model_name="transmitters", - name="slug", - field=models.SlugField( - blank=True, max_length=255, unique=True, verbose_name="slug" - ), - ), - ] diff --git a/apps/hadis/migrations/0050_convert_title_to_json.py b/apps/hadis/migrations/0050_convert_title_to_json.py deleted file mode 100644 index 75c0a63..0000000 --- a/apps/hadis/migrations/0050_convert_title_to_json.py +++ /dev/null @@ -1,32 +0,0 @@ -from django.db import migrations -import json - -def convert_to_json(apps, schema_editor): - """Convert CharField strings to JSON array of language objects""" - HadisCategory = apps.get_model('hadis', 'HadisCategory') - - for obj in HadisCategory.objects.all(): - # Convert plain string to JSON array with language objects - if obj.title and isinstance(obj.title, str): - # Wrap string in JSON format: [{"text": "string", "language_code": "en"}] - obj.title = [{"text": obj.title, "language_code": "en"}] - obj.save(update_fields=['title']) - -def reverse_convert(apps, schema_editor): - """Revert JSON back to plain text (optional)""" - HadisCategory = apps.get_model('hadis', 'HadisCategory') - - for obj in HadisCategory.objects.all(): - if obj.title and isinstance(obj.title, list) and len(obj.title) > 0: - # Extract first language's text - obj.title = obj.title[0].get('text', '') - obj.save(update_fields=['title']) - -class Migration(migrations.Migration): - dependencies = [ - ('hadis', '0049_alter_transmitters_slug'), # Adjust to your last working migration - ] - - operations = [ - migrations.RunPython(convert_to_json, reverse_convert), - ] diff --git a/apps/hadis/migrations/0051_convert_title_to_json_fixed.py b/apps/hadis/migrations/0051_convert_title_to_json_fixed.py deleted file mode 100644 index 04744de..0000000 --- a/apps/hadis/migrations/0051_convert_title_to_json_fixed.py +++ /dev/null @@ -1,40 +0,0 @@ -from django.db import migrations -import json - -def convert_to_json(apps, schema_editor): - """Convert CharField strings to JSON array of language objects""" - HadisCategory = apps.get_model('hadis', 'HadisCategory') - - for obj in HadisCategory.objects.all(): - # Convert plain string to JSON array with language objects - if obj.title and isinstance(obj.title, str): - # Create Python dict, then serialize to valid JSON - title_data = [{"text": obj.title, "language_code": "en"}] - # CRITICAL: Use json.dumps() to convert to valid JSON string - obj.title = json.dumps(title_data) - obj.save(update_fields=['title']) - -def reverse_convert(apps, schema_editor): - """Revert JSON back to plain text (optional)""" - HadisCategory = apps.get_model('hadis', 'HadisCategory') - - for obj in HadisCategory.objects.all(): - if obj.title: - try: - # Parse JSON string back to Python object - title_data = json.loads(obj.title) if isinstance(obj.title, str) else obj.title - if isinstance(title_data, list) and len(title_data) > 0: - # Extract first language's text - obj.title = title_data[0].get('text', '') - obj.save(update_fields=['title']) - except (json.JSONDecodeError, TypeError): - pass - -class Migration(migrations.Migration): - dependencies = [ - ('hadis', '0050_convert_title_to_json'), # Adjust to your last working migration - ] - - operations = [ - migrations.RunPython(convert_to_json, reverse_convert), - ] diff --git a/apps/hadis/migrations/0052_alter_hadiscategory_title.py b/apps/hadis/migrations/0052_alter_hadiscategory_title.py deleted file mode 100644 index 864a12a..0000000 --- a/apps/hadis/migrations/0052_alter_hadiscategory_title.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-17 15:02 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0051_convert_title_to_json_fixed"), - ] - - operations = [ - migrations.AlterField( - model_name="hadiscategory", - name="title", - field=models.JSONField(default=list, verbose_name="Title"), - ), - ] diff --git a/apps/hadis/migrations/0053_alter_hadiscategory_description_and_more.py b/apps/hadis/migrations/0053_alter_hadiscategory_description_and_more.py deleted file mode 100644 index 542947e..0000000 --- a/apps/hadis/migrations/0053_alter_hadiscategory_description_and_more.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-18 10:17 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0052_alter_hadiscategory_title"), - ] - - operations = [ - migrations.AlterField( - model_name="hadiscategory", - name="description", - field=models.JSONField(default=list, verbose_name="Description"), - ), - migrations.AlterField( - model_name="hadissect", - name="description", - field=models.JSONField(default=list, verbose_name="Description"), - ), - migrations.AlterField( - model_name="hadissect", - name="title", - field=models.JSONField(default=list, verbose_name="Title"), - ), - ] diff --git a/apps/hadis/migrations/0054_remove_hadiscorrection_description_and_more.py b/apps/hadis/migrations/0054_remove_hadiscorrection_description_and_more.py deleted file mode 100644 index 78f1ac4..0000000 --- a/apps/hadis/migrations/0054_remove_hadiscorrection_description_and_more.py +++ /dev/null @@ -1,76 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-18 10:32 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0053_alter_hadiscategory_description_and_more"), - ] - - operations = [ - migrations.RemoveField( - model_name="hadiscorrection", - name="description", - ), - migrations.AlterField( - model_name="hadis", - name="address", - field=models.JSONField(default=list, verbose_name="Address"), - ), - migrations.AlterField( - model_name="hadis", - name="description", - field=models.JSONField(default=list, verbose_name="Description"), - ), - migrations.AlterField( - model_name="hadis", - name="explanation", - field=models.JSONField(default=list, verbose_name="Explanation"), - ), - migrations.AlterField( - model_name="hadis", - name="hadis_status_text", - field=models.JSONField(default=list, verbose_name="Status text"), - ), - migrations.AlterField( - model_name="hadis", - name="title", - field=models.JSONField(default=list, verbose_name="Title"), - ), - migrations.AlterField( - model_name="hadis", - name="title_narrator", - field=models.JSONField(default=list, verbose_name="Title Narrator"), - ), - migrations.AlterField( - model_name="hadiscollection", - name="summary", - field=models.JSONField(default=list, verbose_name="Summary"), - ), - migrations.AlterField( - model_name="hadiscollection", - name="title", - field=models.JSONField(default=list, verbose_name="Title"), - ), - migrations.AlterField( - model_name="hadiscorrection", - name="title", - field=models.JSONField(default=list, verbose_name="Title"), - ), - migrations.AlterField( - model_name="hadisreference", - name="description", - field=models.JSONField(default=list, verbose_name="Description"), - ), - migrations.AlterField( - model_name="hadisstatus", - name="title", - field=models.JSONField(default=list, verbose_name="Title"), - ), - migrations.AlterField( - model_name="hadistag", - name="title", - field=models.JSONField(default=list, verbose_name="Title"), - ), - ] diff --git a/apps/hadis/migrations/0055_alter_bookattribute_title_alter_bookattribute_value_and_more.py b/apps/hadis/migrations/0055_alter_bookattribute_title_alter_bookattribute_value_and_more.py deleted file mode 100644 index db3aa43..0000000 --- a/apps/hadis/migrations/0055_alter_bookattribute_title_alter_bookattribute_value_and_more.py +++ /dev/null @@ -1,52 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-18 10:38 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0054_remove_hadiscorrection_description_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="bookattribute", - name="title", - field=models.JSONField(default=list, verbose_name="Title"), - ), - migrations.AlterField( - model_name="bookattribute", - name="value", - field=models.JSONField(default=list, verbose_name="Value"), - ), - migrations.AlterField( - model_name="bookauthor", - name="name", - field=models.JSONField(default=list, verbose_name="Name"), - ), - migrations.AlterField( - model_name="bookreference", - name="description", - field=models.JSONField(default=list, verbose_name="Description"), - ), - migrations.AlterField( - model_name="bookreference", - name="language", - field=models.JSONField(default=list, verbose_name="Language"), - ), - migrations.AlterField( - model_name="bookreference", - name="publisher", - field=models.JSONField(default=list, verbose_name="Publisher"), - ), - migrations.AlterField( - model_name="bookreference", - name="title", - field=models.JSONField(default=list, verbose_name="Title"), - ), - migrations.AlterField( - model_name="bookreferenceimage", - name="description", - field=models.JSONField(default=list, verbose_name="Description"), - ), - ] diff --git a/apps/hadis/migrations/0056_alter_narratorlayer_description_and_more.py b/apps/hadis/migrations/0056_alter_narratorlayer_description_and_more.py deleted file mode 100644 index 196c94a..0000000 --- a/apps/hadis/migrations/0056_alter_narratorlayer_description_and_more.py +++ /dev/null @@ -1,82 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-18 10:49 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0055_alter_bookattribute_title_alter_bookattribute_value_and_more"), - ] - - operations = [ - migrations.AlterField( - model_name="narratorlayer", - name="description", - field=models.JSONField(default=list, verbose_name="Description"), - ), - migrations.AlterField( - model_name="narratorlayer", - name="name", - field=models.JSONField(default=list, verbose_name="Name"), - ), - migrations.AlterField( - model_name="transmitteropinion", - name="opinion_text", - field=models.JSONField(default=list, verbose_name="Opinion Text"), - ), - migrations.AlterField( - model_name="transmitteropinion", - name="scholar_name", - field=models.JSONField(default=list, verbose_name="Scholar Name"), - ), - migrations.AlterField( - model_name="transmitteroriginaltext", - name="text", - field=models.JSONField(default=list, verbose_name="Text"), - ), - migrations.AlterField( - model_name="transmitteroriginaltext", - name="title", - field=models.JSONField(default=list, verbose_name="Title"), - ), - migrations.AlterField( - model_name="transmitters", - name="description", - field=models.JSONField(default=list, verbose_name="Description"), - ), - migrations.AlterField( - model_name="transmitters", - name="died_in", - field=models.JSONField(default=list, verbose_name="Died in"), - ), - migrations.AlterField( - model_name="transmitters", - name="full_name", - field=models.JSONField(default=list, verbose_name="Full Name"), - ), - migrations.AlterField( - model_name="transmitters", - name="known_as", - field=models.JSONField(default=list, verbose_name="Known as"), - ), - migrations.AlterField( - model_name="transmitters", - name="kunya", - field=models.JSONField(default=list, verbose_name="Kunya"), - ), - migrations.AlterField( - model_name="transmitters", - name="lived_in", - field=models.JSONField(default=list, verbose_name="Lived in"), - ), - migrations.AlterField( - model_name="transmitters", - name="nickname", - field=models.JSONField(default=list, verbose_name="Nick Name"), - ), - migrations.AlterField( - model_name="transmitters", - name="origin", - field=models.JSONField(default=list, verbose_name="Origin"), - ), - ] diff --git a/apps/hadis/migrations/0057_hadiscorrection_description.py b/apps/hadis/migrations/0057_hadiscorrection_description.py deleted file mode 100644 index 0017439..0000000 --- a/apps/hadis/migrations/0057_hadiscorrection_description.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.9 on 2025-12-18 12:01 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0056_alter_narratorlayer_description_and_more"), - ] - - operations = [ - migrations.AddField( - model_name="hadiscorrection", - name="description", - field=models.JSONField(default=list, verbose_name="Description"), - ), - ] diff --git a/apps/hadis/migrations/0058_hadis_slug.py b/apps/hadis/migrations/0058_hadis_slug.py deleted file mode 100644 index f0d11b4..0000000 --- a/apps/hadis/migrations/0058_hadis_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-22 08:43 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0057_hadiscorrection_description"), - ] - - operations = [ - migrations.AddField( - model_name="hadis", - name="slug", - field=models.SlugField( - blank=True, max_length=255, null=True, verbose_name="slug" - ), - ), - ] diff --git a/apps/hadis/migrations/0059_alter_hadis_slug.py b/apps/hadis/migrations/0059_alter_hadis_slug.py deleted file mode 100644 index cb291df..0000000 --- a/apps/hadis/migrations/0059_alter_hadis_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-22 09:39 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0058_hadis_slug"), - ] - - operations = [ - migrations.AlterField( - model_name="hadis", - name="slug", - field=models.SlugField( - blank=True, max_length=255, unique=True, verbose_name="slug" - ), - ), - ] diff --git a/apps/hadis/migrations/0060_hadiscorrection_slug.py b/apps/hadis/migrations/0060_hadiscorrection_slug.py deleted file mode 100644 index 7ef44f5..0000000 --- a/apps/hadis/migrations/0060_hadiscorrection_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-22 11:56 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0059_alter_hadis_slug"), - ] - - operations = [ - migrations.AddField( - model_name="hadiscorrection", - name="slug", - field=models.SlugField( - blank=True, max_length=255, null=True, verbose_name="slug" - ), - ), - ] diff --git a/apps/hadis/migrations/0061_alter_hadiscorrection_slug.py b/apps/hadis/migrations/0061_alter_hadiscorrection_slug.py deleted file mode 100644 index 0402bd5..0000000 --- a/apps/hadis/migrations/0061_alter_hadiscorrection_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-22 12:06 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0060_hadiscorrection_slug"), - ] - - operations = [ - migrations.AlterField( - model_name="hadiscorrection", - name="slug", - field=models.SlugField( - blank=True, max_length=255, unique=True, verbose_name="slug" - ), - ), - ] diff --git a/apps/hadis/migrations/0062_transmitteroriginaltext_slug.py b/apps/hadis/migrations/0062_transmitteroriginaltext_slug.py deleted file mode 100644 index a24f475..0000000 --- a/apps/hadis/migrations/0062_transmitteroriginaltext_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-22 12:20 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0061_alter_hadiscorrection_slug"), - ] - - operations = [ - migrations.AddField( - model_name="transmitteroriginaltext", - name="slug", - field=models.SlugField( - blank=True, max_length=255, null=True, verbose_name="slug" - ), - ), - ] diff --git a/apps/hadis/migrations/0063_alter_transmitteroriginaltext_slug.py b/apps/hadis/migrations/0063_alter_transmitteroriginaltext_slug.py deleted file mode 100644 index 7dc9e2b..0000000 --- a/apps/hadis/migrations/0063_alter_transmitteroriginaltext_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-22 12:26 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0062_transmitteroriginaltext_slug"), - ] - - operations = [ - migrations.AlterField( - model_name="transmitteroriginaltext", - name="slug", - field=models.SlugField( - blank=True, max_length=255, unique=True, verbose_name="slug" - ), - ), - ] diff --git a/apps/hadis/migrations/0064_hadis_hadis_hadis_status_5e0de5_idx.py b/apps/hadis/migrations/0064_hadis_hadis_hadis_status_5e0de5_idx.py deleted file mode 100644 index acdc62e..0000000 --- a/apps/hadis/migrations/0064_hadis_hadis_hadis_status_5e0de5_idx.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-22 13:27 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0063_alter_transmitteroriginaltext_slug"), - ] - - operations = [ - migrations.AddIndex( - model_name="hadis", - index=models.Index( - fields=["status", "id"], name="hadis_hadis_status_5e0de5_idx" - ), - ), - ] diff --git a/apps/hadis/migrations/0065_hadiscategory_hadis_hadis_parent__e7a217_idx_and_more.py b/apps/hadis/migrations/0065_hadiscategory_hadis_hadis_parent__e7a217_idx_and_more.py deleted file mode 100644 index 04940b3..0000000 --- a/apps/hadis/migrations/0065_hadiscategory_hadis_hadis_parent__e7a217_idx_and_more.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-22 13:57 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0064_hadis_hadis_hadis_status_5e0de5_idx"), - ] - - operations = [ - migrations.AddIndex( - model_name="hadiscategory", - index=models.Index( - fields=["parent", "sect"], name="hadis_hadis_parent__e7a217_idx" - ), - ), - migrations.AddIndex( - model_name="hadiscategory", - index=models.Index( - fields=["sect", "order"], name="hadis_hadis_sect_id_b57c1d_idx" - ), - ), - ] diff --git a/apps/hadis/migrations/0066_alter_transmitteroriginaltext_options_and_more.py b/apps/hadis/migrations/0066_alter_transmitteroriginaltext_options_and_more.py deleted file mode 100644 index 6dcfc78..0000000 --- a/apps/hadis/migrations/0066_alter_transmitteroriginaltext_options_and_more.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-22 14:11 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0065_hadiscategory_hadis_hadis_parent__e7a217_idx_and_more"), - ] - - operations = [ - migrations.AlterModelOptions( - name="transmitteroriginaltext", - options={ - "verbose_name": "Transmitter Original Text", - "verbose_name_plural": "Transmitter Original Text", - }, - ), - migrations.AddIndex( - model_name="transmitteropinion", - index=models.Index( - fields=["transmitter"], name="hadis_trans_transmi_0f1df2_idx" - ), - ), - migrations.AddIndex( - model_name="transmitteroriginaltext", - index=models.Index( - fields=["transmitter"], name="hadis_trans_transmi_fff93f_idx" - ), - ), - migrations.AddIndex( - model_name="transmitters", - index=models.Index(fields=["id"], name="hadis_trans_id_bd318c_idx"), - ), - ] diff --git a/apps/hadis/migrations/0067_bookreference_hadis_bookr_id_1b53f6_idx_and_more.py b/apps/hadis/migrations/0067_bookreference_hadis_bookr_id_1b53f6_idx_and_more.py deleted file mode 100644 index 0c90fcc..0000000 --- a/apps/hadis/migrations/0067_bookreference_hadis_bookr_id_1b53f6_idx_and_more.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-22 14:22 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0066_alter_transmitteroriginaltext_options_and_more"), - ] - - operations = [ - migrations.AddIndex( - model_name="bookreference", - index=models.Index(fields=["id"], name="hadis_bookr_id_1b53f6_idx"), - ), - migrations.AddIndex( - model_name="hadisreference", - index=models.Index( - fields=["book_reference"], name="hadis_hadis_book_re_3fb4f0_idx" - ), - ), - ] diff --git a/apps/hadis/migrations/0068_transmitterreliability.py b/apps/hadis/migrations/0068_transmitterreliability.py deleted file mode 100644 index c9c8583..0000000 --- a/apps/hadis/migrations/0068_transmitterreliability.py +++ /dev/null @@ -1,47 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-23 08:28 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0067_bookreference_hadis_bookr_id_1b53f6_idx_and_more"), - ] - - operations = [ - migrations.CreateModel( - name="TransmitterReliability", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("title", models.JSONField(default=list, verbose_name="Title")), - ( - "color", - models.CharField( - choices=[ - ("red", "Red"), - ("green", "Green"), - ("blue", "Blue"), - ("yellow", "Yellow"), - ("orange", "Orange"), - ("purple", "Purple"), - ("gray", "Gray"), - ], - max_length=20, - verbose_name="color", - ), - ), - ], - options={ - "verbose_name": "transmitter reliability", - "verbose_name_plural": "transmitter reliability", - }, - ), - ] diff --git a/apps/hadis/migrations/0069_alter_transmitters_reliability.py b/apps/hadis/migrations/0069_alter_transmitters_reliability.py deleted file mode 100644 index 12168d7..0000000 --- a/apps/hadis/migrations/0069_alter_transmitters_reliability.py +++ /dev/null @@ -1,134 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-23 08:32 - -from django.db import migrations, models -import django.db.models.deletion - - -def create_reliability_objects(apps, schema_editor): - """Create TransmitterReliability objects for each reliability level""" - TransmitterReliability = apps.get_model('hadis', 'TransmitterReliability') - - # Define the reliability levels with their data - reliability_data = [ - { - 'title': [ - {'text': 'Very Reliable', 'language_code': 'en'}, - {'text': 'بسیار قابل اعتماد', 'language_code': 'fa'}, - {'text': 'Очень надежный', 'language_code': 'ru'} - ], - 'color': 'green', - 'value': 'very_reliable' - }, - { - 'title': [ - {'text': 'Reliable', 'language_code': 'en'}, - {'text': 'قابل اعتماد', 'language_code': 'fa'}, - {'text': 'Надежный', 'language_code': 'ru'} - ], - 'color': 'blue', - 'value': 'reliable' - }, - { - 'title': [ - {'text': 'Acceptable', 'language_code': 'en'}, - {'text': 'قابل قبول', 'language_code': 'fa'}, - {'text': 'Приемлемый', 'language_code': 'ru'} - ], - 'color': 'yellow', - 'value': 'acceptable' - }, - { - 'title': [ - {'text': 'Weak', 'language_code': 'en'}, - {'text': 'ضعیف', 'language_code': 'fa'}, - {'text': 'Слабый', 'language_code': 'ru'} - ], - 'color': 'orange', - 'value': 'weak' - }, - { - 'title': [ - {'text': 'Very Weak', 'language_code': 'en'}, - {'text': 'بسیار ضعیف', 'language_code': 'fa'}, - {'text': 'Очень слабый', 'language_code': 'ru'} - ], - 'color': 'red', - 'value': 'very_weak' - }, - { - 'title': [ - {'text': 'Unknown', 'language_code': 'en'}, - {'text': 'نامشخص', 'language_code': 'fa'}, - {'text': 'Неизвестный', 'language_code': 'ru'} - ], - 'color': 'gray', - 'value': 'unknown' - } - ] - - reliability_objects = {} - for data in reliability_data: - obj = TransmitterReliability.objects.create( - title=data['title'], - color=data['color'] - ) - reliability_objects[data['value']] = obj - - return reliability_objects - - -def migrate_transmitter_data(apps, schema_editor): - """Migrate existing transmitter reliability data""" - Transmitters = apps.get_model('hadis', 'Transmitters') - - # Create reliability objects - reliability_objects = create_reliability_objects(apps, schema_editor) - - # Update all transmitters to use the new temporary field - for transmitter in Transmitters.objects.all(): - old_value = getattr(transmitter, 'reliability', None) - if old_value and old_value in reliability_objects: - transmitter.reliability_new = reliability_objects[old_value] - else: - # Default to unknown if no value or invalid value - transmitter.reliability_new = reliability_objects['unknown'] - transmitter.save() - - -def reverse_migrate(apps, schema_editor): - """Reverse migration - not needed since we're changing field types""" - pass - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0068_transmitterreliability"), - ] - - operations = [ - # Step 1: Add a temporary ForeignKey field - migrations.AddField( - model_name='transmitters', - name='reliability_new', - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="transmitters_temp", - to="hadis.transmitterreliability", - verbose_name="reliability", - null=True, - ), - ), - # Step 2: Run data migration to populate the new field - migrations.RunPython(migrate_transmitter_data, reverse_migrate), - # Step 3: Remove the old field - migrations.RemoveField( - model_name='transmitters', - name='reliability', - ), - # Step 4: Rename the new field to the final name - migrations.RenameField( - model_name='transmitters', - old_name='reliability_new', - new_name='reliability', - ), - ] diff --git a/apps/hadis/migrations/0070_alter_transmitters_reliability.py b/apps/hadis/migrations/0070_alter_transmitters_reliability.py deleted file mode 100644 index da1e95d..0000000 --- a/apps/hadis/migrations/0070_alter_transmitters_reliability.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-23 08:46 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0069_alter_transmitters_reliability"), - ] - - operations = [ - migrations.AlterField( - model_name="transmitters", - name="reliability", - field=models.ForeignKey( - default=12, - on_delete=django.db.models.deletion.CASCADE, - related_name="transmitters", - to="hadis.transmitterreliability", - verbose_name="reliability", - ), - ), - ] diff --git a/apps/hadis/migrations/0070_migrate_transmitter_reliability_data.py b/apps/hadis/migrations/0070_migrate_transmitter_reliability_data.py deleted file mode 100644 index 0f990d6..0000000 --- a/apps/hadis/migrations/0070_migrate_transmitter_reliability_data.py +++ /dev/null @@ -1,109 +0,0 @@ -# Migration to handle data conversion for transmitter reliability field -from django.db import migrations - - -def create_reliability_objects(apps, schema_editor): - """Create TransmitterReliability objects for each reliability level""" - TransmitterReliability = apps.get_model('hadis', 'TransmitterReliability') - - # Define the reliability levels with their data - reliability_data = [ - { - 'title': [ - {'text': 'Very Reliable', 'language_code': 'en'}, - {'text': 'بسیار قابل اعتماد', 'language_code': 'fa'}, - {'text': 'Очень надежный', 'language_code': 'ru'} - ], - 'color': 'green', - 'value': 'very_reliable' - }, - { - 'title': [ - {'text': 'Reliable', 'language_code': 'en'}, - {'text': 'قابل اعتماد', 'language_code': 'fa'}, - {'text': 'Надежный', 'language_code': 'ru'} - ], - 'color': 'blue', - 'value': 'reliable' - }, - { - 'title': [ - {'text': 'Acceptable', 'language_code': 'en'}, - {'text': 'قابل قبول', 'language_code': 'fa'}, - {'text': 'Приемлемый', 'language_code': 'ru'} - ], - 'color': 'yellow', - 'value': 'acceptable' - }, - { - 'title': [ - {'text': 'Weak', 'language_code': 'en'}, - {'text': 'ضعیف', 'language_code': 'fa'}, - {'text': 'Слабый', 'language_code': 'ru'} - ], - 'color': 'orange', - 'value': 'weak' - }, - { - 'title': [ - {'text': 'Very Weak', 'language_code': 'en'}, - {'text': 'بسیار ضعیف', 'language_code': 'fa'}, - {'text': 'Очень слабый', 'language_code': 'ru'} - ], - 'color': 'red', - 'value': 'very_weak' - }, - { - 'title': [ - {'text': 'Unknown', 'language_code': 'en'}, - {'text': 'نامشخص', 'language_code': 'fa'}, - {'text': 'Неизвестный', 'language_code': 'ru'} - ], - 'color': 'gray', - 'value': 'unknown' - } - ] - - reliability_objects = {} - for data in reliability_data: - obj = TransmitterReliability.objects.create( - title=data['title'], - color=data['color'] - ) - reliability_objects[data['value']] = obj - - return reliability_objects - - -def migrate_transmitter_data(apps, schema_editor): - """Migrate existing transmitter reliability data""" - Transmitters = apps.get_model('hadis', 'Transmitters') - - # Create reliability objects - reliability_objects = create_reliability_objects(apps, schema_editor) - - # Update all transmitters to use the new foreign key references - for transmitter in Transmitters.objects.all(): - old_value = getattr(transmitter, 'reliability', None) - if old_value and old_value in reliability_objects: - transmitter.reliability = reliability_objects[old_value] - transmitter.save(update_fields=['reliability']) - elif old_value == 'unknown' or not old_value: - # Default to unknown if no value or unknown - transmitter.reliability = reliability_objects.get('unknown') - transmitter.save(update_fields=['reliability']) - - -def reverse_migrate(apps, schema_editor): - """Reverse migration - not needed since we're changing field types""" - pass - - -class Migration(migrations.Migration): - dependencies = [ - ('hadis', '0069_alter_transmitters_reliability'), - ] - - operations = [ - migrations.RunPython(migrate_transmitter_data, reverse_migrate), - ] diff --git a/apps/hadis/migrations/0071_merge_20251223_1055.py b/apps/hadis/migrations/0071_merge_20251223_1055.py deleted file mode 100644 index 1aeb506..0000000 --- a/apps/hadis/migrations/0071_merge_20251223_1055.py +++ /dev/null @@ -1,12 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-23 10:55 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0070_alter_transmitters_reliability"), - ("hadis", "0070_migrate_transmitter_reliability_data"), - ] - - operations = [] diff --git a/apps/hadis/migrations/0072_transmitterreliability_slug.py b/apps/hadis/migrations/0072_transmitterreliability_slug.py deleted file mode 100644 index ce0b4e6..0000000 --- a/apps/hadis/migrations/0072_transmitterreliability_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-23 10:55 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0071_merge_20251223_1055"), - ] - - operations = [ - migrations.AddField( - model_name="transmitterreliability", - name="slug", - field=models.SlugField( - blank=True, max_length=255, null=True, verbose_name="slug" - ), - ), - ] diff --git a/apps/hadis/migrations/0073_hadisstatus_slug.py b/apps/hadis/migrations/0073_hadisstatus_slug.py deleted file mode 100644 index c615bac..0000000 --- a/apps/hadis/migrations/0073_hadisstatus_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-23 12:43 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0072_transmitterreliability_slug"), - ] - - operations = [ - migrations.AddField( - model_name="hadisstatus", - name="slug", - field=models.SlugField( - blank=True, max_length=255, null=True, verbose_name="slug" - ), - ), - ] diff --git a/apps/hadis/migrations/0074_alter_hadisstatus_slug.py b/apps/hadis/migrations/0074_alter_hadisstatus_slug.py deleted file mode 100644 index 97961ae..0000000 --- a/apps/hadis/migrations/0074_alter_hadisstatus_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-23 12:53 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0073_hadisstatus_slug"), - ] - - operations = [ - migrations.AlterField( - model_name="hadisstatus", - name="slug", - field=models.SlugField( - blank=True, max_length=255, unique=True, verbose_name="slug" - ), - ), - ] diff --git a/apps/hadis/migrations/0075_opinionstatus.py b/apps/hadis/migrations/0075_opinionstatus.py deleted file mode 100644 index 57e4dd4..0000000 --- a/apps/hadis/migrations/0075_opinionstatus.py +++ /dev/null @@ -1,53 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-23 13:30 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0074_alter_hadisstatus_slug"), - ] - - operations = [ - migrations.CreateModel( - name="OpinionStatus", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("title", models.JSONField(default=list, verbose_name="Title")), - ( - "slug", - models.SlugField( - blank=True, max_length=255, null=True, verbose_name="slug" - ), - ), - ( - "color", - models.CharField( - choices=[ - ("red", "Red"), - ("green", "Green"), - ("blue", "Blue"), - ("yellow", "Yellow"), - ("orange", "Orange"), - ("purple", "Purple"), - ("gray", "Gray"), - ], - max_length=20, - verbose_name="color", - ), - ), - ], - options={ - "verbose_name": "transmitter reliability", - "verbose_name_plural": "transmitter reliability", - }, - ), - ] diff --git a/apps/hadis/migrations/0076_alter_transmitteropinion_status.py b/apps/hadis/migrations/0076_alter_transmitteropinion_status.py deleted file mode 100644 index 8e87b1a..0000000 --- a/apps/hadis/migrations/0076_alter_transmitteropinion_status.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-23 13:57 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0075_opinionstatus"), - ] - - operations = [ - migrations.AlterField( - model_name="transmitteropinion", - name="status", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="opinions", - to="hadis.opinionstatus", - verbose_name="opinion status", - ), - ), - ] diff --git a/apps/hadis/migrations/0077_alter_transmitteropinion_status.py b/apps/hadis/migrations/0077_alter_transmitteropinion_status.py deleted file mode 100644 index ccbaec0..0000000 --- a/apps/hadis/migrations/0077_alter_transmitteropinion_status.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-23 14:02 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0076_alter_transmitteropinion_status"), - ] - - operations = [ - migrations.AlterField( - model_name="transmitteropinion", - name="status", - field=models.ForeignKey( - blank=True, - default=1, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="opinions", - to="hadis.opinionstatus", - verbose_name="opinion status", - ), - ), - ] diff --git a/apps/hadis/migrations/0078_alter_transmitteropinion_status.py b/apps/hadis/migrations/0078_alter_transmitteropinion_status.py deleted file mode 100644 index 8052de2..0000000 --- a/apps/hadis/migrations/0078_alter_transmitteropinion_status.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-23 14:03 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0077_alter_transmitteropinion_status"), - ] - - operations = [ - migrations.AlterField( - model_name="transmitteropinion", - name="status", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="opinions", - to="hadis.opinionstatus", - verbose_name="opinion status", - ), - ), - ] diff --git a/apps/hadis/migrations/0079_remove_transmitteropinion_status.py b/apps/hadis/migrations/0079_remove_transmitteropinion_status.py deleted file mode 100644 index 49222e9..0000000 --- a/apps/hadis/migrations/0079_remove_transmitteropinion_status.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-23 14:08 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0078_alter_transmitteropinion_status"), - ] - - operations = [ - migrations.RemoveField( - model_name="transmitteropinion", - name="status", - ), - ] diff --git a/apps/hadis/migrations/0080_transmitteropinion_status.py b/apps/hadis/migrations/0080_transmitteropinion_status.py deleted file mode 100644 index db31e5b..0000000 --- a/apps/hadis/migrations/0080_transmitteropinion_status.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-23 14:09 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0079_remove_transmitteropinion_status"), - ] - - operations = [ - migrations.AddField( - model_name="transmitteropinion", - name="status", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="opinions", - to="hadis.opinionstatus", - verbose_name="opinion status", - ), - ), - ] diff --git a/apps/hadis/migrations/0081_alter_hadistransmitter_status.py b/apps/hadis/migrations/0081_alter_hadistransmitter_status.py deleted file mode 100644 index b36a679..0000000 --- a/apps/hadis/migrations/0081_alter_hadistransmitter_status.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-24 11:58 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0080_transmitteropinion_status"), - ] - - operations = [ - migrations.AlterField( - model_name="hadistransmitter", - name="status", - field=models.ForeignKey( - blank=True, - help_text="Reliability status of the narrator", - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="hadis_transmitters", - to="hadis.transmitterreliability", - verbose_name="reliability status", - ), - ), - ] diff --git a/apps/hadis/migrations/0082_remove_hadistransmitter_status.py b/apps/hadis/migrations/0082_remove_hadistransmitter_status.py deleted file mode 100644 index effe156..0000000 --- a/apps/hadis/migrations/0082_remove_hadistransmitter_status.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-24 12:11 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0081_alter_hadistransmitter_status"), - ] - - operations = [ - migrations.RemoveField( - model_name="hadistransmitter", - name="status", - ), - ] diff --git a/apps/hadis/migrations/0083_auto_20251224_1214.py b/apps/hadis/migrations/0083_auto_20251224_1214.py deleted file mode 100644 index 1daea60..0000000 --- a/apps/hadis/migrations/0083_auto_20251224_1214.py +++ /dev/null @@ -1,15 +0,0 @@ -from django.db import migrations - -class Migration(migrations.Migration): - - dependencies = [ - ('hadis', '0082_remove_hadistransmitter_status'), # Keep your actual dependency here - ] - - operations = [ - # This tells Django: "Run this SQL command, but don't try to update your internal model state" - migrations.RunSQL( - sql="ALTER TABLE hadis_hadistransmitter DROP COLUMN status;", - reverse_sql="ALTER TABLE hadis_hadistransmitter ADD COLUMN status varchar(255);" # Optional fallback - ), - ] \ No newline at end of file diff --git a/apps/hadis/migrations/0084_hadistransmitter_status.py b/apps/hadis/migrations/0084_hadistransmitter_status.py deleted file mode 100644 index 4f7755b..0000000 --- a/apps/hadis/migrations/0084_hadistransmitter_status.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-24 12:32 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0083_auto_20251224_1214"), - ] - - operations = [ - migrations.AddField( - model_name="hadistransmitter", - name="status", - field=models.ForeignKey( - blank=True, - help_text="Reliability status of the narrator", - null=True, - on_delete=django.db.models.deletion.SET_NULL, - related_name="hadis_transmitters", - to="hadis.transmitterreliability", - verbose_name="reliability status", - ), - ), - ] diff --git a/apps/hadis/migrations/0085_hadistransmitter_hadis_hadis_hadis_i_d04e3a_idx_and_more.py b/apps/hadis/migrations/0085_hadistransmitter_hadis_hadis_hadis_i_d04e3a_idx_and_more.py deleted file mode 100644 index bde1c87..0000000 --- a/apps/hadis/migrations/0085_hadistransmitter_hadis_hadis_hadis_i_d04e3a_idx_and_more.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-24 14:10 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0084_hadistransmitter_status"), - ] - - operations = [ - migrations.AddIndex( - model_name="hadistransmitter", - index=models.Index( - fields=["hadis", "order"], name="hadis_hadis_hadis_i_d04e3a_idx" - ), - ), - migrations.AddIndex( - model_name="referenceimage", - index=models.Index( - fields=["reference", "priority"], name="hadis_refer_referen_a37840_idx" - ), - ), - ] diff --git a/apps/hadis/migrations/0086_alter_opinionstatus_options_and_more.py b/apps/hadis/migrations/0086_alter_opinionstatus_options_and_more.py deleted file mode 100644 index 454b9d7..0000000 --- a/apps/hadis/migrations/0086_alter_opinionstatus_options_and_more.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-27 09:42 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0085_hadistransmitter_hadis_hadis_hadis_i_d04e3a_idx_and_more"), - ] - - operations = [ - migrations.AlterModelOptions( - name="opinionstatus", - options={ - "verbose_name": "Opinion Status", - "verbose_name_plural": "Opinion Statuses", - }, - ), - migrations.AlterModelOptions( - name="transmitterreliability", - options={ - "verbose_name": "Transmitter Reliability", - "verbose_name_plural": "Transmitter Reliabilities", - }, - ), - ] diff --git a/apps/hadis/migrations/0087_contentrelease.py b/apps/hadis/migrations/0087_contentrelease.py deleted file mode 100644 index 717ef51..0000000 --- a/apps/hadis/migrations/0087_contentrelease.py +++ /dev/null @@ -1,44 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-27 10:32 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0086_alter_opinionstatus_options_and_more"), - ] - - operations = [ - migrations.CreateModel( - name="ContentRelease", - fields=[ - ( - "id", - models.BigAutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "version_name", - models.CharField(max_length=50, verbose_name="Version Name"), - ), - ( - "published_at", - models.DateTimeField( - auto_now_add=True, verbose_name="Published Date" - ), - ), - ( - "description", - models.TextField(blank=True, verbose_name="Release Description"), - ), - ("is_active", models.BooleanField(default=True, verbose_name="Active")), - ], - options={ - "ordering": ["-published_at"], - }, - ), - ] diff --git a/apps/hadis/migrations/0088_merge_0007_auto_20250321_2007_0087_contentrelease.py b/apps/hadis/migrations/0088_merge_0007_auto_20250321_2007_0087_contentrelease.py deleted file mode 100644 index fb16355..0000000 --- a/apps/hadis/migrations/0088_merge_0007_auto_20250321_2007_0087_contentrelease.py +++ /dev/null @@ -1,12 +0,0 @@ -# Generated by Django 4.2.27 on 2026-01-04 11:14 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("hadis", "0007_auto_20250321_2007"), - ("hadis", "0087_contentrelease"), - ] - - operations = [] diff --git a/apps/hadis/models/reference.py b/apps/hadis/models/reference.py index b8912c7..1e74e95 100644 --- a/apps/hadis/models/reference.py +++ b/apps/hadis/models/reference.py @@ -141,6 +141,10 @@ class BookAuthor(models.Model): Model for book reference authors """ name = models.JSONField(default = list , verbose_name=_('Name')) + birth_year_hijri = models.IntegerField(verbose_name=_("Birth Year (Hijri)"), null=True, blank=True) + death_year_hijri = models.IntegerField(verbose_name=_("Death Year (Hijri)"), null=True, blank=True) + birth_year_miladi = models.IntegerField(verbose_name=_("Birth Year (Miladi)"), null=True, blank=True) + death_year_miladi = models.IntegerField(verbose_name=_("Death Year (Miladi)"), null=True, blank=True) book_references = models.ManyToManyField( BookReference, related_name='authors', diff --git a/apps/library/migrations/0001_initial.py b/apps/library/migrations/0001_initial.py index 151cd03..1faddc9 100644 --- a/apps/library/migrations/0001_initial.py +++ b/apps/library/migrations/0001_initial.py @@ -1,123 +1,323 @@ -# Generated by Django 5.1.8 on 2025-04-03 00:05 +# Generated by Django 4.2.27 on 2026-01-22 10:48 -import django.db.models.deletion -import filer.fields.image +import dj_language.field 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.FILER_IMAGE_MODEL), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("dj_language", "0002_auto_20220120_1344"), ] operations = [ migrations.CreateModel( - name='Category', + name="Book", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255)), - ('slug', models.SlugField(max_length=255, unique=True)), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255)), + ("slug", models.SlugField(max_length=255, unique=True)), + ("slogan", models.CharField(blank=True, max_length=300, null=True)), + ( + "summary_title", + models.CharField( + blank=True, help_text="Summary Title", max_length=512, null=True + ), + ), + ( + "summary", + models.CharField( + blank=True, help_text="Summary", max_length=512, null=True + ), + ), + ( + "description", + models.TextField(blank=True, help_text="could be null", null=True), + ), + ( + "thumbnail", + models.ImageField( + blank=True, + help_text="image allowed", + null=True, + upload_to="book_thumbnails/", + ), + ), + ("publisher", models.CharField(blank=True, max_length=655, null=True)), + ( + "year_of_publication", + models.CharField(blank=True, max_length=255, null=True), + ), + ("author", models.CharField(blank=True, max_length=255, null=True)), + ("isbn", models.CharField(blank=True, max_length=255, null=True)), + ( + "numnber_of_volume", + models.CharField(blank=True, max_length=255, null=True), + ), + ( + "main_themes", + models.JSONField( + blank=True, + default=list, + help_text="List of main themes", + verbose_name="Main Themes", + ), + ), + ( + "notable_works", + models.JSONField( + blank=True, + default=list, + help_text="List of notable works", + verbose_name="Notable Works", + ), + ), + ( + "pages_count", + models.CharField( + help_text="eg. 34", + max_length=255, + null=True, + verbose_name="Number of Pages", + ), + ), + ("status", models.BooleanField(default=True, verbose_name="status")), + ("pin", models.BooleanField(default=True, verbose_name="Pin to top")), + ( + "view_count", + models.PositiveBigIntegerField( + default=0, verbose_name="view count" + ), + ), + ( + "download_count", + models.PositiveBigIntegerField( + default=0, verbose_name="view count" + ), + ), + ( + "file_type", + models.CharField( + choices=[("pdf", "Pdf"), ("epub", "Epub"), ("docx", "Docx")], + default="pdf", + max_length=16, + verbose_name="File Type", + ), + ), + ( + "book_file", + models.FileField( + blank=True, + max_length=550, + null=True, + upload_to="books", + verbose_name="Book File", + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), ], options={ - 'verbose_name': 'Category', - 'verbose_name_plural': 'Categories', + "verbose_name": "Book", + "verbose_name_plural": "Books", }, ), migrations.CreateModel( - name='Book', + name="Category", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255)), - ('slug', models.SlugField(max_length=255, unique=True)), - ('summary', models.CharField(blank=True, help_text='could be null', max_length=512, null=True)), - ('description', models.TextField(blank=True, help_text='could be null', null=True)), - ('author', models.CharField(blank=True, max_length=255, null=True)), - ('pages_count', models.CharField(help_text='eg. 34', max_length=255, null=True, verbose_name='Number of Pages')), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('pin', models.BooleanField(default=True, verbose_name='Pin to top')), - ('view_count', models.PositiveBigIntegerField(default=0, verbose_name='view count')), - ('download_count', models.PositiveBigIntegerField(default=0, verbose_name='view count')), - ('file_type', models.CharField(choices=[('pdf', 'Pdf'), ('epub', 'Epub'), ('docx', 'Docx')], default='pdf', max_length=16, verbose_name='File Type')), - ('book_file', models.FileField(blank=True, max_length=550, null=True, upload_to='books', verbose_name='Book File')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('thumbnail', filer.fields.image.FilerImageField(blank=True, help_text='image allowed', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.FILER_IMAGE_MODEL)), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255)), + ("slug", models.SlugField(max_length=255, unique=True)), + ("status", models.BooleanField(default=True, verbose_name="status")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), ], options={ - 'verbose_name': 'Book', - 'verbose_name_plural': 'Books', + "verbose_name": "Category", + "verbose_name_plural": "Categories", }, ), migrations.CreateModel( - name='BookCollection', + name="BookDownload", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255)), - ('summary', models.CharField(blank=True, help_text='could be null', max_length=512, null=True)), - ('display_position', models.CharField(choices=[('pinned', 'Pinned'), ('middle', 'Middle Section'), ('bottom', 'Bottom Section')], default='pinned', max_length=20, verbose_name='Display Position')), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('order', models.IntegerField(default=0, verbose_name='order')), - ('books', models.ManyToManyField(blank=True, related_name='related_collections_books', to='library.book', verbose_name='Books')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("status", models.BooleanField(default=True, verbose_name="status")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "book", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="downloads", + to="library.book", + verbose_name="book", + ), + ), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="book_downloads", + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), + ), ], options={ - 'verbose_name': 'Book Collection', - 'verbose_name_plural': 'Book Collections', + "verbose_name": "Book Download", + "verbose_name_plural": "Book Downloads", + "ordering": ("-created_at",), }, ), - migrations.AddField( - model_name='book', - name='collections', - field=models.ManyToManyField(blank=True, related_name='related_collections', to='library.bookcollection', verbose_name='collections'), - ), migrations.CreateModel( - name='BottomBookCollection', + name="BookCollection", fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255)), + ("slug", models.SlugField(max_length=255, unique=True)), + ( + "summary", + models.CharField( + blank=True, help_text="could be null", max_length=512, null=True + ), + ), + ("pin_top", models.BooleanField(default=True, verbose_name="pin top")), + ( + "display_position", + models.CharField( + choices=[("pinned", "Pinned"), ("middle", "Middle Section")], + default="pinned", + max_length=20, + verbose_name="Display Position", + ), + ), + ("status", models.BooleanField(default=True, verbose_name="status")), + ("order", models.IntegerField(default=0, verbose_name="order")), + ( + "books", + models.ManyToManyField( + blank=True, + related_name="related_collections_books", + to="library.book", + verbose_name="Books", + ), + ), ], options={ - 'verbose_name': 'Bottom Section Book Collection', - 'verbose_name_plural': 'Bottom Section Book Collections', - 'proxy': True, - 'indexes': [], - 'constraints': [], + "verbose_name": "Book Collection", + "verbose_name_plural": "Book Collections", }, - bases=('library.bookcollection',), + ), + migrations.AddField( + model_name="book", + name="categories", + field=models.ManyToManyField( + blank=True, + related_name="related_categories", + to="library.category", + verbose_name="categories", + ), + ), + migrations.AddField( + model_name="book", + name="collections", + field=models.ManyToManyField( + blank=True, + related_name="related_collections", + to="library.bookcollection", + verbose_name="collections", + ), + ), + migrations.AddField( + model_name="book", + name="language", + field=dj_language.field.LanguageField( + blank=True, + default=69, + limit_choices_to={"status": True}, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="+", + to="dj_language.language", + verbose_name="Language", + ), ), migrations.CreateModel( - name='MiddleBookCollection', - fields=[ - ], + name="MiddleBookCollection", + fields=[], options={ - 'verbose_name': 'Middle Section Book Collection', - 'verbose_name_plural': 'Middle Section Book Collections', - 'proxy': True, - 'indexes': [], - 'constraints': [], + "verbose_name": "Middle Section Book Collection", + "verbose_name_plural": "Middle Section Book Collections", + "proxy": True, + "indexes": [], + "constraints": [], }, - bases=('library.bookcollection',), + bases=("library.bookcollection",), ), migrations.CreateModel( - name='PinnedBookCollection', - fields=[ - ], + name="PinnedBookCollection", + fields=[], options={ - 'verbose_name': 'Pinned Book Collection', - 'verbose_name_plural': 'Pinned Book Collections', - 'proxy': True, - 'indexes': [], - 'constraints': [], + "verbose_name": "Pinned Book Collection", + "verbose_name_plural": "Pinned Book Collections", + "proxy": True, + "indexes": [], + "constraints": [], }, - bases=('library.bookcollection',), - ), - migrations.AddField( - model_name='book', - name='categories', - field=models.ManyToManyField(blank=True, related_name='related_categories', to='library.category', verbose_name='categories'), + bases=("library.bookcollection",), ), - ] \ No newline at end of file + ] diff --git a/apps/library/migrations/0002_alter_book_thumbnail.py b/apps/library/migrations/0002_alter_book_thumbnail.py deleted file mode 100644 index c4a6803..0000000 --- a/apps/library/migrations/0002_alter_book_thumbnail.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.8 on 2025-04-03 01:24 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('library', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='book', - name='thumbnail', - field=models.ImageField(blank=True, help_text='image allowed', null=True, upload_to='book_thumbnails/'), - ), - ] diff --git a/apps/library/migrations/0002_alter_bookcollection_title.py b/apps/library/migrations/0002_alter_bookcollection_title.py deleted file mode 100644 index 0efec27..0000000 --- a/apps/library/migrations/0002_alter_bookcollection_title.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.7 on 2025-03-20 14:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('library', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='bookcollection', - name='title', - field=models.CharField(max_length=255), - ), - ] diff --git a/apps/library/migrations/0003_auto_20250321_0119.py b/apps/library/migrations/0003_auto_20250321_0119.py deleted file mode 100644 index a64ffc2..0000000 --- a/apps/library/migrations/0003_auto_20250321_0119.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 3.2.7 on 2025-03-21 01:19 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('library', '0002_alter_bookcollection_title'), - ] - - operations = [ - migrations.AddField( - model_name='book', - name='author', - field=models.CharField(blank=True, max_length=255, null=True), - ), - migrations.AddField( - model_name='book', - name='download_count', - field=models.PositiveBigIntegerField(default=0, verbose_name='view count'), - ), - migrations.DeleteModel( - name='BookDownload', - ), - ] diff --git a/apps/library/migrations/0003_bookcollection_pin_top.py b/apps/library/migrations/0003_bookcollection_pin_top.py deleted file mode 100644 index 1987d92..0000000 --- a/apps/library/migrations/0003_bookcollection_pin_top.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.8 on 2025-04-15 01:14 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('library', '0002_alter_book_thumbnail'), - ] - - operations = [ - migrations.AddField( - model_name='bookcollection', - name='pin_top', - field=models.BooleanField(default=True, verbose_name='pin top'), - ), - ] diff --git a/apps/library/migrations/0004_bookcollection_slug.py b/apps/library/migrations/0004_bookcollection_slug.py deleted file mode 100644 index c1a17cc..0000000 --- a/apps/library/migrations/0004_bookcollection_slug.py +++ /dev/null @@ -1,19 +0,0 @@ -# Generated by Django 5.1.8 on 2025-04-15 01:44 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('library', '0003_bookcollection_pin_top'), - ] - - operations = [ - migrations.AddField( - model_name='bookcollection', - name='slug', - field=models.SlugField(default='1', max_length=255, unique=True), - preserve_default=False, - ), - ] diff --git a/apps/library/migrations/0004_remove_category_books.py b/apps/library/migrations/0004_remove_category_books.py deleted file mode 100644 index 54c286b..0000000 --- a/apps/library/migrations/0004_remove_category_books.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 3.2.7 on 2025-03-21 20:07 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('library', '0003_auto_20250321_0119'), - ] - - operations = [ - migrations.RemoveField( - model_name='category', - name='books', - ), - ] diff --git a/apps/library/migrations/0005_bookdownload_delete_bottombookcollection_and_more.py b/apps/library/migrations/0005_bookdownload_delete_bottombookcollection_and_more.py deleted file mode 100644 index 3263687..0000000 --- a/apps/library/migrations/0005_bookdownload_delete_bottombookcollection_and_more.py +++ /dev/null @@ -1,40 +0,0 @@ -# Generated by Django 5.1.8 on 2025-04-23 10:30 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('library', '0004_bookcollection_slug'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='BookDownload', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('book', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='downloads', to='library.book', verbose_name='book')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='book_downloads', to=settings.AUTH_USER_MODEL, verbose_name='user')), - ], - options={ - 'verbose_name': 'Book Download', - 'verbose_name_plural': 'Book Downloads', - 'ordering': ('-created_at',), - }, - ), - migrations.DeleteModel( - name='BottomBookCollection', - ), - migrations.AlterField( - model_name='bookcollection', - name='display_position', - field=models.CharField(choices=[('pinned', 'Pinned'), ('middle', 'Middle Section')], default='pinned', max_length=20, verbose_name='Display Position'), - ), - ] diff --git a/apps/library/migrations/0006_remove_book_author_book_isbn_book_numnber_of_volume_and_more.py b/apps/library/migrations/0006_remove_book_author_book_isbn_book_numnber_of_volume_and_more.py deleted file mode 100644 index 5a6c7ad..0000000 --- a/apps/library/migrations/0006_remove_book_author_book_isbn_book_numnber_of_volume_and_more.py +++ /dev/null @@ -1,52 +0,0 @@ -# Generated by Django 5.1.8 on 2025-05-04 15:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('library', '0005_bookdownload_delete_bottombookcollection_and_more'), - ] - - operations = [ - migrations.RemoveField( - model_name='book', - name='author', - ), - migrations.AddField( - model_name='book', - name='isbn', - field=models.CharField(blank=True, max_length=255, null=True), - ), - migrations.AddField( - model_name='book', - name='numnber_of_volume', - field=models.CharField(blank=True, max_length=255, null=True), - ), - migrations.AddField( - model_name='book', - name='publisher', - field=models.CharField(blank=True, max_length=655, null=True), - ), - migrations.AddField( - model_name='book', - name='slogan', - field=models.CharField(blank=True, max_length=300, null=True), - ), - migrations.AddField( - model_name='book', - name='summary_title', - field=models.CharField(blank=True, help_text='Summary Title', max_length=512, null=True), - ), - migrations.AddField( - model_name='book', - name='year_of_publication', - field=models.CharField(blank=True, max_length=255, null=True), - ), - migrations.AlterField( - model_name='book', - name='summary', - field=models.CharField(blank=True, help_text='Summary', max_length=512, null=True), - ), - ] diff --git a/apps/library/migrations/0007_auto_20251203_1529.py b/apps/library/migrations/0007_auto_20251203_1529.py deleted file mode 100644 index 673b452..0000000 --- a/apps/library/migrations/0007_auto_20251203_1529.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.8 on 2025-12-03 15:29 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('library', '0006_remove_book_author_book_isbn_book_numnber_of_volume_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='book', - name='author', - field=models.CharField(blank=True, max_length=255, null=True), - ), - ] diff --git a/apps/library/migrations/0008_auto_20251203_1533.py b/apps/library/migrations/0008_auto_20251203_1533.py deleted file mode 100644 index 532440e..0000000 --- a/apps/library/migrations/0008_auto_20251203_1533.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 5.1.8 on 2025-12-03 15:33 - -from django.db import migrations, models -import dj_language.field - - -class Migration(migrations.Migration): - - dependencies = [ - ('library', '0007_auto_20251203_1529'), - ('dj_language', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='book', - name='language', - field=dj_language.field.LanguageField(blank=True, null=True, on_delete=models.SET_NULL, to='dj_language.language', verbose_name='Language'), - ), - migrations.AddField( - model_name='book', - name='main_themes', - field=models.JSONField(blank=True, default=list, help_text='List of main themes', verbose_name='Main Themes'), - ), - migrations.AddField( - model_name='book', - name='notable_works', - field=models.JSONField(blank=True, default=list, help_text='List of notable works', verbose_name='Notable Works'), - ), - ] diff --git a/apps/library/migrations/0009_alter_book_language.py b/apps/library/migrations/0009_alter_book_language.py deleted file mode 100644 index e525a47..0000000 --- a/apps/library/migrations/0009_alter_book_language.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 5.1.8 on 2025-12-03 23:32 - -import dj_language.field -import django.db.models.deletion -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('dj_language', '0002_auto_20220120_1344'), - ('library', '0008_auto_20251203_1533'), - ] - - operations = [ - migrations.AlterField( - model_name='book', - name='language', - field=dj_language.field.LanguageField(blank=True, default=69, limit_choices_to={'status': True}, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='dj_language.language', verbose_name='Language'), - ), - ] diff --git a/apps/library/migrations/0010_merge_20260104_1114.py b/apps/library/migrations/0010_merge_20260104_1114.py deleted file mode 100644 index 6725be9..0000000 --- a/apps/library/migrations/0010_merge_20260104_1114.py +++ /dev/null @@ -1,12 +0,0 @@ -# Generated by Django 4.2.27 on 2026-01-04 11:14 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("library", "0004_remove_category_books"), - ("library", "0009_alter_book_language"), - ] - - operations = [] diff --git a/apps/podcast/migrations/0001_initial.py b/apps/podcast/migrations/0001_initial.py index ba1b911..9c17a52 100755 --- a/apps/podcast/migrations/0001_initial.py +++ b/apps/podcast/migrations/0001_initial.py @@ -1,12 +1,11 @@ -# Generated by Django 5.1.8 on 2025-05-06 11:46 +# Generated by Django 4.2.27 on 2026-01-22 10:48 -import django.db.models.deletion from django.conf import settings from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): - initial = True dependencies = [ @@ -15,156 +14,423 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='PodcastCategory', + name="PodcastCategory", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('slug', models.SlugField(allow_unicode=True, unique=True, verbose_name='slug')), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('order', models.PositiveIntegerField(default=0, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255, verbose_name="title")), + ( + "slug", + models.SlugField( + allow_unicode=True, unique=True, verbose_name="slug" + ), + ), + ("status", models.BooleanField(default=True, verbose_name="status")), + ("order", models.PositiveIntegerField(default=0, verbose_name="order")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), ], options={ - 'verbose_name': 'Podcast Category', - 'verbose_name_plural': 'Podcast Categories', - 'ordering': ['order'], + "verbose_name": "Podcast Category", + "verbose_name_plural": "Podcast Categories", + "ordering": ["order"], }, ), migrations.CreateModel( - name='PodcastCollection', + name="PodcastCollection", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(help_text='This title will not be displayed anywhere', max_length=255)), - ('slug', models.SlugField(max_length=255, unique=True)), - ('summary', models.CharField(blank=True, help_text='could be null', max_length=512, null=True)), - ('pin_top', models.BooleanField(default=True, verbose_name='pin top')), - ('thumbnail', models.ImageField(blank=True, help_text='image allowed', null=True, upload_to='podcast/collection/')), - ('order', models.IntegerField(default=0, verbose_name='order')), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('display_position', models.CharField(choices=[('pinned', 'Pinned'), ('middle', 'Middle Section')], default='pinned', max_length=20, verbose_name='Display Position')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "title", + models.CharField( + help_text="This title will not be displayed anywhere", + max_length=255, + ), + ), + ("slug", models.SlugField(max_length=255, unique=True)), + ( + "summary", + models.CharField( + blank=True, help_text="could be null", max_length=512, null=True + ), + ), + ("pin_top", models.BooleanField(default=True, verbose_name="pin top")), + ( + "thumbnail", + models.ImageField( + blank=True, + help_text="image allowed", + null=True, + upload_to="podcast/collection/", + ), + ), + ("order", models.IntegerField(default=0, verbose_name="order")), + ("status", models.BooleanField(default=True, verbose_name="status")), + ( + "display_position", + models.CharField( + choices=[("pinned", "Pinned"), ("middle", "Middle Section")], + default="pinned", + max_length=20, + verbose_name="Display Position", + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), ], options={ - 'verbose_name': 'Podcast Collection', - 'verbose_name_plural': 'Podcasts Collections', + "verbose_name": "Podcast Collection", + "verbose_name_plural": "Podcasts Collections", }, ), migrations.CreateModel( - name='PodcastPlaylist', + name="PodcastPlaylist", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255, verbose_name="title")), + ( + "slug", + models.SlugField( + allow_unicode=True, + blank=True, + null=True, + unique=True, + verbose_name="slug", + ), + ), + ( + "slogan", + models.CharField( + blank=True, max_length=512, null=True, verbose_name="slogan" + ), + ), + ( + "description", + models.TextField(blank=True, null=True, verbose_name="description"), + ), + ( + "thumbnail", + models.ImageField( + blank=True, + null=True, + upload_to="podcast/playlist/thumbnails/", + verbose_name="thumbnail", + ), + ), + ("order", models.PositiveIntegerField(default=0, verbose_name="order")), + ("status", models.BooleanField(default=True, verbose_name="status")), + ( + "view_count", + models.PositiveBigIntegerField( + default=0, verbose_name="view count" + ), + ), + ( + "total_time", + models.DurationField( + blank=True, null=True, verbose_name="total time" + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "categories", + models.ManyToManyField( + blank=True, + related_name="playlists", + to="podcast.podcastcategory", + verbose_name="categories", + ), + ), ], options={ - 'verbose_name': 'Podcast Playlist', - 'verbose_name_plural': 'Podcast Playlists', + "verbose_name": "Podcast Playlist", + "verbose_name_plural": "Podcast Playlists", + "ordering": ["order", "-created_at"], }, ), migrations.CreateModel( - name='Podcast', + name="PodcastPlaylistInCollection", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, null=True)), - ('slug', models.SlugField(allow_unicode=True, unique=True)), - ('thumbnail', models.ImageField(blank=True, help_text='image allowed', null=True, upload_to='book_thumbnails/')), - ('description', models.TextField(null=True)), - ('audio_file', models.FileField(blank=True, null=True, upload_to='podcast/audio/')), - ('audio_time', models.TimeField()), - ('view_count', models.PositiveBigIntegerField(default=0, verbose_name='view count')), - ('download_count', models.PositiveBigIntegerField(default=0, verbose_name='view count')), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('categories', models.ManyToManyField(related_name='podcasts', to='podcast.podcastcategory', verbose_name='categories')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("order", models.PositiveIntegerField(default=0, verbose_name="order")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "collection", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="collection_playlists", + to="podcast.podcastcollection", + verbose_name="collection", + ), + ), + ( + "playlist", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="playlist_collections", + to="podcast.podcastplaylist", + verbose_name="playlist", + ), + ), ], options={ - 'verbose_name': 'Podcast', - 'verbose_name_plural': 'Podcasts', + "verbose_name": "Podcast Playlist in Collection", + "verbose_name_plural": "Podcast Playlists in Collections", + "ordering": ["order"], + "unique_together": {("collection", "playlist")}, }, ), + migrations.AddField( + model_name="podcastplaylist", + name="collections", + field=models.ManyToManyField( + blank=True, + related_name="related_playlists", + through="podcast.PodcastPlaylistInCollection", + to="podcast.podcastcollection", + verbose_name="collections", + ), + ), migrations.CreateModel( - name='MiddlePodcastCollection', + name="Podcast", fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255, null=True)), + ("slug", models.SlugField(allow_unicode=True, unique=True)), + ( + "thumbnail", + models.ImageField( + blank=True, + help_text="image allowed", + null=True, + upload_to="podcast_thumbnails/", + ), + ), + ("description", models.TextField(null=True)), + ( + "audio_file", + models.FileField(blank=True, null=True, upload_to="podcast/audio/"), + ), + ("audio_time", models.TimeField()), + ( + "view_count", + models.PositiveBigIntegerField( + default=0, verbose_name="view count" + ), + ), + ( + "download_count", + models.PositiveBigIntegerField( + default=0, verbose_name="download_count view count" + ), + ), + ("status", models.BooleanField(default=True, verbose_name="status")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "categories", + models.ManyToManyField( + blank=True, + related_name="podcasts", + to="podcast.podcastcategory", + verbose_name="categories", + ), + ), ], options={ - 'verbose_name': 'Middle Section Podcast Collection', - 'verbose_name_plural': 'Middle Section Podcast Collections', - 'proxy': True, - 'indexes': [], - 'constraints': [], + "verbose_name": "Podcast", + "verbose_name_plural": "Podcasts", }, - bases=('podcast.podcastcollection',), ), migrations.CreateModel( - name='PinnedPodcastCollection', - fields=[ - ], + name="MiddlePodcastCollection", + fields=[], options={ - 'verbose_name': 'Pinned Podcast Collection', - 'verbose_name_plural': 'Pinned Podcast Collections', - 'proxy': True, - 'indexes': [], - 'constraints': [], + "verbose_name": "Regular Collection (Middle Section)", + "verbose_name_plural": "Regular Collections (Middle Section)", + "proxy": True, + "indexes": [], + "constraints": [], }, - bases=('podcast.podcastcollection',), + bases=("podcast.podcastcollection",), ), migrations.CreateModel( - name='PodcastInCollection', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.PositiveIntegerField(default=0, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('collection', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='collection_podcasts', to='podcast.podcastcollection', verbose_name='collection')), - ('podcast', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='collection_items', to='podcast.podcast', verbose_name='podcast')), - ], + name="PinnedPodcastCollection", + fields=[], options={ - 'verbose_name': 'Podcast in Collection', - 'verbose_name_plural': 'Podcasts in Collections', - 'ordering': ['order'], - 'unique_together': {('collection', 'podcast')}, + "verbose_name": "Pinned Collection (Top Section)", + "verbose_name_plural": "Pinned Collections (Top Section)", + "proxy": True, + "indexes": [], + "constraints": [], }, - ), - migrations.AddField( - model_name='podcastcollection', - name='podcasts', - field=models.ManyToManyField(related_name='collections', through='podcast.PodcastInCollection', to='podcast.podcast', verbose_name='podcasts'), + bases=("podcast.podcastcollection",), ), migrations.CreateModel( - name='PlaylistItem', + name="UserPlaylist", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('priority', models.PositiveIntegerField(default=0, verbose_name='priority')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('podcast', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='playlist_appearances', to='podcast.podcast', verbose_name='podcast')), - ('playlist', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='playlist_items', to='podcast.podcastplaylist', verbose_name='playlist')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("status", models.BooleanField(default=True, verbose_name="status")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "podcast", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="user_playlists", + to="podcast.podcast", + verbose_name="podcast", + ), + ), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="podcast_playlists", + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), + ), ], options={ - 'verbose_name': 'Playlist Item', - 'verbose_name_plural': 'Playlist Items', - 'ordering': ['priority'], - 'unique_together': {('playlist', 'podcast')}, + "verbose_name": "User Playlist", + "verbose_name_plural": "User Playlists", + "unique_together": {("user", "podcast")}, }, ), migrations.CreateModel( - name='UserPlaylist', + name="PlaylistItem", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('podcast', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user_playlists', to='podcast.podcast', verbose_name='podcast')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='podcast_playlists', to=settings.AUTH_USER_MODEL, verbose_name='user')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "priority", + models.PositiveIntegerField(default=0, verbose_name="priority"), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "playlist", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="playlist_items", + to="podcast.podcastplaylist", + verbose_name="playlist", + ), + ), + ( + "podcast", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="playlist_appearances", + to="podcast.podcast", + verbose_name="podcast", + ), + ), ], options={ - 'verbose_name': 'User Playlist', - 'verbose_name_plural': 'User Playlists', - 'unique_together': {('user', 'podcast')}, + "verbose_name": "Playlist Item", + "verbose_name_plural": "Playlist Items", + "ordering": ["priority"], + "unique_together": {("playlist", "podcast")}, }, ), ] diff --git a/apps/podcast/migrations/0002_podcast_collections_alter_podcast_categories_and_more.py b/apps/podcast/migrations/0002_podcast_collections_alter_podcast_categories_and_more.py deleted file mode 100755 index cc6b6ac..0000000 --- a/apps/podcast/migrations/0002_podcast_collections_alter_podcast_categories_and_more.py +++ /dev/null @@ -1,39 +0,0 @@ -# Generated by Django 5.1.8 on 2025-05-06 12:31 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('podcast', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='podcast', - name='collections', - field=models.ManyToManyField(blank=True, related_name='related_podcasts', through='podcast.PodcastInCollection', to='podcast.podcastcollection', verbose_name='collections'), - ), - migrations.AlterField( - model_name='podcast', - name='categories', - field=models.ManyToManyField(blank=True, related_name='podcasts', to='podcast.podcastcategory', verbose_name='categories'), - ), - migrations.AlterField( - model_name='podcast', - name='download_count', - field=models.PositiveBigIntegerField(default=0, verbose_name='download_count view count'), - ), - migrations.AlterField( - model_name='podcastcollection', - name='podcasts', - field=models.ManyToManyField(related_name='related_collections_podcast', through='podcast.PodcastInCollection', to='podcast.podcast', verbose_name='podcasts'), - ), - migrations.AlterField( - model_name='podcastincollection', - name='podcast', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='podcast_collections', to='podcast.podcast', verbose_name='podcast'), - ), - ] diff --git a/apps/podcast/migrations/0003_refactor_podcast_models.py b/apps/podcast/migrations/0003_refactor_podcast_models.py deleted file mode 100644 index b7fc16e..0000000 --- a/apps/podcast/migrations/0003_refactor_podcast_models.py +++ /dev/null @@ -1,115 +0,0 @@ -# Generated by Django 3.2.4 on 2025-12-01 13:21 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('podcast', '0002_podcast_collections_alter_podcast_categories_and_more'), - ] - - operations = [ - migrations.CreateModel( - name='PodcastPlaylistInCollection', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.PositiveIntegerField(default=0, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ], - options={ - 'verbose_name': 'Podcast Playlist in Collection', - 'verbose_name_plural': 'Podcast Playlists in Collections', - 'ordering': ['order'], - }, - ), - migrations.AlterModelOptions( - name='middlepodcastcollection', - options={'verbose_name': 'Regular Collection (Middle Section)', 'verbose_name_plural': 'Regular Collections (Middle Section)'}, - ), - migrations.AlterModelOptions( - name='pinnedpodcastcollection', - options={'verbose_name': 'Pinned Collection (Top Section)', 'verbose_name_plural': 'Pinned Collections (Top Section)'}, - ), - migrations.AlterModelOptions( - name='podcastplaylist', - options={'ordering': ['order', '-created_at'], 'verbose_name': 'Podcast Playlist', 'verbose_name_plural': 'Podcast Playlists'}, - ), - migrations.RemoveField( - model_name='podcast', - name='collections', - ), - migrations.RemoveField( - model_name='podcastcollection', - name='podcasts', - ), - migrations.AddField( - model_name='podcastplaylist', - name='categories', - field=models.ManyToManyField(blank=True, related_name='playlists', to='podcast.PodcastCategory', verbose_name='categories'), - ), - migrations.AddField( - model_name='podcastplaylist', - name='description', - field=models.TextField(blank=True, null=True, verbose_name='description'), - ), - migrations.AddField( - model_name='podcastplaylist', - name='order', - field=models.PositiveIntegerField(default=0, verbose_name='order'), - ), - migrations.AddField( - model_name='podcastplaylist', - name='slogan', - field=models.CharField(blank=True, max_length=512, null=True, verbose_name='slogan'), - ), - migrations.AddField( - model_name='podcastplaylist', - name='slug', - field=models.SlugField(allow_unicode=True, blank=True, null=True, unique=True, verbose_name='slug'), - ), - migrations.AddField( - model_name='podcastplaylist', - name='status', - field=models.BooleanField(default=True, verbose_name='status'), - ), - migrations.AddField( - model_name='podcastplaylist', - name='thumbnail', - field=models.ImageField(blank=True, null=True, upload_to='podcast/playlist/thumbnails/', verbose_name='thumbnail'), - ), - migrations.AddField( - model_name='podcastplaylist', - name='total_time', - field=models.DurationField(blank=True, null=True, verbose_name='total time'), - ), - migrations.AddField( - model_name='podcastplaylist', - name='view_count', - field=models.PositiveBigIntegerField(default=0, verbose_name='view count'), - ), - migrations.DeleteModel( - name='PodcastInCollection', - ), - migrations.AddField( - model_name='podcastplaylistincollection', - name='collection', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='collection_playlists', to='podcast.podcastcollection', verbose_name='collection'), - ), - migrations.AddField( - model_name='podcastplaylistincollection', - name='playlist', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='playlist_collections', to='podcast.podcastplaylist', verbose_name='playlist'), - ), - migrations.AddField( - model_name='podcastplaylist', - name='collections', - field=models.ManyToManyField(blank=True, related_name='related_playlists', through='podcast.PodcastPlaylistInCollection', to='podcast.PodcastCollection', verbose_name='collections'), - ), - migrations.AlterUniqueTogether( - name='podcastplaylistincollection', - unique_together={('collection', 'playlist')}, - ), - ] diff --git a/apps/quiz/migrations/0001_initial.py b/apps/quiz/migrations/0001_initial.py index baf658e..a496dba 100644 --- a/apps/quiz/migrations/0001_initial.py +++ b/apps/quiz/migrations/0001_initial.py @@ -1,101 +1,220 @@ -import django.db.models.deletion +# Generated by Django 4.2.27 on 2026-01-22 10:48 + from django.conf import settings from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): - initial = True dependencies = [ - ('account', '0001_initial'), - ('course', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("course", "0001_initial"), + ("account", "0001_initial"), ] operations = [ migrations.CreateModel( - name='QuizRankUser', + name="Quiz", fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "title", + models.CharField( + help_text="Quiz Title", max_length=255, verbose_name="title" + ), + ), + ( + "description", + models.CharField( + blank=True, max_length=55, null=True, verbose_name="Description" + ), + ), + ("each_question_timing", models.PositiveIntegerField()), + ("status", models.BooleanField(default=True)), + ( + "lesson", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="quizzes", + to="course.courselesson", + verbose_name="lesson", + ), + ), ], options={ - 'verbose_name': 'Rank Quiz', - 'verbose_name_plural': 'Rank Quizzes', - 'proxy': True, - 'indexes': [], - 'constraints': [], + "verbose_name": "Quiz", + "verbose_name_plural": "Quizzes", + "ordering": ("-id",), }, - bases=('account.user',), ), migrations.CreateModel( - name='Quiz', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(help_text='Quiz Title', max_length=255, verbose_name='title')), - ('description', models.CharField(blank=True, max_length=55, null=True, verbose_name='Description')), - ('each_question_timing', models.PositiveIntegerField()), - ('status', models.BooleanField(default=True)), - ('lesson', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='quizzes', to='course.lesson', verbose_name='lesson')), - ], + name="QuizRankUser", + fields=[], options={ - 'verbose_name': 'Quiz', - 'verbose_name_plural': 'Quizzes', - 'ordering': ('-id',), + "verbose_name": "Rank Quiz", + "verbose_name_plural": "Rank Quizzes", + "proxy": True, + "indexes": [], + "constraints": [], }, + bases=("account.user",), ), migrations.CreateModel( - name='Question', + name="QuizParticipant", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('question', models.CharField(max_length=255)), - ('option1', models.CharField(max_length=255, verbose_name='option 1')), - ('option2', models.CharField(max_length=255, verbose_name='option 2')), - ('option3', models.CharField(max_length=255, verbose_name='option 3')), - ('option4', models.CharField(max_length=255, verbose_name='option 4')), - ('correct_answer', models.PositiveSmallIntegerField(choices=[(1, 'Option 1'), (2, 'Option 2'), (3, 'Option 3'), (4, 'Option 4')])), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('priority', models.IntegerField(blank=True, null=True)), - ('quiz', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='questions', to='quiz.quiz', verbose_name='quiz')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("started_at", models.DateTimeField(verbose_name="started at")), + ("ended_at", models.DateTimeField(verbose_name="ended at")), + ( + "total_timing", + models.PositiveIntegerField( + help_text="Seconds take to finish the quiz" + ), + ), + ("question_score", models.PositiveIntegerField()), + ("timing_score", models.PositiveIntegerField()), + ("total_score", models.PositiveIntegerField()), + ( + "quiz", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="participants", + to="quiz.quiz", + ), + ), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="uquizzes", + to=settings.AUTH_USER_MODEL, + verbose_name="user", + ), + ), ], options={ - 'verbose_name': 'Question', - 'verbose_name_plural': 'Questions', - 'ordering': ('-priority', '-id'), + "verbose_name": "Participant", + "verbose_name_plural": "Participants", + "ordering": ("-id",), }, ), migrations.CreateModel( - name='QuizParticipant', + name="Question", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('started_at', models.DateTimeField(verbose_name='started at')), - ('ended_at', models.DateTimeField(verbose_name='ended at')), - ('total_timing', models.PositiveIntegerField(help_text='Seconds take to finish the quiz')), - ('question_score', models.PositiveIntegerField()), - ('timing_score', models.PositiveIntegerField()), - ('total_score', models.PositiveIntegerField()), - ('quiz', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participants', to='quiz.quiz')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='uquizzes', to=settings.AUTH_USER_MODEL, verbose_name='user')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("question", models.CharField(max_length=255)), + ("option1", models.CharField(max_length=255, verbose_name="option 1")), + ("option2", models.CharField(max_length=255, verbose_name="option 2")), + ("option3", models.CharField(max_length=255, verbose_name="option 3")), + ("option4", models.CharField(max_length=255, verbose_name="option 4")), + ( + "correct_answer", + models.PositiveSmallIntegerField( + choices=[ + (1, "Option 1"), + (2, "Option 2"), + (3, "Option 3"), + (4, "Option 4"), + ] + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ("priority", models.IntegerField(blank=True, null=True)), + ( + "quiz", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="questions", + to="quiz.quiz", + verbose_name="quiz", + ), + ), ], options={ - 'verbose_name': 'Participant', - 'verbose_name_plural': 'Participants', - 'ordering': ('-id',), + "verbose_name": "Question", + "verbose_name_plural": "Questions", + "ordering": ("-priority", "-id"), }, ), migrations.CreateModel( - name='ParticipantAnswer', + name="ParticipantAnswer", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('option_num', models.PositiveSmallIntegerField(choices=[(1, 'Option 1'), (2, 'Option 2'), (3, 'Option 3'), (4, 'Option 4')], verbose_name='selected option')), - ('at_time', models.DateTimeField()), - ('answer_timing', models.PositiveSmallIntegerField(default=0, verbose_name='seconds take to answer')), - ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quiz.question')), - ('participant', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='quiz.quizparticipant')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "option_num", + models.PositiveSmallIntegerField( + choices=[ + (1, "Option 1"), + (2, "Option 2"), + (3, "Option 3"), + (4, "Option 4"), + ], + verbose_name="selected option", + ), + ), + ("at_time", models.DateTimeField()), + ( + "answer_timing", + models.PositiveSmallIntegerField( + default=0, verbose_name="seconds take to answer" + ), + ), + ( + "participant", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="answers", + to="quiz.quizparticipant", + ), + ), + ( + "question", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="quiz.question" + ), + ), ], options={ - 'verbose_name': 'User Quiz Answer', - 'verbose_name_plural': 'User Quiz Answers', - 'ordering': ('-id',), + "verbose_name": "User Quiz Answer", + "verbose_name_plural": "User Quiz Answers", + "ordering": ("-id",), }, ), - ] \ No newline at end of file + ] diff --git a/apps/quiz/migrations/0002_change_quiz_lesson_to_courselesson.py b/apps/quiz/migrations/0002_change_quiz_lesson_to_courselesson.py deleted file mode 100644 index fe81dbe..0000000 --- a/apps/quiz/migrations/0002_change_quiz_lesson_to_courselesson.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 5.1.8 on 2025-08-12 22:14 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('course', '0006_participant_is_active'), - ('quiz', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='quiz', - name='lesson', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='quizzes', to='course.courselesson', verbose_name='lesson'), - ), - ] diff --git a/apps/quiz/migrations/0002_quiz_description.py b/apps/quiz/migrations/0002_quiz_description.py deleted file mode 100644 index a7b0f71..0000000 --- a/apps/quiz/migrations/0002_quiz_description.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.4 on 2024-11-29 11:58 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('quiz', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='quiz', - name='description', - field=models.CharField(blank=True, max_length=55, null=True, verbose_name='Description'), - ), - ] diff --git a/apps/quiz/migrations/0003_merge_20260104_1113.py b/apps/quiz/migrations/0003_merge_20260104_1113.py deleted file mode 100644 index 828a82c..0000000 --- a/apps/quiz/migrations/0003_merge_20260104_1113.py +++ /dev/null @@ -1,12 +0,0 @@ -# Generated by Django 4.2.27 on 2026-01-04 11:13 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("quiz", "0002_change_quiz_lesson_to_courselesson"), - ("quiz", "0002_quiz_description"), - ] - - operations = [] diff --git a/apps/transaction/migrations/0001_initial.py b/apps/transaction/migrations/0001_initial.py index 6fc1605..3c50f2f 100644 --- a/apps/transaction/migrations/0001_initial.py +++ b/apps/transaction/migrations/0001_initial.py @@ -1,44 +1,209 @@ -# Generated by Django 5.1.8 on 2025-04-03 00:05 +# Generated by Django 4.2.27 on 2026-01-22 10:48 +import apps.transaction.models +from django.conf import settings +from django.db import migrations, models import django.db.models.deletion import phonenumber_field.modelfields import utils.validators -from django.conf import settings -from django.db import migrations, models class Migration(migrations.Migration): - initial = True dependencies = [ - ('course', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("course", "0001_initial"), ] operations = [ migrations.CreateModel( - name='TransactionParticipant', + name="TransactionParticipant", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "payment_method", + models.CharField( + choices=[ + ("receipt", "Receipt"), + ("free", "Free"), + ("Payment_Gateway", "Payment Gateway"), + ], + default="Payment_Gateway", + max_length=20, + verbose_name="Transaction Payment Method", + ), + ), + ( + "price", + models.DecimalField( + decimal_places=2, + default=0.0, + max_digits=10, + verbose_name="Transaction Price", + ), + ), + ( + "status", + models.CharField( + choices=[ + ("pending", "Pending"), + ("waiting_approval", "Waiting for Approval"), + ("success", "Success"), + ("failed", "Failed"), + ], + default="pending", + max_length=20, + verbose_name="Transaction Status", + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="Created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="Updated at"), + ), + ("is_deleted", models.BooleanField(default=False)), + ( + "course", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="course_transactions", + to="course.course", + ), + ), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="transactions", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + ), + migrations.CreateModel( + name="TransactionReceipt", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('is_paid', models.BooleanField(default=False, help_text='Indicates whether the payment has been completed or not', verbose_name='Payment Status')), - ('price', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='Transaction Price')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Updated at')), - ('course', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='course_transactions', to='course.course')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='transactions', to=settings.AUTH_USER_MODEL)), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "file", + models.FileField( + help_text="Upload payment receipt image or document", + upload_to=apps.transaction.models.receipt_file_upload_to, + verbose_name="Receipt File", + ), + ), + ( + "uploaded_at", + models.DateTimeField(auto_now_add=True, verbose_name="Uploaded At"), + ), + ( + "description", + models.TextField( + blank=True, + help_text="Optional description or notes about the receipt", + null=True, + verbose_name="Description", + ), + ), + ( + "transaction", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="receipts", + to="transaction.transactionparticipant", + verbose_name="Transaction", + ), + ), ], + options={ + "verbose_name": "Transaction Receipt", + "verbose_name_plural": "Transaction Receipts", + "ordering": ["-uploaded_at"], + }, ), migrations.CreateModel( - name='ParticipantInfo', + name="ParticipantInfo", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('fullname', models.CharField(help_text='Enter the full name of the user.', max_length=255, verbose_name='Full Name')), - ('email', models.EmailField(help_text="Enter the user's email address.", max_length=254, verbose_name='Email Address')), - ('phone_number', phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=128, null=True, region=None, validators=[utils.validators.validate_possible_number], verbose_name='phone')), - ('gender', models.CharField(blank=True, choices=[('male', 'Male'), ('female', 'Female')], help_text="Select the user's gender.", max_length=20, null=True, verbose_name='Gender')), - ('birthdate', models.DateField(blank=True, null=True, verbose_name='birthdate')), - ('transaction_participant', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='participant_infos', to='transaction.transactionparticipant', verbose_name='Transaction Participant')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "fullname", + models.CharField( + help_text="Enter the full name of the user.", + max_length=255, + verbose_name="Full Name", + ), + ), + ( + "email", + models.EmailField( + help_text="Enter the user's email address.", + max_length=254, + verbose_name="Email Address", + ), + ), + ( + "phone_number", + phonenumber_field.modelfields.PhoneNumberField( + blank=True, + max_length=128, + null=True, + region=None, + validators=[utils.validators.validate_possible_number], + verbose_name="phone", + ), + ), + ( + "gender", + models.CharField( + blank=True, + choices=[("male", "Male"), ("female", "Female")], + help_text="Select the user's gender.", + max_length=20, + null=True, + verbose_name="Gender", + ), + ), + ( + "birthdate", + models.DateField(blank=True, null=True, verbose_name="birthdate"), + ), + ( + "transaction_participant", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="participant_infos", + to="transaction.transactionparticipant", + verbose_name="Transaction Participant", + ), + ), ], ), ] diff --git a/apps/transaction/migrations/0002_alter_participantinfo_phone_number.py b/apps/transaction/migrations/0002_alter_participantinfo_phone_number.py deleted file mode 100644 index beda047..0000000 --- a/apps/transaction/migrations/0002_alter_participantinfo_phone_number.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.7 on 2025-01-14 16:36 - -from django.db import migrations -import phonenumber_field.modelfields -import utils.validators - - -class Migration(migrations.Migration): - - dependencies = [ - ('transaction', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='participantinfo', - name='phone_number', - field=phonenumber_field.modelfields.PhoneNumberField(blank=True, max_length=128, null=True, region=None, validators=[utils.validators.validate_possible_number], verbose_name='phone'), - ), - ] diff --git a/apps/transaction/migrations/0002_remove_transactionparticipant_is_paid_and_more.py b/apps/transaction/migrations/0002_remove_transactionparticipant_is_paid_and_more.py deleted file mode 100644 index cd0329e..0000000 --- a/apps/transaction/migrations/0002_remove_transactionparticipant_is_paid_and_more.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 5.1.8 on 2025-04-07 13:39 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('transaction', '0001_initial'), - ] - - operations = [ - migrations.RemoveField( - model_name='transactionparticipant', - name='is_paid', - ), - migrations.AddField( - model_name='transactionparticipant', - name='is_deleted', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='transactionparticipant', - name='status', - field=models.CharField(choices=[('pending', 'Pending'), ('success', 'Success'), ('failed', 'Failed')], default='pending', max_length=20, verbose_name='Transaction Status'), - ), - ] diff --git a/apps/transaction/migrations/0003_alter_participantinfo_email.py b/apps/transaction/migrations/0003_alter_participantinfo_email.py deleted file mode 100644 index c79cca4..0000000 --- a/apps/transaction/migrations/0003_alter_participantinfo_email.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 3.2.7 on 2025-01-14 16:43 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('transaction', '0002_alter_participantinfo_phone_number'), - ] - - operations = [ - migrations.AlterField( - model_name='participantinfo', - name='email', - field=models.EmailField(help_text="Enter the user's email address.", max_length=254, verbose_name='Email Address'), - ), - ] diff --git a/apps/transaction/migrations/0003_alter_transactionparticipant_status_and_more.py b/apps/transaction/migrations/0003_alter_transactionparticipant_status_and_more.py deleted file mode 100644 index a0fd68c..0000000 --- a/apps/transaction/migrations/0003_alter_transactionparticipant_status_and_more.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 5.1.8 on 2025-12-03 23:32 - -import apps.transaction.models -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('transaction', '0002_remove_transactionparticipant_is_paid_and_more'), - ] - - operations = [ - migrations.AlterField( - model_name='transactionparticipant', - name='status', - field=models.CharField(choices=[('pending', 'Pending'), ('waiting_approval', 'Waiting for Approval'), ('success', 'Success'), ('failed', 'Failed')], default='pending', max_length=20, verbose_name='Transaction Status'), - ), - migrations.CreateModel( - name='TransactionReceipt', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('file', models.FileField(help_text='Upload payment receipt image or document', upload_to=apps.transaction.models.receipt_file_upload_to, verbose_name='Receipt File')), - ('uploaded_at', models.DateTimeField(auto_now_add=True, verbose_name='Uploaded At')), - ('description', models.TextField(blank=True, help_text='Optional description or notes about the receipt', null=True, verbose_name='Description')), - ('transaction', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='receipts', to='transaction.transactionparticipant', verbose_name='Transaction')), - ], - options={ - 'verbose_name': 'Transaction Receipt', - 'verbose_name_plural': 'Transaction Receipts', - 'ordering': ['-uploaded_at'], - }, - ), - ] diff --git a/apps/transaction/migrations/0004_transactionparticipant_payment_method.py b/apps/transaction/migrations/0004_transactionparticipant_payment_method.py deleted file mode 100644 index 0785a7c..0000000 --- a/apps/transaction/migrations/0004_transactionparticipant_payment_method.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-28 11:31 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("transaction", "0003_alter_transactionparticipant_status_and_more"), - ] - - operations = [ - migrations.AddField( - model_name="transactionparticipant", - name="payment_method", - field=models.CharField( - choices=[ - ("receipt", "Receipt"), - ("Payment_Gateway", "Payment Gateway"), - ], - default="Payment_Gateway", - max_length=20, - verbose_name="Transaction Payment Method", - ), - ), - ] diff --git a/apps/transaction/migrations/0005_alter_transactionparticipant_payment_method.py b/apps/transaction/migrations/0005_alter_transactionparticipant_payment_method.py deleted file mode 100644 index 3b1090e..0000000 --- a/apps/transaction/migrations/0005_alter_transactionparticipant_payment_method.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 4.2.27 on 2025-12-28 12:00 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ("transaction", "0004_transactionparticipant_payment_method"), - ] - - operations = [ - migrations.AlterField( - model_name="transactionparticipant", - name="payment_method", - field=models.CharField( - choices=[ - ("receipt", "Receipt"), - ("free", "Free"), - ("Payment_Gateway", "Payment Gateway"), - ], - default="Payment_Gateway", - max_length=20, - verbose_name="Transaction Payment Method", - ), - ), - ] diff --git a/apps/transaction/migrations/0006_merge_20260104_1114.py b/apps/transaction/migrations/0006_merge_20260104_1114.py deleted file mode 100644 index 7598e2a..0000000 --- a/apps/transaction/migrations/0006_merge_20260104_1114.py +++ /dev/null @@ -1,12 +0,0 @@ -# Generated by Django 4.2.27 on 2026-01-04 11:14 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("transaction", "0003_alter_participantinfo_email"), - ("transaction", "0005_alter_transactionparticipant_payment_method"), - ] - - operations = [] diff --git a/apps/video/migrations/0001_initial.py b/apps/video/migrations/0001_initial.py index d63e4c5..8a0fcb2 100644 --- a/apps/video/migrations/0001_initial.py +++ b/apps/video/migrations/0001_initial.py @@ -1,91 +1,373 @@ -# Generated by Django 5.1.8 on 2025-04-03 00:05 +# Generated by Django 4.2.27 on 2026-01-22 10:48 -import django.db.models.deletion -import filer.fields.image -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.FILER_IMAGE_MODEL), - ] + dependencies = [] operations = [ migrations.CreateModel( - name='VideoCategory', + name="Video", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255, null=True)), + ("slug", models.SlugField(allow_unicode=True, unique=True)), + ( + "thumbnail", + models.ImageField( + blank=True, + help_text="image allowed", + null=True, + upload_to="video/thumbnails/", + ), + ), + ("description", models.TextField(null=True)), + ( + "video_type", + models.CharField( + choices=[ + ("youtube_link", "Youtube Link"), + ("video_file", "Video File"), + ], + max_length=255, + ), + ), + ( + "video_file", + models.FileField(blank=True, null=True, upload_to="video/videos/"), + ), + ("video_url", models.CharField(blank=True, max_length=655, null=True)), + ("video_time", models.TimeField()), + ( + "view_count", + models.PositiveBigIntegerField( + default=0, verbose_name="view count" + ), + ), + ("status", models.BooleanField(default=True, verbose_name="status")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ], + ), + migrations.CreateModel( + name="VideoCategory", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('slug', models.SlugField(allow_unicode=True, unique=True, verbose_name='slug')), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('order', models.PositiveIntegerField(default=0, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255, verbose_name="title")), + ( + "slug", + models.SlugField( + allow_unicode=True, unique=True, verbose_name="slug" + ), + ), + ("status", models.BooleanField(default=True, verbose_name="status")), + ("order", models.PositiveIntegerField(default=0, verbose_name="order")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), ], options={ - 'verbose_name': 'Video Category', - 'verbose_name_plural': 'Video Categories', - 'ordering': ['order'], + "verbose_name": "Video Category", + "verbose_name_plural": "Video Categories", + "ordering": ["order"], }, ), migrations.CreateModel( - name='VideoCollection', + name="VideoCollection", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(help_text='This title will not be displayed anywhere', max_length=255)), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255)), + ("slug", models.SlugField(max_length=255, unique=True)), + ( + "summary", + models.CharField( + blank=True, help_text="could be null", max_length=512, null=True + ), + ), + ("pin_top", models.BooleanField(default=True, verbose_name="pin top")), + ( + "thumbnail", + models.ImageField( + blank=True, + help_text="image allowed", + null=True, + upload_to="video/collection/", + ), + ), + ("order", models.IntegerField(default=0, verbose_name="order")), + ("status", models.BooleanField(default=True, verbose_name="status")), + ( + "display_position", + models.CharField( + choices=[("pinned", "Pinned"), ("middle", "Middle Section")], + default="pinned", + max_length=20, + verbose_name="Display Position", + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), ], options={ - 'verbose_name': 'Video Collection', - 'verbose_name_plural': 'Video Collections', + "verbose_name": "Video Collection", + "verbose_name_plural": "Video Collections", }, ), migrations.CreateModel( - name='Video', + name="VideoPlaylist", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, null=True)), - ('slug', models.SlugField(allow_unicode=True, unique=True)), - ('description', models.TextField(null=True)), - ('video_type', models.CharField(choices=[('file', 'File'), ('youtube', 'Youtube')], default='file', max_length=255)), - ('video_file', models.FileField(blank=True, null=True, upload_to='video/videos/')), - ('video_url', models.CharField(blank=True, max_length=655, null=True)), - ('video_time', models.TimeField()), - ('view_count', models.PositiveBigIntegerField(default=0, verbose_name='view count')), - ('status', models.BooleanField(default=True, verbose_name='status')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('thumbnail', filer.fields.image.FilerImageField(blank=True, help_text='image allowed', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.FILER_IMAGE_MODEL)), - ('categories', models.ManyToManyField(blank=True, related_name='videos', to='video.videocategory', verbose_name='categories')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=255, verbose_name="title")), + ( + "slug", + models.SlugField( + allow_unicode=True, + blank=True, + null=True, + unique=True, + verbose_name="slug", + ), + ), + ( + "slogan", + models.CharField( + blank=True, max_length=512, null=True, verbose_name="slogan" + ), + ), + ( + "description", + models.TextField(blank=True, null=True, verbose_name="description"), + ), + ( + "thumbnail", + models.ImageField( + blank=True, + null=True, + upload_to="video/playlist/thumbnails/", + verbose_name="thumbnail", + ), + ), + ("order", models.PositiveIntegerField(default=0, verbose_name="order")), + ("status", models.BooleanField(default=True, verbose_name="status")), + ( + "view_count", + models.PositiveBigIntegerField( + default=0, verbose_name="view count" + ), + ), + ( + "total_time", + models.DurationField( + blank=True, null=True, verbose_name="total time" + ), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "categories", + models.ManyToManyField( + blank=True, + related_name="playlists", + to="video.videocategory", + verbose_name="categories", + ), + ), ], options={ - 'verbose_name': 'Video', - 'verbose_name_plural': 'Videos', + "verbose_name": "Video Playlist", + "verbose_name_plural": "Video Playlists", + "ordering": ["order", "-created_at"], }, ), migrations.CreateModel( - name='VideoInCollection', + name="VideoPlaylistInCollection", fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('priority', models.PositiveIntegerField(default=0, verbose_name='priority')), - ('video', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='collections_videos', to='video.video', verbose_name='video')), - ('video_collection', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='videos_in_collection', to='video.videocollection', verbose_name='video collection')), + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("order", models.PositiveIntegerField(default=0, verbose_name="order")), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "collection", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="collection_playlists", + to="video.videocollection", + verbose_name="collection", + ), + ), + ( + "playlist", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="playlist_collections", + to="video.videoplaylist", + verbose_name="playlist", + ), + ), ], options={ - 'verbose_name': 'Video in Collection', - 'verbose_name_plural': 'Videos in Collection', - 'ordering': ['priority'], + "verbose_name": "Video Playlist in Collection", + "verbose_name_plural": "Video Playlists in Collections", + "ordering": ["order"], + "unique_together": {("collection", "playlist")}, }, ), migrations.AddField( - model_name='videocollection', - name='videos', - field=models.ManyToManyField(related_name='collections', through='video.VideoInCollection', to='video.video', verbose_name='videos'), + model_name="videoplaylist", + name="collections", + field=models.ManyToManyField( + blank=True, + related_name="related_playlists", + through="video.VideoPlaylistInCollection", + to="video.videocollection", + verbose_name="collections", + ), + ), + migrations.CreateModel( + name="MiddleVideoCollection", + fields=[], + options={ + "verbose_name": "Middle Section Video Collection", + "verbose_name_plural": "Middle Section Video Collections", + "proxy": True, + "indexes": [], + "constraints": [], + }, + bases=("video.videocollection",), ), - ] \ No newline at end of file + migrations.CreateModel( + name="PinnedVideoCollection", + fields=[], + options={ + "verbose_name": "Pinned Video Collection", + "verbose_name_plural": "Pinned Video Collections", + "proxy": True, + "indexes": [], + "constraints": [], + }, + bases=("video.videocollection",), + ), + migrations.CreateModel( + name="PlaylistItem", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "priority", + models.PositiveIntegerField(default=0, verbose_name="priority"), + ), + ( + "created_at", + models.DateTimeField(auto_now_add=True, verbose_name="created at"), + ), + ( + "updated_at", + models.DateTimeField(auto_now=True, verbose_name="updated at"), + ), + ( + "playlist", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="playlist_items", + to="video.videoplaylist", + verbose_name="playlist", + ), + ), + ( + "video", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="playlist_appearances", + to="video.video", + verbose_name="video", + ), + ), + ], + options={ + "verbose_name": "Playlist Item", + "verbose_name_plural": "Playlist Items", + "ordering": ["priority"], + "unique_together": {("playlist", "video")}, + }, + ), + ] diff --git a/apps/video/migrations/0002_alter_video_thumbnail.py b/apps/video/migrations/0002_alter_video_thumbnail.py deleted file mode 100755 index 7059e88..0000000 --- a/apps/video/migrations/0002_alter_video_thumbnail.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.8 on 2025-04-03 01:24 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('video', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='video', - name='thumbnail', - field=models.ImageField(blank=True, help_text='image allowed', null=True, upload_to='book_thumbnails/'), - ), - ] diff --git a/apps/video/migrations/0003_remove_videocollection_videos_middlevideocollection_and_more.py b/apps/video/migrations/0003_remove_videocollection_videos_middlevideocollection_and_more.py deleted file mode 100755 index 7a92be7..0000000 --- a/apps/video/migrations/0003_remove_videocollection_videos_middlevideocollection_and_more.py +++ /dev/null @@ -1,87 +0,0 @@ -# Generated by Django 5.1.8 on 2025-05-05 09:01 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('video', '0002_alter_video_thumbnail'), - ] - - operations = [ - migrations.RemoveField( - model_name='videocollection', - name='videos', - ), - migrations.CreateModel( - name='MiddleVideoCollection', - fields=[ - ], - options={ - 'verbose_name': 'Middle Section Video Collection', - 'verbose_name_plural': 'Middle Section Video Collections', - 'proxy': True, - 'indexes': [], - 'constraints': [], - }, - bases=('video.videocollection',), - ), - migrations.CreateModel( - name='PinnedVideoCollection', - fields=[ - ], - options={ - 'verbose_name': 'Pinned Video Collection', - 'verbose_name_plural': 'Pinned Video Collections', - 'proxy': True, - 'indexes': [], - 'constraints': [], - }, - bases=('video.videocollection',), - ), - migrations.AddField( - model_name='video', - name='collections', - field=models.ManyToManyField(blank=True, related_name='related_videos', to='video.videocollection', verbose_name='collections'), - ), - migrations.AddField( - model_name='videocollection', - name='display_position', - field=models.CharField(choices=[('pinned', 'Pinned'), ('middle', 'Middle Section')], default='pinned', max_length=20, verbose_name='Display Position'), - ), - migrations.AddField( - model_name='videocollection', - name='pin_top', - field=models.BooleanField(default=True, verbose_name='pin top'), - ), - migrations.AddField( - model_name='videocollection', - name='slug', - field=models.SlugField(default='v_collection_1', max_length=255, unique=True), - preserve_default=False, - ), - migrations.AddField( - model_name='videocollection', - name='summary', - field=models.CharField(blank=True, help_text='could be null', max_length=512, null=True), - ), - migrations.AddField( - model_name='videocollection', - name='thumbnail', - field=models.ImageField(blank=True, help_text='image allowed', null=True, upload_to='video/collection/'), - ), - migrations.AlterField( - model_name='video', - name='thumbnail', - field=models.ImageField(blank=True, help_text='image allowed', null=True, upload_to='video/thumbnails/'), - ), - migrations.AlterField( - model_name='videocollection', - name='title', - field=models.CharField(max_length=255), - ), - migrations.DeleteModel( - name='VideoInCollection', - ), - ] diff --git a/apps/video/migrations/0004_videocollection_order.py b/apps/video/migrations/0004_videocollection_order.py deleted file mode 100755 index 0d1a217..0000000 --- a/apps/video/migrations/0004_videocollection_order.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.8 on 2025-05-05 09:20 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('video', '0003_remove_videocollection_videos_middlevideocollection_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='videocollection', - name='order', - field=models.IntegerField(default=0, verbose_name='order'), - ), - ] diff --git a/apps/video/migrations/0005_videoplaylist_alter_video_options_playlistitem.py b/apps/video/migrations/0005_videoplaylist_alter_video_options_playlistitem.py deleted file mode 100755 index 46c59e7..0000000 --- a/apps/video/migrations/0005_videoplaylist_alter_video_options_playlistitem.py +++ /dev/null @@ -1,48 +0,0 @@ -# Generated by Django 5.1.8 on 2025-05-05 13:50 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('video', '0004_videocollection_order'), - ] - - operations = [ - migrations.CreateModel( - name='VideoPlaylist', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ], - options={ - 'verbose_name': 'Video Playlist', - 'verbose_name_plural': 'Video Playlists', - }, - ), - migrations.AlterModelOptions( - name='video', - options={}, - ), - migrations.CreateModel( - name='PlaylistItem', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('priority', models.PositiveIntegerField(default=0, verbose_name='priority')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('video', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='playlist_appearances', to='video.video', verbose_name='video')), - ('playlist', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='playlist_items', to='video.videoplaylist', verbose_name='playlist')), - ], - options={ - 'verbose_name': 'Playlist Item', - 'verbose_name_plural': 'Playlist Items', - 'ordering': ['priority'], - 'unique_together': {('playlist', 'video')}, - }, - ), - ] diff --git a/apps/video/migrations/0006_alter_video_video_type.py b/apps/video/migrations/0006_alter_video_video_type.py deleted file mode 100755 index b5bd4ca..0000000 --- a/apps/video/migrations/0006_alter_video_video_type.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.8 on 2025-05-06 00:34 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('video', '0005_videoplaylist_alter_video_options_playlistitem'), - ] - - operations = [ - migrations.AlterField( - model_name='video', - name='video_type', - field=models.CharField(choices=[('youtube_link', 'Youtube Link'), ('video_file', 'Video File')], max_length=255), - ), - ] diff --git a/apps/video/migrations/0007_videoincollection_alter_video_collections.py b/apps/video/migrations/0007_videoincollection_alter_video_collections.py deleted file mode 100755 index 2d62d6f..0000000 --- a/apps/video/migrations/0007_videoincollection_alter_video_collections.py +++ /dev/null @@ -1,43 +0,0 @@ -# Generated by Django 5.1.8 on 2025-05-06 11:46 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('video', '0006_alter_video_video_type'), - ] - - operations = [ - # First remove the existing collections field - migrations.RemoveField( - model_name='video', - name='collections', - ), - # Then create the VideoInCollection model - migrations.CreateModel( - name='VideoInCollection', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.PositiveIntegerField(default=0, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('collection', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='collection_videos', to='video.videocollection', verbose_name='collection')), - ('video', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='video_collections', to='video.video', verbose_name='video')), - ], - options={ - 'verbose_name': 'Video in Collection', - 'verbose_name_plural': 'Videos in Collections', - 'ordering': ['order'], - 'unique_together': {('collection', 'video')}, - }, - ), - # Finally add the collections field back with the through model - migrations.AddField( - model_name='video', - name='collections', - field=models.ManyToManyField(blank=True, related_name='related_videos', through='video.VideoInCollection', to='video.videocollection', verbose_name='collections'), - ), - ] diff --git a/apps/video/migrations/0008_videocollection_videos.py b/apps/video/migrations/0008_videocollection_videos.py deleted file mode 100755 index 57754a1..0000000 --- a/apps/video/migrations/0008_videocollection_videos.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.1.8 on 2025-05-06 12:31 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('video', '0007_videoincollection_alter_video_collections'), - ] - - operations = [ - migrations.AddField( - model_name='videocollection', - name='videos', - field=models.ManyToManyField(related_name='related_collections_video', through='video.VideoInCollection', to='video.video', verbose_name='Videos'), - ), - ] diff --git a/apps/video/migrations/0009_auto_20251130_1756.py b/apps/video/migrations/0009_auto_20251130_1756.py deleted file mode 100644 index 0323c9e..0000000 --- a/apps/video/migrations/0009_auto_20251130_1756.py +++ /dev/null @@ -1,93 +0,0 @@ -# Generated by Django 3.2.4 on 2025-11-30 17:56 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('video', '0008_videocollection_videos'), - ] - - operations = [ - migrations.AlterModelOptions( - name='videoplaylist', - options={'ordering': ['order', '-created_at'], 'verbose_name': 'Video Playlist', 'verbose_name_plural': 'Video Playlists'}, - ), - migrations.RemoveField( - model_name='video', - name='categories', - ), - migrations.RemoveField( - model_name='video', - name='collections', - ), - migrations.AddField( - model_name='videoplaylist', - name='categories', - field=models.ManyToManyField(blank=True, related_name='playlists', to='video.VideoCategory', verbose_name='categories'), - ), - migrations.AddField( - model_name='videoplaylist', - name='description', - field=models.TextField(blank=True, null=True, verbose_name='description'), - ), - migrations.AddField( - model_name='videoplaylist', - name='order', - field=models.PositiveIntegerField(default=0, verbose_name='order'), - ), - migrations.AddField( - model_name='videoplaylist', - name='slogan', - field=models.CharField(blank=True, max_length=512, null=True, verbose_name='slogan'), - ), - migrations.AddField( - model_name='videoplaylist', - name='slug', - field=models.SlugField(allow_unicode=True, blank=True, null=True, unique=True, verbose_name='slug'), - ), - migrations.AddField( - model_name='videoplaylist', - name='status', - field=models.BooleanField(default=True, verbose_name='status'), - ), - migrations.AddField( - model_name='videoplaylist', - name='thumbnail', - field=models.ImageField(blank=True, null=True, upload_to='video/playlist/thumbnails/', verbose_name='thumbnail'), - ), - migrations.AddField( - model_name='videoplaylist', - name='total_time', - field=models.DurationField(blank=True, null=True, verbose_name='total time'), - ), - migrations.AddField( - model_name='videoplaylist', - name='view_count', - field=models.PositiveBigIntegerField(default=0, verbose_name='view count'), - ), - migrations.CreateModel( - name='VideoPlaylistInCollection', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('order', models.PositiveIntegerField(default=0, verbose_name='order')), - ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')), - ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')), - ('collection', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='collection_playlists', to='video.videocollection', verbose_name='collection')), - ('playlist', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='playlist_collections', to='video.videoplaylist', verbose_name='playlist')), - ], - options={ - 'verbose_name': 'Video Playlist in Collection', - 'verbose_name_plural': 'Video Playlists in Collections', - 'ordering': ['order'], - 'unique_together': {('collection', 'playlist')}, - }, - ), - migrations.AddField( - model_name='videoplaylist', - name='collections', - field=models.ManyToManyField(blank=True, related_name='related_playlists', through='video.VideoPlaylistInCollection', to='video.VideoCollection', verbose_name='collections'), - ), - ] diff --git a/apps/video/migrations/0010_remove_videoincollection_model.py b/apps/video/migrations/0010_remove_videoincollection_model.py deleted file mode 100644 index ea3959c..0000000 --- a/apps/video/migrations/0010_remove_videoincollection_model.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 3.2.4 on 2025-12-01 13:06 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('video', '0009_auto_20251130_1756'), - ] - - operations = [ - migrations.RemoveField( - model_name='videocollection', - name='videos', - ), - migrations.DeleteModel( - name='VideoInCollection', - ), - ]