From 17ff534444797412cc0acfda2f67b9c9d4aa0ba8 Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Thu, 17 Jan 2019 08:49:40 +0100
Subject: [PATCH] Add voting facility on PotFel nominations

---
 .../colleges/potentialfellowship_list.html    | 41 +++++++++++++++++--
 colleges/urls.py                              |  5 +++
 colleges/views.py                             | 20 ++++++++-
 .../commands/add_groups_and_permissions.py    |  5 +++
 4 files changed, 67 insertions(+), 4 deletions(-)

diff --git a/colleges/templates/colleges/potentialfellowship_list.html b/colleges/templates/colleges/potentialfellowship_list.html
index 8ffcb5c99..564d99646 100644
--- a/colleges/templates/colleges/potentialfellowship_list.html
+++ b/colleges/templates/colleges/potentialfellowship_list.html
@@ -29,11 +29,46 @@ $(document).ready(function($) {
     </p>
     {% if potfels_to_vote_on %}
     <h4>Nominations to vote on:</h4>
-    <ul>
+    <table class="table">
       {% for potfel in potfels_to_vote_on %}
-      <li>{{ potfel }}</li>
+      <tr>
+	<td>{{ potfel.profile.last_name }}, {{ potfel.profile.get_title_display }} {{ potfel.profile.first_name }}</td>
+	<td>{{ potfel.profile.get_discipline_display }}</td>
+	<td>
+	  {% for expertise in potfel.profile.expertises %}
+          <div class="single d-inline" data-specialization="{{expertise|lower}}" data-toggle="tooltip" data-placement="bottom" title="{{expertise|get_specialization_display}}">{{expertise|get_specialization_code}}</div>
+	  {% endfor %}
+	</td>
+        <td>
+	  <div class="opinionsDisplay mx-0 px-2 py-0">
+            Click to vote:
+	    <form action="{% url 'colleges:vote_on_potential_fellowship' potfel_id=potfel.id vote='A' %}" method="post">
+              {% csrf_token %}
+              <input type="submit" class="agree" value="Agree {{ potfel.nr_A }} "/>
+            </form>
+            <form action="{% url 'colleges:vote_on_potential_fellowship' potfel_id=potfel.id vote='N' %}" method="post">
+              {% csrf_token %}
+              <input type="submit" class="notsure" value="Abstain {{ potfel.nr_N }}"/>
+            </form>
+            <form action="{% url 'colleges:vote_on_potential_fellowship' potfel_id=potfel.id vote='D' %}" method="post">
+              {% csrf_token %}
+              <input type="submit" class="disagree" value="Disagree {{ potfel.nr_D }}"/>
+            </form>
+            {% if request.user.contributor in potfel.in_agreement.all %}
+            <strong>(you have voted: Agreed)</strong>
+            {% elif request.user.contributor in potfel.in_abstain.all %}
+            <strong>(you have voted: Abstain)</strong>
+            {% elif request.user.contributor in potfel.in_disagreement.all %}
+            <strong>(you have voted: Disagree)</strong>
+            {% endif %}
+          </div>
+
+
+
+
+      </tr>
       {% endfor %}
-    </ul>
+    </table>
     {% endif %}
   </div>
 </div>
diff --git a/colleges/urls.py b/colleges/urls.py
index 8c3635e77..e26910dd1 100644
--- a/colleges/urls.py
+++ b/colleges/urls.py
@@ -69,6 +69,11 @@ urlpatterns = [
         views.PotentialFellowshipEventCreateView.as_view(),
         name='potential_fellowship_event_create'
     ),
+    url(
+        r'^potentialfellowships/(?P<potfel_id>[0-9]+)/vote/(?P<vote>[AND])/$',
+        views.vote_on_potential_fellowship,
+        name='vote_on_potential_fellowship'
+    ),
     url(
         r'^potentialfellowships/(?P<pk>[0-9]+)/email_initial/$',
         views.PotentialFellowshipInitialEmailView.as_view(),
diff --git a/colleges/views.py b/colleges/views.py
index a146ede31..a11374943 100644
--- a/colleges/views.py
+++ b/colleges/views.py
@@ -4,6 +4,7 @@ __license__ = "AGPL v3"
 
 from django.contrib import messages
 from django.contrib.auth.decorators import login_required, permission_required
+from django.db.models import Count
 from django.shortcuts import get_object_or_404, render, redirect
 from django.core.urlresolvers import reverse, reverse_lazy
 from django.utils import timezone
@@ -378,7 +379,8 @@ class PotentialFellowshipListView(PermissionsMixin, PaginationMixin, ListView):
     def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)
         context['potfels_to_vote_on'] = PotentialFellowship.objects.vote_needed(
-            self.request.user.contributor)
+            self.request.user.contributor).annotate(
+                nr_A=Count('in_agreement'), nr_N=Count('in_abstain'), nr_D=Count('in_disagreement'))
         context['subject_areas'] = SCIPOST_SUBJECT_AREAS
         context['statuses'] = POTENTIAL_FELLOWSHIP_STATUSES
         return context
@@ -395,6 +397,22 @@ class PotentialFellowshipDetailView(PermissionsMixin, DetailView):
         return context
 
 
+@login_required
+@permission_required('scipost.can_vote_on_potentialfellowship', raise_exception=True)
+def vote_on_potential_fellowship(request, potfel_id, vote):
+    potfel = get_object_or_404(PotentialFellowship, pk=potfel_id)
+    potfel.in_agreement.remove(request.user.contributor)
+    potfel.in_abstain.remove(request.user.contributor)
+    potfel.in_disagreement.remove(request.user.contributor)
+    if vote == 'A':
+        potfel.in_agreement.add(request.user.contributor)
+    elif vote == 'N':
+        potfel.in_abstain.add(request.user.contributor)
+    elif vote == 'D':
+        potfel.in_disagreement.add(request.user.contributor)
+    return redirect(reverse('colleges:potential_fellowships'))
+
+
 class PotentialFellowshipInitialEmailView(PermissionsMixin, MailView):
     """Send a templated email to a Potential Fellow."""
 
diff --git a/scipost/management/commands/add_groups_and_permissions.py b/scipost/management/commands/add_groups_and_permissions.py
index 78dee4f65..901687f2a 100644
--- a/scipost/management/commands/add_groups_and_permissions.py
+++ b/scipost/management/commands/add_groups_and_permissions.py
@@ -133,6 +133,10 @@ class Command(BaseCommand):
             codename='can_add_potentialfellowship',
             name='Can add PotentialFellowship',
             content_type=content_type)
+        can_vote_on_potentialfellowship, created = Permission.objects.get_or_create(
+            codename='can_vote_on_potentialfellowship',
+            name='Can vote on PotentialFellowship',
+            content_type=content_type)
 
         # Contributions (not related to submissions)
         can_submit_comments, created = Permission.objects.get_or_create(
@@ -419,6 +423,7 @@ class Command(BaseCommand):
             can_manage_ontology,
             can_view_potentialfellowship_list,
             can_add_potentialfellowship,
+            can_vote_on_potentialfellowship,
         ])
 
         VettingEditors.permissions.set([
-- 
GitLab