196 changed files with 5076 additions and 6322 deletions
-
488apps/account/migrations/0001_initial.py
-
18apps/account/migrations/0002_alter_user_birthdate.py
-
20apps/account/migrations/0002_alter_user_phone_number.py
-
22apps/account/migrations/0003_auto_20241120_1741.py
-
30apps/account/migrations/0003_locationhistory.py
-
18apps/account/migrations/0004_alter_user_avatar.py
-
18apps/account/migrations/0004_user_skill.py
-
17apps/account/migrations/0005_alter_user_unique_together.py
-
18apps/account/migrations/0005_user_city.py
-
45apps/account/migrations/0006_auto_20251006_1101.py
-
18apps/account/migrations/0006_user_country.py
-
27apps/account/migrations/0007_notification.py
-
17apps/account/migrations/0007_user_user_agent.py
-
57apps/account/migrations/0008_auto_20250316_1247.py
-
22apps/account/migrations/0008_loginhistory_device_os_loginhistory_user_agent.py
-
31apps/account/migrations/0009_auto_20250316_1319.py
-
17apps/account/migrations/0009_user_client_ip.py
-
21apps/account/migrations/0010_alter_user_device_os.py
-
18apps/account/migrations/0010_loginhistory_timezone.py
-
12apps/account/migrations/0011_merge_20260104_1114.py
-
184apps/api/migrations/0001_initial.py
-
42apps/api/migrations/0002_auto_20250911_1217.py
-
433apps/article/migrations/0001_initial.py
-
18apps/article/migrations/0002_article_download_count.py
-
47apps/article/migrations/0003_alter_middlearticlecollection_options_and_more.py
-
241apps/blog/migrations/0001_initial.py
-
31apps/blog/migrations/0002_blogseo.py
-
39apps/blog/migrations/0003_convert_varchar_to_jsonb.py
-
129apps/bookmark/migrations/0001_initial.py
-
35apps/bookmark/migrations/0002_rate.py
-
18apps/bookmark/migrations/0003_add_article_service_choice.py
-
23apps/bookmark/migrations/0004_auto_20251130_1758.py
-
23apps/bookmark/migrations/0005_auto_20251202_1245.py
-
67apps/certificate/migrations/0001_initial.py
-
18apps/certificate/migrations/0002_alter_certificate_certificate_file.py
-
18apps/certificate/migrations/0002_alter_certificate_status.py
-
12apps/certificate/migrations/0003_merge_20260104_1114.py
-
227apps/chat/migrations/0001_initial.py
-
49apps/chat/migrations/0002_auto_20241125_1219.py
-
18apps/chat/migrations/0002_chatmessage_metadata.py
-
24apps/chat/migrations/0003_add_file_and_image_attachments.py
-
34apps/chat/migrations/0003_auto_20241125_1737.py
-
18apps/chat/migrations/0004_roommessage_unread_messages_count.py
-
12apps/chat/migrations/0005_merge_20260104_1114.py
-
1036apps/course/migrations/0001_initial.py
-
18apps/course/migrations/0002_alter_course_thumbnail.py
-
32apps/course/migrations/0002_auto_20241121_2238.py
-
34apps/course/migrations/0003_alter_course_is_online_alter_course_timing_and_more.py
-
27apps/course/migrations/0003_participant.py
-
122apps/course/migrations/0005_add_database_indexes.py
-
18apps/course/migrations/0005_participant_unread_messages_count.py
-
23apps/course/migrations/0006_auto_20250113_1337.py
-
18apps/course/migrations/0006_participant_is_active.py
-
19apps/course/migrations/0007_alter_course_thumbnail.py
-
18apps/course/migrations/0007_course_online_link.py
-
104apps/course/migrations/0008_auto_20251013_1724.py
-
22apps/course/migrations/0009_auto_20251014_0051.py
-
18apps/course/migrations/0010_courselivesession_recorded_file.py
-
12apps/course/migrations/0011_merge_20260104_1114.py
-
77apps/dobodbi_calendar/migrations/0001_initial.py
-
1281apps/hadis/migrations/0001_initial.py
-
22apps/hadis/migrations/0002_auto_20250317_0055.py
-
40apps/hadis/migrations/0002_bookauthor_birth_year_hijri_and_more.py
-
217apps/hadis/migrations/0002_hadissect_hadisstatus_alter_hadis_options_and_more.py
-
23apps/hadis/migrations/0003_auto_20250317_0102.py
-
226apps/hadis/migrations/0003_bookreference_narratorlayer_and_more.py
-
121apps/hadis/migrations/0004_auto_20250321_0119.py
-
52apps/hadis/migrations/0004_hadiscollection_hadisincollection.py
-
21apps/hadis/migrations/0005_auto_20250321_1550.py
-
22apps/hadis/migrations/0005_auto_20251209_1620.py
-
23apps/hadis/migrations/0006_auto_20250321_1600.py
-
17apps/hadis/migrations/0006_hadiscategory_slug.py
-
28apps/hadis/migrations/0007_auto_20250321_2007.py
-
29apps/hadis/migrations/0007_auto_20251211_1313.py
-
29apps/hadis/migrations/0007_auto_20251211_1324.py
-
17apps/hadis/migrations/0008_alter_hadiscategory_slug.py
-
17apps/hadis/migrations/0009_alter_hadiscategory_slug.py
-
12apps/hadis/migrations/0010_merge_20251211_1555.py
-
17apps/hadis/migrations/0011_hadis_a.py
-
16apps/hadis/migrations/0012_remove_hadis_title_narrator.py
-
19apps/hadis/migrations/0013_hadis_title_narrator.py
-
16apps/hadis/migrations/0014_remove_hadistransmitter_narrator_layer.py
-
26apps/hadis/migrations/0015_hadistransmitter_narrator_layer.py
-
19apps/hadis/migrations/0016_remove_hadistransmitter_narrator_layer_and_more.py
-
64apps/hadis/migrations/0017_narratorlayer_hadistransmitter_narrator_layer.py
-
16apps/hadis/migrations/0018_remove_hadistransmitter_status.py
-
27apps/hadis/migrations/0019_hadistransmitter_status.py
-
17apps/hadis/migrations/0020_hadisreference_description.py
-
20apps/hadis/migrations/0021_remove_hadisreference_book_reference_and_more.py
-
30apps/hadis/migrations/0022_hadisreference_book_reference_and_more.py
-
29apps/hadis/migrations/0023_remove_hadisreference_book_reference_and_more.py
-
16apps/hadis/migrations/0024_remove_hadisreference_book.py
-
25apps/hadis/migrations/0025_hadisreference_book_reference.py
-
16apps/hadis/migrations/0026_remove_hadisreference_book_reference.py
-
25apps/hadis/migrations/0027_hadisreference_book_reference.py
-
17apps/hadis/migrations/0028_hadistransmitter_description.py
-
21apps/hadis/migrations/0029_remove_hadistransmitter_description_and_more.py
-
16apps/hadis/migrations/0030_remove_hadistransmitter_is_gap.py
-
17apps/hadis/migrations/0031_hadistransmitter_is_gap.py
-
21apps/hadis/migrations/0032_remove_hadis_a_hadis_description.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",), |
||||
), |
), |
||||
] |
] |
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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)), |
|
||||
], |
|
||||
), |
|
||||
] |
|
||||
@ -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/'), |
|
||||
), |
|
||||
] |
|
||||
@ -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), |
|
||||
), |
|
||||
] |
|
||||
@ -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',)}, |
|
||||
), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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')), |
|
||||
], |
|
||||
), |
|
||||
] |
|
||||
@ -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"), |
|
||||
), |
|
||||
] |
|
||||
@ -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)), |
|
||||
], |
|
||||
), |
|
||||
] |
|
||||
@ -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"), |
|
||||
), |
|
||||
] |
|
||||
@ -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', |
|
||||
), |
|
||||
] |
|
||||
@ -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"), |
|
||||
), |
|
||||
] |
|
||||
@ -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, |
|
||||
), |
|
||||
), |
|
||||
] |
|
||||
@ -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), |
|
||||
), |
|
||||
] |
|
||||
@ -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 = [] |
|
||||
@ -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"], |
||||
}, |
}, |
||||
), |
), |
||||
] |
] |
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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",), |
||||
), |
), |
||||
] |
] |
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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'], |
|
||||
}, |
|
||||
), |
|
||||
] |
|
||||
@ -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"], |
||||
}, |
}, |
||||
), |
), |
||||
] |
] |
||||
@ -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', |
|
||||
}, |
|
||||
), |
|
||||
] |
|
||||
@ -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); |
|
||||
""" |
|
||||
), |
|
||||
] |
|
||||
|
|
||||
@ -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')}, |
|
||||
}, |
|
||||
), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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", |
||||
|
), |
||||
|
), |
||||
], |
], |
||||
), |
), |
||||
] |
] |
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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), |
|
||||
), |
|
||||
] |
|
||||
@ -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 = [] |
|
||||
@ -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")}, |
||||
}, |
}, |
||||
), |
), |
||||
] |
] |
||||
@ -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, |
|
||||
), |
|
||||
] |
|
||||
@ -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), |
|
||||
), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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')}, |
|
||||
}, |
|
||||
), |
|
||||
] |
|
||||
@ -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), |
|
||||
), |
|
||||
] |
|
||||
@ -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
File diff suppressed because it is too large
View File
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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')}, |
|
||||
}, |
|
||||
), |
|
||||
] |
|
||||
@ -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)'), |
|
||||
), |
|
||||
] |
|
||||
@ -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')}, |
|
||||
}, |
|
||||
), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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), |
|
||||
), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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), |
|
||||
), |
|
||||
] |
|
||||
@ -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, |
|
||||
), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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 = [] |
|
||||
@ -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
File diff suppressed because it is too large
View File
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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)" |
||||
|
), |
||||
|
), |
||||
|
] |
||||
@ -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', |
|
||||
), |
|
||||
] |
|
||||
@ -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, |
|
||||
), |
|
||||
] |
|
||||
@ -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', |
|
||||
), |
|
||||
] |
|
||||
@ -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')}, |
|
||||
), |
|
||||
] |
|
||||
@ -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')}, |
|
||||
}, |
|
||||
), |
|
||||
] |
|
||||
@ -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', |
|
||||
), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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'), |
|
||||
), |
|
||||
] |
|
||||
@ -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), |
|
||||
), |
|
||||
] |
|
||||
@ -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')}, |
|
||||
), |
|
||||
] |
|
||||
@ -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), |
|
||||
] |
|
||||
@ -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), |
|
||||
] |
|
||||
@ -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), |
|
||||
), |
|
||||
] |
|
||||
@ -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), |
|
||||
), |
|
||||
] |
|
||||
@ -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 = [] |
|
||||
@ -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), |
|
||||
), |
|
||||
] |
|
||||
@ -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", |
|
||||
), |
|
||||
] |
|
||||
@ -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" |
|
||||
), |
|
||||
), |
|
||||
] |
|
||||
@ -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", |
|
||||
), |
|
||||
] |
|
||||
@ -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", |
|
||||
), |
|
||||
), |
|
||||
] |
|
||||
@ -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", |
|
||||
), |
|
||||
] |
|
||||
@ -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", |
|
||||
), |
|
||||
), |
|
||||
] |
|
||||
@ -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", |
|
||||
), |
|
||||
] |
|
||||
@ -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", |
|
||||
), |
|
||||
), |
|
||||
] |
|
||||
@ -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"), |
|
||||
), |
|
||||
] |
|
||||
@ -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", |
|
||||
), |
|
||||
] |
|
||||
@ -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"), |
|
||||
), |
|
||||
] |
|
||||
@ -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", |
|
||||
), |
|
||||
), |
|
||||
] |
|
||||
@ -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", |
|
||||
), |
|
||||
] |
|
||||
@ -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", |
|
||||
), |
|
||||
), |
|
||||
] |
|
||||
@ -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", |
|
||||
), |
|
||||
] |
|
||||
@ -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", |
|
||||
), |
|
||||
), |
|
||||
] |
|
||||
@ -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"), |
|
||||
), |
|
||||
] |
|
||||
@ -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"), |
|
||||
), |
|
||||
] |
|
||||
@ -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", |
|
||||
), |
|
||||
] |
|
||||
@ -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"), |
|
||||
), |
|
||||
] |
|
||||
@ -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
Write
Preview
Loading…
Cancel
Save
Reference in new issue