Browse Source

feat(hadis-admin): enable optional pagination and multipart/json parser for interpretations and corrections

master
Mohsen Taba 3 hours ago
parent
commit
56ff4f37a0
  1. 31
      apps/hadis/serializers/serializers_admin.py
  2. 8
      apps/hadis/views_admin.py
  3. 4
      utils/__init__.py

31
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)

8
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")

4
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

Loading…
Cancel
Save