Implement resource search functionality and enhance resource management in case details
This commit is contained in:
+100
-1
@@ -46,7 +46,7 @@ from django.http import Http404, JsonResponse
|
||||
from django.http import HttpResponseRedirect, HttpResponse
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
|
||||
from generic.models import CidUser, CidUserExam, CimarCase
|
||||
from generic.models import CidUser, CidUserExam, CimarCase, Site
|
||||
from atlas.helpers import get_cases_available_to_user
|
||||
from rad.settings import REMOTE_URL, CIMAR_USERNAME, CIMAR_PASSWORD
|
||||
|
||||
@@ -478,6 +478,9 @@ def case_detail(request, pk):
|
||||
"is_atlas_editor": is_atlas_editor,
|
||||
"is_case_author": is_case_author,
|
||||
"can_mark_normal": can_mark_normal,
|
||||
# Provide helper lists for resource search filters
|
||||
"site_queryset": Site.objects.all(),
|
||||
"subspecialty_queryset": Subspecialty.objects.all(),
|
||||
},
|
||||
)
|
||||
|
||||
@@ -4007,6 +4010,102 @@ def case_dicom_json(request, pk):
|
||||
return JsonResponse(case.get_case_dicom_json())
|
||||
|
||||
|
||||
@login_required
|
||||
def resource_search_widget(request):
|
||||
"""HTMX endpoint: search existing `Resource` objects with simple filters.
|
||||
|
||||
GET params:
|
||||
- q: query string (name/description)
|
||||
- site: site id (optional)
|
||||
- subspecialty: subspecialty id (optional)
|
||||
- open_access: '1' or '0' (optional)
|
||||
|
||||
Returns rendered partial `atlas/partials/resource_search_widget_results.html`.
|
||||
"""
|
||||
from .models import Resource
|
||||
|
||||
q = request.GET.get("q", "").strip()
|
||||
site = request.GET.get("site")
|
||||
subspecialty = request.GET.get("subspecialty")
|
||||
open_access = request.GET.get("open_access")
|
||||
|
||||
qs = Resource.objects.all()
|
||||
if q:
|
||||
qs = qs.filter(Q(name__icontains=q) | Q(description__icontains=q) | Q(url__icontains=q))
|
||||
if site:
|
||||
try:
|
||||
qs = qs.filter(sites__id=int(site))
|
||||
except Exception:
|
||||
pass
|
||||
if subspecialty:
|
||||
try:
|
||||
qs = qs.filter(subspecialty__id=int(subspecialty))
|
||||
except Exception:
|
||||
pass
|
||||
if open_access in ["0", "1"]:
|
||||
qs = qs.filter(open_access=(open_access == "1"))
|
||||
|
||||
# Restrict to what the user may see: open_access or authored (unless editor)
|
||||
if not (request.user.is_superuser or request.user.groups.filter(name="atlas_editor").exists()):
|
||||
qs = qs.filter(Q(open_access=True) | Q(author__id=request.user.id)).distinct()
|
||||
|
||||
results = qs.order_by("name")[:50]
|
||||
|
||||
field = request.GET.get("field", "resource_search")
|
||||
case_id = request.GET.get("case_id")
|
||||
return render(request, "atlas/partials/resource_search_widget_results.html", {"results": results, "field": field, "case_id": case_id})
|
||||
|
||||
|
||||
@login_required
|
||||
@require_POST
|
||||
def case_attach_resource(request, pk):
|
||||
"""Attach an existing resource to the case (HTMX POST).
|
||||
|
||||
POST params:
|
||||
- resource_id: integer
|
||||
- pre_review: '1' or '0' (optional)
|
||||
|
||||
Returns the updated `atlas/partials/case_resources_list.html` fragment.
|
||||
"""
|
||||
case = get_case_for_case_detail(pk)
|
||||
if not case.check_user_can_edit(request.user):
|
||||
return HttpResponse(status=403)
|
||||
|
||||
resource_id = request.POST.get("resource_id")
|
||||
pre_review = request.POST.get("pre_review", "0") == "1"
|
||||
from .models import Resource, CaseResource
|
||||
try:
|
||||
resource = Resource.objects.get(pk=int(resource_id))
|
||||
except Exception:
|
||||
return HttpResponse(status=400)
|
||||
|
||||
# create if not exists
|
||||
cr, created = CaseResource.objects.get_or_create(case=case, resource=resource, defaults={"pre_review": pre_review})
|
||||
if not created:
|
||||
# update flag
|
||||
cr.pre_review = pre_review
|
||||
cr.save()
|
||||
|
||||
# Render updated list
|
||||
return render(request, "atlas/partials/case_resources_list.html", {"case": case})
|
||||
|
||||
|
||||
@login_required
|
||||
@require_POST
|
||||
def case_detach_resource(request, pk):
|
||||
case = get_case_for_case_detail(pk)
|
||||
if not case.check_user_can_edit(request.user):
|
||||
return HttpResponse(status=403)
|
||||
resource_id = request.POST.get("resource_id")
|
||||
from .models import CaseResource
|
||||
try:
|
||||
cr = CaseResource.objects.filter(case=case, resource__id=int(resource_id))
|
||||
cr.delete()
|
||||
except Exception:
|
||||
pass
|
||||
return render(request, "atlas/partials/case_resources_list.html", {"case": case})
|
||||
|
||||
|
||||
def series_dicom_json(request, pk):
|
||||
series = get_object_or_404(Series, pk=pk)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user