diff --git a/finances/models.py b/finances/models.py index 415efa04134e4e4dd7fc713282d4e6a8ff32fe34..2e9c9ddf2117279dc75c38a36322e0d513d0f868 100644 --- a/finances/models.py +++ b/finances/models.py @@ -7,6 +7,7 @@ from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey from django.db import models from django.utils import timezone +from django.utils.html import format_html from .constants import SUBSIDY_TYPES, SUBSIDY_STATUS, SUBSIDY_DURATION from .utils import id_to_slug @@ -27,7 +28,7 @@ class Subsidy(models.Model): organization = models.ForeignKey('organizations.Organization', on_delete=models.CASCADE) subsidy_type = models.CharField(max_length=256, choices=SUBSIDY_TYPES) description = models.CharField(max_length=256) - amount = models.PositiveSmallIntegerField() + amount = models.PositiveSmallIntegerField(help_text="in € (rounded)") status = models.CharField(max_length=32, choices=SUBSIDY_STATUS) date = models.DateField() duration = models.DurationField(choices=SUBSIDY_DURATION, blank=True, null=True) @@ -36,8 +37,8 @@ class Subsidy(models.Model): verbose_name_plural = 'subsidies' def __str__(self): - return '%s: %s, %s' % (self.date, self.organization, self.description) - + return format_html('{}: €{} from {}, for {}', + self.date, self.amount, self.organization, self.description) class WorkLog(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL) diff --git a/finances/templates/finances/base.html b/finances/templates/finances/base.html new file mode 100644 index 0000000000000000000000000000000000000000..f906eaeba8f731537620149d6f341da3a17c11ee --- /dev/null +++ b/finances/templates/finances/base.html @@ -0,0 +1,15 @@ +{% extends 'scipost/base.html' %} + +{% block body_class %}{{ block.super }} finances{% endblock %} + +{% block breadcrumb %} + <div class="container-outside header"> + <div class="container"> + <nav class="breadcrumb hidden-sm-down"> + {% block breadcrumb_items %} + <a href="{% url 'finances:finances' %}" class="breadcrumb-item">Finances</a> + {% endblock %} + </nav> + </div> + </div> +{% endblock %} diff --git a/finances/templates/finances/finances.html b/finances/templates/finances/finances.html new file mode 100644 index 0000000000000000000000000000000000000000..3422bebb62c197cff88d403674445987b281dd8d --- /dev/null +++ b/finances/templates/finances/finances.html @@ -0,0 +1,22 @@ +{% extends 'finances/base.html' %} + +{% load bootstrap %} + +{% block breadcrumb_items %} + {{ block.super }} + <span class="breadcrumb-item">Finances</span> +{% endblock %} + +{% block pagetitle %}: Finances{% endblock pagetitle %} + +{% block content %} +<div class="row"> + <div class="col-12"> + <h3 class="highlight">Finances</h3> + <ul> + <li><a href="{% url 'finances:subsidies' %}">Manage Subsidies</a></li> + <li><a href="{% url 'finances:timesheets' %}">Manage Timesheets</a></li> + </ul> + </div> +</div> +{% endblock content %} diff --git a/finances/templates/finances/subsidy_confirm_delete.html b/finances/templates/finances/subsidy_confirm_delete.html index d50e6c7e5bee3de6fd93eae86010e4beef387ed3..9b7ed50ef7c2fa82de9df646b60ef386b7914bf5 100644 --- a/finances/templates/finances/subsidy_confirm_delete.html +++ b/finances/templates/finances/subsidy_confirm_delete.html @@ -1,7 +1,13 @@ -{% extends 'scipost/base.html' %} +{% extends 'finances/base.html' %} {% load bootstrap %} +{% block breadcrumb_items %} +{{ block.super }} +<span class="breadcrumb-item"><a href="{% url 'finances:subsidies' %}">Subsidies</a></span> +<span class="breadcrumb-item">Confirm deletetion</span> +{% endblock %} + {% block pagetitle %}: Delete Subsidy{% endblock pagetitle %} {% block content %} @@ -13,12 +19,11 @@ </div> <div class="row"> <div class="col-12"> - <form method="post"> - {% csrf_token %} - <h3 class="mb-2">Are you sure you want to delete this Subsidy?</h3> - <input type="submit" class="btn btn-danger" value="Yes, delete it" /> - </form> - </ul> + <form method="post"> + {% csrf_token %} + <h3 class="mb-2">Are you sure you want to delete this Subsidy?</h3> + <input type="submit" class="btn btn-danger" value="Yes, delete it" /> + </form> </div> </div> diff --git a/finances/templates/finances/subsidy_form.html b/finances/templates/finances/subsidy_form.html index 5ed78daa76f3d42652582c168c0de562f89520c7..8458a2a3904b5c8f4a0bbe4398c271d5127de6a3 100644 --- a/finances/templates/finances/subsidy_form.html +++ b/finances/templates/finances/subsidy_form.html @@ -1,14 +1,16 @@ -{% extends 'profiles/base.html' %} +{% extends 'finances/base.html' %} {% load bootstrap %} {% block breadcrumb_items %} - {{ block.super }} - <span class="breadcrumb-item">{% if form.instance.id %}Update {{ form.instance }}{% else %}Add new Subsidy{% endif %}</span> +{{ block.super }} +<span class="breadcrumb-item"><a href="{% url 'finances:subsidies' %}">Subsidies</a></span> +<span class="breadcrumb-item">{% if form.instance.id %}Update {{ form.instance }}{% else %}Add new Subsidy{% endif %}</span> {% endblock %} {% block pagetitle %}: Subsidies{% endblock pagetitle %} + {% block content %} <div class="row"> <div class="col-12"> diff --git a/finances/templates/finances/subsidy_list.html b/finances/templates/finances/subsidy_list.html index 1d5593cea51b209beb107dbc59614cdd41ea63f1..0540cb603a3315f09fc42d18e43aa20a20e50597 100644 --- a/finances/templates/finances/subsidy_list.html +++ b/finances/templates/finances/subsidy_list.html @@ -1,19 +1,69 @@ -{% extends 'scipost/base.html' %} +{% extends 'finances/base.html' %} {% block pagetitle %}: Subsidies{% endblock pagetitle %} +{% block breadcrumb_items %} +{{ block.super }} +<span class="breadcrumb-item">Subsidies</span> +{% endblock %} + {% block content %} <div class="row"> <div class="col-12"> - <h3>Subsidies</h3> + <h3 class="highlight">Subsidies</h3> + {% if perms.scipost.can_manage_subsidies %} <ul> - {% for subsidy in object_list %} - <li>{{ subsidy }}</li> - {% empty %} - <li>No Subsidy found</li> - {% endfor %} + <li><a href="{% url 'finances:subsidy_create' %}">Add a Subsidy</a></li> + </ul> + {% endif %} + + <h4>Subsidies obtained:</h4> + <table class="table table-hover mb-5"> + <thead> + <tr> + <th>From Organization</th> + <th>Type</th> + <th>Amount</th> + <th>Date</th> + </tr> + </thead> + <tbody id="accordion" role="tablist" aria-multiselectable="true"> + {% for subsidy in object_list %} + <tr data-toggle="collapse" data-parent="#accordion" href="#collapse{{ subsidy.id }}" aria-expanded="false" aria-controls="collapse{{ subsidy.id }}" style="cursor: pointer;"> + <td>{{ subsidy.organization }}</td> + <td>{{ subsidy.get_type_display }}</td> + <td>{{ subsidy.amount }}</td> + <td>{{ subside.date|date:"Y-m-d" }}</td> + </tr> + <tr id="collapse{{ subsidy.id }}" class="collapse" role="tabpanel" aria-labelledby="heading{{ subsidy.id }}" style="background-color: #fff;"> + <td colspan="3"> + <h5>Description:</h5> + <p>{{ subsidy.description }}</p> + {% if subsidy.duration %} + <h5>Duration:</h5> + {{ subsidy.get_duration_display }} + {% endif %} + </td> + <td> + {% if perms.scipost.can_manage_subsidies %} + <h5>Admin actions:</h5> + <ul> + <li><a href="{% url 'finances:subsidy_update' pk=subsidy.id %}"><span class="text-warning">Update</span></a></li> + <li><a href="{% url 'finances:subsidy_delete' pk=subsidy.id %}"><span class="text-danger">Delete</span></a></li> + </ul> + {% endif %} + </td> + </tr> + {% empty %} + <tr> + <td colspan="4">No Subsidy found</td> + </tr> + {% endfor %} + </tbody> + </table> + </div> </div> diff --git a/finances/urls.py b/finances/urls.py index 865cd0f7acac62886d08f6c8985230138083ccc3..429317d014215d95bf706b67489ce594e66413a0 100644 --- a/finances/urls.py +++ b/finances/urls.py @@ -3,12 +3,18 @@ __license__ = "AGPL v3" from django.conf.urls import url +from django.views.generic import TemplateView from . import views urlpatterns = [ - url(r'^$', views.timesheets, name='finance'), + url( + r'^$', + TemplateView.as_view(template_name='finances/finances.html'), + name='finances' + ), + # Subsidies url( r'^subsidies/$', views.SubsidyListView.as_view(), @@ -30,7 +36,15 @@ urlpatterns = [ name='subsidy_delete' ), - - url(r'^timesheets$', views.timesheets, name='timesheets'), - url(r'^logs/(?P<slug>\d+)/delete$', views.LogDeleteView.as_view(), name='log_delete'), + # Timesheets + url( + r'^timesheets$', + views.timesheets, + name='timesheets' + ), + url( + r'^logs/(?P<slug>\d+)/delete$', + views.LogDeleteView.as_view(), + name='log_delete' + ), ] diff --git a/finances/views.py b/finances/views.py index 11071a1000e20fc9835b7e761ce6399cea8eeca0..a87360cf647149cd4faa880c434cdf03ad3ba88b 100644 --- a/finances/views.py +++ b/finances/views.py @@ -19,6 +19,11 @@ from .utils import slug_to_id from scipost.mixins import PermissionsMixin + +############# +# Subsidies # +############# + class SubsidyCreateView(PermissionsMixin, CreateView): """ Create a new Subsidy. @@ -26,7 +31,7 @@ class SubsidyCreateView(PermissionsMixin, CreateView): permission_required = 'scipost.can_manage_subsidies' model = Subsidy fields = '__all__' - template_name = 'finances/subsidy_create.html' + template_name = 'finances/subsidy_form.html' success_url = reverse_lazy('finances:subsidies') @@ -37,7 +42,7 @@ class SubsidyUpdateView(PermissionsMixin, UpdateView): permission_required = 'scipost.can_manage_subsidies' model = Subsidy fields = '__all__' - template_name = 'finances/subsidy_update.html' + template_name = 'finances/subsidy_form.html' success_url = reverse_lazy('finances:subsidies') @@ -54,6 +59,10 @@ class SubsidyListView(ListView): model = Subsidy +############################ +# Timesheets and Work Logs # +############################ + @permission_required('scipost.can_view_timesheets', raise_exception=True) def timesheets(request): """ diff --git a/journals/templates/journals/publication_detail.html b/journals/templates/journals/publication_detail.html index 1f28871ec78f1775fa9616ebf3a96ba556ebd4d1..a52c4ad13e6a3e9619424be519690c28de45bb3b 100644 --- a/journals/templates/journals/publication_detail.html +++ b/journals/templates/journals/publication_detail.html @@ -6,6 +6,9 @@ {% load scipost_extras %} {% load user_groups %} +{% is_scipost_admin request.user as is_scipost_admin %} +{% is_edcol_admin request.user as is_edcol_admin %} + {% block pagetitle %}: {{ publication.citation }} - {{ publication.title }}{% endblock pagetitle %} {% block body_class %}{{ block.super }} publication{% endblock %} @@ -65,8 +68,6 @@ </div> {% endif %} -{% is_edcol_admin request.user as is_edcol_admin %} - {% include 'partials/journals/publication_summary.html' with publication=publication %} {% if publication.commentary and publication.commentary.comments.vetted.exists %} diff --git a/notifications/templates/notifications/partials/notification_list_popover.html b/notifications/templates/notifications/partials/notification_list_popover.html index 3f16c462650a4c636afde7c90ebd8d78bf609d74..86cb6344269f533abd00158d4f7834347225ac3b 100644 --- a/notifications/templates/notifications/partials/notification_list_popover.html +++ b/notifications/templates/notifications/partials/notification_list_popover.html @@ -1,4 +1,7 @@ {% load request_filters %} +{% load user_groups %} + +{% is_financial_admin request.user as if_financial_admin %} <div class="popover-template"> <div class="popover notifications" role="tooltip"> @@ -26,8 +29,8 @@ <a class="item {% active 'partners:dashboard' %}" href="{% url 'partners:dashboard' %}">Partner Page</a> {% endif %} - {% if perms.scipost.can_view_timesheets %} - <a class="item {% active 'finances:finance' %}" href="{% url 'finances:finance' %}">Financial Administration</a> + {% if is_financial_admin %} + <a class="item {% active 'finances:finances' %}" href="{% url 'finances:finance' %}">Financial Administration</a> {% endif %} {% if perms.scipost.can_view_all_funding_info %} diff --git a/organizations/templates/organizations/_organization_card.html b/organizations/templates/organizations/_organization_card.html index 0f42473c9e3fa68e1514f9092741287cc3ce7d7f..ade2208cd09420a48048cd2e7e97d690df524b6a 100644 --- a/organizations/templates/organizations/_organization_card.html +++ b/organizations/templates/organizations/_organization_card.html @@ -3,6 +3,8 @@ {% load user_groups %} {% load organizations_extras %} +{% is_scipost_admin request.user as is_scipost_admin %} + <div class="card-body"> <div class="row"> diff --git a/organizations/templates/organizations/organization_confirm_delete.html b/organizations/templates/organizations/organization_confirm_delete.html index 8ea21f23cfe9abbc543a21f2c0eabb1e5701e5aa..600b75bb3aeb19aac85c8686f2ed4c09bd50ff13 100644 --- a/organizations/templates/organizations/organization_confirm_delete.html +++ b/organizations/templates/organizations/organization_confirm_delete.html @@ -13,12 +13,11 @@ </div> <div class="row"> <div class="col-12"> - <form method="post"> - {% csrf_token %} - <h3 class="mb-2">Are you sure you want to delete this Organization?</h3> - <input type="submit" class="btn btn-danger" value="Yes, delete it" /> - </form> - </ul> + <form method="post"> + {% csrf_token %} + <h3 class="mb-2">Are you sure you want to delete this Organization?</h3> + <input type="submit" class="btn btn-danger" value="Yes, delete it" /> + </form> </div> </div> diff --git a/organizations/templates/organizations/organization_list.html b/organizations/templates/organizations/organization_list.html index 0c175b5571917e05c2dbc6455c909e635f183109..4e65d392247c6597c5b5c6e0c386d7a2b84197d4 100644 --- a/organizations/templates/organizations/organization_list.html +++ b/organizations/templates/organizations/organization_list.html @@ -6,6 +6,8 @@ {% load user_groups %} {% load organizations_extras %} +{% is_scipost_admin request.user as is_scipost_admin %} + {% block headsup %} <script type="text/javascript"> $(document).ready(function($) { diff --git a/profiles/templates/profiles/profile_confirm_delete.html b/profiles/templates/profiles/profile_confirm_delete.html index 471ec55535f3e5c98594c37352889f67c9069a97..f23f8a9e62006e8f7905fee5e4e983357903b15f 100644 --- a/profiles/templates/profiles/profile_confirm_delete.html +++ b/profiles/templates/profiles/profile_confirm_delete.html @@ -18,12 +18,11 @@ </div> <div class="row"> <div class="col-12"> - <form method="post"> - {% csrf_token %} - <h3 class="mb-2">Are you sure you want to delete this Profile?</h3> - <input type="submit" class="btn btn-danger" value="Yes, delete it" /> - </form> - </ul> + <form method="post"> + {% csrf_token %} + <h3 class="mb-2">Are you sure you want to delete this Profile?</h3> + <input type="submit" class="btn btn-danger" value="Yes, delete it" /> + </form> </div> </div>