From 97f899762e9ebdf8aabc7b543720384d022f45d5 Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Sun, 7 Oct 2018 10:55:38 +0200
Subject: [PATCH] Add Admin Actions tab in personal page

---
 .../commands/add_groups_and_permissions.py    |  1 +
 scipost/models.py                             | 17 +++-
 .../scipost/personal_page/admin_actions.html  | 87 ++++++++++++++++++
 .../personal_page/editorial_actions.html      | 91 ++++---------------
 scipost/templates/scipost/personal_page.html  | 32 +++++--
 scipost/templatetags/user_groups.py           |  9 ++
 scipost/urls.py                               |  2 +
 scipost/views.py                              | 65 ++++++++++---
 8 files changed, 203 insertions(+), 101 deletions(-)
 create mode 100644 scipost/templates/partials/scipost/personal_page/admin_actions.html

diff --git a/scipost/management/commands/add_groups_and_permissions.py b/scipost/management/commands/add_groups_and_permissions.py
index f481674d1..f701e296f 100644
--- a/scipost/management/commands/add_groups_and_permissions.py
+++ b/scipost/management/commands/add_groups_and_permissions.py
@@ -350,6 +350,7 @@ class Command(BaseCommand):
         ])
 
         FinancialAdmin.permissions.set([
+            can_manage_subsidies,
             can_view_timesheets,
         ])
 
diff --git a/scipost/models.py b/scipost/models.py
index d56d55fec..a4bec62c9 100644
--- a/scipost/models.py
+++ b/scipost/models.py
@@ -84,16 +84,23 @@ class Contributor(models.Model):
         """Check if Contributor is currently not marked as unavailable."""
         return not self.unavailability_periods.today().exists()
 
-    def is_EdCol_Admin(self):
-        """Check if Contributor is an Editorial Administrator."""
-        return (self.user.groups.filter(name='Editorial Administrators').exists()
-                or self.user.is_superuser)
-
     def is_SP_Admin(self):
         """Check if Contributor is a SciPost Administrator."""
         return (self.user.groups.filter(name='SciPost Administrators').exists()
                 or self.user.is_superuser)
 
+    def is_Fin_Admin(self):
+        """
+        Check if Contributor is a SciPost Financial Administrator.
+        """
+        return (self.user.groups.filter(name='Financial Administrators').exists()
+                or self.user.is_superuser)
+
+    def is_EdCol_Admin(self):
+        """Check if Contributor is an Editorial Administrator."""
+        return (self.user.groups.filter(name='Editorial Administrators').exists()
+                or self.user.is_superuser)
+
     def is_MEC(self):
         """Check if Contributor is a member of the Editorial College."""
         return self.fellowships.active().exists() or self.user.is_superuser
diff --git a/scipost/templates/partials/scipost/personal_page/admin_actions.html b/scipost/templates/partials/scipost/personal_page/admin_actions.html
new file mode 100644
index 000000000..d0f616fdc
--- /dev/null
+++ b/scipost/templates/partials/scipost/personal_page/admin_actions.html
@@ -0,0 +1,87 @@
+{% load user_groups %}
+{% is_scipost_admin request.user as is_scipost_admin %}
+<div class="row">
+    <div class="col-12">
+        <div class="card card-grey">
+            <div class="card-body">
+                <h2 class="card-title mb-0">Admin Actions</h2>
+            </div>
+        </div>
+    </div>
+</div>
+
+<div class="row">
+    {% if perms.scipost.can_vet_registration_requests or perms.scipost.can_create_registration_invitations or perms.scipost.can_resend_registration_requests %}
+    <div class="col-md-4">
+        <h3>Registration actions</h3>
+        <ul>
+            {% if perms.scipost.can_vet_registration_requests %}
+                <li><a href="{% url 'scipost:vet_registration_requests' %}">Vet Registration requests</a> ({{ nr_reg_to_vet }})</li>
+            {% endif %}
+            {% if perms.scipost.can_resend_registration_requests %}
+                <li><a href="{% url 'scipost:registration_requests' %}">Awaiting validation</a> ({{ nr_reg_awaiting_validation }})</li>
+            {% endif %}
+            {% if perms.scipost.can_create_registration_invitations %}
+                <li><a href="{% url 'invitations:list' %}">Manage Registration Invitations</a></li>
+            {% endif %}
+        </ul>
+
+        {% if perms.scipost.can_manage_registration_invitations %}
+            <h3>Notifications</h3>
+            <ul>
+                <li><a href="{% url 'invitations:citation_notification_list' %}">Manage citation notifications</a></li>
+            </ul>
+        {% endif %}
+
+        {% if is_scipost_admin %}
+            <h3>Email communications</h3>
+            <ul>
+                {% if perms.scipost.can_email_group_members %}
+                    <li><a href="{% url 'scipost:email_group_members' %}">Email Group Members</a></li>
+                {% endif %}
+                {% if perms.scipost.can_email_particulars %}
+                    <li><a href="{% url 'scipost:send_precooked_email' %}">Send a precooked email</a></li>
+                    <li><a href="{% url 'scipost:email_particular' %}">Email a particular individual/address</a></li>
+                {% endif %}
+                {% if perms.scipost.can_manage_mailchimp %}
+                    <li><a href="{% url 'mailing_lists:overview' %}">Manage mailing lists</a></li>
+                {% endif %}
+            </ul>
+
+        {% endif %}
+
+    </div>
+    {% endif %}
+
+    <div class="col-md-4">
+      {% if perms.scipost.can_view_profiles %}
+      <h3>Profiles</h3>
+      <ul>
+	<li><a href="{% url 'profiles:profiles' %}">List/Manage Profiles</a></li>
+      </ul>
+      {% endif %}
+
+      {% if perms.scipost.can_manage_organizations %}
+      <h3>Organizations</h3>
+      <ul>
+	<li><a href="{% url 'organizations:organizations' %}">Manage Organizations</a></li>
+        <li><a href="{% url 'affiliations:institutions' %}">Manage Institutions database</a></li>
+      </ul>
+      {% endif %}
+
+    </div>
+
+    <div class="col-md-4">
+      <h3>Finances</h3>
+      <ul>
+	{% if perms.scipost.can_manage_subsidies %}
+	<li><a href="{% url 'finances:subsidies' %}">Manage Subsidies</a></li>
+	{% endif %}
+	{% if perms.scipost.can_view_timesheets %}
+        <li><a href="{% url 'finances:timesheets' %}">Production Team Timesheets</a></li>
+	{% endif %}
+      </ul>
+    </div>
+
+
+</div>
diff --git a/scipost/templates/partials/scipost/personal_page/editorial_actions.html b/scipost/templates/partials/scipost/personal_page/editorial_actions.html
index af0fe691f..df5d93442 100644
--- a/scipost/templates/partials/scipost/personal_page/editorial_actions.html
+++ b/scipost/templates/partials/scipost/personal_page/editorial_actions.html
@@ -11,58 +11,6 @@
 </div>
 
 <div class="row">
-    {% if perms.scipost.can_vet_registration_requests or perms.scipost.can_create_registration_invitations or perms.scipost.can_resend_registration_requests %}
-    <div class="col-md-4">
-        <h3>Registration actions</h3>
-        <ul>
-            {% if perms.scipost.can_vet_registration_requests %}
-                <li><a href="{% url 'scipost:vet_registration_requests' %}">Vet Registration requests</a> ({{ nr_reg_to_vet }})</li>
-            {% endif %}
-            {% if perms.scipost.can_resend_registration_requests %}
-                <li><a href="{% url 'scipost:registration_requests' %}">Awaiting validation</a> ({{ nr_reg_awaiting_validation }})</li>
-            {% endif %}
-            {% if perms.scipost.can_create_registration_invitations %}
-                <li><a href="{% url 'invitations:list' %}">Manage Registration Invitations</a></li>
-            {% endif %}
-        </ul>
-
-        {% if perms.scipost.can_manage_registration_invitations %}
-            <h3>Notifications</h3>
-            <ul>
-                <li><a href="{% url 'invitations:citation_notification_list' %}">Manage citation notifications</a></li>
-            </ul>
-        {% endif %}
-
-        {% if is_scipost_admin %}
-            <h3>Email communications</h3>
-            <ul>
-                {% if perms.scipost.can_email_group_members %}
-                    <li><a href="{% url 'scipost:email_group_members' %}">Email Group Members</a></li>
-                {% endif %}
-                {% if perms.scipost.can_email_particulars %}
-                    <li><a href="{% url 'scipost:send_precooked_email' %}">Send a precooked email</a></li>
-                    <li><a href="{% url 'scipost:email_particular' %}">Email a particular individual/address</a></li>
-                {% endif %}
-                {% if perms.scipost.can_manage_mailchimp %}
-                    <li><a href="{% url 'mailing_lists:overview' %}">Manage mailing lists</a></li>
-                {% endif %}
-            </ul>
-
-            <h3>SciPost Administation</h3>
-            <ul>
-	      <li><a href="{% url 'organizations:organizations' %}">Manage Organizations</a></li>
-              <li><a href="{% url 'affiliations:institutions' %}">Manage Institutions database</a></li>
-            </ul>
-        {% endif %}
-
-        {% if perms.scipost.can_view_timesheets %}
-            <h3>Finance</h3>
-            <ul>
-                <li><a href="{% url 'finances:timesheets' %}">Production Team Timesheets</a></li>
-            </ul>
-        {% endif %}
-    </div>
-    {% endif %}
 
     <div class="col-md-4">
         {% if perms.scipost.can_vet_comments or perms.scipost.can_vet_submitted_reports %}
@@ -100,27 +48,6 @@
             </ul>
         {% endif %}
 
-	    {% if perms.scipost.can_view_profiles %}
-	    <h3>Profiles</h3>
-	    <ul>
-	      <li><a href="{% url 'profiles:profiles' %}">List/Manage Profiles</a></li>
-	    </ul>
-	    {% endif %}
-
-	    {% if perms.scipost.can_manage_college_composition %}
-	    <h3>Colleges and Fellowships</h3>
-	    <ul>
-	      <li><a href="{% url 'colleges:potential_fellowships' %}">Manage Potential Fellowships</a></li>
-          <li><a href="{% url 'colleges:fellowships' %}">Manage Fellowships</a></li>
-	    </ul>
-	    {% endif %}
-
-        {% if perms.scipost.can_attend_VGMs %}
-            <h3>Virtual General Meetings</h3>
-            <ul>
-                <li><a href="{% url 'virtualmeetings:VGMs' %}">List of VGMs</a></li>
-            </ul>
-        {% endif %}
     </div>
 
     {% if perms.scipost.can_oversee_refereeing or request.user.contributor.is_MEC %}
@@ -156,6 +83,24 @@
             {% endif %}
         </div>
     {% endif %}
+
+	<div class="col-md-4">
+	  {% if perms.scipost.can_manage_college_composition %}
+	  <h3>Colleges and Fellowships</h3>
+	  <ul>
+	    <li><a href="{% url 'colleges:potential_fellowships' %}">Manage Potential Fellowships</a></li>
+            <li><a href="{% url 'colleges:fellowships' %}">Manage Fellowships</a></li>
+	  </ul>
+	  {% endif %}
+
+          {% if perms.scipost.can_attend_VGMs %}
+          <h3>Virtual General Meetings</h3>
+          <ul>
+            <li><a href="{% url 'virtualmeetings:VGMs' %}">List of VGMs</a></li>
+          </ul>
+          {% endif %}
+	</div>
+
 </div>
 
 {% if active_assignments %}
diff --git a/scipost/templates/scipost/personal_page.html b/scipost/templates/scipost/personal_page.html
index b48c766d6..2f35382ae 100644
--- a/scipost/templates/scipost/personal_page.html
+++ b/scipost/templates/scipost/personal_page.html
@@ -27,16 +27,17 @@
 
     {% else %}
         {# Save all Permission groups into template variables #}
-            {% is_edcol_admin request.user as is_edcol_admin %}
-            {% is_scipost_admin request.user as is_scipost_admin %}
-            {% is_editorial_college request.user as is_editorial_college %}
-            {% is_advisory_board request.user as is_advisory_board %}
-            {% is_vetting_editor request.user as is_vetting_editor %}
-            {% is_ambassador request.user as is_ambassador %}
-            {% is_junior_ambassador request.user as is_junior_ambassador %}
-            {% is_registered_contributor request.user as is_registered_contributor %}
-            {% is_tester request.user as is_tester %}
-            {% is_production_officer request.user as is_production_officer %}
+        {% is_edcol_admin request.user as is_edcol_admin %}
+        {% is_scipost_admin request.user as is_scipost_admin %}
+	{% is_financial_admin request.user as is_financial_admin %}
+        {% is_editorial_college request.user as is_editorial_college %}
+        {% is_advisory_board request.user as is_advisory_board %}
+        {% is_vetting_editor request.user as is_vetting_editor %}
+        {% is_ambassador request.user as is_ambassador %}
+        {% is_junior_ambassador request.user as is_junior_ambassador %}
+        {% is_registered_contributor request.user as is_registered_contributor %}
+        {% is_tester request.user as is_tester %}
+        {% is_production_officer request.user as is_production_officer %}
 
         <div class="row">
             <div class="col-12">
@@ -47,6 +48,11 @@
                           <li class="nav-item btn btn-outline-secondary">
                             <a class="nav-link" {% if tab == 'account' %}sp-autoload='true'{% endif %} href="#account" sp-dynamic-load="{% url 'scipost:personal_page_account' %}" data-toggle="tab">Account</a>
                           </li>
+			  {% if is_scipost_admin or is_financial_admin %}
+			  <li class="nav-item btn btn-outline-secondary">
+			    <a class="nav-link" {% if tab == 'admin_actions' %}sp-autoload='true'{% endif %} href="#admin-actions" sp-dynamic-load="{% url 'scipost:personal_page_admin_actions' %}" data-toggle="tab">Admin Actions</a>
+			  </li>
+			  {% endif %}
                           {% if is_scipost_admin or is_edcol_admin or is_editorial_college or is_advisory_board or is_vetting_editor or is_ambassador or is_junior_ambassador %}
                               <li class="nav-item btn btn-outline-secondary">
                                 <a class="nav-link" {% if tab == 'editorial_actions' %}sp-autoload='true'{% endif %} href="#editorial-actions" sp-dynamic-load="{% url 'scipost:personal_page_editorial_actions' %}" data-toggle="tab">Editorial Actions</a>
@@ -94,6 +100,12 @@
             <div class="tab-pane active" id="account" role="tabpanel">
             </div><!-- End tab -->
 
+	    {% if is_scipost_admin %}
+	    <!-- Tab: Admin Actions -->
+	    <div class="tab-pane" id="admin-actions" role="tabpanel">
+	    </div>
+	    {% endif %}
+
             {% if is_scipost_admin or is_edcol_admin or is_editorial_college or is_advisory_board or is_vetting_editor or is_ambassador or is_junior_ambassador %}
                 <!-- Tab: Editorial Actions -->
                 <div class="tab-pane" id="editorial-actions" role="tabpanel">
diff --git a/scipost/templatetags/user_groups.py b/scipost/templatetags/user_groups.py
index 7f58dd594..21fdecf8a 100644
--- a/scipost/templatetags/user_groups.py
+++ b/scipost/templatetags/user_groups.py
@@ -25,6 +25,15 @@ def is_scipost_admin(user):
     return user.groups.filter(name='SciPost Administrators').exists() or user.is_superuser
 
 
+@register.simple_tag
+def is_financial_admin(user):
+    """
+    Assign template variable (boolean) to check if user is Financial Administrator.
+    This assignment is limited to a certain context block!
+    """
+    return user.groups.filter(name='Financial Administrators').exists() or user.is_superuser
+
+
 @register.simple_tag
 def is_editorial_college(user):
     """
diff --git a/scipost/urls.py b/scipost/urls.py
index 857e7ea35..cbbf0b3cc 100644
--- a/scipost/urls.py
+++ b/scipost/urls.py
@@ -112,6 +112,8 @@ urlpatterns = [
     url(r'^personal_page/$', views.personal_page, name='personal_page'),
     url(r'^personal_page/account$', views.personal_page,
         name='personal_page_account', kwargs={'tab': 'account'}),
+    url(r'^personal_page/admin_actions$', views.personal_page,
+        name='personal_page_admin_actions', kwargs={'tab': 'admin_actions'}),
     url(r'^personal_page/editorial_actions$', views.personal_page,
         name='personal_page_editorial_actions', kwargs={'tab': 'editorial_actions'}),
     url(r'^personal_page/refereeing$', views.personal_page,
diff --git a/scipost/views.py b/scipost/views.py
index 51c421a3e..27dac9480 100644
--- a/scipost/views.py
+++ b/scipost/views.py
@@ -413,7 +413,7 @@ def delete_unavailable_period(request, period_id):
 @login_required
 @is_contributor_user()
 def _personal_page_editorial_account(request):
-    """Personal Page tab: Account."""
+    """ Personal Page tab: Account. """
     contributor = request.user.contributor
     context = {
         'contributor': contributor,
@@ -423,9 +423,33 @@ def _personal_page_editorial_account(request):
     return render(request, 'partials/scipost/personal_page/account.html', context)
 
 
+@login_required
+@is_contributor_user()
+def _personal_page_admin_actions(request):
+    """ Personal Page tab: Admin Actions. """
+    permission = request.user.groups.filter(name__in=[
+        'SciPost Administrators',
+        'Financial Administrators']).exists() or request.user.is_superuser
+
+    if not permission:
+        raise PermissionDenied
+
+    context = {}
+    contributor = request.user.contributor
+
+    if contributor.is_SP_Admin():
+        # count the number of pending registration requests
+        context['nr_reg_to_vet'] = Contributor.objects.awaiting_vetting().count()
+        context['nr_reg_awaiting_validation'] = Contributor.objects.awaiting_validation().count()
+
+    return render(request, 'partials/scipost/personal_page/admin_actions.html', context)
+
+
 @is_contributor_user()
 def _personal_page_editorial_actions(request):
-    """Personal Page tab: Editorial Actions."""
+    """
+    Personal Page tab: Editorial Actions.
+    """
     permission = request.user.groups.filter(name__in=[
         'Ambassadors',
         'Advisory Board',
@@ -441,9 +465,6 @@ def _personal_page_editorial_actions(request):
     contributor = request.user.contributor
 
     if contributor.is_SP_Admin():
-        # count the number of pending registration requests
-        context['nr_reg_to_vet'] = Contributor.objects.awaiting_vetting().count()
-        context['nr_reg_awaiting_validation'] = Contributor.objects.awaiting_validation().count()
         context['nr_submissions_to_assign'] = Submission.objects.prescreening().count()
         context['nr_recommendations_to_prepare_for_voting'] = \
             EICRecommendation.objects.voting_in_preparation().count()
@@ -472,7 +493,9 @@ def _personal_page_editorial_actions(request):
 @permission_required('scipost.can_referee', return_403=True)
 @is_contributor_user()
 def _personal_page_refereeing(request):
-    """Personal Page tab: Refereeing."""
+    """
+    Personal Page tab: Refereeing.
+    """
     context = {
         'contributor': request.user.contributor
     }
@@ -482,7 +505,9 @@ def _personal_page_refereeing(request):
 @login_required
 @is_contributor_user()
 def _personal_page_publications(request):
-    """Personal Page tab: Publications."""
+    """
+    Personal Page tab: Publications.
+    """
     contributor = request.user.contributor
     context = {
         'contributor': contributor,
@@ -499,7 +524,9 @@ def _personal_page_publications(request):
 @login_required
 @is_contributor_user()
 def _personal_page_submissions(request):
-    """Personal Page tab: Submissions."""
+    """
+    Personal Page tab: Submissions.
+    """
     contributor = request.user.contributor
     context = {'contributor': contributor}
 
@@ -516,7 +543,9 @@ def _personal_page_submissions(request):
 @login_required
 @is_contributor_user()
 def _personal_page_commentaries(request):
-    """Personal Page tab: Commentaries."""
+    """
+    Personal Page tab: Commentaries.
+    """
     contributor = request.user.contributor
     context = {'contributor': contributor}
 
@@ -532,7 +561,9 @@ def _personal_page_commentaries(request):
 @login_required
 @is_contributor_user()
 def _personal_page_theses(request):
-    """Personal Page tab: Theses."""
+    """
+    Personal Page tab: Theses.
+    """
     contributor = request.user.contributor
     context = {'contributor': contributor}
 
@@ -548,7 +579,9 @@ def _personal_page_theses(request):
 @login_required
 @is_contributor_user()
 def _personal_page_comments(request):
-    """Personal Page tab: Comments."""
+    """
+    Personal Page tab: Comments.
+    """
     contributor = request.user.contributor
     context = {
         'contributor': contributor,
@@ -561,7 +594,9 @@ def _personal_page_comments(request):
 @login_required
 @is_contributor_user()
 def _personal_page_author_replies(request):
-    """Personal Page tab: Author Replies."""
+    """
+    Personal Page tab: Author Replies.
+    """
     contributor = request.user.contributor
     context = {
         'contributor': contributor,
@@ -573,10 +608,14 @@ def _personal_page_author_replies(request):
 
 @login_required
 def personal_page(request, tab='account'):
-    """Personal Page is the main view for accessing user functions."""
+    """
+    Personal Page is the main view for accessing user functions.
+    """
     if request.is_ajax():
         if tab == 'account':
             return _personal_page_editorial_account(request)
+        elif tab == 'admin_actions':
+            return _personal_page_admin_actions(request)
         elif tab == 'editorial_actions':
             return _personal_page_editorial_actions(request)
         elif tab == 'refereeing':
-- 
GitLab