diff --git a/InvenTree/InvenTree/urls.py b/InvenTree/InvenTree/urls.py index a9f53a7014..e74faf3a87 100644 --- a/InvenTree/InvenTree/urls.py +++ b/InvenTree/InvenTree/urls.py @@ -11,6 +11,7 @@ from django.contrib import admin from django.contrib.auth import views as auth_views from company.urls import company_urls +from company.urls import manufacturer_part_urls from company.urls import supplier_part_urls from company.urls import price_break_urls @@ -114,6 +115,7 @@ dynamic_javascript_urls = [ urlpatterns = [ url(r'^part/', include(part_urls)), + url(r'^manufacturer-part/', include(manufacturer_part_urls)), url(r'^supplier-part/', include(supplier_part_urls)), url(r'^price-break/', include(price_break_urls)), diff --git a/InvenTree/company/models.py b/InvenTree/company/models.py index 202453b9ae..340cb1f91f 100644 --- a/InvenTree/company/models.py +++ b/InvenTree/company/models.py @@ -307,7 +307,7 @@ class ManufacturerPart(models.Model): manufacturer = models.ForeignKey( Company, on_delete=models.SET_NULL, - related_name='manufactured_parts', + related_name='manufacturer_parts', limit_choices_to={ 'is_manufacturer': True }, @@ -386,6 +386,24 @@ class SupplierPart(models.Model): help_text=_('Supplier stock keeping unit') ) + manufacturer = models.ForeignKey( + Company, + on_delete=models.SET_NULL, + related_name='manufactured_parts', + limit_choices_to={ + 'is_manufacturer': True + }, + verbose_name=_('Manufacturer'), + help_text=_('Select manufacturer'), + null=True, blank=True + ) + + MPN = models.CharField( + max_length=100, blank=True, null=True, + verbose_name=_('MPN'), + help_text=_('Manufacturer part number') + ) + link = InvenTreeURLField( blank=True, null=True, verbose_name=_('Link'), diff --git a/InvenTree/part/templates/part/manufacturer.html b/InvenTree/part/templates/part/manufacturer.html new file mode 100644 index 0000000000..1e023c6349 --- /dev/null +++ b/InvenTree/part/templates/part/manufacturer.html @@ -0,0 +1,91 @@ +{% extends "part/part_base.html" %} +{% load static %} +{% load i18n %} + +{% block menubar %} +{% include 'part/navbar.html' with tab='manufacturers' %} +{% endblock %} + +{% block heading %} +{% trans "Part Manufacturers" %} +{% endblock %} + +{% block details %} +
+
+ +
+ + +
+
+
+ + +
+ +{% endblock %} + +{% block js_load %} +{{ block.super }} +{% endblock %} +{% block js_ready %} + {{ block.super }} + + $('#manufacturer-create').click(function () { + launchModalForm( + "{% url 'manufacturer-part-create' %}", + { + reload: true, + data: { + part: {{ part.id }} + }, + secondary: [ + { + field: 'manufacturer', + label: '{% trans "New Manufacturer" %}', + title: '{% trans "Create new manufacturer" %}', + url: "{% url 'manufacturer-create' %}", + } + ] + }); + }); + + $("#manufacturer-part-delete").click(function() { + + var selections = $("#manufacturer-table").bootstrapTable("getSelections"); + + var parts = []; + + selections.forEach(function(item) { + parts.push(item.pk); + }); + + launchModalForm("{% url 'manufacturer-part-delete' %}", { + data: { + parts: parts, + }, + reload: true, + }); + }); + + loadSupplierPartTable( + "#supplier-table", + "{% url 'api-supplier-part-list' %}", + { + params: { + part: {{ part.id }}, + part_detail: true, + supplier_detail: true, + manufacturer_detail: true, + }, + } + ); + + linkButtonsToSelection($("#supplier-table"), ['#supplier-part-options']) + +{% endblock %} \ No newline at end of file diff --git a/InvenTree/part/templates/part/navbar.html b/InvenTree/part/templates/part/navbar.html index e621af038a..1c94c0358f 100644 --- a/InvenTree/part/templates/part/navbar.html +++ b/InvenTree/part/templates/part/navbar.html @@ -70,7 +70,7 @@ {% endif %} {% if part.purchaseable and roles.purchase_order.view %}
  • - + {% trans "Manufacturers" %} diff --git a/InvenTree/part/urls.py b/InvenTree/part/urls.py index f275edede2..f1185fbe8c 100644 --- a/InvenTree/part/urls.py +++ b/InvenTree/part/urls.py @@ -60,6 +60,7 @@ part_detail_urls = [ url(r'^bom/?', views.PartDetail.as_view(template_name='part/bom.html'), name='part-bom'), url(r'^build/?', views.PartDetail.as_view(template_name='part/build.html'), name='part-build'), url(r'^used/?', views.PartDetail.as_view(template_name='part/used_in.html'), name='part-used-in'), + url(r'^manufacturers/?', views.PartDetail.as_view(template_name='part/manufacturer.html'), name='part-manufacturers'), url(r'^suppliers/?', views.PartDetail.as_view(template_name='part/supplier.html'), name='part-suppliers'), url(r'^orders/?', views.PartDetail.as_view(template_name='part/orders.html'), name='part-orders'), url(r'^sales-orders/', views.PartDetail.as_view(template_name='part/sales_orders.html'), name='part-sales-orders'),