From 0af6b25349c01773ecf095037c46500bbf582c76 Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 4 Aug 2025 12:21:37 +0100 Subject: [PATCH] Add case collection update functionality with form handling and template (move from CaseCollection form) --- atlas/forms.py | 19 ++++- .../templates/atlas/casecollection_form.html | 7 +- .../atlas/casecollection_update_case.html | 77 +++++++++++++++++++ atlas/templates/atlas/collection_headers.html | 1 + atlas/urls.py | 5 ++ atlas/views.py | 69 +++++++++++++---- 6 files changed, 161 insertions(+), 17 deletions(-) create mode 100644 atlas/templates/atlas/casecollection_update_case.html diff --git a/atlas/forms.py b/atlas/forms.py index 0d4eef0a..d72d8170 100755 --- a/atlas/forms.py +++ b/atlas/forms.py @@ -992,4 +992,21 @@ class CaseDisplaySetForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - # Optionally, you can filter queryset for findings/structures/conditions here if needed \ No newline at end of file + # Optionally, you can filter queryset for findings/structures/conditions here if needed + + +class CaseCollectionUpdateCaseForm(forms.ModelForm): + def __init__(self, *args, **kwargs): + self.user = kwargs.pop("user") + self.collection = kwargs.pop("collection", None) + super().__init__(*args, **kwargs) + self.helper = FormHelper() + self.helper.form_id = "id-case-form" + self.helper.form_class = "case-form" + self.helper.form_method = "post" + self.helper.form_action = "submit" + self.helper.form_tag = False + self.helper.layout = Layout() + class Meta: + model = CaseCollection + fields = [] # No fields, just for compatibility with UpdateView \ No newline at end of file diff --git a/atlas/templates/atlas/casecollection_form.html b/atlas/templates/atlas/casecollection_form.html index 38aecb7f..5bef2507 100755 --- a/atlas/templates/atlas/casecollection_form.html +++ b/atlas/templates/atlas/casecollection_form.html @@ -37,7 +37,7 @@ {% csrf_token %} {{ form }} -

Cases:

+ {% comment %}

Cases:

Add cases here. These can only be added once created (they can also be added to cases on creation). Click and drag to change order. @@ -54,13 +54,14 @@ {{ case_formset.management_form }} - + {% endcomment %} + + +{% endblock %} \ No newline at end of file diff --git a/atlas/templates/atlas/collection_headers.html b/atlas/templates/atlas/collection_headers.html index 81085da5..ec9ab3c1 100644 --- a/atlas/templates/atlas/collection_headers.html +++ b/atlas/templates/atlas/collection_headers.html @@ -1,5 +1,6 @@ {% if request.user.is_authenticated %} Collection: {{collection.name}}-> Overview / + Cases / History / Mark / Scores / diff --git a/atlas/urls.py b/atlas/urls.py index 277cc46c..5c09cb2e 100755 --- a/atlas/urls.py +++ b/atlas/urls.py @@ -101,6 +101,11 @@ urlpatterns = [ views.collection_history, name="collection_history", ), + path( + "collection//cases/update", + views.CollectionCaseUpdate.as_view(), + name="collection_case_update", + ), path( "collection/add_cases", views.add_cases_to_collection, diff --git a/atlas/views.py b/atlas/views.py index 2ddef069..bec2ce55 100755 --- a/atlas/views.py +++ b/atlas/views.py @@ -48,6 +48,7 @@ from .forms import ( CaseCollectionAuthorForm, CaseCollectionCaseFormSet, CaseCollectionForm, + CaseCollectionUpdateCaseForm, CaseDetailForm, CaseDisplaySetForm, CaseForm, @@ -1023,19 +1024,19 @@ class CaseCollectionUpdate(RevisionMixin, AuthorOrCheckerRequiredMixin, UpdateVi def get_context_data(self, **kwargs): context = super(CaseCollectionUpdate, self).get_context_data(**kwargs) - if self.request.POST: - context["case_formset"] = CaseCollectionCaseFormSet( - self.request.POST, - self.request.FILES, - instance=self.object, - form_kwargs={"user": self.request.user, "collection": self.object}, - ) - context["case_formset"].full_clean() - else: - context["case_formset"] = CaseCollectionCaseFormSet( - instance=self.object, - form_kwargs={"user": self.request.user, "collection": self.object}, - ) + #if self.request.POST: + # context["case_formset"] = CaseCollectionCaseFormSet( + # self.request.POST, + # self.request.FILES, + # instance=self.object, + # form_kwargs={"user": self.request.user, "collection": self.object}, + # ) + # context["case_formset"].full_clean() + #else: + # context["case_formset"] = CaseCollectionCaseFormSet( + # instance=self.object, + # form_kwargs={"user": self.request.user, "collection": self.object}, + # ) context["collection"] = context["casecollection"] return context @@ -1046,6 +1047,7 @@ class CaseCollectionUpdate(RevisionMixin, AuthorOrCheckerRequiredMixin, UpdateVi form.instance.author.add(self.request.user.id) + return super().form_valid(form) context = self.get_context_data(form=form) case_formset = context["case_formset"] # logger.debug(formset.is_valid()) @@ -1363,6 +1365,47 @@ class AtlasUpdate( else: return super().form_invalid(form) +class CollectionCaseUpdate( + RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView): + model = CaseCollection + form_class = CaseCollectionUpdateCaseForm + template_name = "atlas/casecollection_update_case.html" + + def get_form_kwargs(self): + kwargs = super().get_form_kwargs() + kwargs.update({"user": self.request.user, "collection": self.object}) + + return kwargs + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + if self.request.POST: + context["case_formset"] = CaseCollectionCaseFormSet( + self.request.POST, + self.request.FILES, + instance=self.object, + form_kwargs={"user": self.request.user, "collection": self.object}, + ) + context["case_formset"].full_clean() + else: + context["case_formset"] = CaseCollectionCaseFormSet( + instance=self.object, + form_kwargs={"user": self.request.user, "collection": self.object}, + ) + context["collection"] = context["casecollection"] + return context + + def form_valid(self, form): + context = self.get_context_data(form=form) + case_formset = context["case_formset"] + if case_formset.is_valid(): + case_formset.instance = self.object + case_formset.save() + return super().form_valid(form) + else: + return self.form_invalid(form) + + class AtlasSeriesUpdate( RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView ):