Add advanced case search page with filtering options and pagination
This commit is contained in:
@@ -345,6 +345,104 @@ def case_displaysets(request, pk):
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@login_required
|
||||
def case_search_page(request):
|
||||
"""Full page case search with quick filters.
|
||||
|
||||
Supports GET params:
|
||||
- q: query string
|
||||
- field: one of ['all','title','description','history','author']
|
||||
- my: '1' to limit to cases authored by current user
|
||||
- open: '1' to limit to open_access cases
|
||||
- has_images: '1' to require series images
|
||||
- subspecialty: id of subspecialty to filter
|
||||
- page: pagination page
|
||||
"""
|
||||
q = request.GET.get("q", "").strip()
|
||||
field = request.GET.get("field", "all")
|
||||
my_cases = request.GET.get("my", "0") == "1"
|
||||
open_access = request.GET.get("open", "0") == "1"
|
||||
has_images = request.GET.get("has_images", "0") == "1"
|
||||
subspecialty_id = request.GET.get("subspecialty")
|
||||
|
||||
qs = get_cases_available_to_user(request.user)
|
||||
|
||||
if my_cases:
|
||||
qs = qs.filter(author=request.user)
|
||||
|
||||
if open_access:
|
||||
qs = qs.filter(open_access=True)
|
||||
|
||||
if subspecialty_id:
|
||||
try:
|
||||
sid = int(subspecialty_id)
|
||||
qs = qs.filter(subspecialty__id=sid)
|
||||
except (ValueError, TypeError):
|
||||
pass
|
||||
|
||||
if q:
|
||||
if field == "title":
|
||||
qs = qs.filter(title__icontains=q)
|
||||
elif field == "description":
|
||||
qs = qs.filter(description__icontains=q)
|
||||
elif field == "history":
|
||||
qs = qs.filter(history__icontains=q)
|
||||
elif field == "author":
|
||||
qs = qs.filter(
|
||||
Q(author__first_name__icontains=q)
|
||||
| Q(author__last_name__icontains=q)
|
||||
| Q(author__username__icontains=q)
|
||||
)
|
||||
else:
|
||||
qs = qs.filter(
|
||||
Q(title__icontains=q)
|
||||
| Q(description__icontains=q)
|
||||
| Q(history__icontains=q)
|
||||
| Q(discussion__icontains=q)
|
||||
| Q(report__icontains=q)
|
||||
| Q(condition__name__icontains=q)
|
||||
| Q(presentation__name__icontains=q)
|
||||
| Q(subspecialty__name__icontains=q)
|
||||
| Q(series__description__icontains=q)
|
||||
| Q(series__modality__modality__icontains=q)
|
||||
| Q(series__examination__examination__icontains=q)
|
||||
| Q(author__first_name__icontains=q)
|
||||
| Q(author__last_name__icontains=q)
|
||||
| Q(author__username__icontains=q)
|
||||
).distinct()
|
||||
|
||||
if has_images:
|
||||
qs = qs.filter(series__images__isnull=False).distinct()
|
||||
|
||||
qs = qs.order_by("-created_date")
|
||||
|
||||
# Paginate results
|
||||
paginator = Paginator(qs, 25)
|
||||
page_number = request.GET.get("page")
|
||||
page_obj = paginator.get_page(page_number)
|
||||
|
||||
# Recent cases (authored by current user)
|
||||
recent_cases = get_cases_available_to_user(request.user).filter(author=request.user).order_by("-created_date")[:5]
|
||||
|
||||
subspecialty_queryset = Subspecialty.objects.all().order_by("name")
|
||||
|
||||
return render(
|
||||
request,
|
||||
"atlas/case_search_page.html",
|
||||
{
|
||||
"cases": page_obj,
|
||||
"q": q,
|
||||
"field": field,
|
||||
"my": my_cases,
|
||||
"open": open_access,
|
||||
"has_images": has_images,
|
||||
"subspecialty_queryset": subspecialty_queryset,
|
||||
"selected_subspecialty": subspecialty_id,
|
||||
"recent_cases": recent_cases,
|
||||
},
|
||||
)
|
||||
|
||||
@login_required
|
||||
@user_has_case_view_access
|
||||
@require_http_methods(["GET", "POST"])
|
||||
|
||||
Reference in New Issue
Block a user