50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
from django.db.models import Count, Sum
|
||
from rest_framework import serializers
|
||
from rest_framework.serializers import ModelSerializer
|
||
|
||
from main.models import Order, OrderLine, Product
|
||
|
||
|
||
class ProductSerializer(ModelSerializer):
|
||
class Meta:
|
||
model = Product
|
||
fields = "__all__"
|
||
|
||
|
||
class ProductStatSerializer(ModelSerializer):
|
||
EXTERNAL_USER = "Ekstern"
|
||
counts = serializers.SerializerMethodField()
|
||
|
||
def _format_counts(self, per_user):
|
||
per_user = list(per_user)
|
||
for row in per_user:
|
||
first = row.pop("order__customer__first_name")
|
||
last = row.pop("order__customer__last_name")
|
||
if first is None:
|
||
who = self.EXTERNAL_USER
|
||
else:
|
||
who = "{} {}".format(first, last)
|
||
row["full_name"] = who
|
||
|
||
return per_user
|
||
|
||
def get_counts(self, obj):
|
||
name_fields = ["order__customer__first_name", "order__customer__last_name"]
|
||
per_user = OrderLine.objects.filter(product=obj)
|
||
per_user = per_user.values(*name_fields).annotate(amount_total=Sum("amount")).order_by("-amount_total")
|
||
|
||
return self._format_counts(per_user)
|
||
|
||
class Meta:
|
||
model = Product
|
||
fields = [
|
||
"id",
|
||
"name",
|
||
"description",
|
||
"image",
|
||
"inventory_amount",
|
||
"active",
|
||
"created",
|
||
"counts",
|
||
]
|