From 61124135b59fcacb3105f9f2ac91390e2e8288cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laur=C3=A9line=20Gu=C3=A9rin?= Date: Tue, 7 Feb 2023 09:59:26 +0100 Subject: [PATCH 1/2] invoicing: fix journal url for invoice lines (#73918) --- .../lingo/invoicing/manager_invoice_lines.html | 1 + lingo/invoicing/views.py | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lingo/invoicing/templates/lingo/invoicing/manager_invoice_lines.html b/lingo/invoicing/templates/lingo/invoicing/manager_invoice_lines.html index 14550cd..c327d4a 100644 --- a/lingo/invoicing/templates/lingo/invoicing/manager_invoice_lines.html +++ b/lingo/invoicing/templates/lingo/invoicing/manager_invoice_lines.html @@ -1,3 +1,4 @@ +{% url 'lingo-manager-invoicing-pool-journal' pk=object.pk pool_pk=pool.pk as journal_url %} {% for line in object_list %}
  • #{{ line.pk }} diff --git a/lingo/invoicing/views.py b/lingo/invoicing/views.py index 8fb8631..8b70edc 100644 --- a/lingo/invoicing/views.py +++ b/lingo/invoicing/views.py @@ -461,16 +461,21 @@ class InvoiceLineListView(ListView): template_name = 'lingo/invoicing/manager_invoice_lines.html' def dispatch(self, request, *args, **kwargs): - pool = get_object_or_404(Pool, pk=kwargs['pool_pk'], campaign_id=kwargs['pk']) + self.pool = get_object_or_404(Pool, pk=kwargs['pool_pk'], campaign_id=kwargs['pk']) invoice_model = Invoice - if pool.draft: + if self.pool.draft: invoice_model = DraftInvoice - self.invoice = get_object_or_404(invoice_model, pk=kwargs['invoice_pk'], pool=pool) + self.invoice = get_object_or_404(invoice_model, pk=kwargs['invoice_pk'], pool=self.pool) return super().dispatch(request, *args, **kwargs) def get_queryset(self): return self.invoice.lines.all().order_by('user_external_id', 'event_date', 'pk') + def get_context_data(self, **kwargs): + kwargs['object'] = self.pool.campaign + kwargs['pool'] = self.pool + return super().get_context_data(**kwargs) + invoice_line_list = InvoiceLineListView.as_view() -- 2.39.2 From 1b00fa62dd13993d75d381f39089e3bc00b1639a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laur=C3=A9line=20Gu=C3=A9rin?= Date: Tue, 7 Feb 2023 11:20:33 +0100 Subject: [PATCH 2/2] invoicing: invoice filtering (#73918) --- lingo/invoicing/forms.py | 59 ++++++++++++++++- .../invoicing/manager_invoice_lines.html | 2 +- .../lingo/invoicing/manager_pool_detail.html | 22 ++++++- lingo/invoicing/views.py | 18 ++++- tests/invoicing/manager/test_campaign.py | 65 ++++++++++++++++--- 5 files changed, 151 insertions(+), 15 deletions(-) diff --git a/lingo/invoicing/forms.py b/lingo/invoicing/forms.py index b2f385a..8795b92 100644 --- a/lingo/invoicing/forms.py +++ b/lingo/invoicing/forms.py @@ -19,7 +19,7 @@ import django_filters from django import forms from django.utils.translation import ugettext_lazy as _ -from lingo.invoicing.models import Campaign, DraftInvoiceLine, InvoiceLine, Regie +from lingo.invoicing.models import Campaign, DraftInvoice, DraftInvoiceLine, Invoice, InvoiceLine, Regie class CampaignForm(forms.ModelForm): @@ -51,17 +51,74 @@ def regie_queryset(request): return Regie.objects.all() +class AbstractInvoiceFilterSet(django_filters.FilterSet): + regie = django_filters.ModelChoiceFilter( + label=_('Regie'), + queryset=regie_queryset, + ) + # for Invoice + number = django_filters.CharFilter( + label=_('Invoice number'), + field_name='formatted_number', + lookup_expr='contains', + ) + # for DraftInvoice + pk = django_filters.NumberFilter( + label=_('Invoice number'), + ) + payer_external_id = django_filters.CharFilter( + label=_('Payer (external ID)'), + field_name='payer', + ) + user_external_id = django_filters.CharFilter( + label=_('User (external ID)'), + method='filter_user_external_id', + ) + + def __init__(self, *args, **kwargs): + self.pool = kwargs.pop('pool') + super().__init__(*args, **kwargs) + + if self.pool.draft: + del self.filters['number'] + else: + del self.filters['pk'] + + def filter_user_external_id(self, queryset, name, value): + if not value: + return queryset + line_model = InvoiceLine + if self.pool.draft: + line_model = DraftInvoiceLine + lines = line_model.objects.filter(user_external_id=value).values('invoice') + return queryset.filter(pk__in=lines) + + +class DraftInvoiceFilterSet(AbstractInvoiceFilterSet): + class Meta: + model = DraftInvoice + fields = [] + + +class InvoiceFilterSet(AbstractInvoiceFilterSet): + class Meta: + model = Invoice + fields = [] + + class AbstractLineFilterSet(django_filters.FilterSet): regie = django_filters.ModelChoiceFilter( label=_('Regie'), queryset=regie_queryset, field_name='invoice__regie', ) + # for InvoiceLine invoice_number = django_filters.CharFilter( label=_('Invoice number'), field_name='invoice__formatted_number', lookup_expr='contains', ) + # for DraftInvoiceLine invoice_id = django_filters.NumberFilter( label=_('Invoice number'), ) diff --git a/lingo/invoicing/templates/lingo/invoicing/manager_invoice_lines.html b/lingo/invoicing/templates/lingo/invoicing/manager_invoice_lines.html index c327d4a..29f8ad6 100644 --- a/lingo/invoicing/templates/lingo/invoicing/manager_invoice_lines.html +++ b/lingo/invoicing/templates/lingo/invoicing/manager_invoice_lines.html @@ -2,7 +2,7 @@ {% for line in object_list %}
  • #{{ line.pk }} - {{ line.user_name }} + {{ line.user_name }} ({{ line.user_external_id }}) - {{ line.event_date|date:"d/m/Y" }} - {{ line.label }} ({{ line.total_amount }})
  • {% endfor %} diff --git a/lingo/invoicing/templates/lingo/invoicing/manager_pool_detail.html b/lingo/invoicing/templates/lingo/invoicing/manager_pool_detail.html index 5a2b743..e0af55e 100644 --- a/lingo/invoicing/templates/lingo/invoicing/manager_pool_detail.html +++ b/lingo/invoicing/templates/lingo/invoicing/manager_pool_detail.html @@ -25,7 +25,27 @@ {% endblock %} {% block content %} - {% url 'lingo-manager-invoicing-pool-journal' pk=object.pk pool_pk=pool.pk as journal_url %} +
    +
    +
    +
    + {% trans "Invoice Filtering" %} +
    + {{ filterset.form.as_p }} +
    +
    + +
    +
    +
    + {% url 'lingo-manager-invoicing-pool-journal' pk=object.pk pool_pk=pool.pk as journal_url %}