Adds initial inventory management, Django 1.6, ++

Adds dep on south
This commit is contained in:
nikolark committed 2014-07-23 22:39:44 +02:00
1 parent 09d41ba682
commit 32e41c05ae
32 files changed
+5561 -1382

No files matched your search

+1
View File
@@ -5,6 +5,7 @@ class ProductAdmin(admin.ModelAdmin):
pass
admin.site.register(Product, ProductAdmin)
admin.site.register(InventoryTransaction)
admin.site.register(Order)
admin.site.register(OrderLine)
admin.site.register(Transaction)
+17
View File
@@ -53,3 +53,20 @@ class SimpleCreateUserForm(forms.Form):
profile.save()
return user
class InventoryTransactionForm(forms.ModelForm):
unit_price = forms.FloatField(required=True, localize=True)
def __init__(self, *args, **kwargs):
# Only show active products
super (InventoryTransactionForm, self).__init__(*args,**kwargs)
self.fields['product'].queryset = Product.objects.filter(active=True)
class Meta:
model = InventoryTransaction
fields = ['product', 'amount', 'unit_price', 'comment']
class DateRangeForm(forms.Form):
start_time = forms.DateTimeField(required=False, label=_("Fra"))
end_time = forms.DateTimeField(required=False, label=_("Til"))
+172
View File
@@ -0,0 +1,172 @@
# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'Product'
db.create_table('main_product', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=64)),
('sale_price_int', self.gf('django.db.models.fields.FloatField')()),
('sale_price_ext', self.gf('django.db.models.fields.FloatField')()),
('description', self.gf('django.db.models.fields.CharField')(max_length=256, blank=True)),
('volume_liter', self.gf('django.db.models.fields.FloatField')(null=True)),
('alcohol_percent', self.gf('django.db.models.fields.FloatField')(null=True)),
('image', self.gf('django.db.models.fields.files.ImageField')(max_length=100, blank=True)),
('customer_support', self.gf('django.db.models.fields.CharField')(max_length=32, blank=True)),
('active', self.gf('django.db.models.fields.BooleanField')(default=True)),
('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
('updated', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
))
db.send_create_signal('main', ['Product'])
# Adding model 'Order'
db.create_table('main_order', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('customer', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
('order_sum', self.gf('django.db.models.fields.FloatField')(db_column='sum')),
('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
))
db.send_create_signal('main', ['Order'])
# Adding model 'OrderLine'
db.create_table('main_orderline', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('order', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['main.Order'])),
('product', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['main.Product'])),
('amount', self.gf('django.db.models.fields.IntegerField')()),
('unit_price', self.gf('django.db.models.fields.FloatField')()),
))
db.send_create_signal('main', ['OrderLine'])
# Adding unique constraint on 'OrderLine', fields ['order', 'product']
db.create_unique('main_orderline', ['order_id', 'product_id'])
# Adding model 'Transaction'
db.create_table('main_transaction', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
('amount', self.gf('django.db.models.fields.FloatField')()),
('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
))
db.send_create_signal('main', ['Transaction'])
# Adding model 'UserProfile'
db.create_table('main_userprofile', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True)),
('balance', self.gf('django.db.models.fields.FloatField')(default=0.0)),
('image', self.gf('django.db.models.fields.URLField')(max_length=200, blank=True)),
))
db.send_create_signal('main', ['UserProfile'])
def backwards(self, orm):
# Removing unique constraint on 'OrderLine', fields ['order', 'product']
db.delete_unique('main_orderline', ['order_id', 'product_id'])
# Deleting model 'Product'
db.delete_table('main_product')
# Deleting model 'Order'
db.delete_table('main_order')
# Deleting model 'OrderLine'
db.delete_table('main_orderline')
# Deleting model 'Transaction'
db.delete_table('main_transaction')
# Deleting model 'UserProfile'
db.delete_table('main_userprofile')
models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'main.order': {
'Meta': {'object_name': 'Order'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'customer': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'order_sum': ('django.db.models.fields.FloatField', [], {'db_column': "'sum'"})
},
'main.orderline': {
'Meta': {'unique_together': "(('order', 'product'),)", 'object_name': 'OrderLine'},
'amount': ('django.db.models.fields.IntegerField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'order': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['main.Order']"}),
'product': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['main.Product']"}),
'unit_price': ('django.db.models.fields.FloatField', [], {})
},
'main.product': {
'Meta': {'object_name': 'Product'},
'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'alcohol_percent': ('django.db.models.fields.FloatField', [], {'null': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'customer_support': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}),
'description': ('django.db.models.fields.CharField', [], {'max_length': '256', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'sale_price_ext': ('django.db.models.fields.FloatField', [], {}),
'sale_price_int': ('django.db.models.fields.FloatField', [], {}),
'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'volume_liter': ('django.db.models.fields.FloatField', [], {'null': 'True'})
},
'main.transaction': {
'Meta': {'object_name': 'Transaction'},
'amount': ('django.db.models.fields.FloatField', [], {}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
},
'main.userprofile': {
'Meta': {'object_name': 'UserProfile'},
'balance': ('django.db.models.fields.FloatField', [], {'default': '0.0'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'image': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
}
}
complete_apps = ['main']
@@ -0,0 +1,131 @@
# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'InventoryTransaction'
db.create_table(u'main_inventorytransaction', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
('product', self.gf('django.db.models.fields.related.ForeignKey')(related_name='transactions', to=orm['main.Product'])),
('amount', self.gf('django.db.models.fields.FloatField')()),
('unit_price', self.gf('django.db.models.fields.FloatField')()),
('comment', self.gf('django.db.models.fields.TextField')(blank=True)),
('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
))
db.send_create_signal(u'main', ['InventoryTransaction'])
# Adding field 'Product.inventory_amount'
db.add_column(u'main_product', 'inventory_amount',
self.gf('django.db.models.fields.FloatField')(default=0),
keep_default=False)
def backwards(self, orm):
# Deleting model 'InventoryTransaction'
db.delete_table(u'main_inventorytransaction')
# Deleting field 'Product.inventory_amount'
db.delete_column(u'main_product', 'inventory_amount')
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'main.inventorytransaction': {
'Meta': {'object_name': 'InventoryTransaction'},
'amount': ('django.db.models.fields.FloatField', [], {}),
'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'product': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'transactions'", 'to': u"orm['main.Product']"}),
'unit_price': ('django.db.models.fields.FloatField', [], {}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
},
u'main.order': {
'Meta': {'object_name': 'Order'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'customer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'order_sum': ('django.db.models.fields.FloatField', [], {'db_column': "'sum'"})
},
u'main.orderline': {
'Meta': {'unique_together': "(('order', 'product'),)", 'object_name': 'OrderLine'},
'amount': ('django.db.models.fields.IntegerField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'order': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['main.Order']"}),
'product': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'orderlines'", 'to': u"orm['main.Product']"}),
'unit_price': ('django.db.models.fields.FloatField', [], {})
},
u'main.product': {
'Meta': {'ordering': "['name']", 'object_name': 'Product'},
'active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'alcohol_percent': ('django.db.models.fields.FloatField', [], {'null': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'customer_support': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}),
'description': ('django.db.models.fields.CharField', [], {'max_length': '256', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
'inventory_amount': ('django.db.models.fields.FloatField', [], {'default': '0'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'sale_price_ext': ('django.db.models.fields.FloatField', [], {}),
'sale_price_int': ('django.db.models.fields.FloatField', [], {}),
'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'volume_liter': ('django.db.models.fields.FloatField', [], {'null': 'True'})
},
u'main.transaction': {
'Meta': {'object_name': 'Transaction'},
'amount': ('django.db.models.fields.FloatField', [], {}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
},
u'main.userprofile': {
'Meta': {'object_name': 'UserProfile'},
'balance': ('django.db.models.fields.FloatField', [], {'default': '0.0'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'image': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'})
}
}
complete_apps = ['main']
View File
Whitespace-only changes.
+34 -4
View File
@@ -2,6 +2,7 @@ from django.contrib.auth.models import User
from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.utils.translation import ugettext as _
from datetime import datetime
class Product(models.Model):
@@ -17,10 +18,18 @@ class Product(models.Model):
alcohol_percent = models.FloatField(null=True)
image = models.ImageField(upload_to='products', blank=True)
customer_support = models.CharField(max_length=32, blank=True)
inventory_amount = models.FloatField(default=0)
active = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
@property
def inventory_value(self):
return self.inventory_amount * self.sale_price_int
class Meta:
ordering = ['name']
class Order(models.Model):
customer = models.ForeignKey(User)
order_sum = models.FloatField(db_column='sum')
@@ -30,18 +39,23 @@ class Order(models.Model):
return u"{0}: {1} kr".format(self.customer, self.order_sum)
class OrderLine(models.Model):
order = models.ForeignKey(Order)
product = models.ForeignKey(Product)
order = models.ForeignKey('main.Order')
product = models.ForeignKey('main.Product', related_name='orderlines')
amount = models.IntegerField()
unit_price = models.FloatField()
unit_price = models.FloatField(verbose_name=_('Enhetspris'))
@property
def price(self):
return self.amount * self.unit_price
def __unicode__(self):
return u"{1} {0} ({2} kr per)".format(self.product, self.amount, self.unit_price)
return u"{0} {1} ({2} kr per)".format(self.amount, self.product, self.unit_price)
class Meta:
unique_together = ('order', 'product')
class Transaction(models.Model):
""" Money """
user = models.ForeignKey(User)
amount = models.FloatField()
created = models.DateTimeField(auto_now_add=True)
@@ -49,6 +63,22 @@ class Transaction(models.Model):
def __unicode__(self):
return u"{0}: {1}: {2}".format(self.id, self.user, self.amount)
class InventoryTransaction(models.Model):
""" Goods """
user = models.ForeignKey(User)
product = models.ForeignKey('main.Product', related_name='transactions', verbose_name=_('Produkt'))
amount = models.FloatField(verbose_name=_('Antall'))
unit_price = models.FloatField(verbose_name=_('Enhetspris'))
comment = models.TextField(verbose_name=_('Kommentar'), blank=True)
created = models.DateTimeField(auto_now_add=True)
@property
def price(self):
return self.amount * self.unit_price
def __unicode__(self):
return u"{0}: {1}: {2} ({3} kr per)".format(self.id, self.user, self.product, self.amount, self.unit_price)
class UserProfile(models.Model):
user = models.OneToOneField(User)
balance = models.FloatField(default=0.0)
+6 -1
View File
@@ -1,4 +1,5 @@
from django.conf.urls.defaults import patterns, include, url
from django.conf.urls import patterns, include, url
urlpatterns = patterns('main.views',
url(r'^register/$', 'register', name='register'),
@@ -14,4 +15,8 @@ urlpatterns = patterns('main.views',
url(r'^products/(?P<product_id>[0-9]+)/$', 'products', name='json-product'),
url(r'^products/$', 'products', name='json-products'),
url(r'^user/create/$', 'create_user', name='create-user'),
url(r'^inventory/$', 'inventory', name='inventory'),
url(r'^inventory/add/$', 'inventory_add', name='inventory-add'),
url(r'^report$', 'report', name='report'),
)
+130 -7
View File
@@ -1,25 +1,24 @@
# coding: utf-8
from datetime import datetime
from datetime import timedelta
from datetime import datetime
from itertools import groupby
import json
import time
from django.conf import settings
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.auth import login, logout as auth_logout
from django.contrib import messages
from django.core.urlresolvers import reverse
from django.db.models import Count, Sum, Max, Min
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 django.forms.formsets import formset_factory
from django.contrib import messages
from django.db.models import Count, Sum, Max, Min
from models import *
from forms import *
from models import *
import utils
def home(request):
@@ -81,6 +80,8 @@ def register(request):
product=product,
amount=ol['amount'],
unit_price=ol['unit_price'])
product.inventory_amount -= ol['amount']
product.save()
orderlines.append(u"{0} {1}".format(ol['amount'], product))
@@ -173,6 +174,9 @@ def stats(request):
def serialize_product(product):
f_product = {}
for attr in Product._meta.get_all_field_names():
if attr == "transactions" or attr == "orderlines":
continue
if hasattr(product, attr) and product.__getattribute__(attr):
if type(product.__getattribute__(attr)) is datetime:
f_product[attr] = str(product.__getattribute__(attr))
@@ -309,3 +313,122 @@ def create_user(request):
form = SimpleCreateUserForm()
return render(request, 'registration/create_user.html', locals())
def inventory(request):
products = Product.objects.all().order_by('-active', 'inventory_amount', 'name')
transactions = InventoryTransaction.objects.all().order_by('-created')
inventory_value = sum(map(lambda x: x[0] * x[1], Product.objects.filter(active=True).values_list('inventory_amount', 'sale_price_int')))
num_products = sum(Product.objects.filter(active=True).values_list('inventory_amount', flat=True))
return render(request, 'inventory.html', locals())
def inventory_add(request):
if request.method == "POST":
form = InventoryTransactionForm(data=request.POST)
if form.is_valid():
itrans = form.save(commit=False)
# Add amount and user, then save
itrans.product.inventory_amount += itrans.amount
itrans.user = request.user
itrans.product.save()
itrans.save()
messages.success(request, u"Satt inn {0} stk {1}.".format(itrans.amount, itrans.product))
return redirect('inventory-add')
else:
messages.error(request, u'Feil med skjemaet, se under.')
form = InventoryTransactionForm(data=request.POST)
else:
form = InventoryTransactionForm()
return render(request, 'inventory_add.html', locals())
def report(request):
datetime_now = datetime.now()
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
end_time = datetime.now().replace(hour=23, minute=59, second=59, microsecond=999) # end of day
if request.GET.get('start_time', False) or request.GET.get('end_time', False):
form = DateRangeForm(request.GET)
if form.is_valid():
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
else:
form = DateRangeForm(initial={
'start_time': start_time.strftime("%Y-%m-%d"),
'end_time': end_time.strftime("%Y-%m-%d")
})
# Inventory
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
inventory_products = {}
for k, g in groupby(products, lambda x: x['name']):
group = []
for el in g:
el['transactions__price'] = el['transactions__amount'] * el['transactions__unit_price']
group.append(el)
inventory_products.update({ k: {
'name': k,
"transactions": group,
"transactions_sum": sum(map(lambda x: x['transactions__price'], group)),
"transactions_units": sum(map(lambda x: x['transactions__amount'], group))
}})
import pprint
pprint.pprint(inventory_products)
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()))
# out
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
for k, g in groupby(out_products, lambda x: x['name']):
group = []
for el in g:
el['orderlines__price'] = el['orderlines__amount'] * el['orderlines__unit_price']
group.append(el)
product = {
'name': k,
"orderlines": group,
"orderlines_sum": sum(map(lambda x: x['orderlines__price'], group)),
"orderlines_units": sum(map(lambda x: x['orderlines__amount'], group))
}
if k in inventory_products:
# add diff
inventory_products[k].update(product)
else:
inventory_products.update({k: product})
for p in inventory_products.items():
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)
pprint.pprint(inventory_products)
inv_out = sum(map(lambda x: x[1].get('orderlines_sum',0), inventory_products.items()))
inv_diff = inv_in - inv_out
# Deposits and sales
saldo_profiles = sum(UserProfile.objects.all().values_list('balance', flat=True))
deposits = sum(Transaction.objects.all().values_list('amount', flat=True))
purchases = sum(Order.objects.all().values_list('order_sum', flat=True))
saldo = deposits - purchases
deposits_start = sum(Transaction.objects.filter(created__lt=start_time).values_list('amount', flat=True))
purchases_start = sum(Order.objects.filter(created__lt=start_time).values_list('order_sum', flat=True))
saldo_start = deposits_start - purchases_start
deposits_end = sum(Transaction.objects.filter(created__lt=end_time).values_list('amount', flat=True))
purchases_end = sum(Order.objects.filter(created__lt=end_time).values_list('order_sum', flat=True))
saldo_end = deposits_end - purchases_end
deposits_diff = deposits_end - deposits_start
purchases_diff = purchases_end - purchases_start
saldo_diff = saldo_end - saldo_start
return render(request, 'report.html', locals())