diff --git a/hypha/apply/funds/views.py b/hypha/apply/funds/views.py index 087101453637e6e98c9bfa7d84f4d08324deb883..3761903d5cd29454efabcf263df0639759a81c4d 100644 --- a/hypha/apply/funds/views.py +++ b/hypha/apply/funds/views.py @@ -1271,6 +1271,16 @@ class BaseSubmissionEditView(UpdateView): yield ("save", "white", _("Save draft")) def get_form_kwargs(self): + """ + Returns the keyword arguments for instantiating the form. + + This method is called by the form mixin during form instantiation. + It returns a dictionary of keyword arguments that will be passed to + the form's constructor. + + Returns: + dict: A dictionary of keyword arguments for the form constructor. + """ kwargs = super().get_form_kwargs() instance = kwargs.pop("instance").from_draft() initial = instance.raw_data @@ -1292,13 +1302,36 @@ class BaseSubmissionEditView(UpdateView): for f in initial_file ] + def save_draft_and_refresh_page(self, form) -> HttpResponseRedirect: + self.object.create_revision(draft=True, by=self.request.user) + form.delete_temporary_files() + messages.success(self.request, _("Draft saved")) + return HttpResponseRedirect( + reverse_lazy("funds:submissions:edit", args=(self.object.id,)) + ) + def get_context_data(self, **kwargs): return super().get_context_data(buttons=self.buttons(), **kwargs) def get_form_class(self): - draft = self.request.POST.get("save", False) + """ + Returns the form class for the view. + + This method is called by the view during form instantiation. It returns + the form class that will be used to render the form. + + When trying to save as draft, this method will return a version of form + class that doesn't validate required fields while saving. + + The method also disables any group toggle fields in the form, as they + are not supported on edit forms. + + Returns: + class: The form class for the view. + """ + is_draft = True if "save" in self.request.POST else False form_fields = self.object.get_form_fields( - draft, self.object.raw_data, user=self.request.user + draft=is_draft, form_data=self.object.raw_data, user=self.request.user ) field_blocks = self.object.get_defined_fields() for field_block in field_blocks: @@ -1316,8 +1349,7 @@ class AdminSubmissionEditView(BaseSubmissionEditView): self.object.new_data(form.cleaned_data) if "save" in self.request.POST: - self.object.create_revision(draft=True, by=self.request.user) - return self.form_invalid(form) + return self.save_draft_and_refresh_page(form=form) if "submit" in self.request.POST: revision = self.object.create_revision(by=self.request.user) @@ -1370,9 +1402,7 @@ class ApplicantSubmissionEditView(BaseSubmissionEditView): self.object.save(update_fields=["submit_time", "round"]) if "save" in self.request.POST: - self.object.create_revision(draft=True, by=self.request.user) - messages.success(self.request, _("Submission saved successfully")) - return self.form_invalid(form) + return self.save_draft_and_refresh_page(form=form) revision = self.object.create_revision(by=self.request.user) submitting_proposal = self.object.phase.name in STAGE_CHANGE_ACTIONS