opbeans/utils.py (43 lines of code) (raw):
from django.core.serializers.json import DjangoJSONEncoder
from django.db import models
from django.http import StreamingHttpResponse
from opbeans import models as m
def stats():
numbers = m.Product.objects.annotate(
order_count=models.Count('order'),
per_item_profit=models.F('selling_price') - models.F('cost')
).annotate(
total_profit=models.F('order_count') * models.F('per_item_profit'),
total_revenue=models.F('order_count') * models.F('selling_price'),
total_cost=models.F('order_count') * models.F('cost')
).aggregate(
revenue=models.Sum('total_revenue'),
cost=models.Sum('total_cost'),
profit=models.Sum('total_profit'),
)
data = {
'products': m.Product.objects.count(),
'customers': m.Customer.objects.count(),
'orders': m.Order.objects.count(),
'numbers': numbers
}
return data
stats.cache_key = 'shop-stats'
class iterlist(list):
def __init__(self, iterator):
self.iterator = iterator
super(iterlist, self).__init__("Hack")
def __iter__(self):
return self.iterator
class StreamingJsonResponse(StreamingHttpResponse):
def __init__(self, data, encoder=DjangoJSONEncoder, safe=True,
json_dumps_params=None, *args, **kwargs):
if safe and not isinstance(data, dict):
raise TypeError(
'In order to allow non-dict objects to be serialized set the '
'safe parameter to False.'
)
kwargs.setdefault('content_type', 'application/json')
encoder_obj = encoder(**(json_dumps_params or {}))
iterator = encoder_obj.iterencode(data)
super(StreamingJsonResponse, self).__init__(iterator, *args, **kwargs)