✨ Add order stats
This commit is contained in:
1 parent
6fa6bf1334
commit
771e0c2a3b
10 files changed
+336
-27
No files matched your search
+20
-1
@@ -1,8 +1,18 @@
|
||||
import strawberry
|
||||
import strawberry_django
|
||||
|
||||
from main import models
|
||||
from main.api import mutations
|
||||
from main.api.types import Order, OrderOrdering, Product, Transaction, TransactionOrdering, User
|
||||
from main.api.types import (
|
||||
Order,
|
||||
OrderOrdering,
|
||||
OrderStats,
|
||||
OrderStatsByTime,
|
||||
Product,
|
||||
Transaction,
|
||||
TransactionOrdering,
|
||||
User,
|
||||
)
|
||||
|
||||
|
||||
@strawberry.type
|
||||
@@ -13,6 +23,15 @@ class Query:
|
||||
order_list: list[Order] = strawberry_django.field(pagination=True, order=OrderOrdering)
|
||||
transaction_list: list[Transaction] = strawberry_django.field(pagination=True, order=TransactionOrdering)
|
||||
|
||||
@strawberry.field
|
||||
def order_stats(self) -> OrderStats:
|
||||
return OrderStats(
|
||||
yearly=[OrderStatsByTime(**stat) for stat in models.Order.objects.count_by_year().order_by("period")],
|
||||
monthly=[OrderStatsByTime(**stat) for stat in models.Order.objects.count_by_month().order_by("period")],
|
||||
dayly=[OrderStatsByTime(**stat) for stat in models.Order.objects.count_by_weekday().order_by("period")],
|
||||
hourly=[OrderStatsByTime(**stat) for stat in models.Order.objects.count_by_hour().order_by("period")],
|
||||
)
|
||||
|
||||
|
||||
@strawberry.type
|
||||
class Mutation:
|
||||
|
||||
@@ -79,6 +79,20 @@ class OrderLine:
|
||||
unit_price: auto
|
||||
|
||||
|
||||
@strawberry.type
|
||||
class OrderStatsByTime:
|
||||
period: int
|
||||
count: str
|
||||
|
||||
|
||||
@strawberry.type
|
||||
class OrderStats:
|
||||
yearly: list[OrderStatsByTime]
|
||||
monthly: list[OrderStatsByTime]
|
||||
dayly: list[OrderStatsByTime]
|
||||
hourly: list[OrderStatsByTime]
|
||||
|
||||
|
||||
@strawberry_django.ordering.order(models.Transaction)
|
||||
class TransactionOrdering:
|
||||
created: auto
|
||||
|
||||
+21
-3
@@ -2,8 +2,8 @@ from datetime import datetime
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import models
|
||||
from django.db.models import Sum
|
||||
from django.templatetags.static import static
|
||||
from django.db.models import Count, Sum
|
||||
from django.db.models.functions import ExtractHour, ExtractMonth, ExtractWeekDay, ExtractYear
|
||||
|
||||
EXTERNAL_USER = "Ekstern"
|
||||
|
||||
@@ -79,6 +79,22 @@ class Product(models.Model):
|
||||
ordering = ["name"]
|
||||
|
||||
|
||||
class OrderManager(models.Manager):
|
||||
def count_by_year(self):
|
||||
return self.get_queryset().annotate(period=ExtractYear("created")).values("period").annotate(count=Count("id"))
|
||||
|
||||
def count_by_month(self):
|
||||
return self.get_queryset().annotate(period=ExtractMonth("created")).values("period").annotate(count=Count("id"))
|
||||
|
||||
def count_by_weekday(self):
|
||||
return (
|
||||
self.get_queryset().annotate(period=ExtractWeekDay("created")).values("period").annotate(count=Count("id"))
|
||||
)
|
||||
|
||||
def count_by_hour(self):
|
||||
return self.get_queryset().annotate(period=ExtractHour("created")).values("period").annotate(count=Count("id"))
|
||||
|
||||
|
||||
class Order(models.Model):
|
||||
customer = models.ForeignKey(
|
||||
settings.AUTH_USER_MODEL,
|
||||
@@ -90,6 +106,8 @@ class Order(models.Model):
|
||||
order_sum = models.FloatField(db_column="sum")
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
objects = OrderManager()
|
||||
|
||||
def is_external(self):
|
||||
return self.customer is None
|
||||
|
||||
@@ -97,7 +115,7 @@ class Order(models.Model):
|
||||
return "{}".format(", ".join([str(ol) for ol in self.orderlines.all()]))
|
||||
|
||||
def __str__(self):
|
||||
return "{}: {} kr".format(self.customer or "Ekstern", self.order_sum)
|
||||
return "{}: {} kr".format(self.customer or EXTERNAL_USER, self.order_sum)
|
||||
|
||||
|
||||
class OrderLine(models.Model):
|
||||
|
||||
Reference in new issue
Block a user