From 38100520df00c21e57872d68140ef86adeb8fd42 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 2 May 2019 20:18:34 +1000 Subject: [PATCH] Add 'to_order' and 'to_build' collapsible panels --- InvenTree/InvenTree/views.py | 17 +++++++++++++++++ InvenTree/build/templates/build/allocate.html | 3 --- InvenTree/part/models.py | 15 +++++++++++++-- InvenTree/templates/InvenTree/index.html | 13 ++++++++++++- .../templates/InvenTree/parts_to_build.html | 14 ++++++++++++++ .../templates/InvenTree/parts_to_order.html | 14 ++++++++++++++ InvenTree/templates/collapse.html | 2 ++ InvenTree/templates/required_part_table.html | 18 ++++++++++++++++++ 8 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 InvenTree/templates/InvenTree/parts_to_build.html create mode 100644 InvenTree/templates/InvenTree/parts_to_order.html create mode 100644 InvenTree/templates/required_part_table.html diff --git a/InvenTree/InvenTree/views.py b/InvenTree/InvenTree/views.py index 18267f33c4..9a388c5b2c 100644 --- a/InvenTree/InvenTree/views.py +++ b/InvenTree/InvenTree/views.py @@ -15,6 +15,8 @@ from django.views import View from django.views.generic import UpdateView, CreateView, DeleteView from django.views.generic.base import TemplateView +from part.models import Part + from rest_framework import views @@ -287,6 +289,21 @@ class IndexView(TemplateView): template_name = 'InvenTree/index.html' + def get_context_data(self, **kwargs): + + context = super(TemplateView, self).get_context_data(**kwargs) + + # Generate a list of orderable parts which have stock below their minimum values + context['to_order'] = [part for part in Part.objects.filter(purchaseable=True) if part.need_to_restock()] + + # Generate a list of buildable parts which have stock below their minimum values + context['to_build'] = [part for part in Part.objects.filter(buildable=True) if part.need_to_restock()] + + print("order:", len(context['to_order'])) + print("build:", len(context['to_build'])) + + return context + class SearchView(TemplateView): """ View for InvenTree search page. diff --git a/InvenTree/build/templates/build/allocate.html b/InvenTree/build/templates/build/allocate.html index 1a8c018e01..0a3867af8e 100644 --- a/InvenTree/build/templates/build/allocate.html +++ b/InvenTree/build/templates/build/allocate.html @@ -14,9 +14,6 @@ {% include "build/allocation_item.html" with item=bom_item build=build collapse_id=bom_item.id %} {% endfor %} - -
-
diff --git a/InvenTree/part/models.py b/InvenTree/part/models.py index c5e7683427..3c321d2b3d 100644 --- a/InvenTree/part/models.py +++ b/InvenTree/part/models.py @@ -193,14 +193,25 @@ class Part(models.Model): def available_stock(self): """ Return the total available stock. - This subtracts stock which is already allocated + + - This subtracts stock which is already allocated to builds """ total = self.total_stock total -= self.allocation_count - return max(total, 0) + return total + + def need_to_restock(self): + """ Return True if this part needs to be restocked + (either by purchasing or building). + + If the allocated_stock exceeds the total_stock, + then we need to restock. + """ + + return (self.total_stock - self.allocation_count) < self.minimum_stock @property def can_build(self): diff --git a/InvenTree/templates/InvenTree/index.html b/InvenTree/templates/InvenTree/index.html index 4150313bf9..91cac4c18c 100644 --- a/InvenTree/templates/InvenTree/index.html +++ b/InvenTree/templates/InvenTree/index.html @@ -3,9 +3,20 @@ {% block content %}

InvenTree

-

Index!

+{% if to_order %} +{% include "InvenTree/parts_to_order.html" with collapse_id="order" %} +{% endif %} + +{% if to_build %} +{% include "InvenTree/parts_to_build.html" with collapse_id="build" %} +{% endif %} {% endblock %} {% block js_load %} +{{ block.super }} +{% endblock %} + +{% block js_ready %} +{{ block.super }} {% endblock %} \ No newline at end of file diff --git a/InvenTree/templates/InvenTree/parts_to_build.html b/InvenTree/templates/InvenTree/parts_to_build.html new file mode 100644 index 0000000000..e9c1dcdee1 --- /dev/null +++ b/InvenTree/templates/InvenTree/parts_to_build.html @@ -0,0 +1,14 @@ +{% extends "collapse.html" %} +{% block collapse_title %} +Parts to Build{{ to_build | length }} +{% endblock %} + +{% block collapse_heading %} +There are {{ to_build | length }} parts which need building. +{% endblock %} + +{% block collapse_content %} + +{% include "required_part_table.html" with parts=to_build table_id="to-build-table" %} + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/templates/InvenTree/parts_to_order.html b/InvenTree/templates/InvenTree/parts_to_order.html new file mode 100644 index 0000000000..b68eda7e14 --- /dev/null +++ b/InvenTree/templates/InvenTree/parts_to_order.html @@ -0,0 +1,14 @@ +{% extends "collapse.html" %} +{% block collapse_title %} +Parts to Order{{ to_order | length }} +{% endblock %} + +{% block collapse_heading %} +There are {{ to_order | length }} parts which need to be ordered. +{% endblock %} + +{% block collapse_content %} + +{% include "required_part_table.html" with parts=to_order table_id="to-order-table" %} + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/templates/collapse.html b/InvenTree/templates/collapse.html index e1ad9b7917..776c9cee35 100644 --- a/InvenTree/templates/collapse.html +++ b/InvenTree/templates/collapse.html @@ -1,3 +1,5 @@ +{% block collapse_preamble %} +{% endblock %}
diff --git a/InvenTree/templates/required_part_table.html b/InvenTree/templates/required_part_table.html new file mode 100644 index 0000000000..4ae1441f11 --- /dev/null +++ b/InvenTree/templates/required_part_table.html @@ -0,0 +1,18 @@ + + + + + + + + + {% for part in parts %} + + + + + + + + {% endfor %} +
PartDescriptionIn StockAllocatedNet Stock
{{ part.name }}{{ part.description }}{{ part.total_stock }}{{ part.allocation_count }}{{ part.available_stock }}
\ No newline at end of file