mirror of
https://github.com/ae-utbm/sith.git
synced 2024-11-26 02:54:20 +00:00
Update shopping list history (ShoppingListItem creation)
This commit is contained in:
parent
62200827c2
commit
539faccab2
@ -1,7 +1,9 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from stock.models import Stock, StockItem
|
from stock.models import Stock, StockItem, ShoppingList, ShoppingListItem
|
||||||
|
|
||||||
# Register your models here.
|
# Register your models here.
|
||||||
admin.site.register(Stock)
|
admin.site.register(Stock)
|
||||||
admin.site.register(StockItem)
|
admin.site.register(StockItem)
|
||||||
|
admin.site.register(ShoppingList)
|
||||||
|
admin.site.register(ShoppingListItem)
|
@ -2,6 +2,7 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
@ -11,22 +12,42 @@ class Migration(migrations.Migration):
|
|||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ShoppingList',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')),
|
||||||
|
('date', models.DateTimeField(verbose_name='date')),
|
||||||
|
('name', models.CharField(max_length=64, verbose_name='name')),
|
||||||
|
('todo', models.BooleanField(verbose_name='todo')),
|
||||||
|
],
|
||||||
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Stock',
|
name='Stock',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')),
|
||||||
('name', models.CharField(max_length=64, verbose_name='name')),
|
('name', models.CharField(max_length=64, verbose_name='name')),
|
||||||
('counter', models.OneToOneField(to='counter.Counter', related_name='stock', verbose_name='counter')),
|
('counter', models.OneToOneField(to='counter.Counter', verbose_name='counter', related_name='stock')),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='StockItem',
|
name='StockItem',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')),
|
||||||
('name', models.CharField(max_length=64, verbose_name='name')),
|
('name', models.CharField(max_length=64, verbose_name='name')),
|
||||||
('unit_quantity', models.IntegerField(default=0, verbose_name='unit quantity')),
|
('unit_quantity', models.IntegerField(default=0, help_text='number of element in one box', verbose_name='unit quantity')),
|
||||||
('effective_quantity', models.IntegerField(default=0, verbose_name='effective quantity')),
|
('effective_quantity', models.IntegerField(default=0, help_text='number of box', verbose_name='effective quantity')),
|
||||||
('stock_owner', models.ForeignKey(related_name='stock_owner', to='stock.Stock')),
|
('stock_owner', models.ForeignKey(to='stock.Stock', related_name='items')),
|
||||||
|
('type', models.ForeignKey(to='counter.ProductType', on_delete=django.db.models.deletion.SET_NULL, null=True, verbose_name='type', blank=True, related_name='stock_items')),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='shoppinglist',
|
||||||
|
name='items_to_buy',
|
||||||
|
field=models.ManyToManyField(to='stock.StockItem', related_name='shopping_lists', verbose_name='items to buy'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='shoppinglist',
|
||||||
|
name='stock_owner',
|
||||||
|
field=models.ForeignKey(to='stock.Stock', null=True, related_name='shopping_lists'),
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('counter', '0011_auto_20161004_2039'),
|
|
||||||
('stock', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='stockitem',
|
|
||||||
name='type',
|
|
||||||
field=models.ForeignKey(to='counter.ProductType', blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, verbose_name='type', related_name='stockItem_type'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='stockitem',
|
|
||||||
name='effective_quantity',
|
|
||||||
field=models.IntegerField(help_text='total number of bottle/barrel', verbose_name='effective quantity', default=0),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='stockitem',
|
|
||||||
name='unit_quantity',
|
|
||||||
field=models.IntegerField(help_text='number of beer in one crate (equal one for barrels)', verbose_name='unit quantity', default=0),
|
|
||||||
),
|
|
||||||
]
|
|
29
stock/migrations/0002_auto_20170105_2017.py
Normal file
29
stock/migrations/0002_auto_20170105_2017.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('stock', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='stockitem',
|
||||||
|
name='bought_quantity',
|
||||||
|
field=models.IntegerField(help_text='quantity bought during the last shopping session', default=6, verbose_name='quantity bought'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='stockitem',
|
||||||
|
name='minimal_quantity',
|
||||||
|
field=models.IntegerField(help_text='if the effective quantity is less than the minimal, item is added to the shopping list', default=1, verbose_name='minimal quantity'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='stockitem',
|
||||||
|
name='tobuy_quantity',
|
||||||
|
field=models.IntegerField(help_text='quantity to buy during the next shopping session', default=6, verbose_name='quantity to buy'),
|
||||||
|
),
|
||||||
|
]
|
@ -1,35 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('stock', '0002_auto_20161113_2325'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='stockitem',
|
|
||||||
name='effective_quantity',
|
|
||||||
field=models.IntegerField(default=0, verbose_name='effective quantity', help_text='number of box'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='stockitem',
|
|
||||||
name='stock_owner',
|
|
||||||
field=models.ForeignKey(related_name='items', to='stock.Stock'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='stockitem',
|
|
||||||
name='type',
|
|
||||||
field=models.ForeignKey(related_name='stock_items', verbose_name='type', null=True, to='counter.ProductType', blank=True, on_delete=django.db.models.deletion.SET_NULL),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='stockitem',
|
|
||||||
name='unit_quantity',
|
|
||||||
field=models.IntegerField(default=0, verbose_name='unit quantity', help_text='number of element in one box'),
|
|
||||||
),
|
|
||||||
]
|
|
32
stock/migrations/0003_auto_20170105_2138.py
Normal file
32
stock/migrations/0003_auto_20170105_2138.py
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('stock', '0002_auto_20170105_2017'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='stockitem',
|
||||||
|
name='bought_quantity',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='stockitem',
|
||||||
|
name='tobuy_quantity',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='shoppinglist',
|
||||||
|
name='bought_quantity',
|
||||||
|
field=models.IntegerField(help_text='quantity bought during the last shopping session', default=6, verbose_name='quantity bought'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='shoppinglist',
|
||||||
|
name='tobuy_quantity',
|
||||||
|
field=models.IntegerField(help_text='quantity to buy during the next shopping session', default=6, verbose_name='quantity to buy'),
|
||||||
|
),
|
||||||
|
]
|
32
stock/migrations/0004_auto_20170105_2145.py
Normal file
32
stock/migrations/0004_auto_20170105_2145.py
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('stock', '0003_auto_20170105_2138'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='shoppinglist',
|
||||||
|
name='bought_quantity',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='shoppinglist',
|
||||||
|
name='tobuy_quantity',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='stockitem',
|
||||||
|
name='bought_quantity',
|
||||||
|
field=models.IntegerField(help_text='quantity bought during the last shopping session', verbose_name='quantity bought', default=6),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='stockitem',
|
||||||
|
name='tobuy_quantity',
|
||||||
|
field=models.IntegerField(help_text='quantity to buy during the next shopping session', verbose_name='quantity to buy', default=6),
|
||||||
|
),
|
||||||
|
]
|
46
stock/migrations/0005_auto_20170107_0857.py
Normal file
46
stock/migrations/0005_auto_20170107_0857.py
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('stock', '0004_auto_20170105_2145'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ShoppingListItems',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, auto_created=True, verbose_name='ID', serialize=False)),
|
||||||
|
('name', models.CharField(max_length=64, verbose_name='name')),
|
||||||
|
('tobuy_quantity', models.IntegerField(verbose_name='quantity to buy', default=6, help_text='quantity to buy during the next shopping session')),
|
||||||
|
('bought_quantity', models.IntegerField(verbose_name='quantity bought', default=6, help_text='quantity bought during the last shopping session')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='stockitem',
|
||||||
|
name='bought_quantity',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='stockitem',
|
||||||
|
name='tobuy_quantity',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='shoppinglist',
|
||||||
|
name='comment',
|
||||||
|
field=models.TextField(null=True, verbose_name='comment', blank=True),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='shoppinglistitems',
|
||||||
|
name='shoppinglist_owner',
|
||||||
|
field=models.ForeignKey(related_name='item_quantity', to='stock.ShoppingList'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='shoppinglistitems',
|
||||||
|
name='stockitem_owner',
|
||||||
|
field=models.ForeignKey(related_name='item', null=True, to='stock.StockItem'),
|
||||||
|
),
|
||||||
|
]
|
48
stock/migrations/0006_auto_20170107_0910.py
Normal file
48
stock/migrations/0006_auto_20170107_0910.py
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('stock', '0005_auto_20170107_0857'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ShoppingListItem',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(serialize=False, auto_created=True, primary_key=True, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=64, verbose_name='name')),
|
||||||
|
('tobuy_quantity', models.IntegerField(default=6, help_text='quantity to buy during the next shopping session', verbose_name='quantity to buy')),
|
||||||
|
('bought_quantity', models.IntegerField(default=0, help_text='quantity bought during the last shopping session', verbose_name='quantity bought')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='shoppinglistitems',
|
||||||
|
name='shoppinglist_owner',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='shoppinglistitems',
|
||||||
|
name='stockitem_owner',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='shoppinglist',
|
||||||
|
name='items_to_buy',
|
||||||
|
),
|
||||||
|
migrations.DeleteModel(
|
||||||
|
name='ShoppingListItems',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='shoppinglistitem',
|
||||||
|
name='shopping_lists',
|
||||||
|
field=models.ManyToManyField(related_name='shopping_items_to_buy', to='stock.ShoppingList', verbose_name='shopping lists'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='shoppinglistitem',
|
||||||
|
name='stockitem_owner',
|
||||||
|
field=models.ForeignKey(related_name='item', null=True, to='stock.StockItem'),
|
||||||
|
),
|
||||||
|
]
|
21
stock/migrations/0007_shoppinglistitem_type.py
Normal file
21
stock/migrations/0007_shoppinglistitem_type.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('counter', '0011_auto_20161004_2039'),
|
||||||
|
('stock', '0006_auto_20170107_0910'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='shoppinglistitem',
|
||||||
|
name='type',
|
||||||
|
field=models.ForeignKey(null=True, verbose_name='type', on_delete=django.db.models.deletion.SET_NULL, to='counter.ProductType', blank=True, related_name='shoppinglist_items'),
|
||||||
|
),
|
||||||
|
]
|
@ -7,13 +7,13 @@ from django.db import migrations, models
|
|||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('stock', '0013_auto_20161228_1006'),
|
('stock', '0007_shoppinglistitem_type'),
|
||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
model_name='shoppinglist',
|
model_name='shoppinglistitem',
|
||||||
name='stock_owner',
|
name='stockitem_owner',
|
||||||
field=models.ForeignKey(related_name='shopping_lists', null=True, to='stock.Stock'),
|
field=models.ForeignKey(related_name='shopping_item', to='stock.StockItem', null=True),
|
||||||
),
|
),
|
||||||
]
|
]
|
@ -29,6 +29,8 @@ class StockItem(models.Model):
|
|||||||
name = models.CharField(_('name'), max_length=64)
|
name = models.CharField(_('name'), max_length=64)
|
||||||
unit_quantity = models.IntegerField(_('unit quantity'), default=0, help_text='number of element in one box')
|
unit_quantity = models.IntegerField(_('unit quantity'), default=0, help_text='number of element in one box')
|
||||||
effective_quantity = models.IntegerField(_('effective quantity'), default=0, help_text='number of box')
|
effective_quantity = models.IntegerField(_('effective quantity'), default=0, help_text='number of box')
|
||||||
|
minimal_quantity = models.IntegerField(_('minimal quantity'), default=1,
|
||||||
|
help_text='if the effective quantity is less than the minimal, item is added to the shopping list')
|
||||||
type = models.ForeignKey(ProductType, related_name="stock_items", verbose_name=_("type"), null=True, blank=True,
|
type = models.ForeignKey(ProductType, related_name="stock_items", verbose_name=_("type"), null=True, blank=True,
|
||||||
on_delete=models.SET_NULL)
|
on_delete=models.SET_NULL)
|
||||||
stock_owner = models.ForeignKey(Stock, related_name="items")
|
stock_owner = models.ForeignKey(Stock, related_name="items")
|
||||||
@ -49,14 +51,36 @@ class ShoppingList(models.Model):
|
|||||||
date = models.DateTimeField(_('date'))
|
date = models.DateTimeField(_('date'))
|
||||||
name = models.CharField(_('name'), max_length=64)
|
name = models.CharField(_('name'), max_length=64)
|
||||||
todo = models.BooleanField(_('todo'))
|
todo = models.BooleanField(_('todo'))
|
||||||
items_to_buy = models.ManyToManyField(StockItem, verbose_name=_('items to buy'), related_name="shopping_lists")
|
comment = models.TextField(_('comment'), null=True, blank=True)
|
||||||
stock_owner = models.ForeignKey(Stock, null=True, related_name="shopping_lists")
|
stock_owner = models.ForeignKey(Stock, null=True, related_name="shopping_lists")
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "%s (%s)" % (self.name, self.effective_quantity)
|
return "%s (%s)" % (self.name, self.date)
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return reverse('stock:shoppinglist_list')
|
return reverse('stock:shoppinglist_list')
|
||||||
|
|
||||||
def can_be_viewed_by(self, user):
|
def can_be_viewed_by(self, user):
|
||||||
return user.is_in_group(settings.SITH_GROUP_COUNTER_ADMIN_ID)
|
return user.is_in_group(settings.SITH_GROUP_COUNTER_ADMIN_ID)
|
||||||
|
|
||||||
|
|
||||||
|
class ShoppingListItem(models.Model):
|
||||||
|
"""
|
||||||
|
"""
|
||||||
|
shopping_lists = models.ManyToManyField(ShoppingList, verbose_name=_('shopping lists'), related_name="shopping_items_to_buy")
|
||||||
|
stockitem_owner = models.ForeignKey(StockItem, related_name="shopping_item", null=True)
|
||||||
|
name = models.CharField(_('name'), max_length=64)
|
||||||
|
type = models.ForeignKey(ProductType, related_name="shoppinglist_items", verbose_name=_("type"), null=True, blank=True,
|
||||||
|
on_delete=models.SET_NULL)
|
||||||
|
tobuy_quantity = models.IntegerField(_('quantity to buy'), default=6, help_text="quantity to buy during the next shopping session")
|
||||||
|
bought_quantity = models.IntegerField(_('quantity bought'), default=0, help_text="quantity bought during the last shopping session")
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "%s - %s" % (self.name, self.shopping_lists.first())
|
||||||
|
|
||||||
|
def can_be_viewed_by(self, user):
|
||||||
|
return user.is_in_group(settings.SITH_GROUP_COUNTER_ADMIN_ID)
|
||||||
|
|
||||||
|
def get_absolute_url(self):
|
||||||
|
return reverse('stock:shoppinglist_list')
|
||||||
|
|
||||||
|
@ -10,25 +10,42 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<h3>{{ shoppinglist.name }}</h3>
|
<h3>{{ shoppinglist.name }}</h3>
|
||||||
{% for t in ProductType.objects.order_by('name') %}
|
{% for t in ProductType.objects.order_by('name').all() %}
|
||||||
{% if shoppinglist.items_to_buy.filter(type=t) %}
|
{% if shoppinglist.shopping_items_to_buy.filter(type=t) %}
|
||||||
<h4>{{ t }}</h4>
|
<h4>{{ t }}</h4>
|
||||||
|
<br>
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<td>{% trans %}Name{% endtrans %}</td>
|
<td>{% trans %}Name{% endtrans %}</td>
|
||||||
<td>{% trans %}Number{% endtrans %}</td>
|
<td>{% trans %}Quantity asked{% endtrans %}</td>
|
||||||
|
<td>{% trans %}Quantity bought{% endtrans %}</td>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for i in shoppinglist.items_to_buy.filter(type=t).order_by('name') %}
|
{% for i in shoppinglist.shopping_items_to_buy.filter(type=t).order_by('name').all() %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ i.name }}</td>
|
<td>{{ i.name }}</td>
|
||||||
<td>{{ i.tobuy_quantity }}</td>
|
<td>{{ i.tobuy_quantity }}</td>
|
||||||
|
<td>{{ i.bought_quantity }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
<h4>Other</h4>
|
||||||
|
<br>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td>{% trans %}Comments{% endtrans %}</td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>{{ shoppinglist.comment }}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -28,11 +28,11 @@ Shopping list for {{ stock }}
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for s in shoppinglist_list.filter(todo=True).filter(stock_owner=stock).order_by('-date') %}
|
{% for s in stock.shopping_lists.filter(todo=True).filter(stock_owner=stock).order_by('-date').all() %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ s.date|localtime|date("Y-m-d H:i") }}</td>
|
<td>{{ s.date|localtime|date("Y-m-d H:i") }}</td>
|
||||||
<td><a href="{{ url('stock:shoppinglist_items', stock_id=stock.id, shoppinglist_id=s.id)}}">{{ s.name }}</a></td>
|
<td><a href="{{ url('stock:shoppinglist_items', stock_id=stock.id, shoppinglist_id=s.id)}}">{{ s.name }}</a></td>
|
||||||
<td>{{ s.items_to_buy.count() }}</td>
|
<td>{{ s.shopping_items_to_buy.count() }}</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ url('stock:update_after_shopping', stock_id=stock.id, shoppinglist_id=s.id)}}">{% trans %}Update stock{% endtrans %}</a>
|
<a href="{{ url('stock:update_after_shopping', stock_id=stock.id, shoppinglist_id=s.id)}}">{% trans %}Update stock{% endtrans %}</a>
|
||||||
</td>
|
</td>
|
||||||
@ -57,11 +57,11 @@ Shopping list for {{ stock }}
|
|||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for s in shoppinglist_list.filter(todo=False).filter(stock_owner=stock).order_by('-date') %}
|
{% for s in stock.shopping_lists.filter(todo=False).filter(stock_owner=stock).order_by('-date').all() %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ s.date|localtime|date("Y-m-d H:i") }}</td>
|
<td>{{ s.date|localtime|date("Y-m-d H:i") }}</td>
|
||||||
<td><a href="{{ url('stock:shoppinglist_items', stock_id=stock.id, shoppinglist_id=s.id)}}">{{ s.name }}</a></td>
|
<td><a href="{{ url('stock:shoppinglist_items', stock_id=stock.id, shoppinglist_id=s.id)}}">{{ s.name }}</a></td>
|
||||||
<td>{{ s.items_to_buy.count() }}</td>
|
<td>{{ s.shopping_items_to_buy.count() }}</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="{{ url('stock:shoppinglist_set_todo', stock_id=stock.id, shoppinglist_id=s.id)}}">{% trans %}Mark as to do{% endtrans %}</a>
|
<a href="{{ url('stock:shoppinglist_set_todo', stock_id=stock.id, shoppinglist_id=s.id)}}">{% trans %}Mark as to do{% endtrans %}</a>
|
||||||
</td>
|
</td>
|
||||||
|
@ -1,16 +1,21 @@
|
|||||||
|
from collections import OrderedDict
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
|
from django.utils import timezone
|
||||||
from django.shortcuts import render, get_object_or_404
|
from django.shortcuts import render, get_object_or_404
|
||||||
from django.views.generic import ListView, DetailView, RedirectView, TemplateView
|
from django.views.generic import ListView, DetailView, RedirectView, TemplateView
|
||||||
from django.views.generic.edit import UpdateView, CreateView, DeleteView, ProcessFormView, FormMixin
|
from django.views.generic.edit import UpdateView, CreateView, DeleteView, ProcessFormView, FormMixin, BaseFormView
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.http import HttpResponseRedirect, HttpResponse
|
from django.http import HttpResponseRedirect, HttpResponse
|
||||||
from django.forms.models import modelform_factory
|
from django.forms.models import modelform_factory
|
||||||
from django.core.urlresolvers import reverse_lazy, reverse
|
from django.core.urlresolvers import reverse_lazy, reverse
|
||||||
|
from django.db import transaction, DataError
|
||||||
|
|
||||||
from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin, TabedViewMixin
|
from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin, TabedViewMixin
|
||||||
from counter.views import CounterAdminTabsMixin, CounterTabsMixin
|
from counter.views import CounterAdminTabsMixin, CounterTabsMixin
|
||||||
from counter.models import Counter, ProductType
|
from counter.models import Counter, ProductType
|
||||||
from stock.models import Stock, StockItem, ShoppingList
|
from stock.models import Stock, StockItem, ShoppingList, ShoppingListItem
|
||||||
|
|
||||||
|
|
||||||
class StockItemList(CounterAdminTabsMixin, CanCreateMixin, ListView):
|
class StockItemList(CounterAdminTabsMixin, CanCreateMixin, ListView):
|
||||||
@ -76,7 +81,7 @@ class StockItemEditView(CounterAdminTabsMixin, CanEditPropMixin, UpdateView):
|
|||||||
An edit view for a stock item
|
An edit view for a stock item
|
||||||
"""
|
"""
|
||||||
model = StockItem
|
model = StockItem
|
||||||
form_class = modelform_factory(StockItem, fields=['name', 'unit_quantity', 'effective_quantity', 'type', 'stock_owner'])
|
form_class = modelform_factory(StockItem, fields=['name', 'unit_quantity', 'effective_quantity', 'minimal_quantity', 'type', 'stock_owner'])
|
||||||
pk_url_kwarg = "item_id"
|
pk_url_kwarg = "item_id"
|
||||||
template_name = 'core/edit.jinja'
|
template_name = 'core/edit.jinja'
|
||||||
current_tab = "stocks"
|
current_tab = "stocks"
|
||||||
@ -104,7 +109,7 @@ class StockItemCreateView(CounterAdminTabsMixin, CanCreateMixin, CreateView):
|
|||||||
A create view for a new StockItem
|
A create view for a new StockItem
|
||||||
"""
|
"""
|
||||||
model = StockItem
|
model = StockItem
|
||||||
form_class = modelform_factory(StockItem, fields=['name', 'unit_quantity', 'effective_quantity', 'type', 'stock_owner'])
|
form_class = modelform_factory(StockItem, fields=['name', 'unit_quantity', 'effective_quantity', 'minimal_quantity', 'type', 'stock_owner'])
|
||||||
template_name = 'core/create.jinja'
|
template_name = 'core/create.jinja'
|
||||||
pk_url_kwarg = "stock_id"
|
pk_url_kwarg = "stock_id"
|
||||||
current_tab = "stocks"
|
current_tab = "stocks"
|
||||||
@ -144,12 +149,20 @@ class StockItemQuantityForm(forms.BaseForm):
|
|||||||
shopping_list.stock_owner = self.stock
|
shopping_list.stock_owner = self.stock
|
||||||
shopping_list.save()
|
shopping_list.save()
|
||||||
for k,t in self.cleaned_data.items():
|
for k,t in self.cleaned_data.items():
|
||||||
if int(t) > 0 :
|
if k == 'name':
|
||||||
|
shopping_list.name = t
|
||||||
|
shopping_list.save()
|
||||||
|
elif k == "comment":
|
||||||
|
shopping_list.comment = t
|
||||||
|
shopping_list.save()
|
||||||
|
else:
|
||||||
|
if t > 0 :
|
||||||
item_id = int(k[5:])
|
item_id = int(k[5:])
|
||||||
item = StockItem.objects.filter(id=item_id).first()
|
item = StockItem.objects.filter(id=item_id).first()
|
||||||
item.tobuy_quantity = t
|
shoppinglist_item = ShoppingListItem(stockitem_owner=item, name=item.name, type=item.type, tobuy_quantity=t)
|
||||||
item.shopping_lists.add(shopping_list)
|
shoppinglist_item.save()
|
||||||
item.save()
|
shoppinglist_item.shopping_lists.add(shopping_list)
|
||||||
|
shoppinglist_item.save()
|
||||||
|
|
||||||
return self.cleaned_data
|
return self.cleaned_data
|
||||||
|
|
||||||
@ -165,13 +178,15 @@ class StockItemQuantityBaseFormView(CounterAdminTabsMixin, CanEditMixin, DetailV
|
|||||||
def get_form_class(self):
|
def get_form_class(self):
|
||||||
fields = OrderedDict()
|
fields = OrderedDict()
|
||||||
kwargs = {}
|
kwargs = {}
|
||||||
|
fields['name'] = forms.CharField(max_length=30, required=True, label='Shopping list name')
|
||||||
for t in ProductType.objects.order_by('name').all():
|
for t in ProductType.objects.order_by('name').all():
|
||||||
for i in self.stock.items.filter(type=t).order_by('name').all():
|
for i in self.stock.items.filter(type=t).order_by('name').all():
|
||||||
if i.effective_quantity <= i.minimal_quantity:
|
if i.effective_quantity <= i.minimal_quantity:
|
||||||
field_name = "item-%s" % (str(i.id))
|
field_name = "item-%s" % (str(i.id))
|
||||||
fields[field_name] = forms.CharField(max_length=30, required=True, label=str(i),
|
fields[field_name] = forms.IntegerField(required=True, label=str(i),
|
||||||
help_text=str(i.effective_quantity)+" left")
|
help_text=str(i.effective_quantity)+" left")
|
||||||
kwargs[field_name] = i.effective_quantity
|
fields['comment'] = forms.CharField(widget=forms.Textarea(), required=False,
|
||||||
|
initial="Add here, items to buy that are not reference as a product (example : sponge, knife, mugs ...)")
|
||||||
kwargs['stock_id'] = self.stock.id
|
kwargs['stock_id'] = self.stock.id
|
||||||
kwargs['base_fields'] = fields
|
kwargs['base_fields'] = fields
|
||||||
return type('StockItemQuantityForm', (StockItemQuantityForm,), kwargs)
|
return type('StockItemQuantityForm', (StockItemQuantityForm,), kwargs)
|
||||||
@ -272,11 +287,18 @@ class StockUpdateAfterShopppingForm(forms.BaseForm):
|
|||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
self.shoppinglist = ShoppingList.objects.filter(id=self.shoppinglist_id).first()
|
self.shoppinglist = ShoppingList.objects.filter(id=self.shoppinglist_id).first()
|
||||||
for k,t in self.cleaned_data.items():
|
for k,t in self.cleaned_data.items():
|
||||||
item_id = int(k[5:])
|
shoppinglist_item_id = int(k[5:])
|
||||||
|
#item_id = int(k[5:])
|
||||||
if int(t) > 0 :
|
if int(t) > 0 :
|
||||||
item = StockItem.objects.filter(id=item_id).first()
|
shoppinglist_item = ShoppingListItem.objects.filter(id=shoppinglist_item_id).first()
|
||||||
item.effective_quantity += int(t)
|
shoppinglist_item.bought_quantity = int(t)
|
||||||
item.save()
|
shoppinglist_item.save()
|
||||||
|
shoppinglist_item.stockitem_owner.effective_quantity += int(t)
|
||||||
|
shoppinglist_item.stockitem_owner.save()
|
||||||
|
#item = StockItem.objects.filter(id=item_id).first()
|
||||||
|
#item.bought_quantity = int(t)
|
||||||
|
#item.effective_quantity += int(t)
|
||||||
|
#item.save()
|
||||||
self.shoppinglist.todo = False
|
self.shoppinglist.todo = False
|
||||||
self.shoppinglist.save()
|
self.shoppinglist.save()
|
||||||
return self.cleaned_data
|
return self.cleaned_data
|
||||||
@ -294,7 +316,7 @@ class StockUpdateAfterShopppingBaseFormView(CounterAdminTabsMixin, CanEditMixin,
|
|||||||
fields = OrderedDict()
|
fields = OrderedDict()
|
||||||
kwargs = {}
|
kwargs = {}
|
||||||
for t in ProductType.objects.order_by('name').all():
|
for t in ProductType.objects.order_by('name').all():
|
||||||
for i in self.shoppinglist.items_to_buy.filter(type=t).order_by('name').all():
|
for i in self.shoppinglist.shopping_items_to_buy.filter(type=t).order_by('name').all():
|
||||||
field_name = "item-%s" % (str(i.id))
|
field_name = "item-%s" % (str(i.id))
|
||||||
fields[field_name] = forms.CharField(max_length=30, required=True, label=str(i),
|
fields[field_name] = forms.CharField(max_length=30, required=True, label=str(i),
|
||||||
help_text=str(i.tobuy_quantity) + " asked")
|
help_text=str(i.tobuy_quantity) + " asked")
|
||||||
@ -341,9 +363,9 @@ class StockTakeItemsForm(forms.BaseForm):
|
|||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
for k,t in self.cleaned_data.items():
|
for k,t in self.cleaned_data.items():
|
||||||
item_id = int(k[5:])
|
item_id = int(k[5:])
|
||||||
if int(t) > 0 :
|
if t > 0 :
|
||||||
item = StockItem.objects.filter(id=item_id).first()
|
item = StockItem.objects.filter(id=item_id).first()
|
||||||
item.effective_quantity -= int(t)
|
item.effective_quantity -= t
|
||||||
item.save()
|
item.save()
|
||||||
return self.cleaned_data
|
return self.cleaned_data
|
||||||
|
|
||||||
@ -363,7 +385,7 @@ class StockTakeItemsBaseFormView(CounterTabsMixin, CanEditMixin, DetailView, Bas
|
|||||||
for t in ProductType.objects.order_by('name').all():
|
for t in ProductType.objects.order_by('name').all():
|
||||||
for i in self.stock.items.filter(type=t).order_by('name').all():
|
for i in self.stock.items.filter(type=t).order_by('name').all():
|
||||||
field_name = "item-%s" % (str(i.id))
|
field_name = "item-%s" % (str(i.id))
|
||||||
fields[field_name] = forms.CharField(max_length=30, required=True, label=str(i))
|
fields[field_name] = forms.IntegerField(required=False, label=str(i), help_text="("+ str(i.effective_quantity) + " left)")
|
||||||
kwargs[field_name] = i.effective_quantity
|
kwargs[field_name] = i.effective_quantity
|
||||||
kwargs['stock_id'] = self.stock.id
|
kwargs['stock_id'] = self.stock.id
|
||||||
kwargs['counter_id'] = self.stock.counter.id
|
kwargs['counter_id'] = self.stock.counter.id
|
||||||
|
Loading…
Reference in New Issue
Block a user