diff --git a/colleges/templates/colleges/potentialfellowship_list.html b/colleges/templates/colleges/potentialfellowship_list.html index 8ffcb5c9927885748545c7e77e67efa1313f04b7..564d996465b4f7aebccc37d3f6e2b1b5aafc3515 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 8c3635e77253e4364962924be0e412ac34ab7179..e26910dd19d1329322522ec495aed30c9c82233e 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 a146ede3196127022b00a661ebe16ac277c4a552..a11374943df1188cba010fa973b28b7f1e4fd83c 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 78dee4f65e7e2ff89c5eada08562b918ee28320b..901687f2afd869c2f3fb4d36dab65d80b0c598fe 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([