Adds initial profile page
This commit is contained in:
1 parent
fc65e15d98
commit
f8a94b7bee
10 files changed
+196
-23
No files matched your search
+9
-6
@@ -50,19 +50,22 @@ class Product(models.Model):
|
||||
|
||||
|
||||
class Order(models.Model):
|
||||
customer = models.ForeignKey(User, null=True, blank=True)
|
||||
customer = models.ForeignKey(User, null=True, blank=True, related_name='orders')
|
||||
order_sum = models.FloatField(db_column='sum')
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def is_external(self):
|
||||
return self.customer is None
|
||||
|
||||
def reciept(self):
|
||||
return u"{0}".format(u", ".join([str(ol) for ol in self.orderlines.all()]))
|
||||
|
||||
def __unicode__(self):
|
||||
return u"{0}: {1} kr".format(self.customer or u"Ekstern", self.order_sum)
|
||||
|
||||
|
||||
class OrderLine(models.Model):
|
||||
order = models.ForeignKey('main.Order')
|
||||
order = models.ForeignKey('main.Order', related_name='orderlines')
|
||||
product = models.ForeignKey('main.Product', related_name='orderlines')
|
||||
amount = models.IntegerField()
|
||||
unit_price = models.FloatField(verbose_name=_('Enhetspris'))
|
||||
@@ -80,7 +83,7 @@ class OrderLine(models.Model):
|
||||
|
||||
class Transaction(models.Model):
|
||||
""" Money """
|
||||
user = models.ForeignKey(User)
|
||||
user = models.ForeignKey(User, related_name='transactions')
|
||||
amount = models.FloatField()
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
@@ -90,7 +93,7 @@ class Transaction(models.Model):
|
||||
|
||||
class InventoryTransaction(models.Model):
|
||||
""" Goods """
|
||||
user = models.ForeignKey(User)
|
||||
user = models.ForeignKey(User, related_name='inventory_transactions')
|
||||
product = models.ForeignKey('main.Product', related_name='transactions', verbose_name=_('Produkt'))
|
||||
amount = models.FloatField(verbose_name=_('Antall'))
|
||||
unit_price = models.FloatField(verbose_name=_('Enhetspris'))
|
||||
@@ -117,9 +120,9 @@ class UserProfile(models.Model):
|
||||
image = models.URLField(blank=True)
|
||||
|
||||
def last_purchase(self):
|
||||
if len(self.user.order_set.all()) == 0:
|
||||
if len(self.user.orders.all()) == 0:
|
||||
return None
|
||||
return self.user.order_set.order_by('created').reverse()[0]
|
||||
return self.user.orders.order_by('created').reverse()[0]
|
||||
|
||||
def last_purchase_date(self):
|
||||
last = self.last_purchase()
|
||||
|
||||
@@ -12,9 +12,11 @@ urlpatterns = patterns('main.views',
|
||||
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/(?P<product>[0-9]+)/$', 'stats_products', name='stats-product'),
|
||||
url(r'^stats/products/by_user/(?P<user_id>[0-9]+)/$', 'stats_products_per_user', name='stats-products-per-user'),
|
||||
url(r'^products/(?P<product_id>[0-9]+)/$', 'products_json', name='json-product'),
|
||||
url(r'^products/$', 'products_json', name='json-products'),
|
||||
url(r'^user/create/$', 'create_user', name='create-user'),
|
||||
url(r'^profile/$', 'profile', name='profile'),
|
||||
url(r'^inventory/$', 'inventory', name='inventory'),
|
||||
url(r'^inventory/add/$', 'inventory_add', name='inventory-add'),
|
||||
url(r'^report$', 'report', name='report'),
|
||||
|
||||
+55
-3
@@ -4,9 +4,11 @@ from itertools import groupby
|
||||
import json
|
||||
import time
|
||||
|
||||
from django.db import connection
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.forms import AuthenticationForm
|
||||
from django.contrib.auth import login, logout as auth_logout
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.contrib.auth.forms import AuthenticationForm
|
||||
from django.contrib import messages
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.db.models import Count, Sum, Min
|
||||
@@ -14,7 +16,6 @@ from django.forms.formsets import formset_factory
|
||||
from django.http import HttpResponse, HttpResponseRedirect
|
||||
from django.shortcuts import render_to_response, render, get_object_or_404, redirect
|
||||
from django.template import RequestContext
|
||||
|
||||
from forms import *
|
||||
from models import *
|
||||
import utils
|
||||
@@ -309,7 +310,7 @@ def stats_orders_hourly(request):
|
||||
def stats_products_realtime(request):
|
||||
end_time = datetime.now()
|
||||
start_time = datetime.now() - timedelta(hours=24)
|
||||
|
||||
|
||||
order_lines = OrderLine.objects.filter(order__created__range=(start_time, end_time)).order_by("order__created")
|
||||
products = {}
|
||||
for order_line in order_lines:
|
||||
@@ -488,3 +489,54 @@ def report(request):
|
||||
saldo_diff = saldo_end - saldo_start
|
||||
|
||||
return render(request, 'report.html', locals())
|
||||
|
||||
|
||||
@login_required
|
||||
def profile(request):
|
||||
transactions = Transaction.objects.filter(user=request.user.pk)
|
||||
transaction_totals = {
|
||||
'sum': sum([t.amount for t in transactions])
|
||||
}
|
||||
orders = Order.objects.filter(customer=request.user.pk)
|
||||
orders_totals = {
|
||||
'sum': sum([o.order_sum for o in orders])
|
||||
}
|
||||
|
||||
#order_lines = OrderLine.objects.filter(order__customer__pk=1).order_by("order__created")
|
||||
order_report = _orders_monthly(filter_by={'customer': request.user.pk})
|
||||
top_months = order_report.order_by('-sum')[:5]
|
||||
return render(request, 'profile.html', locals())
|
||||
|
||||
|
||||
def stats_products_per_user(request, user_id=None):
|
||||
if not user_id:
|
||||
return HttpResponse(
|
||||
json.dumps({'error': 'Missing param user_id'}),
|
||||
content_type='application/javascript; charset=utf8')
|
||||
|
||||
order_lines = OrderLine.objects.filter(order__customer__pk=user_id).order_by("order__created")
|
||||
products = {}
|
||||
for order_line in order_lines:
|
||||
order_time_in_milliseconds = int(time.mktime(order_line.order.created.timetuple()) * 1000)
|
||||
if order_line.product not in products:
|
||||
products[order_line.product] = [[order_time_in_milliseconds, order_line.amount]]
|
||||
else:
|
||||
prev_entry = products[order_line.product][-1]
|
||||
products[order_line.product].append([order_time_in_milliseconds, prev_entry[1] + order_line.amount])
|
||||
|
||||
serialized_products = []
|
||||
for product, value in products.iteritems():
|
||||
serialized_products.append({
|
||||
'name': product.name,
|
||||
'data': value
|
||||
})
|
||||
return HttpResponse(json.dumps(serialized_products), content_type='application/javascript; charset=utf8')
|
||||
|
||||
|
||||
def _orders_monthly(filter_by={}, order_by='month'):
|
||||
|
||||
truncate_date = connection.ops.date_trunc_sql('month', 'created')
|
||||
qs = Order.objects.filter(**filter_by).extra({'month': truncate_date})
|
||||
order_report = qs.values('month').annotate(sum=Sum('order_sum'), num=Count('pk')).order_by(order_by)
|
||||
|
||||
return order_report
|
||||
Reference in new issue
Block a user