Avoid uncaught error when updating order batch row quantities

This commit is contained in:
Lance Edgar 2024-04-10 12:24:13 -05:00
parent e0dc858451
commit a1b05540be

View file

@ -2,7 +2,7 @@
################################################################################ ################################################################################
# #
# Rattail -- Retail Software Framework # Rattail -- Retail Software Framework
# Copyright © 2010-2023 Lance Edgar # Copyright © 2010-2024 Lance Edgar
# #
# This file is part of Rattail. # This file is part of Rattail.
# #
@ -28,18 +28,23 @@ API.
""" """
import datetime import datetime
import logging
from rattail.db import model import sqlalchemy as sa
from rattail.util import pretty_quantity
from rattail.db.model import PurchaseBatch, PurchaseBatchRow
from cornice import Service from cornice import Service
from tailbone.api.batch import APIBatchView, APIBatchRowView from tailbone.api.batch import APIBatchView, APIBatchRowView
log = logging.getLogger(__name__)
class OrderingBatchViews(APIBatchView): class OrderingBatchViews(APIBatchView):
model_class = model.PurchaseBatch model_class = PurchaseBatch
default_handler_spec = 'rattail.batch.purchase:PurchaseBatchHandler' default_handler_spec = 'rattail.batch.purchase:PurchaseBatchHandler'
route_prefix = 'orderingbatchviews' route_prefix = 'orderingbatchviews'
permission_prefix = 'ordering' permission_prefix = 'ordering'
@ -55,12 +60,13 @@ class OrderingBatchViews(APIBatchView):
Adds a condition to the query, to ensure only purchase batches with Adds a condition to the query, to ensure only purchase batches with
"ordering" mode are returned. "ordering" mode are returned.
""" """
query = super(OrderingBatchViews, self).base_query() model = self.model
query = super().base_query()
query = query.filter(model.PurchaseBatch.mode == self.enum.PURCHASE_BATCH_MODE_ORDERING) query = query.filter(model.PurchaseBatch.mode == self.enum.PURCHASE_BATCH_MODE_ORDERING)
return query return query
def normalize(self, batch): def normalize(self, batch):
data = super(OrderingBatchViews, self).normalize(batch) data = super().normalize(batch)
data['vendor_uuid'] = batch.vendor.uuid data['vendor_uuid'] = batch.vendor.uuid
data['vendor_display'] = str(batch.vendor) data['vendor_display'] = str(batch.vendor)
@ -81,7 +87,7 @@ class OrderingBatchViews(APIBatchView):
""" """
data = dict(data) data = dict(data)
data['mode'] = self.enum.PURCHASE_BATCH_MODE_ORDERING data['mode'] = self.enum.PURCHASE_BATCH_MODE_ORDERING
batch = super(OrderingBatchViews, self).create_object(data) batch = super().create_object(data)
return batch return batch
def worksheet(self): def worksheet(self):
@ -221,7 +227,7 @@ class OrderingBatchViews(APIBatchView):
class OrderingBatchRowViews(APIBatchRowView): class OrderingBatchRowViews(APIBatchRowView):
model_class = model.PurchaseBatchRow model_class = PurchaseBatchRow
default_handler_spec = 'rattail.batch.purchase:PurchaseBatchHandler' default_handler_spec = 'rattail.batch.purchase:PurchaseBatchHandler'
route_prefix = 'ordering.rows' route_prefix = 'ordering.rows'
permission_prefix = 'ordering' permission_prefix = 'ordering'
@ -231,8 +237,9 @@ class OrderingBatchRowViews(APIBatchRowView):
editable = True editable = True
def normalize(self, row): def normalize(self, row):
data = super().normalize(row)
app = self.get_rattail_app()
batch = row.batch batch = row.batch
data = super(OrderingBatchRowViews, self).normalize(row)
data['item_id'] = row.item_id data['item_id'] = row.item_id
data['upc'] = str(row.upc) data['upc'] = str(row.upc)
@ -252,8 +259,8 @@ class OrderingBatchRowViews(APIBatchRowView):
data['case_quantity'] = row.case_quantity data['case_quantity'] = row.case_quantity
data['cases_ordered'] = row.cases_ordered data['cases_ordered'] = row.cases_ordered
data['units_ordered'] = row.units_ordered data['units_ordered'] = row.units_ordered
data['cases_ordered_display'] = pretty_quantity(row.cases_ordered or 0, empty_zero=False) data['cases_ordered_display'] = app.render_quantity(row.cases_ordered or 0, empty_zero=False)
data['units_ordered_display'] = pretty_quantity(row.units_ordered or 0, empty_zero=False) data['units_ordered_display'] = app.render_quantity(row.units_ordered or 0, empty_zero=False)
data['po_unit_cost'] = row.po_unit_cost data['po_unit_cost'] = row.po_unit_cost
data['po_unit_cost_display'] = "${:0.2f}".format(row.po_unit_cost) if row.po_unit_cost is not None else None data['po_unit_cost_display'] = "${:0.2f}".format(row.po_unit_cost) if row.po_unit_cost is not None else None
@ -281,7 +288,17 @@ class OrderingBatchRowViews(APIBatchRowView):
if not self.batch_handler.is_mutable(row.batch): if not self.batch_handler.is_mutable(row.batch):
return {'error': "Batch is not mutable"} return {'error': "Batch is not mutable"}
try:
self.batch_handler.update_row_quantity(row, **data) self.batch_handler.update_row_quantity(row, **data)
self.Session.flush()
except Exception as error:
log.warning("update_row_quantity failed", exc_info=True)
if isinstance(error, sa.exc.DataError) and hasattr(error, 'orig'):
error = str(error.orig)
else:
error = str(error)
return {'error': error}
return row return row