2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-06-18 13:05:42 +00:00

Remove "calculate price" button from SalesOrderLineItem

- Existing method is extremely expensive
- Will be replaced with an API driven approach
This commit is contained in:
Oliver Walters
2023-02-21 00:56:10 +11:00
parent 782ae133b7
commit bf5c366b5d
3 changed files with 1 additions and 137 deletions

View File

@ -18,8 +18,6 @@ purchase_order_detail_urls = [
purchase_order_urls = [ purchase_order_urls = [
re_path(r'^pricing/', views.LineItemPricing.as_view(), name='line-pricing'),
# Display detail view for a single purchase order # Display detail view for a single purchase order
re_path(r'^(?P<pk>\d+)/', include(purchase_order_detail_urls)), re_path(r'^(?P<pk>\d+)/', include(purchase_order_detail_urls)),

View File

@ -4,9 +4,7 @@ import logging
from decimal import Decimal, InvalidOperation from decimal import Decimal, InvalidOperation
from django.db.utils import IntegrityError from django.db.utils import IntegrityError
from django.forms import HiddenInput, IntegerField
from django.http import HttpResponseRedirect from django.http import HttpResponseRedirect
from django.http.response import JsonResponse
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.urls import reverse from django.urls import reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@ -18,14 +16,11 @@ from common.views import FileManagementFormView
from company.models import SupplierPart # ManufacturerPart from company.models import SupplierPart # ManufacturerPart
from InvenTree.helpers import DownloadFile from InvenTree.helpers import DownloadFile
from InvenTree.views import AjaxView, InvenTreeRoleMixin from InvenTree.views import AjaxView, InvenTreeRoleMixin
from part.models import Part
from part.views import PartPricing
from plugin.views import InvenTreePluginViewMixin from plugin.views import InvenTreePluginViewMixin
from . import forms as order_forms from . import forms as order_forms
from .admin import PurchaseOrderLineItemResource, SalesOrderLineItemResource from .admin import PurchaseOrderLineItemResource, SalesOrderLineItemResource
from .models import (PurchaseOrder, PurchaseOrderLineItem, SalesOrder, from .models import PurchaseOrder, PurchaseOrderLineItem, SalesOrder
SalesOrderLineItem)
logger = logging.getLogger("inventree") logger = logging.getLogger("inventree")
@ -301,105 +296,3 @@ class PurchaseOrderExport(AjaxView):
filedata = dataset.export(format=export_format) filedata = dataset.export(format=export_format)
return DownloadFile(filedata, filename) return DownloadFile(filedata, filename)
class LineItemPricing(PartPricing):
"""View for inspecting part pricing information."""
class EnhancedForm(PartPricing.form_class):
"""Extra form options"""
pk = IntegerField(widget=HiddenInput())
so_line = IntegerField(widget=HiddenInput())
form_class = EnhancedForm
def get_part(self, id=False):
"""Return the Part instance associated with this view"""
if 'line_item' in self.request.GET:
try:
part_id = self.request.GET.get('line_item')
part = SalesOrderLineItem.objects.get(id=part_id).part
except Part.DoesNotExist:
return None
elif 'pk' in self.request.POST:
try:
part_id = self.request.POST.get('pk')
part = Part.objects.get(id=part_id)
except Part.DoesNotExist:
return None
else:
return None
if id:
return part.id
return part
def get_so(self, pk=False):
"""Return the SalesOrderLineItem associated with this view"""
so_line = self.request.GET.get('line_item', None)
if not so_line:
so_line = self.request.POST.get('so_line', None)
if so_line:
try:
sales_order = SalesOrderLineItem.objects.get(pk=so_line)
if pk:
return sales_order.pk
return sales_order
except Part.DoesNotExist:
return None
return None
def get_quantity(self):
"""Return set quantity in decimal format."""
qty = Decimal(self.request.GET.get('quantity', 1))
if qty == 1:
return Decimal(self.request.POST.get('quantity', 1))
return qty
def get_initials(self):
"""Return initial context values for this view"""
initials = super().get_initials()
initials['pk'] = self.get_part(id=True)
initials['so_line'] = self.get_so(pk=True)
return initials
def post(self, request, *args, **kwargs):
"""Respond to a POST request to get particular pricing information"""
REF = 'act-btn_'
act_btn = [a.replace(REF, '') for a in self.request.POST if REF in a]
# check if extra action was passed
if act_btn and act_btn[0] == 'update_price':
# get sales order
so_line = self.get_so()
if not so_line:
self.data = {'non_field_errors': [_('Sales order not found')]}
else:
quantity = self.get_quantity()
price = self.get_pricing(quantity).get('unit_part_price', None)
if not price:
self.data = {'non_field_errors': [_('Price not found')]}
else:
# set normal update note
note = _('Updated {part} unit-price to {price}')
# check qunatity and update if different
if so_line.quantity != quantity:
so_line.quantity = quantity
note = _('Updated {part} unit-price to {price} and quantity to {qty}')
# update sale_price
so_line.sale_price = price
so_line.save()
# parse response
data = {
'form_valid': True,
'success': note.format(part=str(so_line.part), price=str(so_line.sale_price), qty=quantity)
}
return JsonResponse(data=data)
# let the normal pricing view run
return super().post(request, *args, **kwargs)

View File

@ -4058,8 +4058,6 @@ function loadSalesOrderLineItemTable(table, options={}) {
if (part.assembly) { if (part.assembly) {
html += makeIconButton('fa-tools', 'button-build', row.part, '{% trans "Build stock" %}'); html += makeIconButton('fa-tools', 'button-build', row.part, '{% trans "Build stock" %}');
} }
html += makeIconButton('fa-dollar-sign icon-green', 'button-price', pk, '{% trans "Calculate price" %}');
} }
html += makeIconButton('fa-clone', 'button-duplicate', pk, '{% trans "Duplicate line item" %}'); html += makeIconButton('fa-clone', 'button-duplicate', pk, '{% trans "Duplicate line item" %}');
@ -4247,31 +4245,6 @@ function loadSalesOrderLineItemTable(table, options={}) {
} }
); );
}); });
// Callback for displaying price
$(table).find('.button-price').click(function() {
var pk = $(this).attr('pk');
var idx = $(this).closest('tr').attr('data-index');
var row = $(table).bootstrapTable('getData')[idx];
launchModalForm(
'{% url "line-pricing" %}',
{
submit_text: '{% trans "Calculate price" %}',
data: {
line_item: pk,
quantity: row.quantity,
},
buttons: [
{
name: 'update_price',
title: '{% trans "Update Unit Price" %}'
},
],
success: reloadTable,
}
);
});
} }
$(table).inventreeTable({ $(table).inventreeTable({