diff --git a/scipost_django/finances/forms.py b/scipost_django/finances/forms.py index e39525574949ea434d161c79b628752144ea3e75..b74540c8776753602a97a6e59542cdc68e91b0bf 100644 --- a/scipost_django/finances/forms.py +++ b/scipost_django/finances/forms.py @@ -6,6 +6,7 @@ import re from django import forms from django.contrib.auth import get_user_model +from django.urls import reverse_lazy from django.utils.dates import MONTHS from django.db.models import Q, Case, DateField, Max, Min, Sum, Value, When, F from django.utils import timezone @@ -36,6 +37,14 @@ class SubsidyForm(forms.ModelForm): ), ) + renewal_of = forms.ModelChoiceField( + queryset=Subsidy.objects.all(), + widget=autocomplete.ModelSelect2( + url=reverse_lazy("finances:subsidy_autocomplete") + ), + help_text=("Start typing, and select from the popup."), + ) + class Meta: model = Subsidy fields = [ @@ -453,11 +462,13 @@ class LogsFilterForm(forms.Form): if self.cleaned_data["hourly_rate"]: salary_per_month = [ - duration.total_seconds() - / 3600 # Convert to hours - * self.cleaned_data["hourly_rate"] - if duration is not None - else 0 + ( + duration.total_seconds() + / 3600 # Convert to hours + * self.cleaned_data["hourly_rate"] + if duration is not None + else 0 + ) for duration in total_time_per_month ] else: diff --git a/scipost_django/finances/urls.py b/scipost_django/finances/urls.py index 371cbb6f451a4ef3642db57eba18b67a7207154c..dd9ff61282502773ddaa6f43a11e50ca393f8314 100644 --- a/scipost_django/finances/urls.py +++ b/scipost_django/finances/urls.py @@ -101,6 +101,11 @@ urlpatterns = [ views.SubsidyDeleteView.as_view(), name="subsidy_delete", ), + path( + "subsidies/autocomplete/", + views.SubsidyAutocompleteView.as_view(), + name="subsidy_autocomplete", + ), path( "subsidies/<int:pk>/", views.SubsidyDetailView.as_view(), name="subsidy_details" ), diff --git a/scipost_django/finances/views.py b/scipost_django/finances/views.py index 1774b925080766f627f4280f8121d0fcb06ada11..7a641eac0034cee91e88ad1d356ad04a5dcaec68 100644 --- a/scipost_django/finances/views.py +++ b/scipost_django/finances/views.py @@ -4,8 +4,9 @@ __license__ = "AGPL v3" import datetime from itertools import accumulate -import mimetypes +from dal import autocomplete +from django.db.models import Q import matplotlib matplotlib.use("Agg") @@ -290,6 +291,30 @@ class SubsidyDeleteView(PermissionsMixin, DeleteView): success_url = reverse_lazy("finances:subsidies") +class SubsidyAutocompleteView(autocomplete.Select2QuerySetView): + """ + Autocomplete for Subsidy, meant to be used with Select2. + Will only show subsidies whose amounts are publicly visible + for users without the 'can_manage_subsidies' permission. + """ + + def get_queryset(self): + qs = Subsidy.objects.all() + if not self.request.user.has_perm("scipost.can_manage_subsidies"): + qs = qs.filter(amount_publicly_shown=True) + if self.q: + qs = qs.filter( + Q(organization__name__unaccent__icontains=self.q) + | Q(organization__name_original__unaccent__icontains=self.q) + | Q(organization__acronym__unaccent__icontains=self.q) + | Q(amount__icontains=self.q) + | Q(description__icontains=self.q) + | Q(date_from__year__icontains=self.q) + | Q(date_until__year__icontains=self.q) + ) + return qs + + class SubsidyListView(ListView): model = Subsidy template_name = "finances/subsidy_list_old.html"