From c63fdf9cb7b19d723cd7c1a989d6958d0602d019 Mon Sep 17 00:00:00 2001
From: sandeepsajan0 <sandeepsajan0@gmail.com>
Date: Tue, 12 Jul 2022 12:07:53 +0530
Subject: [PATCH] fix PAF submit issue

---
 hypha/apply/projects/forms/project.py         | 28 ++++++----
 .../project_approval_form.html                | 55 +++++++++++++++++++
 hypha/apply/projects/views/project.py         | 24 +++++++-
 3 files changed, 93 insertions(+), 14 deletions(-)
 create mode 100644 hypha/apply/projects/templates/application_projects/project_approval_form.html

diff --git a/hypha/apply/projects/forms/project.py b/hypha/apply/projects/forms/project.py
index a301b3d4a..c7e3e2c73 100644
--- a/hypha/apply/projects/forms/project.py
+++ b/hypha/apply/projects/forms/project.py
@@ -4,6 +4,7 @@ from django.db.models import Q
 from django.utils.translation import gettext_lazy as _
 
 from hypha.apply.funds.models import ApplicationSubmission
+from hypha.apply.stream_forms.forms import StreamBaseForm
 from hypha.apply.users.groups import STAFF_GROUP_NAME
 
 from ..models.project import COMMITTED, Approval, Contract, PacketFile, Project
@@ -76,28 +77,31 @@ class CreateApprovalForm(forms.ModelForm):
         return by
 
 
-class ProjectApprovalForm(forms.ModelForm):
+class MixedMetaClass(type(StreamBaseForm), type(forms.ModelForm)):
+    pass
+
+
+class ProjectApprovalForm(StreamBaseForm, forms.ModelForm, metaclass=MixedMetaClass):
     class Meta:
         fields = [
             'title',
-            'value',
-            'proposed_start',
-            'proposed_end',
         ]
         model = Project
         widgets = {
-            'title': forms.TextInput,
-            'proposed_end': forms.DateInput,
-            'proposed_start': forms.DateInput,
+            'title': forms.HiddenInput()
         }
 
     def __init__(self, *args, extra_fields=None, **kwargs):
         super().__init__(*args, **kwargs)
-        if extra_fields:
-            self.fields = {
-                **self.fields,
-                **extra_fields,
-            }
+
+    def clean(self):
+        cleaned_data = super().clean()
+        cleaned_data['form_data'] = {
+            key: value
+            for key, value in cleaned_data.items()
+            if key not in self._meta.fields
+        }
+        return cleaned_data
 
     def save(self, *args, **kwargs):
         self.instance.form_data = {
diff --git a/hypha/apply/projects/templates/application_projects/project_approval_form.html b/hypha/apply/projects/templates/application_projects/project_approval_form.html
new file mode 100644
index 000000000..8520b225d
--- /dev/null
+++ b/hypha/apply/projects/templates/application_projects/project_approval_form.html
@@ -0,0 +1,55 @@
+{% extends "base-apply.html" %}
+{% load i18n static %}
+{% block title %}Editing: {{object.title }}{% endblock %}
+{% block content %}
+<div class="admin-bar">
+    <div class="admin-bar__inner">
+        <h2 class="heading heading--no-margin">{% trans "Editing" %}: {{ object.title }}</h2>
+    </div>
+</div>
+
+{% include "forms/includes/form_errors.html" with form=form %}
+
+<div class="wrapper wrapper--light-grey-bg wrapper--form wrapper--sidebar">
+    <div class="wrapper--sidebar--inner">
+        <form class="form application-form" action="" method="post" enctype="multipart/form-data">
+            {% csrf_token %}
+            {{ form.media }}
+
+            {% for field in form %}
+                {% if field.field %}
+                    {% if field.field.multi_input_field %}
+                        {% include "forms/includes/multi_input_field.html" %}
+                    {% else %}
+                        {% include "forms/includes/field.html" %}
+                    {% endif %}
+                {% else %}
+                    {{ field.block }}
+                {% endif %}
+            {% endfor %}
+
+            {# Hidden fields needed e.g. for django-file-form. See `StreamBaseForm.hidden_fields` #}
+            {% for hidden_field in form.hidden_fields %}
+                {{ hidden_field }}
+            {% endfor %}
+
+            {% trans "Save draft" as save_draft %}
+            {% for button_name, button_type, button_value in buttons %}
+                <button class="button button--submit button--top-space button--{{ button_type }}" type="submit" name="{{ button_name }}" {% if button_value == save_draft %}formnovalidate{% endif %}>{{ button_value }}</button>
+            {% endfor %}
+        </form>
+    </div>
+</div>
+
+{% endblock %}
+
+{% block extra_js %}
+    <script src="{% static 'js/apply/list-input-files.js' %}"></script>
+    <script src="{% static 'js/apply/tinymce-word-count.js' %}"></script>
+    <script src="{% static 'js/apply/multi-input-fields.js' %}"></script>
+    <script src="{% static 'js/apply/submission-form-copy.js' %}"></script>
+    <script src="{% static 'js/apply/application-form-links-new-window.js' %}"></script>
+    {% if not show_all_group_fields %}
+    <script src="{% static 'js/apply/form-group-toggle.js' %}"></script>
+    {% endif %}
+{% endblock %}
diff --git a/hypha/apply/projects/views/project.py b/hypha/apply/projects/views/project.py
index f563bd0f0..294eb1f3f 100644
--- a/hypha/apply/projects/views/project.py
+++ b/hypha/apply/projects/views/project.py
@@ -28,6 +28,7 @@ from django_tables2 import SingleTableMixin
 
 from hypha.apply.activity.messaging import MESSAGES, messenger
 from hypha.apply.activity.views import ActivityContextMixin, CommentFormView
+from hypha.apply.stream_forms.models import BaseStreamForm
 from hypha.apply.users.decorators import (
     approver_required,
     staff_or_finance_required,
@@ -590,9 +591,14 @@ class ProjectDetailPDFView(SingleObjectMixin, View):
 
 
 @method_decorator(staff_required, name='dispatch')
-class ProjectApprovalEditView(UpdateView):
-    form_class = ProjectApprovalForm
+class ProjectApprovalEditView(BaseStreamForm, UpdateView):
+    submission_form_class = ProjectApprovalForm
     model = Project
+    template_name = 'application_projects/project_approval_form.html'
+
+    def buttons(self):
+        yield ('submit', 'primary', _('Submit'))
+        # yield ('save', 'white', _('Save draft'))
 
     def dispatch(self, request, *args, **kwargs):
         project = self.get_object()
@@ -610,6 +616,20 @@ class ProjectApprovalEditView(UpdateView):
 
         return approval_form
 
+    def get_context_data(self, **kwargs):
+        return super().get_context_data(
+            title=self.object.title,
+            buttons=self.buttons(),
+            **kwargs
+        )
+
+    def get_defined_fields(self):
+        approval_form = self.object.submission.get_from_parent('approval_form')
+        if approval_form:
+            return approval_form.form_fields
+        return self.object.get_defined_fields()
+
+
     def get_form_kwargs(self):
         kwargs = super().get_form_kwargs()
 
-- 
GitLab