PEP8 party
This commit is contained in:
1 parent
85218c6120
commit
4b3ffeda3c
3 files changed
+73
-41
No files matched your search
@@ -6,3 +6,4 @@ static/.sass-cache
|
|||||||
uploads/[^.]*
|
uploads/[^.]*
|
||||||
venv
|
venv
|
||||||
node_modules
|
node_modules
|
||||||
|
.idea
|
||||||
+2
-2
@@ -12,8 +12,8 @@ urlpatterns = patterns('main.views',
|
|||||||
url(r'^stats/orders/products_realtime$', 'stats_products_realtime', name='stats-products-realtime'),
|
url(r'^stats/orders/products_realtime$', 'stats_products_realtime', name='stats-products-realtime'),
|
||||||
url(r'^stats/products/$', 'stats_products', name='stats-products'),
|
url(r'^stats/products/$', 'stats_products', name='stats-products'),
|
||||||
url(r'^stats/products/(?P<product>[0-9]+)/$', 'stats_products', name='stats-product'),
|
url(r'^stats/products/(?P<product>[0-9]+)/$', 'stats_products', name='stats-product'),
|
||||||
url(r'^products/(?P<product_id>[0-9]+)/$', 'products', name='json-product'),
|
url(r'^products/(?P<product_id>[0-9]+)/$', 'products_json', name='json-product'),
|
||||||
url(r'^products/$', 'products', name='json-products'),
|
url(r'^products/$', 'products_json', name='json-products'),
|
||||||
url(r'^user/create/$', 'create_user', name='create-user'),
|
url(r'^user/create/$', 'create_user', name='create-user'),
|
||||||
url(r'^inventory/$', 'inventory', name='inventory'),
|
url(r'^inventory/$', 'inventory', name='inventory'),
|
||||||
url(r'^inventory/add/$', 'inventory_add', name='inventory-add'),
|
url(r'^inventory/add/$', 'inventory_add', name='inventory-add'),
|
||||||
|
|||||||
+70
-39
@@ -1,17 +1,15 @@
|
|||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from datetime import datetime
|
|
||||||
from itertools import groupby
|
from itertools import groupby
|
||||||
import json
|
import json
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth.decorators import login_required
|
|
||||||
from django.contrib.auth.forms import AuthenticationForm
|
from django.contrib.auth.forms import AuthenticationForm
|
||||||
from django.contrib.auth import login, logout as auth_logout
|
from django.contrib.auth import login, logout as auth_logout
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.db.models import Count, Sum, Max, Min
|
from django.db.models import Count, Sum, Min
|
||||||
from django.forms.formsets import formset_factory
|
from django.forms.formsets import formset_factory
|
||||||
from django.http import HttpResponse, HttpResponseRedirect
|
from django.http import HttpResponse, HttpResponseRedirect
|
||||||
from django.shortcuts import render_to_response, render, get_object_or_404, redirect
|
from django.shortcuts import render_to_response, render, get_object_or_404, redirect
|
||||||
@@ -21,6 +19,7 @@ from forms import *
|
|||||||
from models import *
|
from models import *
|
||||||
import utils
|
import utils
|
||||||
|
|
||||||
|
|
||||||
def home(request):
|
def home(request):
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
form = AuthenticationForm(data=request.POST)
|
form = AuthenticationForm(data=request.POST)
|
||||||
@@ -30,11 +29,12 @@ def home(request):
|
|||||||
else:
|
else:
|
||||||
if request.user.is_authenticated():
|
if request.user.is_authenticated():
|
||||||
# Redirect to the register
|
# Redirect to the register
|
||||||
return HttpResponseRedirect( reverse('main.views.register') )
|
return HttpResponseRedirect(reverse('main.views.register'))
|
||||||
else:
|
else:
|
||||||
form = AuthenticationForm(request)
|
form = AuthenticationForm(request)
|
||||||
return render_to_response('home.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('home.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
def register(request):
|
def register(request):
|
||||||
products = Product.objects.filter(active=True)
|
products = Product.objects.filter(active=True)
|
||||||
cheapest_product_price = products.aggregate(Min('sale_price_int')).values()[0] or 0
|
cheapest_product_price = products.aggregate(Min('sale_price_int')).values()[0] or 0
|
||||||
@@ -60,11 +60,11 @@ def register(request):
|
|||||||
order.customer.first_name,
|
order.customer.first_name,
|
||||||
order.customer.last_name,
|
order.customer.last_name,
|
||||||
int(order_sum - profile.balance)))
|
int(order_sum - profile.balance)))
|
||||||
return HttpResponseRedirect( reverse('main.views.register') )
|
return HttpResponseRedirect(reverse('main.views.register'))
|
||||||
# empty order?
|
# empty order?
|
||||||
if order_sum == 0:
|
if order_sum == 0:
|
||||||
messages.error(request, u'Du har ikke valgt hva du skal kjøpe...')
|
messages.error(request, u'Du har ikke valgt hva du skal kjøpe...')
|
||||||
return HttpResponseRedirect( reverse('main.views.register') )
|
return HttpResponseRedirect(reverse('main.views.register'))
|
||||||
order.order_sum = order_sum
|
order.order_sum = order_sum
|
||||||
order.save()
|
order.save()
|
||||||
# substract order from balance
|
# substract order from balance
|
||||||
@@ -90,7 +90,7 @@ def register(request):
|
|||||||
order.customer.last_name,
|
order.customer.last_name,
|
||||||
u", ".join(orderlines)
|
u", ".join(orderlines)
|
||||||
))
|
))
|
||||||
return HttpResponseRedirect( reverse('main.views.register') )
|
return HttpResponseRedirect(reverse('main.views.register'))
|
||||||
else:
|
else:
|
||||||
# TODO specify error(s)
|
# TODO specify error(s)
|
||||||
messages.error(request, u'Skjemaet er ikke gyldig.')
|
messages.error(request, u'Skjemaet er ikke gyldig.')
|
||||||
@@ -101,10 +101,12 @@ def register(request):
|
|||||||
formset = OrderLineFormSet()
|
formset = OrderLineFormSet()
|
||||||
return render_to_response('register.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('register.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
def deposit(request):
|
def deposit(request):
|
||||||
users = User.objects.all().order_by('first_name','last_name')
|
users = User.objects.all().order_by('first_name', 'last_name')
|
||||||
users_js = users_format_js(users)
|
users_js = users_format_js(users)
|
||||||
allowed_users = utils.users_with_perm('add_transaction')
|
allowed_users = utils.users_with_perm('add_transaction')
|
||||||
|
error_message_template = u'{0} {1} kan ikke sette inn {2} kr, det overskrider maks saldo ({3} kr) med {4} kr'
|
||||||
|
|
||||||
# FIXME: dont need this
|
# FIXME: dont need this
|
||||||
try:
|
try:
|
||||||
@@ -118,14 +120,14 @@ def deposit(request):
|
|||||||
amount = form.cleaned_data['amount']
|
amount = form.cleaned_data['amount']
|
||||||
user = form.cleaned_data['user']
|
user = form.cleaned_data['user']
|
||||||
if amount + user.get_profile().balance > settings.BBS_SALDO_MAX and amount + user.get_profile().balance != 1337:
|
if amount + user.get_profile().balance > settings.BBS_SALDO_MAX and amount + user.get_profile().balance != 1337:
|
||||||
messages.error(request, u'{0} {1} kan ikke sette inn {2} kr, det overskrider maks saldo ({3} kr) med {4} kr'.format(
|
messages.error(request, error_message_template.format(
|
||||||
user.first_name,
|
user.first_name,
|
||||||
user.last_name,
|
user.last_name,
|
||||||
amount,
|
amount,
|
||||||
settings.BBS_SALDO_MAX,
|
settings.BBS_SALDO_MAX,
|
||||||
amount + user.get_profile().balance - settings.BBS_SALDO_MAX
|
amount + user.get_profile().balance - settings.BBS_SALDO_MAX
|
||||||
))
|
))
|
||||||
return HttpResponseRedirect( reverse('main.views.deposit') )
|
return HttpResponseRedirect(reverse('main.views.deposit'))
|
||||||
|
|
||||||
transaction = form.save()
|
transaction = form.save()
|
||||||
profile = transaction.user.get_profile()
|
profile = transaction.user.get_profile()
|
||||||
@@ -137,7 +139,7 @@ def deposit(request):
|
|||||||
transaction.user.last_name,
|
transaction.user.last_name,
|
||||||
transaction.amount,
|
transaction.amount,
|
||||||
profile.balance))
|
profile.balance))
|
||||||
return HttpResponseRedirect( reverse('main.views.deposit') )
|
return HttpResponseRedirect(reverse('main.views.deposit'))
|
||||||
else:
|
else:
|
||||||
messages.error(request, u'Skjemaet er ikke gyldig.')
|
messages.error(request, u'Skjemaet er ikke gyldig.')
|
||||||
form = DepositForm(request.POST)
|
form = DepositForm(request.POST)
|
||||||
@@ -146,6 +148,7 @@ def deposit(request):
|
|||||||
|
|
||||||
return render_to_response('deposit.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('deposit.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
def log(request, limit=datetime.now()-timedelta(days=2)):
|
def log(request, limit=datetime.now()-timedelta(days=2)):
|
||||||
if limit:
|
if limit:
|
||||||
# display last two days of orders and transactions
|
# display last two days of orders and transactions
|
||||||
@@ -166,11 +169,13 @@ def log(request, limit=datetime.now()-timedelta(days=2)):
|
|||||||
|
|
||||||
return render_to_response('log.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('log.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
def stats(request):
|
def stats(request):
|
||||||
products = Product.objects.filter(active=True)
|
products = Product.objects.filter(active=True)
|
||||||
|
|
||||||
return render_to_response('stats.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('stats.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
def serialize_product(product):
|
def serialize_product(product):
|
||||||
f_product = {}
|
f_product = {}
|
||||||
for attr in Product._meta.get_all_field_names():
|
for attr in Product._meta.get_all_field_names():
|
||||||
@@ -184,7 +189,8 @@ def serialize_product(product):
|
|||||||
f_product[attr] = product.__getattribute__(attr)
|
f_product[attr] = product.__getattribute__(attr)
|
||||||
return f_product
|
return f_product
|
||||||
|
|
||||||
def products(request, product_id=None):
|
|
||||||
|
def products_json(request, product_id=None):
|
||||||
if product_id:
|
if product_id:
|
||||||
#single
|
#single
|
||||||
products = get_object_or_404(Product, pk=product_id)
|
products = get_object_or_404(Product, pk=product_id)
|
||||||
@@ -199,22 +205,28 @@ def products(request, product_id=None):
|
|||||||
|
|
||||||
return HttpResponse(json.dumps(f_products), content_type='application/javascript; charset=utf8')
|
return HttpResponse(json.dumps(f_products), content_type='application/javascript; charset=utf8')
|
||||||
|
|
||||||
|
|
||||||
def stats_product(product):
|
def stats_product(product):
|
||||||
sales = OrderLine.objects.filter(product=product)
|
|
||||||
# reverse lookup via order, customer
|
# reverse lookup via order, customer
|
||||||
per_user = sales.values('order__customer__first_name','order__customer__last_name').annotate(num=Sum('amount')).order_by('num').reverse()
|
per_user = OrderLine.objects\
|
||||||
|
.filter(product=product)\
|
||||||
|
.values('order__customer__first_name', 'order__customer__last_name')\
|
||||||
|
.annotate(num=Sum('amount'))\
|
||||||
|
.order_by('num')\
|
||||||
|
.reverse()
|
||||||
f_per_user = []
|
f_per_user = []
|
||||||
for row in per_user:
|
for row in per_user:
|
||||||
who = row['order__customer__first_name'] + " " + row['order__customer__last_name']
|
who = row['order__customer__first_name'] + " " + row['order__customer__last_name']
|
||||||
num = row['num']
|
num = row['num']
|
||||||
f_per_user.append([who, num])
|
f_per_user.append([who, num])
|
||||||
response = {
|
response = {
|
||||||
'product' : serialize_product(Product.objects.get(pk=product)) if type(product) is unicode else serialize_product(product),
|
'product': serialize_product(Product.objects.get(pk=product)) if type(product) is unicode else serialize_product(product),
|
||||||
'counts' : f_per_user,
|
'counts': f_per_user,
|
||||||
'total_counts' : sum([row['num'] for row in per_user]),
|
'total_counts': sum([row['num'] for row in per_user]),
|
||||||
}
|
}
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
||||||
def stats_products(request, product=None):
|
def stats_products(request, product=None):
|
||||||
if product:
|
if product:
|
||||||
#single
|
#single
|
||||||
@@ -227,17 +239,20 @@ def stats_products(request, product=None):
|
|||||||
|
|
||||||
totals = float(sum([sale.amount for sale in sales]))
|
totals = float(sum([sale.amount for sale in sales]))
|
||||||
response = {
|
response = {
|
||||||
'request' : 'all' if not product else product,
|
'request': 'all' if not product else product,
|
||||||
'response' : {
|
'response': {
|
||||||
'products' : f_products,
|
'products': f_products,
|
||||||
'total_count' : totals,
|
'total_count': totals,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return HttpResponse(json.dumps(response), content_type='application/javascript; charset=utf8')
|
return HttpResponse(json.dumps(response), content_type='application/javascript; charset=utf8')
|
||||||
|
|
||||||
|
|
||||||
def stats_orders(request):
|
def stats_orders(request):
|
||||||
total = float(Order.objects.count())
|
per_user = Order.objects\
|
||||||
per_user = Order.objects.values('customer__first_name','customer__last_name').annotate(num=Count('customer')).order_by('num').reverse()
|
.values('customer__first_name', 'customer__last_name')\
|
||||||
|
.annotate(num=Count('customer'))\
|
||||||
|
.order_by('num').reverse()
|
||||||
f_per_user = []
|
f_per_user = []
|
||||||
for row in per_user:
|
for row in per_user:
|
||||||
who = row['customer__first_name'] + " " + row['customer__last_name']
|
who = row['customer__first_name'] + " " + row['customer__last_name']
|
||||||
@@ -245,23 +260,25 @@ def stats_orders(request):
|
|||||||
f_per_user.append([who, num])
|
f_per_user.append([who, num])
|
||||||
return HttpResponse(json.dumps(f_per_user), content_type='application/javascript; charset=utf8')
|
return HttpResponse(json.dumps(f_per_user), content_type='application/javascript; charset=utf8')
|
||||||
|
|
||||||
|
|
||||||
def stats_orders_hourly(request):
|
def stats_orders_hourly(request):
|
||||||
orders = Order.objects.all()
|
orders = Order.objects.all()
|
||||||
f_hourly = dict([(key,0) for key in range(0,24)]) # init
|
f_hourly = dict([(key, 0) for key in range(0, 24)]) # init
|
||||||
# group by hour
|
# group by hour
|
||||||
for key, values in groupby(orders, key=lambda row: row.created.hour):
|
for key, values in groupby(orders, key=lambda row: row.created.hour):
|
||||||
count = len(list(values))
|
count = len(list(values))
|
||||||
f_hourly[key] = f_hourly[key] + count
|
f_hourly[key] += count
|
||||||
|
|
||||||
if len(orders) == 0:
|
if len(orders) == 0:
|
||||||
return HttpResponse(json.dumps({}), content_type='application/javascript; charset=utf8')
|
return HttpResponse(json.dumps({}), content_type='application/javascript; charset=utf8')
|
||||||
response = {
|
response = {
|
||||||
'start': str(orders[0].created),
|
'start': str(orders[0].created),
|
||||||
'hourly' : [[k,v] for k,v in f_hourly.iteritems()],
|
'hourly': [[k, v] for k, v in f_hourly.iteritems()],
|
||||||
'total' : sum(f_hourly.values()),
|
'total': sum(f_hourly.values()),
|
||||||
}
|
}
|
||||||
return HttpResponse(json.dumps(response), content_type='application/javascript; charset=utf8')
|
return HttpResponse(json.dumps(response), content_type='application/javascript; charset=utf8')
|
||||||
|
|
||||||
|
|
||||||
def stats_products_realtime(request):
|
def stats_products_realtime(request):
|
||||||
end_time = datetime.now()
|
end_time = datetime.now()
|
||||||
start_time = datetime.now() - timedelta(hours=24)
|
start_time = datetime.now() - timedelta(hours=24)
|
||||||
@@ -291,6 +308,7 @@ def logout(request):
|
|||||||
auth_logout(request)
|
auth_logout(request)
|
||||||
return render_to_response('registration/logout.html', locals(), context_instance=RequestContext(request))
|
return render_to_response('registration/logout.html', locals(), context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
def users_format_js(users):
|
def users_format_js(users):
|
||||||
users_js = []
|
users_js = []
|
||||||
for user in users:
|
for user in users:
|
||||||
@@ -298,6 +316,7 @@ def users_format_js(users):
|
|||||||
users_js = u"[{0}]".format(u",".join(users_js))
|
users_js = u"[{0}]".format(u",".join(users_js))
|
||||||
return users_js
|
return users_js
|
||||||
|
|
||||||
|
|
||||||
def create_user(request):
|
def create_user(request):
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
form = SimpleCreateUserForm(data=request.POST)
|
form = SimpleCreateUserForm(data=request.POST)
|
||||||
@@ -314,15 +333,17 @@ def create_user(request):
|
|||||||
|
|
||||||
return render(request, 'registration/create_user.html', locals())
|
return render(request, 'registration/create_user.html', locals())
|
||||||
|
|
||||||
|
|
||||||
def inventory(request):
|
def inventory(request):
|
||||||
products = Product.objects.all().order_by('-active', 'inventory_amount', 'name')
|
products = Product.objects.all().order_by('-active', 'inventory_amount', 'name')
|
||||||
transactions = InventoryTransaction.objects.all().order_by('-created')
|
transactions = InventoryTransaction.objects.all().order_by('-created')
|
||||||
|
products_active = products.filter(active=True)
|
||||||
inventory_value = sum(map(lambda x: x[0] * x[1], Product.objects.filter(active=True).values_list('inventory_amount', 'sale_price_int')))
|
inventory_value = sum(map(lambda x: x[0] * x[1], products_active.values_list('inventory_amount', 'sale_price_int')))
|
||||||
num_products = sum(Product.objects.filter(active=True).values_list('inventory_amount', flat=True))
|
num_products = sum(products_active.values_list('inventory_amount', flat=True))
|
||||||
|
|
||||||
return render(request, 'inventory.html', locals())
|
return render(request, 'inventory.html', locals())
|
||||||
|
|
||||||
|
|
||||||
def inventory_add(request):
|
def inventory_add(request):
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
form = InventoryTransactionForm(data=request.POST)
|
form = InventoryTransactionForm(data=request.POST)
|
||||||
@@ -344,17 +365,22 @@ def inventory_add(request):
|
|||||||
|
|
||||||
return render(request, 'inventory_add.html', locals())
|
return render(request, 'inventory_add.html', locals())
|
||||||
|
|
||||||
|
|
||||||
def report(request):
|
def report(request):
|
||||||
|
# FIXME: split this up in smaller pieces
|
||||||
datetime_now = datetime.now()
|
datetime_now = datetime.now()
|
||||||
start_time = datetime.now() - timedelta(days=30)
|
start_time = datetime.now() - timedelta(days=30)
|
||||||
start_time = start_time.replace(hour=0, minute=0, second=0, microsecond=0) # start of day, 1 month
|
# start of day, 1 month
|
||||||
end_time = datetime.now().replace(hour=23, minute=59, second=59, microsecond=999) # end of day
|
start_time = start_time.replace(hour=0, minute=0, second=0, microsecond=0)
|
||||||
|
# end of day
|
||||||
|
end_time = datetime.now().replace(hour=23, minute=59, second=59, microsecond=999)
|
||||||
|
|
||||||
if request.GET.get('start_time', False) or request.GET.get('end_time', False):
|
if request.GET.get('start_time', False) or request.GET.get('end_time', False):
|
||||||
form = DateRangeForm(request.GET)
|
form = DateRangeForm(request.GET)
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
start_time = form.cleaned_data['start_time']
|
start_time = form.cleaned_data['start_time']
|
||||||
end_time = form.cleaned_data['end_time'].replace(hour=23, minute=59, second=59, microsecond=999) # end of day
|
# end of day
|
||||||
|
end_time = form.cleaned_data['end_time'].replace(hour=23, minute=59, second=59, microsecond=999)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
form = DateRangeForm(initial={
|
form = DateRangeForm(initial={
|
||||||
@@ -363,7 +389,10 @@ def report(request):
|
|||||||
})
|
})
|
||||||
|
|
||||||
# Inventory
|
# Inventory
|
||||||
products = Product.objects.filter(transactions__created__range=[start_time, end_time]).values('name', 'transactions__unit_price','transactions__amount').order_by('name')
|
products = Product.objects\
|
||||||
|
.filter(transactions__created__range=[start_time, end_time])\
|
||||||
|
.values('name', 'transactions__unit_price', 'transactions__amount')\
|
||||||
|
.order_by('name')
|
||||||
# group by name and sum
|
# group by name and sum
|
||||||
inventory_products = {}
|
inventory_products = {}
|
||||||
for k, g in groupby(products, lambda x: x['name']):
|
for k, g in groupby(products, lambda x: x['name']):
|
||||||
@@ -371,7 +400,7 @@ def report(request):
|
|||||||
for el in g:
|
for el in g:
|
||||||
el['transactions__price'] = el['transactions__amount'] * el['transactions__unit_price']
|
el['transactions__price'] = el['transactions__amount'] * el['transactions__unit_price']
|
||||||
group.append(el)
|
group.append(el)
|
||||||
inventory_products.update({ k: {
|
inventory_products.update({k: {
|
||||||
'name': k,
|
'name': k,
|
||||||
"transactions": group,
|
"transactions": group,
|
||||||
"transactions_sum": sum(map(lambda x: x['transactions__price'], group)),
|
"transactions_sum": sum(map(lambda x: x['transactions__price'], group)),
|
||||||
@@ -379,11 +408,13 @@ def report(request):
|
|||||||
}})
|
}})
|
||||||
|
|
||||||
itrans = InventoryTransaction.objects.filter(created__range=[start_time, end_time])
|
itrans = InventoryTransaction.objects.filter(created__range=[start_time, end_time])
|
||||||
inv_in = sum(map(lambda x: x[1].get('transactions_sum',0), inventory_products.items()))
|
inv_in = sum(map(lambda x: x[1].get('transactions_sum', 0), inventory_products.items()))
|
||||||
|
|
||||||
|
|
||||||
# out
|
# out
|
||||||
out_products = Product.objects.filter(orderlines__order__created__range=[start_time, end_time]).values('name', 'orderlines__unit_price','orderlines__amount').order_by('name')
|
out_products = Product.objects\
|
||||||
|
.filter(orderlines__order__created__range=[start_time, end_time])\
|
||||||
|
.values('name', 'orderlines__unit_price', 'orderlines__amount')\
|
||||||
|
.order_by('name')
|
||||||
# group by name and sum
|
# group by name and sum
|
||||||
for k, g in groupby(out_products, lambda x: x['name']):
|
for k, g in groupby(out_products, lambda x: x['name']):
|
||||||
group = []
|
group = []
|
||||||
@@ -407,7 +438,7 @@ def report(request):
|
|||||||
p[1]['value_diff'] = p[1].get('transactions_sum', 0) - p[1].get('orderlines_sum', 0)
|
p[1]['value_diff'] = p[1].get('transactions_sum', 0) - p[1].get('orderlines_sum', 0)
|
||||||
p[1]['units_diff'] = p[1].get('transactions_units', 0) - p[1].get('orderlines_units', 0)
|
p[1]['units_diff'] = p[1].get('transactions_units', 0) - p[1].get('orderlines_units', 0)
|
||||||
|
|
||||||
inv_out = sum(map(lambda x: x[1].get('orderlines_sum',0), inventory_products.items()))
|
inv_out = sum(map(lambda x: x[1].get('orderlines_sum', 0), inventory_products.items()))
|
||||||
|
|
||||||
inv_diff = inv_in - inv_out
|
inv_diff = inv_in - inv_out
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user