diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py index 2e6d3c694c..63fcf4add8 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,18 @@ 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. 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 29b151ddbf..3c08ff8822 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