mirror of
https://github.com/ae-utbm/sith.git
synced 2024-11-24 18:14:22 +00:00
Merge pull request #878 from ae-utbm/fix-invoices
fix: InvoiceQuerySet.annotate_total() (but this time good)
This commit is contained in:
commit
143713fac1
@ -158,10 +158,11 @@ def test_user_invoice_with_multiple_items():
|
|||||||
item_recipe = Recipe(InvoiceItem, invoice=foreign_key(Recipe(Invoice, user=user)))
|
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=3, quantity=1, product_unit_price=5)
|
||||||
item_recipe.make(_quantity=1, 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(
|
res = list(
|
||||||
Invoice.objects.filter(user=user)
|
Invoice.objects.filter(user=user)
|
||||||
.annotate_total()
|
.annotate_total()
|
||||||
.order_by("-total")
|
.order_by("-total")
|
||||||
.values_list("total", flat=True)
|
.values_list("total", flat=True)
|
||||||
)
|
)
|
||||||
assert res == [15, 5]
|
assert res == [15, 13, 5]
|
||||||
|
@ -21,9 +21,11 @@
|
|||||||
# Place - Suite 330, Boston, MA 02111-1307, USA.
|
# Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
import itertools
|
||||||
|
|
||||||
# This file contains all the views that concern the user model
|
# This file contains all the views that concern the user model
|
||||||
from datetime import date, timedelta
|
from datetime import date, timedelta
|
||||||
|
from operator import itemgetter
|
||||||
from smtplib import SMTPException
|
from smtplib import SMTPException
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
@ -665,9 +667,15 @@ class UserAccountView(UserAccountBase):
|
|||||||
kwargs["refilling_month"] = self.expense_by_month(
|
kwargs["refilling_month"] = self.expense_by_month(
|
||||||
Refilling.objects.filter(customer=self.object.customer)
|
Refilling.objects.filter(customer=self.object.customer)
|
||||||
)
|
)
|
||||||
kwargs["invoices_month"] = self.expense_by_month(
|
kwargs["invoices_month"] = [
|
||||||
Invoice.objects.filter(user=self.object)
|
# 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)
|
kwargs["etickets"] = self.object.customer.buyings.exclude(product__eticket=None)
|
||||||
return kwargs
|
return kwargs
|
||||||
|
|
||||||
|
@ -173,9 +173,8 @@ class InvoiceQueryset(models.QuerySet):
|
|||||||
return self.annotate(
|
return self.annotate(
|
||||||
total=Subquery(
|
total=Subquery(
|
||||||
InvoiceItem.objects.filter(invoice_id=OuterRef("pk"))
|
InvoiceItem.objects.filter(invoice_id=OuterRef("pk"))
|
||||||
.annotate(item_amount=F("product_unit_price") * F("quantity"))
|
.values("invoice_id")
|
||||||
.values("item_amount")
|
.annotate(total=Sum(F("product_unit_price") * F("quantity")))
|
||||||
.annotate(total=Sum("item_amount"))
|
|
||||||
.values("total")
|
.values("total")
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user