From 56ff4f37a0442cd353d45ef6263a1da4dab73e5b Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Tue, 25 Aug 2026 09:57:31 +0330 Subject: [PATCH] feat(hadis-admin): enable optional pagination and multipart/json parser for interpretations and corrections --- apps/hadis/serializers/serializers_admin.py | 31 +++++++++++++++++++-- apps/hadis/views_admin.py | 8 +++--- utils/__init__.py | 4 ++- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/apps/hadis/serializers/serializers_admin.py b/apps/hadis/serializers/serializers_admin.py index d792a68..36322ab 100644 --- a/apps/hadis/serializers/serializers_admin.py +++ b/apps/hadis/serializers/serializers_admin.py @@ -353,11 +353,34 @@ def save_relation_reference_data(instance, validated_data, request=None, is_corr address = validated_data.pop("address", None) delete_image_ids = validated_data.pop("delete_image_ids", []) - new_images = request.FILES.getlist("uploaded_images") if request else [] + new_images = [] + if request: + files_obj = getattr(request, "FILES", None) + if not files_obj and hasattr(request, "_request"): + files_obj = getattr(request._request, "FILES", None) + + if files_obj: + if hasattr(files_obj, "getlist"): + new_images = files_obj.getlist("uploaded_images") or files_obj.getlist("uploaded_images[]") + if not new_images: + val = files_obj.get("uploaded_images") or files_obj.get("uploaded_images[]") + if val: + new_images = [val] if not isinstance(val, list) else val + + if not new_images and hasattr(request, "data"): + data_obj = request.data + if hasattr(data_obj, "getlist"): + new_images = data_obj.getlist("uploaded_images") or data_obj.getlist("uploaded_images[]") + if not new_images and hasattr(data_obj, "get"): + val = data_obj.get("uploaded_images") or data_obj.get("uploaded_images[]") + if val: + new_images = val if isinstance(val, list) else [val] + + actual_images = [img for img in new_images if img and not isinstance(img, (str, int, float, bool, dict))] ref = instance.references.first() if not ref: - if book_reference or address or new_images: + if book_reference or address or actual_images: if ref_type == "original_text": ref = OriginalTextReference.objects.create(original_text=instance) elif is_correction: @@ -376,7 +399,7 @@ def save_relation_reference_data(instance, validated_data, request=None, is_corr if delete_image_ids: ref.images.filter(id__in=delete_image_ids).delete() - for img in new_images: + for img in actual_images: if ref_type == "original_text": OriginalTextReferenceImage.objects.create(reference=ref, image=img) elif is_correction: @@ -385,6 +408,8 @@ def save_relation_reference_data(instance, validated_data, request=None, is_corr InterpretationReferenceImage.objects.create(reference=ref, image=img) + + class AdminHadisCorrectionSerializer(serializers.ModelSerializer): hadis_detail = AdminHadisBriefSerializer(source="hadis", read_only=True) bookmark_count = serializers.IntegerField(source="annotated_bookmark_count", read_only=True) diff --git a/apps/hadis/views_admin.py b/apps/hadis/views_admin.py index 77c5fd6..e431ff0 100644 --- a/apps/hadis/views_admin.py +++ b/apps/hadis/views_admin.py @@ -358,8 +358,8 @@ class AdminHadisCorrectionViewSet(ModelViewSet): serializer_class = AdminHadisCorrectionSerializer permission_classes = [IsAuthenticated, IsSuperAdmin] authentication_classes = [TokenAuthentication] - parser_classes = (JSONParser, MultiPartParser, FormParser) - pagination_class = None + parser_classes = (MultiPartParser, FormParser, JSONParser) + pagination_class = OptionalPagination def get_queryset(self): from django.db.models import Count, OuterRef, Subquery, IntegerField @@ -414,8 +414,8 @@ class AdminHadisInterpretationViewSet(ModelViewSet): serializer_class = AdminHadisInterpretationSerializer permission_classes = [IsAuthenticated, IsSuperAdmin] authentication_classes = [TokenAuthentication] - parser_classes = (JSONParser, MultiPartParser, FormParser) - pagination_class = None + parser_classes = (MultiPartParser, FormParser, JSONParser) + pagination_class = OptionalPagination def get_queryset(self): queryset = HadisInterpretation.objects.all().select_related("category").prefetch_related("references", "references__images") diff --git a/utils/__init__.py b/utils/__init__.py index bd0eda0..6054fec 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -38,11 +38,13 @@ logger = logging.getLogger(__name__) def absolute_https_url(url, request=None): - """Build an absolute URL and always expose it over HTTPS.""" + """Build an absolute URL and always expose it over HTTPS, except in local development (localhost/127.0.0.1).""" if request: url = request.build_absolute_uri(url) if isinstance(url, str) and url.startswith('http://'): + if 'localhost' in url or '127.0.0.1' in url: + return url return f'https://{url[7:]}' return url