Browse Source

restore the migratons history and migrations files.

master
Mohsen Taba 5 months ago
parent
commit
c2a13318ed
  1. 488
      apps/account/migrations/0001_initial.py
  2. 18
      apps/account/migrations/0002_alter_user_birthdate.py
  3. 20
      apps/account/migrations/0002_alter_user_phone_number.py
  4. 22
      apps/account/migrations/0003_auto_20241120_1741.py
  5. 30
      apps/account/migrations/0003_locationhistory.py
  6. 18
      apps/account/migrations/0004_alter_user_avatar.py
  7. 18
      apps/account/migrations/0004_user_skill.py
  8. 17
      apps/account/migrations/0005_alter_user_unique_together.py
  9. 18
      apps/account/migrations/0005_user_city.py
  10. 45
      apps/account/migrations/0006_auto_20251006_1101.py
  11. 18
      apps/account/migrations/0006_user_country.py
  12. 27
      apps/account/migrations/0007_notification.py
  13. 17
      apps/account/migrations/0007_user_user_agent.py
  14. 57
      apps/account/migrations/0008_auto_20250316_1247.py
  15. 22
      apps/account/migrations/0008_loginhistory_device_os_loginhistory_user_agent.py
  16. 31
      apps/account/migrations/0009_auto_20250316_1319.py
  17. 17
      apps/account/migrations/0009_user_client_ip.py
  18. 21
      apps/account/migrations/0010_alter_user_device_os.py
  19. 18
      apps/account/migrations/0010_loginhistory_timezone.py
  20. 12
      apps/account/migrations/0011_merge_20260104_1114.py
  21. 184
      apps/api/migrations/0001_initial.py
  22. 42
      apps/api/migrations/0002_auto_20250911_1217.py
  23. 433
      apps/article/migrations/0001_initial.py
  24. 18
      apps/article/migrations/0002_article_download_count.py
  25. 47
      apps/article/migrations/0003_alter_middlearticlecollection_options_and_more.py
  26. 241
      apps/blog/migrations/0001_initial.py
  27. 31
      apps/blog/migrations/0002_blogseo.py
  28. 39
      apps/blog/migrations/0003_convert_varchar_to_jsonb.py
  29. 129
      apps/bookmark/migrations/0001_initial.py
  30. 35
      apps/bookmark/migrations/0002_rate.py
  31. 18
      apps/bookmark/migrations/0003_add_article_service_choice.py
  32. 23
      apps/bookmark/migrations/0004_auto_20251130_1758.py
  33. 23
      apps/bookmark/migrations/0005_auto_20251202_1245.py
  34. 67
      apps/certificate/migrations/0001_initial.py
  35. 18
      apps/certificate/migrations/0002_alter_certificate_certificate_file.py
  36. 18
      apps/certificate/migrations/0002_alter_certificate_status.py
  37. 12
      apps/certificate/migrations/0003_merge_20260104_1114.py
  38. 227
      apps/chat/migrations/0001_initial.py
  39. 49
      apps/chat/migrations/0002_auto_20241125_1219.py
  40. 18
      apps/chat/migrations/0002_chatmessage_metadata.py
  41. 24
      apps/chat/migrations/0003_add_file_and_image_attachments.py
  42. 34
      apps/chat/migrations/0003_auto_20241125_1737.py
  43. 18
      apps/chat/migrations/0004_roommessage_unread_messages_count.py
  44. 12
      apps/chat/migrations/0005_merge_20260104_1114.py
  45. 1036
      apps/course/migrations/0001_initial.py
  46. 18
      apps/course/migrations/0002_alter_course_thumbnail.py
  47. 32
      apps/course/migrations/0002_auto_20241121_2238.py
  48. 34
      apps/course/migrations/0003_alter_course_is_online_alter_course_timing_and_more.py
  49. 27
      apps/course/migrations/0003_participant.py
  50. 122
      apps/course/migrations/0005_add_database_indexes.py
  51. 18
      apps/course/migrations/0005_participant_unread_messages_count.py
  52. 23
      apps/course/migrations/0006_auto_20250113_1337.py
  53. 18
      apps/course/migrations/0006_participant_is_active.py
  54. 19
      apps/course/migrations/0007_alter_course_thumbnail.py
  55. 18
      apps/course/migrations/0007_course_online_link.py
  56. 104
      apps/course/migrations/0008_auto_20251013_1724.py
  57. 22
      apps/course/migrations/0009_auto_20251014_0051.py
  58. 18
      apps/course/migrations/0010_courselivesession_recorded_file.py
  59. 12
      apps/course/migrations/0011_merge_20260104_1114.py
  60. 77
      apps/dobodbi_calendar/migrations/0001_initial.py
  61. 1281
      apps/hadis/migrations/0001_initial.py
  62. 22
      apps/hadis/migrations/0002_auto_20250317_0055.py
  63. 40
      apps/hadis/migrations/0002_bookauthor_birth_year_hijri_and_more.py
  64. 217
      apps/hadis/migrations/0002_hadissect_hadisstatus_alter_hadis_options_and_more.py
  65. 23
      apps/hadis/migrations/0003_auto_20250317_0102.py
  66. 226
      apps/hadis/migrations/0003_bookreference_narratorlayer_and_more.py
  67. 121
      apps/hadis/migrations/0004_auto_20250321_0119.py
  68. 52
      apps/hadis/migrations/0004_hadiscollection_hadisincollection.py
  69. 21
      apps/hadis/migrations/0005_auto_20250321_1550.py
  70. 22
      apps/hadis/migrations/0005_auto_20251209_1620.py
  71. 23
      apps/hadis/migrations/0006_auto_20250321_1600.py
  72. 17
      apps/hadis/migrations/0006_hadiscategory_slug.py
  73. 28
      apps/hadis/migrations/0007_auto_20250321_2007.py
  74. 29
      apps/hadis/migrations/0007_auto_20251211_1313.py
  75. 29
      apps/hadis/migrations/0007_auto_20251211_1324.py
  76. 17
      apps/hadis/migrations/0008_alter_hadiscategory_slug.py
  77. 17
      apps/hadis/migrations/0009_alter_hadiscategory_slug.py
  78. 12
      apps/hadis/migrations/0010_merge_20251211_1555.py
  79. 17
      apps/hadis/migrations/0011_hadis_a.py
  80. 16
      apps/hadis/migrations/0012_remove_hadis_title_narrator.py
  81. 19
      apps/hadis/migrations/0013_hadis_title_narrator.py
  82. 16
      apps/hadis/migrations/0014_remove_hadistransmitter_narrator_layer.py
  83. 26
      apps/hadis/migrations/0015_hadistransmitter_narrator_layer.py
  84. 19
      apps/hadis/migrations/0016_remove_hadistransmitter_narrator_layer_and_more.py
  85. 64
      apps/hadis/migrations/0017_narratorlayer_hadistransmitter_narrator_layer.py
  86. 16
      apps/hadis/migrations/0018_remove_hadistransmitter_status.py
  87. 27
      apps/hadis/migrations/0019_hadistransmitter_status.py
  88. 17
      apps/hadis/migrations/0020_hadisreference_description.py
  89. 20
      apps/hadis/migrations/0021_remove_hadisreference_book_reference_and_more.py
  90. 30
      apps/hadis/migrations/0022_hadisreference_book_reference_and_more.py
  91. 29
      apps/hadis/migrations/0023_remove_hadisreference_book_reference_and_more.py
  92. 16
      apps/hadis/migrations/0024_remove_hadisreference_book.py
  93. 25
      apps/hadis/migrations/0025_hadisreference_book_reference.py
  94. 16
      apps/hadis/migrations/0026_remove_hadisreference_book_reference.py
  95. 25
      apps/hadis/migrations/0027_hadisreference_book_reference.py
  96. 17
      apps/hadis/migrations/0028_hadistransmitter_description.py
  97. 21
      apps/hadis/migrations/0029_remove_hadistransmitter_description_and_more.py
  98. 16
      apps/hadis/migrations/0030_remove_hadistransmitter_is_gap.py
  99. 17
      apps/hadis/migrations/0031_hadistransmitter_is_gap.py
  100. 21
      apps/hadis/migrations/0032_remove_hadis_a_hadis_description.py

488
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 import dj_language.field
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
import phonenumber_field.modelfields import phonenumber_field.modelfields
import utils.validators import utils.validators
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ 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 = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='User',
name="User",
fields=[ 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={ 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( migrations.CreateModel(
name='AdminUser',
name="Notification",
fields=[ 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( migrations.CreateModel(
name='ClientUser',
name="LoginHistory",
fields=[ 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( migrations.CreateModel(
name='ProfessorUser',
name="LocationHistory",
fields=[ 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={ 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( migrations.CreateModel(
name='StudentUser',
fields=[
],
name="ClientUser",
fields=[],
options={ 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( migrations.CreateModel(
name='SuperAdminUser',
fields=[
],
name="ProfessorUser",
fields=[],
options={ 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( 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( 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",),
), ),
] ]

18
apps/account/migrations/0002_alter_user_birthdate.py

@ -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'),
),
]

20
apps/account/migrations/0002_alter_user_phone_number.py

@ -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'),
),
]

22
apps/account/migrations/0003_auto_20241120_1741.py

@ -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'),
),
]

30
apps/account/migrations/0003_locationhistory.py

@ -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)),
],
),
]

18
apps/account/migrations/0004_alter_user_avatar.py

@ -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/'),
),
]

18
apps/account/migrations/0004_user_skill.py

@ -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),
),
]

17
apps/account/migrations/0005_alter_user_unique_together.py

@ -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',)},
),
]

18
apps/account/migrations/0005_user_city.py

@ -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'),
),
]

45
apps/account/migrations/0006_auto_20251006_1101.py

@ -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),
]

18
apps/account/migrations/0006_user_country.py

@ -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'),
),
]

27
apps/account/migrations/0007_notification.py

@ -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')),
],
),
]

17
apps/account/migrations/0007_user_user_agent.py

@ -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"),
),
]

57
apps/account/migrations/0008_auto_20250316_1247.py

@ -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)),
],
),
]

22
apps/account/migrations/0008_loginhistory_device_os_loginhistory_user_agent.py

@ -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"),
),
]

31
apps/account/migrations/0009_auto_20250316_1319.py

@ -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',
),
]

17
apps/account/migrations/0009_user_client_ip.py

@ -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"),
),
]

21
apps/account/migrations/0010_alter_user_device_os.py

@ -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,
),
),
]

18
apps/account/migrations/0010_loginhistory_timezone.py

@ -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),
),
]

12
apps/account/migrations/0011_merge_20260104_1114.py

@ -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 = []

184
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 from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
("dj_language", "0002_auto_20220120_1344"),
] ]
operations = [ operations = [
migrations.CreateModel( 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=[ 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={ options={
'verbose_name': 'Comment',
'verbose_name_plural': 'Comments',
'ordering': ['order', '-created_at'],
"verbose_name": "Comment",
"verbose_name_plural": "Comments",
"ordering": ["order", "-created_at"],
}, },
), ),
] ]

42
apps/api/migrations/0002_auto_20250911_1217.py

@ -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'),
),
]

433
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 from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [
]
dependencies = []
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='ArticleCategory',
name="Article",
fields=[ 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={ options={
'verbose_name': 'Article Category',
'verbose_name_plural': 'Article Categories',
'ordering': ['order'],
"verbose_name": "Article",
"verbose_name_plural": "Articles",
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='ArticleCollection',
name="ArticleCategory",
fields=[ 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={ options={
'verbose_name': 'Article Collection',
'verbose_name_plural': 'Articles Collections',
"verbose_name": "Article Category",
"verbose_name_plural": "Article Categories",
"ordering": ["order"],
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='Article',
name="ArticleCollection",
fields=[ 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={ options={
'verbose_name': 'Article',
'verbose_name_plural': 'Articles',
"verbose_name": "Article Collection",
"verbose_name_plural": "Articles Collections",
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='MiddleArticleCollection',
name="ArticleContent",
fields=[ 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={ 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( migrations.CreateModel(
name='PinnedArticleCollection',
name="ContentPart",
fields=[ 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={ 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( migrations.CreateModel(
name='ArticleContent',
name="TextSection",
fields=[ 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={ 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( migrations.CreateModel(
name='ArticleInCollection',
name="ArticleInCollection",
fields=[ 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={ 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( 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( 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( 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={ 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",),
), ),
] ]

18
apps/article/migrations/0002_article_download_count.py

@ -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'),
),
]

47
apps/article/migrations/0003_alter_middlearticlecollection_options_and_more.py

@ -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'],
},
),
]

241
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 from django.db import migrations, models
import django.db.models.deletion import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
("dj_language", "0002_auto_20220120_1344"),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='Blog',
name="Blog",
fields=[ 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.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={ options={
'verbose_name': 'Blog',
'verbose_name_plural': 'Blogs',
'ordering': ['-created_at'],
"verbose_name": "Blog",
"verbose_name_plural": "Blogs",
"ordering": ["-created_at"],
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='BlogContent',
name="BlogSeo",
fields=[ 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.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",
},
),
migrations.CreateModel(
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",
),
),
], ],
options={ 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"],
}, },
), ),
] ]

31
apps/blog/migrations/0002_blogseo.py

@ -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',
},
),
]

39
apps/blog/migrations/0003_convert_varchar_to_jsonb.py

@ -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);
"""
),
]

129
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 from django.conf import settings
import django.core.validators
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
@ -15,20 +15,121 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.CreateModel( 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=[ 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={ 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")},
}, },
), ),
] ]

35
apps/bookmark/migrations/0002_rate.py

@ -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')},
},
),
]

18
apps/bookmark/migrations/0003_add_article_service_choice.py

@ -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'),
),
]

23
apps/bookmark/migrations/0004_auto_20251130_1758.py

@ -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'),
),
]

23
apps/bookmark/migrations/0005_auto_20251202_1245.py

@ -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'),
),
]

67
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 from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
('account', '0001_initial'),
('course', '0001_initial'),
("course", "0001_initial"),
("account", "0001_initial"),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='Certificate',
name="Certificate",
fields=[ 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",
),
),
], ],
), ),
] ]

18
apps/certificate/migrations/0002_alter_certificate_certificate_file.py

@ -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'),
),
]

18
apps/certificate/migrations/0002_alter_certificate_status.py

@ -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),
),
]

12
apps/certificate/migrations/0003_merge_20260104_1114.py

@ -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 = []

227
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.conf import settings
from django.db import migrations, models from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
('course', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL), migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("course", "0001_initial"),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='RoomMessage',
name="RoomMessage",
fields=[ 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( migrations.CreateModel(
name='ChatMessage',
name="ChatMessage",
fields=[ 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( migrations.CreateModel(
name='MessageReadStatus',
name="MessageReadStatus",
fields=[ 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={ options={
'unique_together': {('user', 'message')},
"unique_together": {("user", "message")},
}, },
), ),
] ]

49
apps/chat/migrations/0002_auto_20241125_1219.py

@ -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,
),
]

18
apps/chat/migrations/0002_chatmessage_metadata.py

@ -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),
),
]

24
apps/chat/migrations/0003_add_file_and_image_attachments.py

@ -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'),
),
]

34
apps/chat/migrations/0003_auto_20241125_1737.py

@ -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')},
},
),
]

18
apps/chat/migrations/0004_roommessage_unread_messages_count.py

@ -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),
),
]

12
apps/chat/migrations/0005_merge_20260104_1114.py

@ -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 = []

1036
apps/course/migrations/0001_initial.py
File diff suppressed because it is too large
View File

18
apps/course/migrations/0002_alter_course_thumbnail.py

@ -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'),
),
]

32
apps/course/migrations/0002_auto_20241121_2238.py

@ -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')},
},
),
]

34
apps/course/migrations/0003_alter_course_is_online_alter_course_timing_and_more.py

@ -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)'),
),
]

27
apps/course/migrations/0003_participant.py

@ -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')},
},
),
]

122
apps/course/migrations/0005_add_database_indexes.py

@ -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'),
),
]

18
apps/course/migrations/0005_participant_unread_messages_count.py

@ -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),
),
]

23
apps/course/migrations/0006_auto_20250113_1337.py

@ -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'),
),
]

18
apps/course/migrations/0006_participant_is_active.py

@ -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),
),
]

19
apps/course/migrations/0007_alter_course_thumbnail.py

@ -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,
),
]

18
apps/course/migrations/0007_course_online_link.py

@ -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'),
),
]

104
apps/course/migrations/0008_auto_20251013_1724.py

@ -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'),
),
]

22
apps/course/migrations/0009_auto_20251014_0051.py

@ -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'),
),
]

18
apps/course/migrations/0010_courselivesession_recorded_file.py

@ -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'),
),
]

12
apps/course/migrations/0011_merge_20260104_1114.py

@ -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 = []

77
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 from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
initial = True initial = True
dependencies = [
]
dependencies = []
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='CalendarOccasions',
name="CalendarOccasions",
fields=[ 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={ options={
'ordering': ('-updated_at',),
"ordering": ("-updated_at",),
}, },
), ),
] ]

1281
apps/hadis/migrations/0001_initial.py
File diff suppressed because it is too large
View File

22
apps/hadis/migrations/0002_auto_20250317_0055.py

@ -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'),
),
]

40
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)"
),
),
]

217
apps/hadis/migrations/0002_hadissect_hadisstatus_alter_hadis_options_and_more.py

@ -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',
),
]

23
apps/hadis/migrations/0003_auto_20250317_0102.py

@ -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,
),
]

226
apps/hadis/migrations/0003_bookreference_narratorlayer_and_more.py

@ -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',
),
]

121
apps/hadis/migrations/0004_auto_20250321_0119.py

@ -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')},
),
]

52
apps/hadis/migrations/0004_hadiscollection_hadisincollection.py

@ -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')},
},
),
]

21
apps/hadis/migrations/0005_auto_20250321_1550.py

@ -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',
),
]

22
apps/hadis/migrations/0005_auto_20251209_1620.py

@ -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'),
),
]

23
apps/hadis/migrations/0006_auto_20250321_1600.py

@ -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'),
),
]

17
apps/hadis/migrations/0006_hadiscategory_slug.py

@ -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),
),
]

28
apps/hadis/migrations/0007_auto_20250321_2007.py

@ -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')},
),
]

29
apps/hadis/migrations/0007_auto_20251211_1313.py

@ -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),
]

29
apps/hadis/migrations/0007_auto_20251211_1324.py

@ -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),
]

17
apps/hadis/migrations/0008_alter_hadiscategory_slug.py

@ -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),
),
]

17
apps/hadis/migrations/0009_alter_hadiscategory_slug.py

@ -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),
),
]

12
apps/hadis/migrations/0010_merge_20251211_1555.py

@ -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 = []

17
apps/hadis/migrations/0011_hadis_a.py

@ -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),
),
]

16
apps/hadis/migrations/0012_remove_hadis_title_narrator.py

@ -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",
),
]

19
apps/hadis/migrations/0013_hadis_title_narrator.py

@ -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"
),
),
]

16
apps/hadis/migrations/0014_remove_hadistransmitter_narrator_layer.py

@ -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",
),
]

26
apps/hadis/migrations/0015_hadistransmitter_narrator_layer.py

@ -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",
),
),
]

19
apps/hadis/migrations/0016_remove_hadistransmitter_narrator_layer_and_more.py

@ -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",
),
]

64
apps/hadis/migrations/0017_narratorlayer_hadistransmitter_narrator_layer.py

@ -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",
),
),
]

16
apps/hadis/migrations/0018_remove_hadistransmitter_status.py

@ -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",
),
]

27
apps/hadis/migrations/0019_hadistransmitter_status.py

@ -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",
),
),
]

17
apps/hadis/migrations/0020_hadisreference_description.py

@ -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"),
),
]

20
apps/hadis/migrations/0021_remove_hadisreference_book_reference_and_more.py

@ -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",
),
]

30
apps/hadis/migrations/0022_hadisreference_book_reference_and_more.py

@ -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"),
),
]

29
apps/hadis/migrations/0023_remove_hadisreference_book_reference_and_more.py

@ -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",
),
),
]

16
apps/hadis/migrations/0024_remove_hadisreference_book.py

@ -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",
),
]

25
apps/hadis/migrations/0025_hadisreference_book_reference.py

@ -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",
),
),
]

16
apps/hadis/migrations/0026_remove_hadisreference_book_reference.py

@ -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",
),
]

25
apps/hadis/migrations/0027_hadisreference_book_reference.py

@ -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",
),
),
]

17
apps/hadis/migrations/0028_hadistransmitter_description.py

@ -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"),
),
]

21
apps/hadis/migrations/0029_remove_hadistransmitter_description_and_more.py

@ -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"),
),
]

16
apps/hadis/migrations/0030_remove_hadistransmitter_is_gap.py

@ -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",
),
]

17
apps/hadis/migrations/0031_hadistransmitter_is_gap.py

@ -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"),
),
]

21
apps/hadis/migrations/0032_remove_hadis_a_hadis_description.py

@ -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"),
),
]

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save