From 564d95f701024efeacc3e3d7b63bbc3d61fa2c50 Mon Sep 17 00:00:00 2001 From: imperosol Date: Sun, 13 Oct 2024 10:37:48 +0200 Subject: [PATCH 1/2] fix: InvoiceQuerySet.annotate_total() (but for real this time) --- core/tests/test_user.py | 3 ++- eboutic/models.py | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/tests/test_user.py b/core/tests/test_user.py index c767f3f4..0fdf43c9 100644 --- a/core/tests/test_user.py +++ b/core/tests/test_user.py @@ -158,10 +158,11 @@ def test_user_invoice_with_multiple_items(): item_recipe = Recipe(InvoiceItem, invoice=foreign_key(Recipe(Invoice, user=user))) item_recipe.make(_quantity=3, quantity=1, product_unit_price=5) item_recipe.make(_quantity=1, quantity=1, product_unit_price=5) + item_recipe.make(_quantity=2, quantity=1, product_unit_price=iter([5, 8])) res = list( Invoice.objects.filter(user=user) .annotate_total() .order_by("-total") .values_list("total", flat=True) ) - assert res == [15, 5] + assert res == [15, 13, 5] diff --git a/eboutic/models.py b/eboutic/models.py index 468562ad..7ec9deef 100644 --- a/eboutic/models.py +++ b/eboutic/models.py @@ -173,9 +173,8 @@ class InvoiceQueryset(models.QuerySet): return self.annotate( total=Subquery( InvoiceItem.objects.filter(invoice_id=OuterRef("pk")) - .annotate(item_amount=F("product_unit_price") * F("quantity")) - .values("item_amount") - .annotate(total=Sum("item_amount")) + .values("invoice_id") + .annotate(total=Sum(F("product_unit_price") * F("quantity"))) .values("total") ) ) From e4845b580bf11f38b3b7a5f5c76e77a1128eaf53 Mon Sep 17 00:00:00 2001 From: imperosol Date: Sun, 13 Oct 2024 11:46:03 +0200 Subject: [PATCH 2/2] fix: invoices month grouping --- core/views/user.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/core/views/user.py b/core/views/user.py index 286a3a92..027a7edc 100644 --- a/core/views/user.py +++ b/core/views/user.py @@ -21,9 +21,11 @@ # Place - Suite 330, Boston, MA 02111-1307, USA. # # +import itertools # This file contains all the views that concern the user model from datetime import date, timedelta +from operator import itemgetter from smtplib import SMTPException from django.conf import settings @@ -665,9 +667,15 @@ class UserAccountView(UserAccountBase): kwargs["refilling_month"] = self.expense_by_month( Refilling.objects.filter(customer=self.object.customer) ) - kwargs["invoices_month"] = self.expense_by_month( - Invoice.objects.filter(user=self.object) - ) + kwargs["invoices_month"] = [ + # the django ORM removes the `group by` clause in this query, + # so a little of post-processing is needed + {"grouped_date": key, "total": sum(i["total"] for i in group)} + for key, group in itertools.groupby( + self.expense_by_month(Invoice.objects.filter(user=self.object)), + key=itemgetter("grouped_date"), + ) + ] kwargs["etickets"] = self.object.customer.buyings.exclude(product__eticket=None) return kwargs