# Generated by Django 4.2.27 on 2026-01-22 10:48 from django.conf import settings from django.db import migrations, models import django.db.models.deletion import filer.fields.image import mptt.fields class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.FILER_IMAGE_MODEL), ] operations = [ migrations.CreateModel( name="BookAttribute", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("title", models.JSONField(default=list, verbose_name="Title")), ("value", models.JSONField(default=list, verbose_name="Value")), ( "created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), ( "updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at"), ), ], options={ "verbose_name": "Book Attribute", "verbose_name_plural": "Book Attributes", "ordering": ["title"], }, ), migrations.CreateModel( name="BookAuthor", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("name", models.JSONField(default=list, verbose_name="Name")), ( "created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), ( "updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at"), ), ], options={ "verbose_name": "Book Author", "verbose_name_plural": "Book Authors", "ordering": ["name"], }, ), migrations.CreateModel( name="BookReference", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("title", models.JSONField(default=list, verbose_name="Title")), ( "description", models.JSONField(default=list, verbose_name="Description"), ), ("language", models.JSONField(default=list, verbose_name="Language")), ( "isbn", models.CharField( blank=True, max_length=100, null=True, verbose_name="ISBN" ), ), ( "volume", models.CharField( blank=True, max_length=100, null=True, verbose_name="volume" ), ), ( "year_of_publication", models.CharField( blank=True, max_length=50, null=True, verbose_name="year of publication", ), ), ( "number_page", models.PositiveIntegerField( blank=True, null=True, verbose_name="number of pages" ), ), ( "slug", models.SlugField( blank=True, max_length=255, unique=True, verbose_name="slug" ), ), ("publisher", models.JSONField(default=list, verbose_name="Publisher")), ( "rate", models.DecimalField( blank=True, decimal_places=2, help_text="Rating from 0 to 5", max_digits=3, null=True, verbose_name="rate", ), ), ( "created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), ( "updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at"), ), ], options={ "verbose_name": "Book Reference", "verbose_name_plural": "Book References", "ordering": ("-created_at",), }, ), migrations.CreateModel( name="ContentRelease", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "version_name", models.CharField(max_length=50, verbose_name="Version Name"), ), ( "published_at", models.DateTimeField( auto_now_add=True, verbose_name="Published Date" ), ), ( "description", models.TextField(blank=True, verbose_name="Release Description"), ), ("is_active", models.BooleanField(default=True, verbose_name="Active")), ], options={ "ordering": ["-published_at"], }, ), migrations.CreateModel( name="Hadis", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "number", models.PositiveIntegerField(default=1, verbose_name="number"), ), ( "slug", models.SlugField( blank=True, max_length=255, unique=True, verbose_name="slug" ), ), ( "title_narrator", models.JSONField(default=list, verbose_name="Title Narrator"), ), ("title", models.JSONField(default=list, verbose_name="Title")), ( "description", models.JSONField(default=list, verbose_name="Description"), ), ("text", models.TextField(verbose_name="text")), ( "translation", models.JSONField(default=list, verbose_name="translation"), ), ( "status", models.BooleanField(default=True, verbose_name="visibility"), ), ( "hadis_status_text", models.JSONField(default=list, verbose_name="Status text"), ), ("address", models.JSONField(default=list, verbose_name="Address")), ( "links", models.JSONField( blank=True, default=dict, null=True, verbose_name="links" ), ), ( "share_link", models.CharField( blank=True, max_length=255, null=True, verbose_name="share link" ), ), ( "explanation", models.JSONField(default=list, verbose_name="Explanation"), ), ( "created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), ( "updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at"), ), ], options={ "verbose_name": "hadis", "verbose_name_plural": "hadises", "ordering": ("category", "number"), }, ), migrations.CreateModel( name="HadisCollection", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("title", models.JSONField(default=list, verbose_name="Title")), ( "slug", models.SlugField( blank=True, max_length=255, unique=True, verbose_name="slug" ), ), ("summary", models.JSONField(default=list, verbose_name="Summary")), ("status", models.BooleanField(default=True, verbose_name="status")), ("order", models.IntegerField(default=0, verbose_name="order")), ( "created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), ( "updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at"), ), ( "thumbnail", filer.fields.image.FilerImageField( blank=True, help_text="thumbnail image", null=True, on_delete=django.db.models.deletion.CASCADE, related_name="+", to=settings.FILER_IMAGE_MODEL, verbose_name="thumbnail", ), ), ], options={ "verbose_name": "hadis collection", "verbose_name_plural": "hadis collections", "ordering": ("order",), }, ), migrations.CreateModel( name="HadisReference", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), ( "description", models.JSONField(default=list, verbose_name="Description"), ), ( "book_reference", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="hadis_references", to="hadis.bookreference", verbose_name="book reference", ), ), ( "hadis", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="references", to="hadis.hadis", verbose_name="hadis", ), ), ], options={ "verbose_name": "Hadis Reference", "verbose_name_plural": "Hadis References", }, ), migrations.CreateModel( name="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.JSONField(default=list, verbose_name="Title")), ( "description", models.JSONField(default=list, verbose_name="Description"), ), ( "is_active", models.BooleanField(default=True, verbose_name="Is Active"), ), ("order", models.IntegerField(default=0, verbose_name="order")), ], options={ "verbose_name": "Hadis 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.JSONField(default=list, verbose_name="Title")), ( "slug", models.SlugField( blank=True, max_length=255, unique=True, verbose_name="slug" ), ), ( "color", models.CharField( choices=[ ("red", "Red"), ("green", "Green"), ("blue", "Blue"), ("yellow", "Yellow"), ("orange", "Orange"), ("purple", "Purple"), ("gray", "Gray"), ], max_length=20, verbose_name="color", ), ), ("order", models.IntegerField(default=0, verbose_name="order")), ], options={ "verbose_name": "hadis status", "verbose_name_plural": "hadis statuses", "ordering": ("order",), }, ), migrations.CreateModel( name="HadisTag", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("title", models.JSONField(default=list, verbose_name="Title")), ("status", models.BooleanField(default=True, verbose_name="status")), ( "created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), ( "updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at"), ), ], ), migrations.CreateModel( name="NarratorLayer", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("name", models.JSONField(default=list, verbose_name="Name")), ( "number", models.PositiveIntegerField( unique=True, verbose_name="layer number" ), ), ( "description", models.JSONField(default=list, verbose_name="Description"), ), ( "slug", models.SlugField( blank=True, max_length=255, unique=True, verbose_name="slug" ), ), ( "created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), ( "updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at"), ), ], options={ "verbose_name": "Narrator Layer", "verbose_name_plural": "Narrator Layers", "ordering": ["number"], }, ), migrations.CreateModel( name="OpinionStatus", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("title", models.JSONField(default=list, verbose_name="Title")), ( "slug", models.SlugField( blank=True, max_length=255, null=True, verbose_name="slug" ), ), ( "color", models.CharField( choices=[ ("red", "Red"), ("green", "Green"), ("blue", "Blue"), ("yellow", "Yellow"), ("orange", "Orange"), ("purple", "Purple"), ("gray", "Gray"), ], max_length=20, verbose_name="color", ), ), ], options={ "verbose_name": "Opinion Status", "verbose_name_plural": "Opinion Statuses", }, ), migrations.CreateModel( name="TransmitterReliability", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("title", models.JSONField(default=list, verbose_name="Title")), ( "slug", models.SlugField( blank=True, max_length=255, null=True, verbose_name="slug" ), ), ( "color", models.CharField( choices=[ ("red", "Red"), ("green", "Green"), ("blue", "Blue"), ("yellow", "Yellow"), ("orange", "Orange"), ("purple", "Purple"), ("gray", "Gray"), ], max_length=20, verbose_name="color", ), ), ], options={ "verbose_name": "Transmitter Reliability", "verbose_name_plural": "Transmitter Reliabilities", }, ), migrations.CreateModel( name="Transmitters", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("full_name", models.JSONField(default=list, verbose_name="Full Name")), ("kunya", models.JSONField(default=list, verbose_name="Kunya")), ("known_as", models.JSONField(default=list, verbose_name="Known as")), ("nickname", models.JSONField(default=list, verbose_name="Nick Name")), ( "slug", models.SlugField( blank=True, max_length=255, unique=True, verbose_name="slug" ), ), ("origin", models.JSONField(default=list, verbose_name="Origin")), ("lived_in", models.JSONField(default=list, verbose_name="Lived in")), ("died_in", models.JSONField(default=list, verbose_name="Died in")), ( "birth_year_hijri", models.IntegerField( blank=True, null=True, verbose_name="Birth Year (Hijri)" ), ), ( "death_year_hijri", models.IntegerField( blank=True, null=True, verbose_name="Death Year (Hijri)" ), ), ( "age_at_death", models.PositiveIntegerField( blank=True, null=True, verbose_name="Age at Death" ), ), ( "generation", models.PositiveIntegerField( blank=True, null=True, verbose_name="Generation" ), ), ( "madhhab", models.CharField( choices=[ ("shia", "Shia"), ("sunni", "Sunni"), ("other", "Other"), ("unknown", "Unknown"), ], default="unknown", max_length=20, verbose_name="Madhhab/School of Thought", ), ), ( "in_sahih_muslim", models.BooleanField( default=False, help_text="Is this narrator present in Sahih Muslim?", verbose_name="In Sahih Muslim", ), ), ( "in_sahih_bukhari", models.BooleanField( default=False, help_text="Is this narrator present in Sahih Bukhari?", verbose_name="In Sahih Bukhari", ), ), ( "description", models.JSONField(default=list, verbose_name="Description"), ), ( "created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), ( "updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at"), ), ( "reliability", models.ForeignKey( default=12, on_delete=django.db.models.deletion.CASCADE, related_name="transmitters", to="hadis.transmitterreliability", verbose_name="reliability", ), ), ( "thumbnail", filer.fields.image.FilerImageField( blank=True, help_text="image allowed", null=True, on_delete=django.db.models.deletion.CASCADE, related_name="+", to=settings.FILER_IMAGE_MODEL, ), ), ], options={ "verbose_name": "Transmitter", "verbose_name_plural": "Transmitters", "ordering": ("full_name",), }, ), migrations.CreateModel( name="TransmitterOriginalText", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "slug", models.SlugField( blank=True, max_length=255, unique=True, verbose_name="slug" ), ), ("title", models.JSONField(default=list, verbose_name="Title")), ("text", models.JSONField(default=list, verbose_name="Text")), ( "translation", models.JSONField(default=list, verbose_name="translation"), ), ( "share_link", models.CharField( blank=True, max_length=255, null=True, verbose_name="share link" ), ), ( "transmitter", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="originaltexts", to="hadis.transmitters", verbose_name="transmitter", ), ), ], options={ "verbose_name": "Transmitter Original Text", "verbose_name_plural": "Transmitter Original Text", }, ), migrations.CreateModel( name="TransmitterOpinion", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "scholar_name", models.JSONField(default=list, verbose_name="Scholar Name"), ), ( "opinion_text", models.JSONField(default=list, verbose_name="Opinion Text"), ), ( "created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), ( "updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at"), ), ( "status", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="opinions", to="hadis.opinionstatus", verbose_name="opinion status", ), ), ( "transmitter", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="opinions", to="hadis.transmitters", verbose_name="transmitter", ), ), ], options={ "verbose_name": "Transmitter Opinion", "verbose_name_plural": "Transmitter Opinions", "ordering": ("-created_at",), }, ), migrations.CreateModel( name="ReferenceImage", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "thumbnail", models.ImageField( blank=True, null=True, upload_to="hadis/reference_images/", verbose_name="thumbnail", ), ), ( "priority", models.IntegerField( default=0, help_text="Priority of the image, lower values mean higher priority.", verbose_name="Priority", ), ), ( "reference", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="images", to="hadis.hadisreference", verbose_name="Hadis Reference", ), ), ], options={ "verbose_name": "Reference Image", "verbose_name_plural": "Reference Images", }, ), migrations.CreateModel( name="HadisTransmitter", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "order", models.PositiveIntegerField( default=0, help_text="Order in the chain of transmission", verbose_name="Order", ), ), ("is_gap", models.BooleanField(default=False, verbose_name="is gap")), ( "created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), ( "hadis", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="transmitters", to="hadis.hadis", verbose_name="hadis", ), ), ( "narrator_layer", models.ForeignKey( blank=True, help_text="The layer/class (Tabaqah) this narrator belongs to", null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="transmitters", to="hadis.narratorlayer", verbose_name="narrator layer", ), ), ( "status", models.ForeignKey( blank=True, help_text="Reliability status of the narrator", null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="hadis_transmitters", to="hadis.transmitterreliability", verbose_name="reliability status", ), ), ( "transmitter", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="hadises", to="hadis.transmitters", verbose_name="transmitter", ), ), ], options={ "verbose_name": "Hadis Transmitter", "verbose_name_plural": "Hadis Transmitters", "ordering": ("hadis", "order"), }, ), migrations.CreateModel( name="HadisInCollection", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("order", models.IntegerField(default=0, verbose_name="order")), ( "created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), ( "collection", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="hadis_items", to="hadis.hadiscollection", verbose_name="collection", ), ), ( "hadis", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="collection_items", to="hadis.hadis", verbose_name="hadis", ), ), ], options={ "verbose_name": "hadis in collection", "verbose_name_plural": "hadis in collections", "ordering": ("order",), }, ), migrations.CreateModel( name="HadisCorrection", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("title", models.JSONField(default=list, verbose_name="Title")), ( "slug", models.SlugField( blank=True, max_length=255, unique=True, verbose_name="slug" ), ), ( "description", models.JSONField(default=list, verbose_name="Description"), ), ( "translation", models.JSONField(default=list, verbose_name="translation"), ), ( "created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), ( "updated_at", models.DateTimeField(auto_now=True, verbose_name="updated at"), ), ( "share_link", models.CharField( blank=True, max_length=255, null=True, verbose_name="share link" ), ), ( "hadis", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, to="hadis.hadis", verbose_name="hadis correction", ), ), ], options={ "verbose_name": "Hadis Correction", "verbose_name_plural": "Hadis Corrections", "ordering": ("-created_at",), }, ), migrations.CreateModel( name="HadisCategory", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "source_type", models.CharField( choices=[ ("quran", "Quran"), ("hadith", "Hadith"), ("history", "History"), ("fatwa", "Fatwa"), ("quote", "Quote"), ], max_length=10, verbose_name="Source Type", ), ), ("title", models.JSONField(default=list, verbose_name="Title")), ( "description", models.JSONField(default=list, verbose_name="Description"), ), ("order", models.IntegerField(default=0, verbose_name="order")), ( "xmind_file", models.FileField( blank=True, null=True, upload_to="hadis/xmind_files/", verbose_name="xmind file", ), ), ("slug", models.SlugField(blank=True, max_length=255, null=True)), ("lft", models.PositiveIntegerField(editable=False)), ("rght", models.PositiveIntegerField(editable=False)), ("tree_id", models.PositiveIntegerField(db_index=True, editable=False)), ("level", models.PositiveIntegerField(editable=False)), ( "parent", mptt.fields.TreeForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="children", to="hadis.hadiscategory", ), ), ( "sect", models.ForeignKey( on_delete=django.db.models.deletion.PROTECT, to="hadis.hadissect", verbose_name="Sect", ), ), ], options={ "verbose_name": "Hadis Category", "verbose_name_plural": "Hadis Categories", "ordering": ("order",), }, ), migrations.AddField( model_name="hadis", name="category", field=models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="hadis.hadiscategory", verbose_name="category", ), ), migrations.AddField( model_name="hadis", name="hadis_status", field=models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="hadis.hadisstatus", verbose_name="hadis status", ), ), migrations.AddField( model_name="hadis", name="tags", field=models.ManyToManyField( blank=True, related_name="hadis_overview", to="hadis.hadistag", verbose_name="tags", ), ), migrations.CreateModel( name="BookReferenceImage", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "image", models.ImageField( upload_to="hadis/book_reference_images/", verbose_name="image" ), ), ("order", models.PositiveIntegerField(default=0, verbose_name="order")), ( "description", models.JSONField(default=list, verbose_name="Description"), ), ( "created_at", models.DateTimeField(auto_now_add=True, verbose_name="created at"), ), ( "book_reference", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="images", to="hadis.bookreference", verbose_name="book reference", ), ), ], options={ "verbose_name": "Book Reference Image", "verbose_name_plural": "Book Reference Images", "ordering": ["order", "-created_at"], }, ), migrations.AddIndex( model_name="bookreference", index=models.Index(fields=["id"], name="hadis_bookr_id_1b53f6_idx"), ), migrations.AddField( model_name="bookauthor", name="book_references", field=models.ManyToManyField( blank=True, related_name="authors", to="hadis.bookreference", verbose_name="book references", ), ), migrations.AddField( model_name="bookattribute", name="book_reference", field=models.ForeignKey( default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="attributes", to="hadis.bookreference", verbose_name="book attribute", ), ), migrations.AddIndex( model_name="transmitters", index=models.Index(fields=["id"], name="hadis_trans_id_bd318c_idx"), ), migrations.AddIndex( model_name="transmitteroriginaltext", index=models.Index( fields=["transmitter"], name="hadis_trans_transmi_fff93f_idx" ), ), migrations.AddIndex( model_name="transmitteropinion", index=models.Index( fields=["transmitter"], name="hadis_trans_transmi_0f1df2_idx" ), ), migrations.AddIndex( model_name="referenceimage", index=models.Index( fields=["reference", "priority"], name="hadis_refer_referen_a37840_idx" ), ), migrations.AddIndex( model_name="hadistransmitter", index=models.Index( fields=["hadis", "order"], name="hadis_hadis_hadis_i_d04e3a_idx" ), ), migrations.AlterUniqueTogether( name="hadistransmitter", unique_together={("hadis", "transmitter", "order")}, ), migrations.AddIndex( model_name="hadisreference", index=models.Index( fields=["book_reference"], name="hadis_hadis_book_re_3fb4f0_idx" ), ), migrations.AlterUniqueTogether( name="hadisincollection", unique_together={("hadis", "collection")}, ), migrations.AddIndex( model_name="hadiscategory", index=models.Index( fields=["parent", "sect"], name="hadis_hadis_parent__e7a217_idx" ), ), migrations.AddIndex( model_name="hadiscategory", index=models.Index( fields=["sect", "order"], name="hadis_hadis_sect_id_b57c1d_idx" ), ), migrations.AddIndex( model_name="hadis", index=models.Index( fields=["status", "id"], name="hadis_hadis_status_5e0de5_idx" ), ), ]