More stats!

This commit is contained in:
nikolark committed 2015-11-29 18:51:31 +01:00
1 parent 6560d3e89b
commit 17545b5261
13 files changed
+189 -154

No files matched your search

+2 -3
View File
@@ -1,8 +1,8 @@
from django.db.models import Sum
from django.db.models import Sum, Count
from rest_framework import serializers
from rest_framework.serializers import ModelSerializer
from main.models import Product, OrderLine
from main.models import Product, OrderLine, Order
class ProductSerializer(ModelSerializer):
@@ -10,7 +10,6 @@ class ProductSerializer(ModelSerializer):
model = Product
class ProductStatSerializer(ModelSerializer):
EXTERNAL_USER = 'Ekstern'
counts = serializers.SerializerMethodField()
+1
View File
@@ -19,3 +19,4 @@ class ProductViewSet(mixins.ListModelMixin,
serializer = ProductStatSerializer(products, many=True)
return Response(serializer.data)
+12 -7
View File
@@ -1,6 +1,7 @@
from django.conf.urls import url, patterns
from main.api.views import ProductViewSet
from main.views.stats import stats_list, stats_orders, stats_orders_hourly, stats_products_realtime, stats_products_per_user
from main.views.stats import stats_list, stats_products_realtime, stats_products_per_user, \
OrdersHourlyView, OrdersDailyView, OrdersMonthlyView, OrdersYearlyView
from main.views.general import register, deposit, log
from main.views.reports import inventory, inventory_add, report
from main.views.users import create_user, profile
@@ -12,12 +13,6 @@ urlpatterns = [
url(r'^deposit/$', deposit, name='deposit'),
url(r'^log/$', log, name='log'),
url(r'^log/all$', log, kwargs={'limit': None}, name='log-all'),
# Stats
url(r'^stats/$', stats_list, name='stats'),
url(r'^stats/orders/$', stats_orders, name='stats-orders'),
url(r'^stats/orders/hourly$', stats_orders_hourly, name='stats-orders-hourly'),
url(r'^stats/orders/products_realtime$', stats_products_realtime, name='stats-products-realtime'),
url(r'^stats/products/by_user/(?P<user_id>[0-9]+)/$', stats_products_per_user, name='stats-products-per-user'),
# Users
url(r'^user/create/$', create_user, name='create-user'),
url(r'^profile/$', profile, name='profile'),
@@ -27,6 +22,16 @@ urlpatterns = [
url(r'^report$', report, name='report'),
]
# Stats
urlpatterns += [
url(r'^stats/$', stats_list, name='stats'),
url(r'^stats/orders/hourly/$', OrdersHourlyView.as_view(), name='stats-orders-hourly'),
url(r'^stats/orders/daily/', OrdersDailyView.as_view(), name='stats-orders-daily'),
url(r'^stats/orders/monthly/', OrdersMonthlyView.as_view(), name='stats-orders-monthly'),
url(r'^stats/orders/yearly/', OrdersYearlyView.as_view(), name='stats-orders-yearly'),
url(r'^stats/orders/products_realtime$', stats_products_realtime, name='stats-products-realtime'),
url(r'^stats/products/by_user/(?P<user_id>[0-9]+)/$', stats_products_per_user, name='stats-products-per-user'),
]
# Root level service-worker.js
urlpatterns += patterns(
'django.contrib.staticfiles.views',
+75 -35
View File
@@ -1,57 +1,97 @@
from __future__ import unicode_literals
import time
from datetime import datetime, timedelta
from django.db.models import Sum, Count
from django.http import JsonResponse
from django.shortcuts import render, get_object_or_404
from django.shortcuts import render
from django.utils import timezone
from itertools import groupby
from django.utils import six
from django.views.generic import View
from main.models import Product, OrderLine, Order
def stats_list(request):
products = Product.objects.filter(active=True)
order_groups = ['hourly', 'daily', 'monthly', 'yearly']
return render(request, 'stats.html', {'products': products})
return render(request, 'stats.html', {'products': products, 'order_groups': order_groups})
def stats_orders(request):
num_external_orders = Order.objects.filter(customer=None).count()
per_user = Order.objects\
.values('customer__first_name', 'customer__last_name')\
.annotate(num=Count('customer'))\
.order_by('num').reverse()
f_per_user = []
for row in per_user:
if row['customer__first_name'] is not None:
who = row['customer__first_name'] + " " + row['customer__last_name']
num = row['num']
else:
who = "Ekstern"
num = num_external_orders
f_per_user.append([who, num])
class OrdersView(View):
grouping = 'orders'
return JsonResponse(f_per_user, safe=False)
def get_range(self):
raise NotImplementedError
def get_key(self, order):
raise NotImplementedError
def group_by(self, orders):
orders_grouped = dict([(key, 0) for key in self.get_range()]) # init
for key, values in groupby(orders, key=self.get_key):
count = len(list(values))
orders_grouped[key] += count
return orders_grouped
def get(self, request):
orders = Order.objects.all()
if not orders.exists():
return JsonResponse({})
orders_grouped = self.group_by(orders)
data = {
'start': str(orders[0].created),
'orders': [[k, v] for k, v in orders_grouped.items()],
'total': sum(orders_grouped.values()),
'grouping': self.grouping
}
return JsonResponse(data)
def stats_orders_hourly(request):
orders = Order.objects.all()
f_hourly = dict([(key, 0) for key in range(0, 24)]) # init
# group by hour
for key, values in groupby(orders, key=lambda row: row.created.hour):
count = len(list(values))
f_hourly[key] += count
class OrdersHourlyView(OrdersView):
grouping = 'hourly'
if len(orders) == 0:
return JsonResponse({})
def get_range(self):
return range(0, 24)
response = {
'start': str(orders[0].created),
'hourly': [[k, v] for k, v in f_hourly.items()],
'total': sum(f_hourly.values()),
}
return JsonResponse(response)
def get_key(self, order):
return order.created.hour
class OrdersDailyView(OrdersView):
grouping = 'daily'
def get_range(self):
return range(0, 7)
def get_key(self, order):
return order.created.weekday()
class OrdersMonthlyView(OrdersView):
grouping = 'monthly'
def get_range(self):
return range(1, 13)
def get_key(self, order):
return order.created.month
class OrdersYearlyView(OrdersView):
grouping = 'yearly'
def get_range(self):
first = Order.objects.order_by('created').first()
last = timezone.now().year
first = first.created.year if first else last
return range(first, last+1)
def get_key(self, order):
return order.created.year
def stats_products_realtime(request):