Add Procedure model integration: create views, forms, and templates; update URLs and search functionality
This commit is contained in:
+65
-3
@@ -88,6 +88,7 @@ from .forms import (
|
||||
SubspecialtyForm,
|
||||
PresentationForm,
|
||||
PathologicalProcessForm,
|
||||
ProcedureForm,
|
||||
UserQuestionAnswerForm,
|
||||
UserReportAnswerForm,
|
||||
)
|
||||
@@ -2748,6 +2749,65 @@ class PresentationView(LoginRequiredMixin, UserConfigurablePaginationMixin, Sing
|
||||
return ctx
|
||||
|
||||
|
||||
class ProcedureView(LoginRequiredMixin, UserConfigurablePaginationMixin, SingleTableMixin, ListView):
|
||||
model = Procedure
|
||||
table_class = __import__('atlas.tables', fromlist=['ProcedureTable']).ProcedureTable
|
||||
template_name = "atlas/view.html"
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
ctx = super().get_context_data(**kwargs)
|
||||
try:
|
||||
ctx["create_url"] = reverse(f"atlas:{self.model._meta.model_name}_create")
|
||||
except NoReverseMatch:
|
||||
ctx["create_url"] = None
|
||||
ctx["model_verbose_name"] = getattr(self.model._meta, "verbose_name", None)
|
||||
ctx["model_verbose_name_plural"] = getattr(self.model._meta, "verbose_name_plural", None)
|
||||
return ctx
|
||||
|
||||
|
||||
class ProcedureCreate(RevisionMixin, LoginRequiredMixin, CreateView):
|
||||
model = Procedure
|
||||
form_class = ProcedureForm
|
||||
template_name = "atlas/procedure_form.html"
|
||||
def form_valid(self, form):
|
||||
self.object = form.save()
|
||||
return super().form_valid(form)
|
||||
|
||||
def form_invalid(self, form):
|
||||
logger.warning("ProcedureCreate form invalid: %s", form.errors)
|
||||
return super().form_invalid(form)
|
||||
|
||||
def get_success_url(self):
|
||||
try:
|
||||
return reverse("atlas:procedure_detail", kwargs={"pk": self.object.pk})
|
||||
except Exception:
|
||||
return reverse("atlas:procedure_view")
|
||||
|
||||
|
||||
class ProcedureUpdate(RevisionMixin, LoginRequiredMixin, UpdateView):
|
||||
model = Procedure
|
||||
form_class = ProcedureForm
|
||||
template_name = "atlas/procedure_form.html"
|
||||
def form_valid(self, form):
|
||||
self.object = form.save()
|
||||
return super().form_valid(form)
|
||||
|
||||
def form_invalid(self, form):
|
||||
logger.warning("ProcedureUpdate form invalid: %s", form.errors)
|
||||
return super().form_invalid(form)
|
||||
|
||||
def get_success_url(self):
|
||||
try:
|
||||
return reverse("atlas:procedure_detail", kwargs={"pk": self.object.pk})
|
||||
except Exception:
|
||||
return reverse("atlas:procedure_view")
|
||||
|
||||
|
||||
class ProcedureDelete(RevisionMixin, LoginRequiredMixin, DeleteView):
|
||||
model = Procedure
|
||||
template_name = "confirm_delete.html"
|
||||
|
||||
|
||||
class PathologicalProcessView(LoginRequiredMixin, UserConfigurablePaginationMixin, SingleTableMixin, FilterView):
|
||||
model = PathologicalProcess
|
||||
table_class = PathologicalProcessTable
|
||||
@@ -3137,7 +3197,7 @@ def categories_list(request):
|
||||
|
||||
results = None
|
||||
if query:
|
||||
from .models import Condition, Finding, Structure, Subspecialty, Presentation
|
||||
from .models import Condition, Finding, Structure, Subspecialty, Presentation, Procedure
|
||||
|
||||
# Helper to conditionally populate each result list only when the
|
||||
# corresponding type is requested (or when no types filter provided).
|
||||
@@ -3150,6 +3210,7 @@ def categories_list(request):
|
||||
"structures": Structure.objects.filter(name__icontains=query).order_by("name") if include("structures") else (),
|
||||
"subspecialties": Subspecialty.objects.filter(name__icontains=query).order_by("name") if include("subspecialties") else (),
|
||||
"presentations": Presentation.objects.filter(name__icontains=query).order_by("name") if include("presentations") else (),
|
||||
"procedures": Procedure.objects.filter(name__icontains=query).order_by("name") if include("procedures") else (),
|
||||
}
|
||||
|
||||
return render(request, "atlas/categories_list.html", {"query": query, "results": results})
|
||||
@@ -3163,9 +3224,9 @@ def categories_search_partial(request):
|
||||
"""
|
||||
query = request.GET.get("q", "").strip()
|
||||
types = request.GET.getlist("types")
|
||||
results = {"conditions": (), "findings": (), "structures": (), "subspecialties": (), "presentations": ()}
|
||||
results = {"conditions": (), "findings": (), "structures": (), "subspecialties": (), "presentations": (), "procedures": ()}
|
||||
if query:
|
||||
from .models import Condition, Finding, Structure, Subspecialty, Presentation
|
||||
from .models import Condition, Finding, Structure, Subspecialty, Presentation, Procedure
|
||||
|
||||
def include(name: str) -> bool:
|
||||
return not types or name in types
|
||||
@@ -3176,6 +3237,7 @@ def categories_search_partial(request):
|
||||
"structures": Structure.objects.filter(name__icontains=query).order_by("name") if include("structures") else (),
|
||||
"subspecialties": Subspecialty.objects.filter(name__icontains=query).order_by("name") if include("subspecialties") else (),
|
||||
"presentations": Presentation.objects.filter(name__icontains=query).order_by("name") if include("presentations") else (),
|
||||
"procedures": Procedure.objects.filter(name__icontains=query).order_by("name") if include("procedures") else (),
|
||||
}
|
||||
|
||||
return render(request, "atlas/_categories_search_results.html", {"query": query, "results": results})
|
||||
|
||||
Reference in New Issue
Block a user