diff --git a/apps/article/migrations/0004_alter_articlecollection_slug.py b/apps/article/migrations/0004_alter_articlecollection_slug.py new file mode 100644 index 0000000..d60ee0a --- /dev/null +++ b/apps/article/migrations/0004_alter_articlecollection_slug.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.30 on 2026-07-20 17:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('article', '0003_remove_articlecollection_pin_top'), + ] + + operations = [ + migrations.AlterField( + model_name='articlecollection', + name='slug', + field=models.SlugField(allow_unicode=True, max_length=255, unique=True), + ), + ] diff --git a/apps/article/models.py b/apps/article/models.py index 3c5ea15..537508a 100755 --- a/apps/article/models.py +++ b/apps/article/models.py @@ -30,7 +30,7 @@ class ArticleCollection(LowercaseSlugMixin, models.Model): MIDDLE = 'middle', _('Middle Section') title = models.CharField(max_length=255, help_text="This title will not be displayed anywhere") - slug = models.SlugField(max_length=255, unique=True) + slug = models.SlugField(max_length=255, unique=True, allow_unicode=True) summary = models.CharField(max_length=512, null=True, blank=True, help_text=_('could be null')) thumbnail = models.ImageField(upload_to='article/collection/', null=True, blank=True, help_text=_('image allowed')) order = models.IntegerField(default=0, verbose_name=_('order')) diff --git a/apps/hadis/migrations/0032_alter_bookauthor_slug_alter_bookreference_slug_and_more.py b/apps/hadis/migrations/0032_alter_bookauthor_slug_alter_bookreference_slug_and_more.py new file mode 100644 index 0000000..080c980 --- /dev/null +++ b/apps/hadis/migrations/0032_alter_bookauthor_slug_alter_bookreference_slug_and_more.py @@ -0,0 +1,78 @@ +# Generated by Django 4.2.30 on 2026-07-20 17:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('hadis', '0031_remove_hadiscollection_pin_top_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='bookauthor', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, null=True, unique=True, verbose_name='slug'), + ), + migrations.AlterField( + model_name='bookreference', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, unique=True, verbose_name='slug'), + ), + migrations.AlterField( + model_name='bookresearcher', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, null=True, verbose_name='slug'), + ), + migrations.AlterField( + model_name='hadis', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, unique=True, verbose_name='slug'), + ), + migrations.AlterField( + model_name='hadiscollection', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, unique=True, verbose_name='slug'), + ), + migrations.AlterField( + model_name='hadiscorrection', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, unique=True, verbose_name='slug'), + ), + migrations.AlterField( + model_name='hadisinterpretation', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, verbose_name='slug'), + ), + migrations.AlterField( + model_name='hadisstatus', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, unique=True, verbose_name='slug'), + ), + migrations.AlterField( + model_name='narratorlayer', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, unique=True, verbose_name='slug'), + ), + migrations.AlterField( + model_name='opinionstatus', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, null=True, verbose_name='slug'), + ), + migrations.AlterField( + model_name='transmitteroriginaltext', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, unique=True, verbose_name='slug'), + ), + migrations.AlterField( + model_name='transmitterreliability', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, null=True, verbose_name='slug'), + ), + migrations.AlterField( + model_name='transmitters', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, unique=True, verbose_name='slug'), + ), + ] diff --git a/apps/hadis/models/hadis.py b/apps/hadis/models/hadis.py index 3fac040..e2fbdb7 100644 --- a/apps/hadis/models/hadis.py +++ b/apps/hadis/models/hadis.py @@ -16,7 +16,7 @@ class HadisCollection(LowercaseSlugMixin, models.Model): slug_source_field = 'title' title = models.JSONField(default = list , verbose_name=_('Title')) - slug = models.SlugField(max_length=255, unique=True, verbose_name=_('slug'), blank=True) + slug = models.SlugField(max_length=255, unique=True, verbose_name=_('slug'), blank=True, allow_unicode=True) summary = models.JSONField(default = list , verbose_name=_('Summary')) status = models.BooleanField(default=True, verbose_name=_('status')) display_position = models.CharField( @@ -120,7 +120,7 @@ class HadisStatus(ColorPaletteMixin, LowercaseSlugMixin, models.Model): slug_source_field = 'title' title = models.JSONField(default = list , verbose_name=_('Title')) - slug= models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,unique = True) + slug= models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,unique = True, allow_unicode=True) # color = models.CharField(max_length=20, choices=ColorChoices.choices, verbose_name=_('color')) order = models.IntegerField(default=0, verbose_name=_('order')) description = models.JSONField(default = list , verbose_name=_('Description')) @@ -158,7 +158,7 @@ class Hadis(LowercaseSlugMixin, models.Model): category = models.ForeignKey("hadis.HadisCategory", on_delete=models.SET_NULL, null=True, blank=True, verbose_name=_('category')) number = models.PositiveIntegerField(verbose_name=_('number'), default=1) legacy_id = models.CharField(max_length=255, unique=True, null=True, blank=True, db_index=True) - slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,unique=True) + slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,unique=True, allow_unicode=True) 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')) @@ -388,7 +388,7 @@ class ReferenceImage(models.Model): class HadisCorrection(models.Model): hadis = models.ForeignKey(Hadis, verbose_name=_("hadis correction"), on_delete=models.CASCADE) title = models.JSONField(default = list , verbose_name=_('Title')) - slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,unique=True) + slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,unique=True, allow_unicode=True) legacy_id = models.CharField(max_length=255, unique=True, null=True, blank=True, db_index=True) narrator = models.CharField(max_length=255, null=True, blank=True, verbose_name=_('Narrator')) links = models.JSONField(verbose_name=_('links'), null=True, blank=True, default=dict) @@ -447,7 +447,7 @@ class HadisCorrection(models.Model): class HadisInterpretation(models.Model): category = models.ForeignKey('HadisCategory', on_delete=models.CASCADE, related_name='interpretations', verbose_name=_('Category')) - slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True, db_index=True) # 👈 فیلد جدید + slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True, db_index=True, allow_unicode=True) # 👈 فیلد جدید legacy_id = models.CharField(max_length=255, unique=True, null=True, blank=True, db_index=True) narrator = models.CharField(max_length=255, null=True, blank=True, verbose_name=_('Narrator')) links = models.JSONField(verbose_name=_('links'), null=True, blank=True, default=dict) diff --git a/apps/hadis/models/reference.py b/apps/hadis/models/reference.py index bf83ae1..45fffd2 100644 --- a/apps/hadis/models/reference.py +++ b/apps/hadis/models/reference.py @@ -95,7 +95,7 @@ class BookReference(LowercaseSlugMixin, models.Model): description = models.JSONField(default = list , verbose_name=_('Description')) language = models.JSONField(default = list , verbose_name=_('Language')) number_page = models.PositiveIntegerField(verbose_name=_('number of pages'), blank=True, null=True) - slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,unique=True) + slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,unique=True, allow_unicode=True) subject_area = models.ManyToManyField( 'BookSubjectArea', verbose_name=_('Subject Area'), @@ -329,7 +329,7 @@ class BookAuthor(LowercaseSlugMixin, models.Model): Model for book reference authors """ name = models.JSONField(default=list, verbose_name=_('Name')) - slug = models.SlugField(max_length=255, verbose_name=_('slug'), null=True, blank=True, unique=True) + slug = models.SlugField(max_length=255, verbose_name=_('slug'), null=True, blank=True, unique=True, allow_unicode=True) related_narrator = models.OneToOneField( 'hadis.Transmitters', @@ -466,7 +466,7 @@ class BookResearcher(LowercaseSlugMixin, models.Model): verbose_name=_('Author') ) name = models.JSONField(default=list, blank=True, verbose_name=_('Name')) - slug = models.SlugField(max_length=255, verbose_name=_('slug'), null=True, blank=True) + slug = models.SlugField(max_length=255, verbose_name=_('slug'), null=True, blank=True, allow_unicode=True) class Meta: verbose_name = _('Book Researcher') diff --git a/apps/hadis/models/transmitter.py b/apps/hadis/models/transmitter.py index ce06d3d..09e2062 100644 --- a/apps/hadis/models/transmitter.py +++ b/apps/hadis/models/transmitter.py @@ -20,7 +20,7 @@ class NarratorLayer(LowercaseSlugMixin, models.Model): name = models.JSONField(default = list , verbose_name=_('Name')) number = models.PositiveIntegerField(verbose_name=_('layer number'), unique=True) description = models.JSONField(default = list , verbose_name=_('Description')) - slug = models.SlugField(max_length=255,unique=True, verbose_name=_('slug'), blank=True) + slug = models.SlugField(max_length=255,unique=True, verbose_name=_('slug'), blank=True, allow_unicode=True) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('created at')) updated_at = models.DateTimeField(auto_now=True, verbose_name=_('updated at')) @@ -127,7 +127,7 @@ class TransmitterReliability(ColorPaletteMixin, LowercaseSlugMixin, models.Model slug_source_field = 'title' title = models.JSONField(default = list , verbose_name=_('Title')) - slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,null=True) + slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,null=True, allow_unicode=True) @@ -183,7 +183,7 @@ class Transmitters(LowercaseSlugMixin, models.Model): 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(max_length=255, verbose_name=_('slug'), blank=True,unique=True) + slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,unique=True, allow_unicode=True) legacy_number = models.PositiveIntegerField(unique=True, null=True, blank=True, db_index=True) legacy_id = models.CharField(max_length=255, unique=True, null=True, blank=True, db_index=True) relatives_raw = models.JSONField(default=dict, blank=True, verbose_name=_('Raw Relatives Data')) @@ -389,7 +389,7 @@ class OpinionStatus(ColorPaletteMixin, LowercaseSlugMixin, models.Model): slug_source_field = 'title' title = models.JSONField(default = list , verbose_name=_('Title')) - slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,null=True) + slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,null=True, allow_unicode=True) @@ -510,7 +510,7 @@ class TransmitterOriginalText(models.Model): verbose_name=_('transmitter'), related_name='originaltexts' ) - slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,unique=True) + slug = models.SlugField(max_length=255, verbose_name=_('slug'), blank=True,unique=True, allow_unicode=True) title = models.JSONField(default = list , verbose_name=_('Title')) text = models.JSONField(default = list , verbose_name=_('Text')) translation = models.JSONField(verbose_name=_('translation'), default=list) diff --git a/apps/library/migrations/0008_alter_author_slug_alter_book_slug_and_more.py b/apps/library/migrations/0008_alter_author_slug_alter_book_slug_and_more.py new file mode 100644 index 0000000..86c30bd --- /dev/null +++ b/apps/library/migrations/0008_alter_author_slug_alter_book_slug_and_more.py @@ -0,0 +1,33 @@ +# Generated by Django 4.2.30 on 2026-07-20 17:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('library', '0007_remove_bookcollection_pin_top_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='author', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, null=True, unique=True), + ), + migrations.AlterField( + model_name='book', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, null=True, unique=True), + ), + migrations.AlterField( + model_name='bookcollection', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, null=True, unique=True), + ), + migrations.AlterField( + model_name='category', + name='slug', + field=models.SlugField(allow_unicode=True, blank=True, max_length=255, null=True, unique=True), + ), + ] diff --git a/apps/library/models.py b/apps/library/models.py index a81aabe..de38714 100644 --- a/apps/library/models.py +++ b/apps/library/models.py @@ -18,7 +18,7 @@ class BookCollection(LowercaseSlugMixin, models.Model): # BOTTOM = 'bottom', _('Bottom Section') title = models.CharField(max_length=255) - slug = models.SlugField(max_length=255, unique=True, blank=True, null=True) + slug = models.SlugField(max_length=255, unique=True, blank=True, null=True, allow_unicode=True) summary = models.CharField(max_length=512, null=True, blank=True, help_text=_('could be null')) display_position = models.CharField( max_length=20, @@ -65,7 +65,7 @@ class MiddleBookCollection(BookCollection): class Category(LowercaseSlugMixin, models.Model): title = models.CharField(max_length=255) - slug = models.SlugField(max_length=255, unique=True, blank=True, null=True) + slug = models.SlugField(max_length=255, unique=True, blank=True, null=True, allow_unicode=True) status = models.BooleanField(default=True, verbose_name=_('status')) # books = models.ManyToManyField('library.Book', related_name='related_categories_books',through="library.Book_categories" ,verbose_name=_('Books'), blank=True) @@ -88,7 +88,7 @@ class Category(LowercaseSlugMixin, models.Model): class Author(LowercaseSlugMixin, models.Model): slug_source_field = 'full_name' full_name = models.CharField(max_length=255, verbose_name=_('Full Name')) - slug = models.SlugField(max_length=255, unique=True, blank=True, null=True) + slug = models.SlugField(max_length=255, unique=True, blank=True, null=True, allow_unicode=True) thumbnail = models.ImageField( upload_to='author_thumbnails/', null=True, @@ -140,7 +140,7 @@ class Book(LowercaseSlugMixin, models.Model): docx = 'docx', 'Docx' title = models.CharField(max_length=255) - slug = models.SlugField(max_length=255, unique=True, blank=True, null=True) + slug = models.SlugField(max_length=255, unique=True, blank=True, null=True, allow_unicode=True) slogan = models.CharField(max_length=300, blank=True, null=True) summary_title = models.CharField(max_length=512, null=True, blank=True, help_text=_('Summary Title')) diff --git a/apps/podcast/migrations/0004_alter_podcastcollection_slug.py b/apps/podcast/migrations/0004_alter_podcastcollection_slug.py new file mode 100644 index 0000000..15ce524 --- /dev/null +++ b/apps/podcast/migrations/0004_alter_podcastcollection_slug.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.30 on 2026-07-20 17:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('podcast', '0003_remove_podcastcollection_pin_top'), + ] + + operations = [ + migrations.AlterField( + model_name='podcastcollection', + name='slug', + field=models.SlugField(allow_unicode=True, max_length=255, unique=True), + ), + ] diff --git a/apps/podcast/models.py b/apps/podcast/models.py index c3e38e4..94fb79d 100644 --- a/apps/podcast/models.py +++ b/apps/podcast/models.py @@ -31,7 +31,7 @@ class PodcastCollection(LowercaseSlugMixin, models.Model): MIDDLE = 'middle', _('Middle Section') title = models.CharField(max_length=255, help_text="This title will not be displayed anywhere") - slug = models.SlugField(max_length=255, unique=True) + slug = models.SlugField(max_length=255, unique=True, allow_unicode=True) summary = models.CharField(max_length=512, null=True, blank=True, help_text=_('could be null')) thumbnail = models.ImageField(upload_to='podcast/collection/', null=True, blank=True, help_text=_('image allowed')) order = models.IntegerField(default=0, verbose_name=_('order')) diff --git a/apps/video/migrations/0004_alter_videocollection_slug.py b/apps/video/migrations/0004_alter_videocollection_slug.py new file mode 100644 index 0000000..aa6c1f5 --- /dev/null +++ b/apps/video/migrations/0004_alter_videocollection_slug.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.30 on 2026-07-20 17:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('video', '0003_remove_videocollection_pin_top'), + ] + + operations = [ + migrations.AlterField( + model_name='videocollection', + name='slug', + field=models.SlugField(allow_unicode=True, max_length=255, unique=True), + ), + ] diff --git a/apps/video/models.py b/apps/video/models.py index 410ddd4..1d3e88b 100644 --- a/apps/video/models.py +++ b/apps/video/models.py @@ -33,7 +33,7 @@ class VideoCollection(LowercaseSlugMixin, models.Model): MIDDLE = 'middle', _('Middle Section') title = models.CharField(max_length=255) - slug = models.SlugField(max_length=255, unique=True) + slug = models.SlugField(max_length=255, unique=True, allow_unicode=True) summary = models.CharField(max_length=512, null=True, blank=True, help_text=_('could be null')) thumbnail = models.ImageField(upload_to='video/collection/', null=True, blank=True, help_text=_('image allowed')) order = models.IntegerField(default=0, verbose_name=_('order'))