Add way to prevent "case" entries for inventory adjustment batch

This commit is contained in:
Lance Edgar 2018-05-23 14:48:17 -05:00
parent 57c2a7981f
commit 54bfafdbfe
4 changed files with 80 additions and 30 deletions

View file

@ -97,6 +97,10 @@ class InventoryBatchView(BatchMasterView):
# set to False to disable "zero all" batch count mode
allow_zero_all = True
# set to False to prevent exposing case fields for user input,
# when the batch count mode is "adjust only"
allow_adjustment_cases = True
labels = {
'mode': "Count Mode",
}
@ -310,8 +314,16 @@ class InventoryBatchView(BatchMasterView):
'index_url': self.get_action_url('view', batch),
'form': form,
'dform': form.make_deform_form(),
'allow_cases': self.allow_cases(batch),
})
def allow_cases(self, batch):
if batch.mode == self.enum.INVENTORY_MODE_ADJUST:
if self.allow_adjustment_cases:
return True
return False
return True
def desktop_lookup(self):
"""
Try to locate a product by UPC, and validate it in the context of
@ -463,23 +475,26 @@ class InventoryBatchView(BatchMasterView):
"""
self.viewing = True
row = self.get_row_instance()
parent = self.get_parent(row)
batch = self.get_parent(row)
form = self.make_mobile_row_form(row)
context = {
'row': row,
'batch': batch,
'instance': row,
'instance_title': self.get_row_instance_title(row),
'parent_model_title': self.get_model_title(),
'parent_title': self.get_instance_title(parent),
'parent_url': self.get_action_url('view', parent, mobile=True),
'parent_title': self.get_instance_title(batch),
'parent_url': self.get_action_url('view', batch, mobile=True),
'product_image_url': pod.get_image_url(self.rattail_config, row.upc),
'form': form,
'allow_cases': self.allow_cases(batch),
}
if self.request.has_perm('{}.edit_row'.format(self.get_permission_prefix())):
update_form = forms.Form(schema=InventoryForm(), request=self.request)
schema = InventoryForm().bind(session=self.Session())
update_form = forms.Form(schema=schema, request=self.request)
if update_form.validate(newstyle=True):
row = update_form.validated['row']
row = self.Session.query(model.InventoryBatchRow).get(update_form.validated['row'])
cases = update_form.validated['cases']
units = update_form.validated['units']
if cases:
@ -489,7 +504,8 @@ class InventoryBatchView(BatchMasterView):
row.cases = None
row.units = units
self.handler.refresh_row(row)
return self.redirect(self.request.route_url('mobile.{}.view'.format(self.get_route_prefix()), uuid=row.batch_uuid))
route_prefix = self.get_route_prefix()
return self.redirect(self.request.route_url('mobile.{}.view'.format(route_prefix), uuid=batch.uuid))
return self.render_to_response('view_row', context, mobile=True)
@ -533,6 +549,7 @@ class InventoryBatchView(BatchMasterView):
def configure_row_form(self, f):
super(InventoryBatchView, self).configure_row_form(f)
row = f.model_instance
# readonly fields
f.set_readonly('upc')
@ -557,6 +574,11 @@ class InventoryBatchView(BatchMasterView):
# upc
f.set_renderer('upc', self.render_upc)
# cases
if self.editing:
if not self.allow_cases(row.batch):
f.set_readonly('cases')
def render_upc(self, row, field):
upc = row.upc
if not upc:
@ -599,19 +621,26 @@ class InventoryBatchView(BatchMasterView):
permission='{}.create_row'.format(permission_prefix))
class InventoryBatchRowType(forms.types.ObjectType):
model_class = model.InventoryBatchRow
def deserialize(self, node, cstruct):
row = super(InventoryBatchRowType, self).deserialize(node, cstruct)
if row and row.batch.executed:
# TODO: this is a stopgap measure to fix an obvious bug, which exists when the
# session is not provided by the view at runtime (i.e. when it was instead
# being provided by the type instance, which was created upon app startup).
@colander.deferred
def valid_inventory_batch_row(node, kw):
session = kw['session']
def validate(node, value):
row = session.query(model.InventoryBatchRow).get(value)
if not row:
raise colander.Invalid(node, "Batch row not found")
if row.batch.executed:
raise colander.Invalid(node, "Batch has already been executed")
return row
return row.uuid
return validate
class InventoryForm(colander.MappingSchema):
row = colander.SchemaNode(InventoryBatchRowType())
row = colander.SchemaNode(colander.String(),
validator=valid_inventory_batch_row)
cases = colander.SchemaNode(colander.Decimal(), missing=colander.null)