From 4beabda3b7e7f96ecf64221613ef6eb7a0f002fd Mon Sep 17 00:00:00 2001
From: sks444 <krishnasingh.ss30@gmail.com>
Date: Tue, 27 Oct 2020 11:24:32 +0530
Subject: [PATCH] Add set screening status with thumbs and with screening
 options

---
 hypha/apply/api/v1/screening/views.py         |  5 +++-
 hypha/apply/api/v1/urls.py                    |  3 ++-
 hypha/apply/funds/forms.py                    | 19 +++++++++++++-
 .../commands/export_submissions_csv.py        |  1 -
 hypha/apply/funds/models/submissions.py       |  4 +++
 .../funds/applicationsubmission_detail.html   |  1 +
 .../includes/screening_status_block.html      | 21 +++++++++------
 hypha/apply/funds/views.py                    |  3 +--
 hypha/static_src/src/javascript/apply/flag.js |  1 +
 .../src/javascript/apply/screening-status.js  | 26 +++++++++++++++++++
 10 files changed, 70 insertions(+), 14 deletions(-)
 create mode 100644 hypha/static_src/src/javascript/apply/screening-status.js

diff --git a/hypha/apply/api/v1/screening/views.py b/hypha/apply/api/v1/screening/views.py
index baa152b08..eb904fe61 100644
--- a/hypha/apply/api/v1/screening/views.py
+++ b/hypha/apply/api/v1/screening/views.py
@@ -79,5 +79,8 @@ class SubmissionScreeningStatusViewSet(
                 'detail': "Can't set default as more than one screening status is already set."
             })
         screening_status = ScreeningStatus.objects.get(default=True, yes=yes)
+        if submission.has_default_screening_status_set:
+            default_status = submission.screening_statuses.get()
+            submission.screening_statuses.remove(default_status)
         submission.screening_statuses.add(screening_status)
-        return Response(status=status.HTTP_201_CREATED)
+        return Response(ser.data, status=status.HTTP_201_CREATED)
diff --git a/hypha/apply/api/v1/urls.py b/hypha/apply/api/v1/urls.py
index 673a4daa9..e1529d339 100644
--- a/hypha/apply/api/v1/urls.py
+++ b/hypha/apply/api/v1/urls.py
@@ -3,7 +3,7 @@ from rest_framework_nested import routers
 
 from hypha.apply.api.v1.determination.views import SubmissionDeterminationViewSet
 from hypha.apply.api.v1.review.views import SubmissionReviewViewSet
-from hypha.apply.api.v1.screening.views import ScreeningStatusViewSet
+from hypha.apply.api.v1.screening.views import ScreeningStatusViewSet, SubmissionScreeningStatusViewSet
 
 from .views import (
     CommentViewSet,
@@ -28,6 +28,7 @@ submission_router.register(r'actions', SubmissionActionViewSet, basename='submis
 submission_router.register(r'comments', SubmissionCommentViewSet, basename='submission-comments')
 submission_router.register(r'reviews', SubmissionReviewViewSet, basename='reviews')
 submission_router.register(r'determinations', SubmissionDeterminationViewSet, basename='determinations')
+submission_router.register(r'screening_statuses', SubmissionScreeningStatusViewSet, basename='screening_statuses')
 
 urlpatterns = [
     path('user/', CurrentUser.as_view(), name='user'),
diff --git a/hypha/apply/funds/forms.py b/hypha/apply/funds/forms.py
index 4b4d4edb7..9b8811eee 100644
--- a/hypha/apply/funds/forms.py
+++ b/hypha/apply/funds/forms.py
@@ -11,7 +11,7 @@ from django_select2.forms import Select2Widget
 from hypha.apply.categories.models import MetaTerm
 from hypha.apply.users.models import User
 
-from .models import ApplicationSubmission, AssignedReviewers, Reminder, ReviewerRole
+from .models import ApplicationSubmission, AssignedReviewers, Reminder, ReviewerRole, ScreeningStatus
 from .utils import render_icon
 from .widgets import MetaTermSelect2Widget, Select2MultiCheckboxesWidget
 from .workflow import get_action_mapping
@@ -97,12 +97,29 @@ class ScreeningSubmissionForm(ApplicationSubmissionModelForm):
         model = ApplicationSubmission
         fields = ('screening_statuses',)
 
+    # screening_statuses = forms.ModelMultipleChoiceField(queryset=ScreeningStatus.objects.filter(yes=True))
+
     def __init__(self, *args, **kwargs):
         self.user = kwargs.pop('user')
         super().__init__(*args, **kwargs)
+        instance = kwargs.get('instance')
+        if instance and instance.has_default_screening_status_set:
+            screening_status = instance.screening_statuses.get(default=True)
+            self.fields['screening_statuses'].queryset = ScreeningStatus.objects.filter(
+                yes=screening_status.yes
+            )
         self.should_show = False
         if self.user.is_apply_staff:
             self.should_show = True
+        
+    def clean(self):
+        cleaned_data = super().clean()
+        instance = self.instance
+        default_status = instance.screening_statuses.get(default=True)
+        if default_status not in cleaned_data['screening_statuses']:
+            self.add_error('screening_statuses', 'Can\'t remove default screening status.')
+        return cleaned_data
+        # self.add_error('start_date', 'Please select start date.')
 
 
 class UpdateSubmissionLeadForm(ApplicationSubmissionModelForm):
diff --git a/hypha/apply/funds/management/commands/export_submissions_csv.py b/hypha/apply/funds/management/commands/export_submissions_csv.py
index 90ef23cf0..61bbe8a11 100644
--- a/hypha/apply/funds/management/commands/export_submissions_csv.py
+++ b/hypha/apply/funds/management/commands/export_submissions_csv.py
@@ -44,5 +44,4 @@ class Command(BaseCommand):
                     submission_value = submission.value
                 except KeyError:
                     submission_value = 0
-                import ipdb; ipdb.set_trace()
                 writer.writerow([submission.id, submission.title, submission.full_name, submission.email, submission_value, submission.duration, submission_reapplied, submission.stage, submission.phase, submission.screening_status, submission.submit_time.strftime('%Y-%m-%d'), submission_region, submission_country, submission_focus, submission_type])
diff --git a/hypha/apply/funds/models/submissions.py b/hypha/apply/funds/models/submissions.py
index 307a21a52..5d2c5ca90 100644
--- a/hypha/apply/funds/models/submissions.py
+++ b/hypha/apply/funds/models/submissions.py
@@ -804,6 +804,10 @@ class ApplicationSubmission(
     def _get_REQUIRED_value(self, name):
         return self.data(name)
 
+    @property
+    def has_default_screening_status_set(self):
+        return self.screening_statuses.filter(default=True).exists()
+
 
 @receiver(post_transition, sender=ApplicationSubmission)
 def log_status_update(sender, **kwargs):
diff --git a/hypha/apply/funds/templates/funds/applicationsubmission_detail.html b/hypha/apply/funds/templates/funds/applicationsubmission_detail.html
index e0d294c2b..3a2efbe34 100644
--- a/hypha/apply/funds/templates/funds/applicationsubmission_detail.html
+++ b/hypha/apply/funds/templates/funds/applicationsubmission_detail.html
@@ -173,4 +173,5 @@
     <script src="{% static 'js/apply/submission-text-cleanup.js' %}"></script>
     <script src="{% static 'js/apply/edit-comment.js' %}"></script>
     <script src="{% static 'js/apply/flag.js' %}"></script>
+    <script src="{% static 'js/apply/screening-status.js' %}"></script>
 {% endblock %}
diff --git a/hypha/apply/funds/templates/funds/includes/screening_status_block.html b/hypha/apply/funds/templates/funds/includes/screening_status_block.html
index a67aaf4e3..9b688d44a 100644
--- a/hypha/apply/funds/templates/funds/includes/screening_status_block.html
+++ b/hypha/apply/funds/templates/funds/includes/screening_status_block.html
@@ -6,21 +6,26 @@
             <div>
                 {{ default_yes }}
             </div>
-            <div>
-                <svg class="icon icon--private-eye" style="margin-right: 2em;"><use xlink:href="#like"></use></svg>
+            <div class="abcdef" data-id="{{ object.id }}" data-yes="true">
+                <svg class="icon icon--private-eye" style="cursor: pointer;"><use xlink:href="#like"></use></svg>
             </div>
         </div>
         <div>
             <div>
                 {{ default_no }}
             </div>
-            <div>
-                <svg class="icon icon--private-eye" style="margin-right: 2em;"><use xlink:href="#dislike"></use></svg>
+            <div class="abcdef" data-id="{{ object.id }}" data-yes="false">
+                <svg class="icon icon--private-eye" style="cursor: pointer;"><use xlink:href="#dislike"></use></svg>
             </div>
         </div>
     </div>
-
-    <p>
-        <!-- {% if object.screening_statuses.exists %}{{ object.screening_statuses|default:"Awaiting Screen status" }}{% endif %} <a data-fancybox data-src="#screen-application" class="link link--secondary-change" href="#">Change</a> -->
-    </p>
+    <hr>
+    <div>
+        {% for status in object.screening_statuses.all %}
+            <p>{{ status.title }}</p>
+        {% endfor %}
+        {% if object.has_default_screening_status_set %}
+            <p><a id="screening-options" data-fancybox="" data-src="#screen-application" class="link link--secondary-change" href="#">Screening Options</a></p>
+        {% endif %}
+    </div>
 </div>
diff --git a/hypha/apply/funds/views.py b/hypha/apply/funds/views.py
index fa8deffb6..589bf9364 100644
--- a/hypha/apply/funds/views.py
+++ b/hypha/apply/funds/views.py
@@ -578,7 +578,6 @@ class ScreeningSubmissionView(DelegatedViewMixin, UpdateView):
     context_name = 'screening_form'
 
     def form_valid(self, form):
-        import ipdb; ipdb.set_trace()
         old = copy(self.get_object())
         response = super().form_valid(form)
         # Record activity
@@ -587,7 +586,7 @@ class ScreeningSubmissionView(DelegatedViewMixin, UpdateView):
             request=self.request,
             user=self.request.user,
             source=self.object,
-            related=str(old.screening_status),
+            related=','.join([s.title for s in old.screening_statuses.all()]),
         )
         return response
 
diff --git a/hypha/static_src/src/javascript/apply/flag.js b/hypha/static_src/src/javascript/apply/flag.js
index 932622b58..dde91ef26 100644
--- a/hypha/static_src/src/javascript/apply/flag.js
+++ b/hypha/static_src/src/javascript/apply/flag.js
@@ -21,6 +21,7 @@
             url: '/apply/submissions/' + id + '/' + type + '/flag/',
             type: 'POST',
             success: function (json) {
+                console.log(json.result);
                 if (json.result) {
                     $current.addClass('flagged');
                 }
diff --git a/hypha/static_src/src/javascript/apply/screening-status.js b/hypha/static_src/src/javascript/apply/screening-status.js
new file mode 100644
index 000000000..170ac4b2d
--- /dev/null
+++ b/hypha/static_src/src/javascript/apply/screening-status.js
@@ -0,0 +1,26 @@
+(function ($) {
+
+    'use strict';
+
+    $('.abcdef').on('click', function (e) {
+        e.preventDefault();
+
+        console.log('Coming here');
+        var $current = $(this);
+        var id = $current.data('id');
+        var yes = $current.data('yes');
+
+        $.ajax({
+            url: '/api/v1/submissions/' + id + '/screening_statuses/default/',
+            type: 'POST',
+            data: {yes: yes},
+            success: function (json) {
+                if (json && $('#screening-options').length === 0) {
+                    var screeningOptions = $('<p><a id="screening-options" data-fancybox="" data-src="#screen-application" class="link link--secondary-change" href="#">Screening Options</a></p>');
+                    $(screeningOptions).insertAfter($current);
+                }
+            }
+        });
+    });
+
+})(jQuery);
-- 
GitLab