From 2e37ea5b2ab976acf5f6793803a5400a81e92f36 Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Sun, 7 Jun 2026 20:56:34 +0330 Subject: [PATCH] ensure the course multilanguages are isolated with all related apps --- apps/blog/views_admin.py | 11 +++++++++++ apps/quiz/views/admin.py | 11 +++++++++++ apps/transaction/views.py | 15 ++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/apps/blog/views_admin.py b/apps/blog/views_admin.py index b757ea8..a37ad06 100644 --- a/apps/blog/views_admin.py +++ b/apps/blog/views_admin.py @@ -36,13 +36,22 @@ class AdminBlogViewSet(ModelViewSet): # Custom Search handling for JSON fields search_query = self.request.query_params.get('search', None) + has_search = False if search_query: + has_search = True + from django.db.models import Case, When, Value, IntegerField # Note: Searching inside a JSON array of dicts in Django can be tricky # depending on your DB (PostgreSQL vs SQLite). # This is a safe fallback using text casting for SQLite/PG compatibility. queryset = queryset.filter( Q(title__icontains=search_query) | Q(slogan__icontains=search_query) + ).annotate( + search_relevance=Case( + When(title__icontains=search_query, then=Value(2)), + default=Value(1), + output_field=IntegerField() + ) ) created_date = self.request.query_params.get('created', None) @@ -57,6 +66,8 @@ class AdminBlogViewSet(ModelViewSet): if created_before: queryset = queryset.filter(created_at__date__lte=created_before) + if has_search: + return queryset.order_by('-search_relevance', '-created_at') return queryset.order_by('-created_at') class AdminBlogContentViewSet(ModelViewSet): diff --git a/apps/quiz/views/admin.py b/apps/quiz/views/admin.py index 96faba0..9e6b7d0 100644 --- a/apps/quiz/views/admin.py +++ b/apps/quiz/views/admin.py @@ -91,14 +91,23 @@ class AdminQuizViewSet(ModelViewSet): # Handle Search search_query = self.request.query_params.get('search', None) + has_search = False if search_query: + has_search = True matching_course_ids = find_matching_course_ids(search_query) matching_lesson_ids = find_matching_lesson_ids(search_query) + from django.db.models import Case, When, Value, IntegerField queryset = queryset.filter( Q(title__icontains=search_query) | Q(description__icontains=search_query) | Q(course_id__in=matching_course_ids) | Q(lesson_id__in=matching_lesson_ids) + ).annotate( + search_relevance=Case( + When(title__icontains=search_query, then=Value(2)), + default=Value(1), + output_field=IntegerField() + ) ) # Handle Course Filter @@ -119,6 +128,8 @@ class AdminQuizViewSet(ModelViewSet): elif status_param.lower() == 'false': queryset = queryset.filter(status=False) + if has_search: + return queryset.order_by('-search_relevance', '-id') return queryset.order_by('-id') @action(detail=True, methods=['get']) diff --git a/apps/transaction/views.py b/apps/transaction/views.py index 7bff327..bc2aebf 100644 --- a/apps/transaction/views.py +++ b/apps/transaction/views.py @@ -462,6 +462,7 @@ class AdminTransactionViewSet(ModelViewSet): """ queryset = TransactionParticipant.objects.all() serializer_class = AdminTransactionSerializer + permission_classes = [IsAuthenticated, IsSuperAdmin] authentication_classes = [TokenAuthentication] pagination_class = StandardResultsSetPagination @@ -476,7 +477,9 @@ class AdminTransactionViewSet(ModelViewSet): # Search search_query = self.request.query_params.get('search', None) + has_search = False if search_query: + has_search = True matching_course_ids = list( Course.objects.filter( Q(title__icontains=search_query) | @@ -492,10 +495,19 @@ class AdminTransactionViewSet(ModelViewSet): or normalized_search in extract_text_from_json(course.slug).lower() ] + from django.db.models import Case, When, Value, IntegerField queryset = queryset.filter( Q(user__fullname__icontains=search_query) | Q(user__email__icontains=search_query) | Q(course_id__in=matching_course_ids) + ).annotate( + search_relevance=Case( + When(user__fullname__icontains=search_query, then=Value(3)), + When(user__email__icontains=search_query, then=Value(2)), + When(course_id__in=matching_course_ids, then=Value(1)), + default=Value(0), + output_field=IntegerField() + ) ) # Status filter @@ -525,5 +537,6 @@ class AdminTransactionViewSet(ModelViewSet): if date_before: queryset = queryset.filter(created_at__date__lte=date_before) + if has_search: + return queryset.order_by('-search_relevance', '-created_at') return queryset.order_by('-created_at') -