Avoid uncaught error when updating order batch row quantities
This commit is contained in:
parent
e0dc858451
commit
a1b05540be
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue