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