diff --git a/InvenTree/InvenTree/views.py b/InvenTree/InvenTree/views.py
index 06aec54c18..17caeb872d 100644
--- a/InvenTree/InvenTree/views.py
+++ b/InvenTree/InvenTree/views.py
@@ -337,7 +337,7 @@ class AjaxMixin(InvenTreeRoleMixin):
# Do nothing by default
pass
- def renderJsonResponse(self, request, form=None, data={}, context=None):
+ def renderJsonResponse(self, request, form=None, data=None, context=None):
""" Render a JSON response based on specific class context.
Args:
@@ -349,6 +349,9 @@ class AjaxMixin(InvenTreeRoleMixin):
Returns:
JSON response object
"""
+ # a empty dict as default can be dangerous - set it here if empty
+ if not data:
+ data = {}
if not request.is_ajax():
return HttpResponseRedirect('/')
diff --git a/InvenTree/common/models.py b/InvenTree/common/models.py
index 31a0031c48..b78fe1c2bf 100644
--- a/InvenTree/common/models.py
+++ b/InvenTree/common/models.py
@@ -205,6 +205,13 @@ class InvenTreeSetting(models.Model):
'validator': bool,
},
+ 'PART_SHOW_PRICE_IN_FORMS': {
+ 'name': _('Show Price in Forms'),
+ 'description': _('Display part price in some forms'),
+ 'default': True,
+ 'validator': bool,
+ },
+
'PART_INTERNAL_PRICE': {
'name': _('Internal Prices'),
'description': _('Enable internal prices for parts'),
diff --git a/InvenTree/order/templates/order/order_wizard/select_parts.html b/InvenTree/order/templates/order/order_wizard/select_parts.html
index 28b4a36213..a02113fa18 100644
--- a/InvenTree/order/templates/order/order_wizard/select_parts.html
+++ b/InvenTree/order/templates/order/order_wizard/select_parts.html
@@ -4,6 +4,8 @@
{% load i18n %}
{% block form %}
+{% default_currency as currency %}
+{% settings_value 'PART_SHOW_PRICE_IN_FORMS' as show_price %}
{% trans "Step 1 of 2 - Select Part Suppliers" %}
@@ -49,7 +51,13 @@
diff --git a/InvenTree/order/views.py b/InvenTree/order/views.py
index c8ec42d3e7..4a8e576a6d 100644
--- a/InvenTree/order/views.py
+++ b/InvenTree/order/views.py
@@ -1004,6 +1004,15 @@ class OrderParts(AjaxView):
return ctx
+ def get_data(self):
+ """ enrich respone json data """
+ data = super().get_data()
+ # if in selection-phase, add a button to update the prices
+ if getattr(self, 'form_step', 'select_parts') == 'select_parts':
+ data['buttons'] = [{'name': 'update_price', 'title': _('Update prices')}] # set buttons
+ data['hideErrorMessage'] = '1' # hide the error message
+ return data
+
def get_suppliers(self):
""" Calculates a list of suppliers which the user will need to create POs for.
This is calculated AFTER the user finishes selecting the parts to order.
@@ -1238,9 +1247,10 @@ class OrderParts(AjaxView):
valid = False
if form_step == 'select_parts':
- # No errors? Proceed to PO selection form
- if part_errors is False:
+ # No errors? and the price-update button was not used to submit? Proceed to PO selection form
+ if part_errors is False and 'act-btn_update_price' not in request.POST:
self.ajax_template_name = 'order/order_wizard/select_pos.html'
+ self.form_step = 'select_purchase_orders' # set step (important for get_data)
else:
self.ajax_template_name = 'order/order_wizard/select_parts.html'
diff --git a/InvenTree/templates/InvenTree/settings/part.html b/InvenTree/templates/InvenTree/settings/part.html
index 08b53be022..1bf5f8794a 100644
--- a/InvenTree/templates/InvenTree/settings/part.html
+++ b/InvenTree/templates/InvenTree/settings/part.html
@@ -20,6 +20,7 @@
{% include "InvenTree/settings/setting.html" with key="PART_ALLOW_DUPLICATE_IPN" %}
{% include "InvenTree/settings/setting.html" with key="PART_ALLOW_EDIT_IPN" %}
{% include "InvenTree/settings/setting.html" with key="PART_SHOW_QUANTITY_IN_FORMS" icon="fa-hashtag" %}
+ {% include "InvenTree/settings/setting.html" with key="PART_SHOW_PRICE_IN_FORMS" icon="fa-dollar-sign" %}
{% include "InvenTree/settings/setting.html" with key="PART_RECENT_COUNT" icon="fa-clock" %}
{% include "InvenTree/settings/setting.html" with key="PART_TEMPLATE" icon="fa-clone" %}