5 changed files with 343 additions and 1 deletions
-
23apps/hadis/migrations/0014_hadiscorrection_priority_and_more.py
-
2apps/hadis/models/hadis.py
-
165apps/hadis/serializers/serializers_admin.py
-
14apps/hadis/urls.py
-
140apps/hadis/views_admin.py
@ -0,0 +1,23 @@ |
|||
# Generated by Django 5.2.12 on 2026-06-13 08:54 |
|||
|
|||
from django.db import migrations, models |
|||
|
|||
|
|||
class Migration(migrations.Migration): |
|||
|
|||
dependencies = [ |
|||
('hadis', '0013_remove_correctionreferenceimage_pages_and_more'), |
|||
] |
|||
|
|||
operations = [ |
|||
migrations.AddField( |
|||
model_name='hadiscorrection', |
|||
name='priority', |
|||
field=models.IntegerField(default=0, verbose_name='priority'), |
|||
), |
|||
migrations.AddField( |
|||
model_name='hadisinterpretation', |
|||
name='priority', |
|||
field=models.IntegerField(default=0, verbose_name='priority'), |
|||
), |
|||
] |
|||
@ -0,0 +1,165 @@ |
|||
from rest_framework import serializers |
|||
from ..models import Hadis, HadisCategory, HadisStatus, HadisTag, HadisCorrection, HadisInterpretation, HadisSect |
|||
from .category import LocalizedField |
|||
|
|||
|
|||
class AdminHadisCategorySerializer(serializers.ModelSerializer): |
|||
sect_type = serializers.CharField(source='sect.sect_type', read_only=True) |
|||
title = LocalizedField() |
|||
description = LocalizedField() |
|||
|
|||
class Meta: |
|||
model = HadisCategory |
|||
fields = [ |
|||
"id", |
|||
"title", |
|||
"slug", |
|||
"source_type", |
|||
"order", |
|||
"sect", |
|||
"sect_type", |
|||
"description", |
|||
] |
|||
|
|||
|
|||
class AdminHadisStatusSerializer(serializers.ModelSerializer): |
|||
title = LocalizedField() |
|||
description = LocalizedField() |
|||
|
|||
class Meta: |
|||
model = HadisStatus |
|||
fields = ["id", "title", "slug", "color", "order", "description"] |
|||
|
|||
|
|||
class AdminHadisTagSerializer(serializers.ModelSerializer): |
|||
title = LocalizedField() |
|||
|
|||
class Meta: |
|||
model = HadisTag |
|||
fields = ["id", "title", "status"] |
|||
|
|||
|
|||
class AdminHadisListSerializer(serializers.ModelSerializer): |
|||
category_detail = AdminHadisCategorySerializer(source="category", read_only=True) |
|||
hadis_status_detail = AdminHadisStatusSerializer(source="hadis_status", read_only=True) |
|||
title = LocalizedField() |
|||
title_narrator = LocalizedField() |
|||
translation = LocalizedField() |
|||
|
|||
class Meta: |
|||
model = Hadis |
|||
fields = [ |
|||
"id", |
|||
"number", |
|||
"slug", |
|||
"title", |
|||
"title_narrator", |
|||
"text", |
|||
"translation", |
|||
"status", |
|||
"category", |
|||
"category_detail", |
|||
"hadis_status", |
|||
"hadis_status_detail", |
|||
"created_at", |
|||
"updated_at", |
|||
] |
|||
read_only_fields = ["id", "slug", "created_at", "updated_at"] |
|||
|
|||
|
|||
class AdminHadisDetailSerializer(serializers.ModelSerializer): |
|||
category_detail = AdminHadisCategorySerializer(source="category", read_only=True) |
|||
hadis_status_detail = AdminHadisStatusSerializer(source="hadis_status", read_only=True) |
|||
tags_detail = AdminHadisTagSerializer(source="tags", many=True, read_only=True) |
|||
|
|||
category = serializers.PrimaryKeyRelatedField( |
|||
queryset=HadisCategory.objects.all(), |
|||
required=False, |
|||
allow_null=True, |
|||
) |
|||
hadis_status = serializers.PrimaryKeyRelatedField( |
|||
queryset=HadisStatus.objects.all(), |
|||
required=False, |
|||
allow_null=True, |
|||
) |
|||
tags = serializers.PrimaryKeyRelatedField( |
|||
queryset=HadisTag.objects.all(), |
|||
many=True, |
|||
required=False, |
|||
) |
|||
|
|||
class Meta: |
|||
model = Hadis |
|||
fields = [ |
|||
"id", |
|||
"number", |
|||
"slug", |
|||
"category", |
|||
"category_detail", |
|||
"title_narrator", |
|||
"title", |
|||
"description", |
|||
"text", |
|||
"translation", |
|||
"status", |
|||
"hadis_status", |
|||
"hadis_status_detail", |
|||
"hadis_status_text", |
|||
"address", |
|||
"links", |
|||
"tags", |
|||
"tags_detail", |
|||
"share_link", |
|||
"explanation", |
|||
"created_at", |
|||
"updated_at", |
|||
"embedded_in", |
|||
] |
|||
read_only_fields = ["id", "slug", "share_link", "created_at", "updated_at"] |
|||
|
|||
def create(self, validated_data): |
|||
tags = validated_data.pop("tags", []) |
|||
hadis = super().create(validated_data) |
|||
if tags: |
|||
hadis.tags.set(tags) |
|||
return hadis |
|||
|
|||
def update(self, instance, validated_data): |
|||
tags = validated_data.pop("tags", None) |
|||
hadis = super().update(instance, validated_data) |
|||
if tags is not None: |
|||
hadis.tags.set(tags) |
|||
return hadis |
|||
|
|||
|
|||
class AdminHadisCorrectionSerializer(serializers.ModelSerializer): |
|||
class Meta: |
|||
model = HadisCorrection |
|||
fields = [ |
|||
"id", |
|||
"hadis", |
|||
"title", |
|||
"slug", |
|||
"text", |
|||
"translation", |
|||
"priority", |
|||
"created_at", |
|||
"updated_at", |
|||
] |
|||
read_only_fields = ["id", "slug", "created_at", "updated_at"] |
|||
|
|||
|
|||
class AdminHadisInterpretationSerializer(serializers.ModelSerializer): |
|||
class Meta: |
|||
model = HadisInterpretation |
|||
fields = [ |
|||
"id", |
|||
"category", |
|||
"title", |
|||
"text", |
|||
"translation", |
|||
"priority", |
|||
"created_at", |
|||
"updated_at", |
|||
] |
|||
read_only_fields = ["id", "created_at", "updated_at"] |
|||
@ -0,0 +1,140 @@ |
|||
from django.db.models import Q |
|||
from rest_framework.authentication import TokenAuthentication |
|||
from rest_framework.decorators import action |
|||
from rest_framework.parsers import FormParser, JSONParser, MultiPartParser |
|||
from rest_framework.permissions import IsAuthenticated |
|||
from rest_framework.response import Response |
|||
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet |
|||
|
|||
from apps.account.permissions import IsSuperAdmin |
|||
from utils.pagination import StandardResultsSetPagination |
|||
|
|||
from .models import Hadis, HadisCategory, HadisCorrection, HadisInterpretation, HadisStatus, HadisTag |
|||
from .serializers.serializers_admin import ( |
|||
AdminHadisCategorySerializer, |
|||
AdminHadisCorrectionSerializer, |
|||
AdminHadisDetailSerializer, |
|||
AdminHadisInterpretationSerializer, |
|||
AdminHadisListSerializer, |
|||
AdminHadisStatusSerializer, |
|||
AdminHadisTagSerializer, |
|||
) |
|||
|
|||
|
|||
class AdminHadisCategoryViewSet(ReadOnlyModelViewSet): |
|||
serializer_class = AdminHadisCategorySerializer |
|||
permission_classes = [IsAuthenticated, IsSuperAdmin] |
|||
authentication_classes = [TokenAuthentication] |
|||
pagination_class = None |
|||
|
|||
def get_queryset(self): |
|||
return HadisCategory.objects.all().order_by("order", "id") |
|||
|
|||
|
|||
class AdminHadisStatusViewSet(ReadOnlyModelViewSet): |
|||
serializer_class = AdminHadisStatusSerializer |
|||
permission_classes = [IsAuthenticated, IsSuperAdmin] |
|||
authentication_classes = [TokenAuthentication] |
|||
pagination_class = None |
|||
|
|||
def get_queryset(self): |
|||
return HadisStatus.objects.all().order_by("order", "id") |
|||
|
|||
|
|||
class AdminHadisTagViewSet(ReadOnlyModelViewSet): |
|||
serializer_class = AdminHadisTagSerializer |
|||
permission_classes = [IsAuthenticated, IsSuperAdmin] |
|||
authentication_classes = [TokenAuthentication] |
|||
pagination_class = None |
|||
|
|||
def get_queryset(self): |
|||
return HadisTag.objects.all().order_by("id") |
|||
|
|||
|
|||
|
|||
class AdminHadisViewSet(ModelViewSet): |
|||
permission_classes = [IsAuthenticated, IsSuperAdmin] |
|||
authentication_classes = [TokenAuthentication] |
|||
pagination_class = StandardResultsSetPagination |
|||
parser_classes = (MultiPartParser, FormParser, JSONParser) |
|||
|
|||
def get_serializer_class(self): |
|||
if self.action == "list": |
|||
return AdminHadisListSerializer |
|||
return AdminHadisDetailSerializer |
|||
|
|||
def get_queryset(self): |
|||
queryset = Hadis.objects.all().select_related("category", "hadis_status") |
|||
|
|||
search_query = self.request.query_params.get("search") |
|||
if search_query: |
|||
q_filter = ( |
|||
Q(title__icontains=search_query) |
|||
| Q(title_narrator__icontains=search_query) |
|||
| Q(text__icontains=search_query) |
|||
| Q(translation__icontains=search_query) |
|||
| Q(slug__icontains=search_query) |
|||
) |
|||
if search_query.isdigit(): |
|||
q_filter |= Q(number=int(search_query)) |
|||
queryset = queryset.filter(q_filter) |
|||
|
|||
category_id = self.request.query_params.get("category") |
|||
if category_id and category_id != "all": |
|||
queryset = queryset.filter(category_id=category_id) |
|||
|
|||
status_filter = self.request.query_params.get("status") |
|||
if status_filter in {"true", "false"}: |
|||
queryset = queryset.filter(status=status_filter == "true") |
|||
|
|||
return queryset.distinct().order_by("-id") |
|||
|
|||
|
|||
class AdminHadisCorrectionViewSet(ModelViewSet): |
|||
serializer_class = AdminHadisCorrectionSerializer |
|||
permission_classes = [IsAuthenticated, IsSuperAdmin] |
|||
authentication_classes = [TokenAuthentication] |
|||
parser_classes = (JSONParser, MultiPartParser, FormParser) |
|||
|
|||
def get_queryset(self): |
|||
queryset = HadisCorrection.objects.all() |
|||
hadis_id = self.request.query_params.get("hadis_id") |
|||
if hadis_id: |
|||
queryset = queryset.filter(hadis_id=hadis_id) |
|||
return queryset.order_by("priority", "created_at") |
|||
|
|||
@action(detail=False, methods=["post"]) |
|||
def reorder(self, request): |
|||
correction_ids = request.data.get("correction_ids", []) |
|||
if not correction_ids: |
|||
return Response({"error": "correction_ids list is required"}, status=400) |
|||
|
|||
for index, correction_id in enumerate(correction_ids, start=1): |
|||
HadisCorrection.objects.filter(id=correction_id).update(priority=index) |
|||
|
|||
return Response({"status": "success"}) |
|||
|
|||
|
|||
class AdminHadisInterpretationViewSet(ModelViewSet): |
|||
serializer_class = AdminHadisInterpretationSerializer |
|||
permission_classes = [IsAuthenticated, IsSuperAdmin] |
|||
authentication_classes = [TokenAuthentication] |
|||
parser_classes = (JSONParser, MultiPartParser, FormParser) |
|||
|
|||
def get_queryset(self): |
|||
queryset = HadisInterpretation.objects.all() |
|||
category_id = self.request.query_params.get("category_id") |
|||
if category_id: |
|||
queryset = queryset.filter(category_id=category_id) |
|||
return queryset.order_by("priority", "created_at") |
|||
|
|||
@action(detail=False, methods=["post"]) |
|||
def reorder(self, request): |
|||
interpretation_ids = request.data.get("interpretation_ids", []) |
|||
if not interpretation_ids: |
|||
return Response({"error": "interpretation_ids list is required"}, status=400) |
|||
|
|||
for index, interpretation_id in enumerate(interpretation_ids, start=1): |
|||
HadisInterpretation.objects.filter(id=interpretation_id).update(priority=index) |
|||
|
|||
return Response({"status": "success"}) |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue