From c1224048ad6c8b762d71a74354415867fb75e0e8 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 16 May 2019 21:01:34 +1000 Subject: [PATCH 1/4] Add ability to filter stock by supplier --- InvenTree/stock/api.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 29b151ddbf..86b5f84c67 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -242,6 +242,7 @@ class StockList(generics.ListCreateAPIView): Additional query parameters are available: - location: Filter stock by location - category: Filter by parts belonging to a certain category + - supplier: Filter by supplier """ def get_queryset(self): @@ -275,6 +276,12 @@ class StockList(generics.ListCreateAPIView): except PartCategory.DoesNotExist: pass + # Filter by supplier + supplier_id = self.request.query_params.get('supplier', None) + + if supplier_id: + stock_list = stock_list.filter(supplier_part__supplier=supplier_id) + return stock_list serializer_class = StockItemSerializer From 1b06cd23af4dfdb3d09e60c8b7ac96622081d9b7 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 16 May 2019 21:16:19 +1000 Subject: [PATCH 2/4] Add 'stock' tab for supplier page --- .../templates/company/company_base.html | 5 ++++ .../templates/company/detail_stock.html | 25 +++++++++++++++++++ InvenTree/company/templates/company/tabs.html | 3 +++ InvenTree/company/urls.py | 1 + InvenTree/stock/api.py | 2 +- 5 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 InvenTree/company/templates/company/detail_stock.html diff --git a/InvenTree/company/templates/company/company_base.html b/InvenTree/company/templates/company/company_base.html index 56983784ee..8c64190865 100644 --- a/InvenTree/company/templates/company/company_base.html +++ b/InvenTree/company/templates/company/company_base.html @@ -72,6 +72,11 @@ InvenTree | Company - {{ company.name }} {% endblock %} +{% block js_load %} +{{ block.super }} + +{% endblock %} + {% block js_ready %} enableDragAndDrop( diff --git a/InvenTree/company/templates/company/detail_stock.html b/InvenTree/company/templates/company/detail_stock.html new file mode 100644 index 0000000000..89ea0fdb2f --- /dev/null +++ b/InvenTree/company/templates/company/detail_stock.html @@ -0,0 +1,25 @@ +{% extends "company/company_base.html" %} +{% load static %} + +{% block details %} + +{% include "company/tabs.html" with tab='stock' %} + +

Supplier Stock

+ + +
+ +{% endblock %} +{% block js_ready %} +{{ block.super }} + + loadStockTable($('#stock-table'), + { + url: "{% url 'api-stock-list' %}", + params: { + supplier: {{ company.id }}, + } + }); + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/company/templates/company/tabs.html b/InvenTree/company/templates/company/tabs.html index df8b9a4fc9..211b56e1d1 100644 --- a/InvenTree/company/templates/company/tabs.html +++ b/InvenTree/company/templates/company/tabs.html @@ -6,6 +6,9 @@ Supplier Parts {{ company.part_count }} + + Stock {{ company.stock_count }} + {% if 0 %} Purchase Orders diff --git a/InvenTree/company/urls.py b/InvenTree/company/urls.py index 2c5018ebec..0f8719fe01 100644 --- a/InvenTree/company/urls.py +++ b/InvenTree/company/urls.py @@ -16,6 +16,7 @@ company_detail_urls = [ # url(r'orders/?', views.CompanyDetail.as_view(template_name='company/orders.html'), name='company-detail-orders'), url(r'parts/?', views.CompanyDetail.as_view(template_name='company/detail_part.html'), name='company-detail-parts'), + url(r'stock/?', views.CompanyDetail.as_view(template_name='company/detail_stock.html'), name='company-detail-stock'), url(r'thumbnail/?', views.CompanyImage.as_view(), name='company-image'), diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 86b5f84c67..3c08ff8822 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -242,7 +242,7 @@ class StockList(generics.ListCreateAPIView): Additional query parameters are available: - location: Filter stock by location - category: Filter by parts belonging to a certain category - - supplier: Filter by supplier + - supplier: Filter by supplier """ def get_queryset(self): From 64a82389a244d03565843367944c60ad5701efe3 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 16 May 2019 21:26:12 +1000 Subject: [PATCH 3/4] Add ability for Company model to count stock sourced from that supplier --- InvenTree/company/models.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py index 2e6d3c694c..c6b3a13c84 100644 --- a/InvenTree/company/models.py +++ b/InvenTree/company/models.py @@ -7,6 +7,7 @@ from __future__ import unicode_literals import os +from django.apps import apps from django.db import models from django.urls import reverse from django.conf import settings @@ -111,6 +112,19 @@ class Company(models.Model): """ Return True if this company supplies any parts """ return self.part_count > 0 + @property + def stock_items(self): + """ Return a list of all stock items supplied by this company """ + stock = apps.get_model('stock', 'StockItem') + return stock.objects.filter(supplier_part__supplier=self.id).all() + + @property + def stock_count(self): + """ Return the number of stock items supplied by this company """ + stock = apps.get_model('stock', 'StockItem') + return stock.objects.filter(supplier_part__supplier=self.id).count() + + class Contact(models.Model): """ A Contact represents a person who works at a particular company. From 7ef448d205ddb25849349ced4f5176b8560a0510 Mon Sep 17 00:00:00 2001 From: Oliver Walters Date: Thu, 16 May 2019 21:26:53 +1000 Subject: [PATCH 4/4] PEP --- InvenTree/company/models.py | 1 - 1 file changed, 1 deletion(-) diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py index c6b3a13c84..63fcf4add8 100644 --- a/InvenTree/company/models.py +++ b/InvenTree/company/models.py @@ -125,7 +125,6 @@ class Company(models.Model): return stock.objects.filter(supplier_part__supplier=self.id).count() - class Contact(models.Model): """ A Contact represents a person who works at a particular company. A Company may have zero or more associated Contact objects.