diff --git a/InvenTree/order/models.py b/InvenTree/order/models.py
index 684d2b76b4..5443a6ce9f 100644
--- a/InvenTree/order/models.py
+++ b/InvenTree/order/models.py
@@ -822,14 +822,24 @@ class PurchaseOrderLineItem(OrderLineItem):
"""
- @staticmethod
- def get_api_url():
- return reverse('api-po-line-list')
-
class Meta:
unique_together = (
('order', 'part', 'quantity', 'purchase_price')
)
+
+
+ @staticmethod
+ def get_api_url():
+ return reverse('api-po-line-list')
+
+ def clean(self):
+
+ if self.order.supplier and self.part:
+ # Supplier part *must* point to the same supplier!
+ if self.part.supplier != self.order.supplier:
+ raise ValidationError({
+ 'part': _('Supplier part must match supplier')
+ })
def __str__(self):
return "{n} x {part} from {supplier} (for {po})".format(
diff --git a/InvenTree/templates/js/translated/forms.js b/InvenTree/templates/js/translated/forms.js
index 50ae39df2f..2f2d1f8ae4 100644
--- a/InvenTree/templates/js/translated/forms.js
+++ b/InvenTree/templates/js/translated/forms.js
@@ -1734,6 +1734,9 @@ function renderModelData(name, model, data, parameters, options) {
case 'partparametertemplate':
renderer = renderPartParameterTemplate;
break;
+ case 'purchaseorder':
+ renderer = renderPurchaseOrder;
+ break;
case 'salesorder':
renderer = renderSalesOrder;
break;
diff --git a/InvenTree/templates/js/translated/model_renderers.js b/InvenTree/templates/js/translated/model_renderers.js
index 710f67ad67..ee4c4cb5ef 100644
--- a/InvenTree/templates/js/translated/model_renderers.js
+++ b/InvenTree/templates/js/translated/model_renderers.js
@@ -221,20 +221,54 @@ function renderOwner(name, data, parameters, options) {
}
-// Renderer for "SalesOrder" model
+// Renderer for "PurchaseOrder" model
// eslint-disable-next-line no-unused-vars
-function renderSalesOrder(name, data, parameters, options) {
- var html = `${data.reference}`;
+function renderPurchaseOrder(name, data, parameters, options) {
+ var html = '';
+
+ var prefix = global_settings.PURCHASEORDER_REFERENCE_PREFIX;
+
+ var thumbnail = null;
+
+ html += `${prefix}${data.reference}`;
+
+ if (data.supplier_detail) {
+ thumbnail = data.supplier_detail.thumbnail || data.supplier_detail.image;
+
+ html += ' - ' + select2Thumbnail(thumbnail);
+ html += `${data.supplier_detail.name}`;
+ }
if (data.description) {
- html += ` - ${data.description}`;
+ html += ` - ${data.description}`;
}
html += `
{% trans "Order ID" %}: ${data.pk}
-
+
+
+ `;
+
+ return html;
+}
+
+
+// Renderer for "SalesOrder" model
+// eslint-disable-next-line no-unused-vars
+function renderSalesOrder(name, data, parameters, options) {
+ var html = `${data.reference}`;
+
+ if (data.description) {
+ html += ` - ${data.description}`;
+ }
+
+ html += `
+
+
+ {% trans "Order ID" %}: ${data.pk}
+
`;
return html;