diff --git a/apps/hadis/migrations/0021_rename_page_originaltextreference_pages_and_more.py b/apps/hadis/migrations/0021_rename_page_originaltextreference_pages_and_more.py new file mode 100644 index 0000000..cc485c3 --- /dev/null +++ b/apps/hadis/migrations/0021_rename_page_originaltextreference_pages_and_more.py @@ -0,0 +1,84 @@ +# Generated by Django 5.2.12 on 2026-06-23 11:34 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('hadis', '0020_transmitteropinion_scholar'), + ] + + operations = [ + migrations.RenameField( + model_name='originaltextreference', + old_name='page', + new_name='pages', + ), + migrations.AddField( + model_name='correctionreference', + name='address', + field=models.TextField(blank=True, null=True, verbose_name='Address'), + ), + migrations.AddField( + model_name='correctionreference', + name='book_volume', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='hadis.bookvolume', verbose_name='Volume Record'), + ), + migrations.AddField( + model_name='correctionreference', + name='edition', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='hadis.bookedition', verbose_name='Edition'), + ), + migrations.AddField( + model_name='interpretationreference', + name='address', + field=models.TextField(blank=True, null=True, verbose_name='Address'), + ), + migrations.AddField( + model_name='interpretationreference', + name='book_volume', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='hadis.bookvolume', verbose_name='Volume Record'), + ), + migrations.AddField( + model_name='interpretationreference', + name='edition', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='hadis.bookedition', verbose_name='Edition'), + ), + migrations.AddField( + model_name='originaltextreference', + name='address', + field=models.TextField(blank=True, null=True, verbose_name='Address'), + ), + migrations.AddField( + model_name='originaltextreference', + name='book_volume', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='hadis.bookvolume', verbose_name='Volume Record'), + ), + migrations.AddField( + model_name='originaltextreference', + name='edition', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='hadis.bookedition', verbose_name='Edition'), + ), + migrations.AlterField( + model_name='correctionreference', + name='volume', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Volume Text'), + ), + migrations.AlterField( + model_name='interpretationreference', + name='volume', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Volume Text'), + ), + migrations.AlterField( + model_name='originaltextreference', + name='url', + field=models.URLField(blank=True, max_length=1000, null=True), + ), + migrations.AlterField( + model_name='originaltextreference', + name='volume', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Volume Text'), + ), + ] diff --git a/apps/hadis/migrations/0022_hadisinterpretation_slug.py b/apps/hadis/migrations/0022_hadisinterpretation_slug.py new file mode 100644 index 0000000..5515498 --- /dev/null +++ b/apps/hadis/migrations/0022_hadisinterpretation_slug.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.12 on 2026-06-23 11:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('hadis', '0021_rename_page_originaltextreference_pages_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='hadisinterpretation', + name='slug', + field=models.SlugField(blank=True, max_length=255, verbose_name='slug'), + ), + ] diff --git a/apps/hadis/models/hadis.py b/apps/hadis/models/hadis.py index e8e1d5c..5dd99ac 100644 --- a/apps/hadis/models/hadis.py +++ b/apps/hadis/models/hadis.py @@ -568,6 +568,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) # 👈 فیلد جدید legacy_id = models.CharField(max_length=255, unique=True, null=True, blank=True, db_index=True) title = models.JSONField(default=list, verbose_name=_('Title')) @@ -582,6 +583,12 @@ class HadisInterpretation(models.Model): verbose_name = _("Hadis Interpretation") verbose_name_plural = _("Hadis Interpretations") + def save(self, *args, **kwargs): + # 👈 ست کردن اسلاگ تفسیر برابر با اسلاگ کتگوری + if self.category and self.category.slug: + self.slug = self.category.slug + super().save(*args, **kwargs) + # --- FOR CORRECTIONS --- class CorrectionReference(models.Model): correction = models.ForeignKey(HadisCorrection, on_delete=models.CASCADE, related_name='references') diff --git a/apps/hadis/urls.py b/apps/hadis/urls.py index dc7e4ca..625fdc4 100644 --- a/apps/hadis/urls.py +++ b/apps/hadis/urls.py @@ -120,8 +120,7 @@ urlpatterns = [ # path('debug-headers',debug_headers , name='headers'), # Interpretation Detail Endpoint (تفسیر بر اساس آی‌دی) - path('interpretations//', HadisInterpretationDetailView.as_view(), name='interpretation-detail'), - + path('interpretations//', HadisInterpretationDetailView.as_view(), name='interpretation-detail'), # Correction Detail Endpoint (تصحیح بر اساس اسلاگ) path('corrections//', HadisCorrectionDetailView.as_view(), name='correction-detail'), diff --git a/apps/hadis/views/hadis.py b/apps/hadis/views/hadis.py index 3f0e2de..66d3a0e 100644 --- a/apps/hadis/views/hadis.py +++ b/apps/hadis/views/hadis.py @@ -858,10 +858,10 @@ class HadisCorrectionDetailView(RetrieveAPIView): ) class HadisInterpretationDetailView(RetrieveAPIView): - """API View to get full details of a specific HadisInterpretation by ID""" + """API View to get full details of a specific HadisInterpretation by slug""" serializer_class = HadisInterpretationDetailSerializer - lookup_field = 'id' - lookup_url_kwarg = 'interpretation_id' + lookup_field = 'slug' # 👈 تغییر به slug + lookup_url_kwarg = 'interpretation_slug' permission_classes = [AllowAny] def get_queryset(self): @@ -872,4 +872,18 @@ class HadisInterpretationDetailView(RetrieveAPIView): 'references__edition', 'references__book_volume', 'references__images' - ) \ No newline at end of file + ) + + # 👈 هندل کردن حالت امن برای زمانی که چند تفسیر در یک کتگوری باشند + def get_object(self): + queryset = self.filter_queryset(self.get_queryset()) + lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field + filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]} + + obj = queryset.filter(**filter_kwargs).first() # گرفتن اولین آبجکت + + if not obj: + raise Http404("No HadisInterpretation matches the given query.") + + self.check_object_permissions(self.request, obj) + return obj \ No newline at end of file