Update stock items quantity after shopping

This commit is contained in:
guillaume-renaud 2016-12-29 18:50:19 +01:00
parent 0660ea5e64
commit 2f721592f1
5 changed files with 3342 additions and 6 deletions

File diff suppressed because it is too large Load Diff

View File

@ -10,6 +10,14 @@ Shopping list for {{ stock }}
{% endif %} {% endif %}
<h3>{% trans s=stock %}Shopping lists history for {{ s }}{% endtrans %}</h3> <h3>{% trans s=stock %}Shopping lists history for {{ s }}{% endtrans %}</h3>
<p>
{% trans %}Information :{% endtrans %}
<br>
{% trans %}Use the "update stock" action when you get back from shopping to add the effective quantity bought for each shopping list item.{% endtrans %}
<br>
{% trans %}For example, 3 Cheesburger (boxes) are aksing in the list, but there were only 2 so, 2 have to be added in the stock quantity.{% endtrans %}
</p>
<h4>{% trans %}To do{% endtrans %}</h4> <h4>{% trans %}To do{% endtrans %}</h4>
<table> <table>
<thead> <thead>
@ -25,6 +33,9 @@ Shopping list for {{ stock }}
<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.items_to_buy.count() }}</td>
<td>
<a href="{{ url('stock:update_after_shopping', stock_id=stock.id, shoppinglist_id=s.id)}}">{% trans %}Update stock{% endtrans %}</a>
</td>
<td> <td>
<a href="{{ url('stock:shoppinglist_set_done', stock_id=stock.id, shoppinglist_id=s.id)}}">{% trans %}Mark as done{% endtrans %}</a> <a href="{{ url('stock:shoppinglist_set_done', stock_id=stock.id, shoppinglist_id=s.id)}}">{% trans %}Mark as done{% endtrans %}</a>
</td> </td>

View File

@ -0,0 +1,16 @@
{% extends "core/base.jinja" %}
{% block title %}
{% trans s = shoppinglist %}Update {{ s }}'s quantity after shopping{% endtrans %}
{% endblock %}
{% block content %}
<h3>{% trans s = shoppinglist %}Update {{ s }}'s quantity after shopping{% endtrans %}</h3>
<div>
<form method="post" action="" class="inline" style="display:inline">
{% csrf_token %}
{{ form.as_p() }}
<p><input type="submit" value="{% trans %}Update stock quantities{% endtrans %}" /></p>
</form>
</div>
{% endblock %}

View File

@ -24,4 +24,6 @@ urlpatterns = [
name='shoppinglist_set_done'), name='shoppinglist_set_done'),
url(r'^(?P<stock_id>[0-9]+)/shoppingList/(?P<shoppinglist_id>[0-9]+)/setTodo$', StockShopppingListSetTodo.as_view(), url(r'^(?P<stock_id>[0-9]+)/shoppingList/(?P<shoppinglist_id>[0-9]+)/setTodo$', StockShopppingListSetTodo.as_view(),
name='shoppinglist_set_todo'), name='shoppinglist_set_todo'),
url(r'^(?P<stock_id>[0-9]+)/shoppingList/(?P<shoppinglist_id>[0-9]+)/updateStock$', StockUpdateAfterShopppingBaseFormView.as_view(),
name='update_after_shopping'),
] ]

View File

@ -218,15 +218,9 @@ class StockItemQuantityBaseFormView(CounterAdminTabsMixin, CanEditMixin, DetailV
return super(StockItemQuantityBaseFormView, self).post(request, *args, **kwargs) return super(StockItemQuantityBaseFormView, self).post(request, *args, **kwargs)
def form_valid(self, form): def form_valid(self, form):
"""
We handle here the redirection, passing the user id of the asked customer
"""
return super(StockItemQuantityBaseFormView, self).form_valid(form) return super(StockItemQuantityBaseFormView, self).form_valid(form)
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
"""
We handle here the login form for the barman
"""
kwargs = super(StockItemQuantityBaseFormView, self).get_context_data(**kwargs) kwargs = super(StockItemQuantityBaseFormView, self).get_context_data(**kwargs)
if 'form' not in kwargs.keys(): if 'form' not in kwargs.keys():
kwargs['form'] = self.get_form() kwargs['form'] = self.get_form()
@ -297,3 +291,69 @@ class StockShopppingListSetTodo(CanEditMixin, DetailView):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
self.object = self.get_object() self.object = self.get_object()
return HttpResponseRedirect(reverse('stock:shoppinglist_list', args=self.args, kwargs={'stock_id':self.object.stock_owner.id})) return HttpResponseRedirect(reverse('stock:shoppinglist_list', args=self.args, kwargs={'stock_id':self.object.stock_owner.id}))
class StockUpdateAfterShopppingForm(forms.BaseForm):
def clean(self):
with transaction.atomic():
self.shoppinglist = ShoppingList.objects.filter(id=self.shoppinglist_id).first()
for k,t in self.cleaned_data.items():
item_id = int(k[5:])
if int(t) > 0 :
item = StockItem.objects.filter(id=item_id).first()
item.effective_quantity += int(t)
item.save()
self.shoppinglist.todo = False
self.shoppinglist.save()
return self.cleaned_data
class StockUpdateAfterShopppingBaseFormView(CounterAdminTabsMixin, CanEditMixin, DetailView, BaseFormView):
"""
docstring for StockUpdateAfterShopppingBaseFormView
"""
model = ShoppingList
template_name = "stock/update_after_shopping.jinja"
pk_url_kwarg = "shoppinglist_id"
current_tab = "stocks"
def get_form_class(self):
fields = OrderedDict()
kwargs = {}
for t in ProductType.objects.order_by('name').all():
for i in self.shoppinglist.items_to_buy.filter(type=t).order_by('name').all():
field_name = "item-%s" % (str(i.id))
fields[field_name] = forms.CharField(max_length=30, required=True, label=str(i),
help_text=str(i.tobuy_quantity) + " asked")
kwargs['shoppinglist_id'] = self.shoppinglist.id
kwargs['base_fields'] = fields
return type('StockUpdateAfterShopppingForm', (StockUpdateAfterShopppingForm,), kwargs)
def get(self, request, *args, **kwargs):
self.shoppinglist = ShoppingList.objects.filter(id=self.kwargs['shoppinglist_id']).first()
return super(StockUpdateAfterShopppingBaseFormView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
"""
Handle the many possibilities of the post request
"""
self.object = self.get_object()
self.shoppinglist = ShoppingList.objects.filter(id=self.kwargs['shoppinglist_id']).first()
return super(StockUpdateAfterShopppingBaseFormView, self).post(request, *args, **kwargs)
def form_valid(self, form):
"""
We handle here the redirection
"""
return super(StockUpdateAfterShopppingBaseFormView, self).form_valid(form)
def get_context_data(self, **kwargs):
kwargs = super(StockUpdateAfterShopppingBaseFormView, self).get_context_data(**kwargs)
if 'form' not in kwargs.keys():
kwargs['form'] = self.get_form()
kwargs['shoppinglist'] = self.shoppinglist
kwargs['stock'] = self.shoppinglist.stock_owner
return kwargs
def get_success_url(self):
self.kwargs.pop('shoppinglist_id', None)
return reverse_lazy('stock:shoppinglist_list', args=self.args, kwargs=self.kwargs)