feat: add tools to change order item status; add notes

This commit is contained in:
Lance Edgar 2025-01-15 21:49:17 -06:00
parent b4deea76e0
commit 9d378a0c5f
6 changed files with 520 additions and 18 deletions

View file

@ -38,3 +38,23 @@ class TestOrderHandler(DataTestCase):
self.assertEqual(text, "2 Units")
text = handler.get_order_qty_uom_text(2, enum.ORDER_UOM_UNIT, html=True)
self.assertEqual(text, "2 Units")
def test_item_status_to_variant(self):
enum = self.app.enum
handler = self.make_handler()
# typical
self.assertIsNone(handler.item_status_to_variant(enum.ORDER_ITEM_STATUS_INITIATED))
self.assertIsNone(handler.item_status_to_variant(enum.ORDER_ITEM_STATUS_READY))
self.assertIsNone(handler.item_status_to_variant(enum.ORDER_ITEM_STATUS_PLACED))
self.assertIsNone(handler.item_status_to_variant(enum.ORDER_ITEM_STATUS_RECEIVED))
self.assertIsNone(handler.item_status_to_variant(enum.ORDER_ITEM_STATUS_CONTACTED))
self.assertIsNone(handler.item_status_to_variant(enum.ORDER_ITEM_STATUS_PAID))
# warning
self.assertEqual(handler.item_status_to_variant(enum.ORDER_ITEM_STATUS_CANCELED), 'warning')
self.assertEqual(handler.item_status_to_variant(enum.ORDER_ITEM_STATUS_REFUND_PENDING), 'warning')
self.assertEqual(handler.item_status_to_variant(enum.ORDER_ITEM_STATUS_REFUNDED), 'warning')
self.assertEqual(handler.item_status_to_variant(enum.ORDER_ITEM_STATUS_RESTOCKED), 'warning')
self.assertEqual(handler.item_status_to_variant(enum.ORDER_ITEM_STATUS_EXPIRED), 'warning')
self.assertEqual(handler.item_status_to_variant(enum.ORDER_ITEM_STATUS_INACTIVE), 'warning')

View file

@ -1183,6 +1183,19 @@ class TestOrderView(WebTestCase):
view.configure_row_grid(grid)
self.assertIn('product_scancode', grid.linked_columns)
def test_row_grid_row_class(self):
model = self.app.model
enum = self.app.enum
view = self.make_view()
# typical
item = model.OrderItem(status_code=enum.ORDER_ITEM_STATUS_READY)
self.assertIsNone(view.row_grid_row_class(item, {}, 1))
# warning
item = model.OrderItem(status_code=enum.ORDER_ITEM_STATUS_CANCELED)
self.assertEqual(view.row_grid_row_class(item, {}, 1), 'has-background-warning')
def test_render_status_code(self):
enum = self.app.enum
view = self.make_view()
@ -1291,17 +1304,18 @@ class TestOrderItemView(WebTestCase):
self.assertEqual(view.render_status_code(None, None, enum.ORDER_ITEM_STATUS_INITIATED),
'initiated')
def test_get_instance_title(self):
def test_grid_row_class(self):
model = self.app.model
enum = self.app.enum
view = self.make_view()
item = model.OrderItem(product_brand='Bragg',
product_description='Vinegar',
product_size='32oz',
status_code=enum.ORDER_ITEM_STATUS_INITIATED)
title = view.get_instance_title(item)
self.assertEqual(title, "(initiated) Bragg Vinegar 32oz")
# typical
item = model.OrderItem(status_code=enum.ORDER_ITEM_STATUS_READY)
self.assertIsNone(view.grid_row_class(item, {}, 1))
# warning
item = model.OrderItem(status_code=enum.ORDER_ITEM_STATUS_CANCELED)
self.assertEqual(view.grid_row_class(item, {}, 1), 'has-background-warning')
def test_configure_form(self):
model = self.app.model
@ -1349,6 +1363,24 @@ class TestOrderItemView(WebTestCase):
self.assertIn('order_qty_uom_text', context)
self.assertEqual(context['order_qty_uom_text'], "2 Cases (× 8 = 16 Units)")
def test_render_event_note(self):
model = self.app.model
enum = self.app.enum
view = self.make_view()
# typical
event = model.OrderItemEvent(type_code=enum.ORDER_ITEM_EVENT_READY, note='testing')
result = view.render_event_note(event, 'note', 'testing')
self.assertEqual(result, 'testing')
# user note
event = model.OrderItemEvent(type_code=enum.ORDER_ITEM_EVENT_NOTE_ADDED, note='testing2')
result = view.render_event_note(event, 'note', 'testing2')
self.assertNotEqual(result, 'testing2')
self.assertIn('<span', result)
self.assertIn('class="has-background-info-light"', result)
self.assertIn('testing2', result)
def test_get_xref_buttons(self):
self.pyramid_config.add_route('orders.view', '/orders/{uuid}')
model = self.app.model
@ -1371,3 +1403,86 @@ class TestOrderItemView(WebTestCase):
buttons = view.get_xref_buttons(item)
self.assertEqual(len(buttons), 1)
self.assertIn("View the Order", buttons[0])
def test_add_note(self):
self.pyramid_config.add_route('order_items.view', '/order-items/{uuid}')
model = self.app.model
enum = self.app.enum
view = self.make_view()
user = model.User(username='barney')
self.session.add(user)
order = model.Order(order_id=42, created_by=user)
self.session.add(order)
item = model.OrderItem(order_qty=1, order_uom=enum.ORDER_UOM_UNIT,
status_code=enum.ORDER_ITEM_STATUS_INITIATED)
order.items.append(item)
self.session.flush()
with patch.object(view, 'Session', return_value=self.session):
with patch.object(self.request, 'matchdict', new={'uuid': item.uuid}):
with patch.object(self.request, 'POST', new={'note': 'testing'}):
self.assertEqual(len(item.events), 0)
result = view.add_note()
self.assertEqual(len(item.events), 1)
self.assertEqual(item.events[0].type_code, enum.ORDER_ITEM_EVENT_NOTE_ADDED)
self.assertEqual(item.events[0].note, 'testing')
def test_change_status(self):
self.pyramid_config.add_route('order_items.view', '/order-items/{uuid}')
model = self.app.model
enum = self.app.enum
view = self.make_view()
user = model.User(username='barney')
self.session.add(user)
order = model.Order(order_id=42, created_by=user)
self.session.add(order)
item = model.OrderItem(order_qty=1, order_uom=enum.ORDER_UOM_UNIT,
status_code=enum.ORDER_ITEM_STATUS_INITIATED)
order.items.append(item)
self.session.flush()
with patch.object(view, 'Session', return_value=self.session):
with patch.object(self.request, 'user', new=user):
with patch.object(self.request, 'matchdict', new={'uuid': item.uuid}):
# just status change, no note
with patch.object(self.request, 'POST', new={
'new_status': enum.ORDER_ITEM_STATUS_PLACED}):
self.assertEqual(len(item.events), 0)
result = view.change_status()
self.assertIsInstance(result, HTTPFound)
self.assertFalse(self.request.session.peek_flash('error'))
self.assertEqual(len(item.events), 1)
self.assertEqual(item.events[0].type_code, enum.ORDER_ITEM_EVENT_STATUS_CHANGE)
self.assertEqual(item.events[0].note,
"status changed from 'initiated' to 'placed'")
# status change plus note
with patch.object(self.request, 'POST', new={
'new_status': enum.ORDER_ITEM_STATUS_RECEIVED,
'note': 'check it out'}):
self.assertEqual(len(item.events), 1)
result = view.change_status()
self.assertIsInstance(result, HTTPFound)
self.assertFalse(self.request.session.peek_flash('error'))
self.assertEqual(len(item.events), 3)
self.assertEqual(item.events[0].type_code, enum.ORDER_ITEM_EVENT_STATUS_CHANGE)
self.assertEqual(item.events[0].note,
"status changed from 'initiated' to 'placed'")
self.assertEqual(item.events[1].type_code, enum.ORDER_ITEM_EVENT_STATUS_CHANGE)
self.assertEqual(item.events[1].note,
"status changed from 'placed' to 'received'")
self.assertEqual(item.events[2].type_code, enum.ORDER_ITEM_EVENT_NOTE_ADDED)
self.assertEqual(item.events[2].note, "check it out")
# invalid status
with patch.object(self.request, 'POST', new={'new_status': 23432143}):
self.assertEqual(len(item.events), 3)
result = view.change_status()
self.assertIsInstance(result, HTTPFound)
self.assertTrue(self.request.session.peek_flash('error'))
self.assertEqual(len(item.events), 3)