feat: add config option to show/hide Store ID; default value

This commit is contained in:
Lance Edgar 2025-01-27 20:33:14 -06:00
parent 3ef84ff706
commit 89e3445ace
19 changed files with 445 additions and 64 deletions

View file

@ -30,10 +30,19 @@ class TestNewOrderBatchView(WebTestCase):
def test_configure_grid(self):
model = self.app.model
view = self.make_view()
# store_id not exposed by default
grid = view.make_grid(model_class=model.NewOrderBatch)
self.assertNotIn('total_price', grid.renderers)
self.assertIn('store_id', grid.columns)
view.configure_grid(grid)
self.assertIn('total_price', grid.renderers)
self.assertNotIn('store_id', grid.columns)
# store_id is exposed if configured
self.config.setdefault('sideshow.orders.expose_store_id', 'true')
grid = view.make_grid(model_class=model.NewOrderBatch)
self.assertIn('store_id', grid.columns)
view.configure_grid(grid)
self.assertIn('store_id', grid.columns)
def test_configure_form(self):
model = self.app.model
@ -58,6 +67,19 @@ class TestNewOrderBatchView(WebTestCase):
self.assertIsInstance(schema['pending_customer'].typ, PendingCustomerRef)
self.assertIsInstance(schema['total_price'].typ, WuttaMoney)
# store_id not exposed by default
form = view.make_form(model_instance=batch)
self.assertIn('store_id', form)
view.configure_form(form)
self.assertNotIn('store_id', form)
# store_id is exposed if configured
self.config.setdefault('sideshow.orders.expose_store_id', 'true')
form = view.make_form(model_instance=batch)
self.assertIn('store_id', form)
view.configure_form(form)
self.assertIn('store_id', form)
def test_configure_row_grid(self):
model = self.app.model
view = self.make_view()

View file

@ -31,27 +31,28 @@ class TestOrderView(WebTestCase):
def make_handler(self):
return NewOrderBatchHandler(self.config)
def test_order_handler(self):
view = self.make_view()
handler = view.order_handler
self.assertIsInstance(handler, OrderHandler)
handler2 = view.get_order_handler()
self.assertIs(handler2, handler)
def test_configure_grid(self):
model = self.app.model
view = self.make_view()
grid = view.make_grid(model_class=model.PendingProduct)
self.assertNotIn('order_id', grid.linked_columns)
self.assertNotIn('total_price', grid.renderers)
# store_id hidden by default
grid = view.make_grid(model_class=model.Order, columns=['store_id', 'order_id'])
self.assertIn('store_id', grid.columns)
view.configure_grid(grid)
self.assertIn('order_id', grid.linked_columns)
self.assertIn('total_price', grid.renderers)
self.assertNotIn('store_id', grid.columns)
# store_id is shown if configured
self.config.setdefault('sideshow.orders.expose_store_id', 'true')
grid = view.make_grid(model_class=model.Order, columns=['store_id', 'order_id'])
self.assertIn('store_id', grid.columns)
view.configure_grid(grid)
self.assertIn('store_id', grid.columns)
def test_create(self):
self.pyramid_config.include('sideshow.web.views')
self.config.setdefault('wutta.batch.neworder.handler.spec',
'sideshow.batch.neworder:NewOrderBatchHandler')
self.config.setdefault('sideshow.orders.expose_store_id', 'true')
self.config.setdefault('sideshow.orders.allow_item_discounts', 'true')
model = self.app.model
enum = self.app.enum
@ -59,6 +60,10 @@ class TestOrderView(WebTestCase):
user = model.User(username='barney')
self.session.add(user)
store = model.Store(store_id='001', name='Acme Goods')
self.session.add(store)
store = model.Store(store_id='002', name='Acme Services')
self.session.add(store)
self.session.flush()
with patch.object(view, 'Session', return_value=self.session):
@ -101,6 +106,7 @@ class TestOrderView(WebTestCase):
self.assertIsInstance(response, Response)
self.assertEqual(response.content_type, 'application/json')
self.assertEqual(response.json_body, {
'store_id': None,
'customer_is_known': False,
'customer_id': None,
'customer_name': 'Fred Flintstone',
@ -304,6 +310,7 @@ class TestOrderView(WebTestCase):
self.session.flush()
context = view.get_context_customer(batch)
self.assertEqual(context, {
'store_id': None,
'customer_is_known': True,
'customer_id': 42,
'customer_name': 'Fred Flintstone',
@ -321,6 +328,7 @@ class TestOrderView(WebTestCase):
self.session.flush()
context = view.get_context_customer(batch)
self.assertEqual(context, {
'store_id': None,
'customer_is_known': True,
'customer_id': local.uuid.hex,
'customer_name': 'Betty Boop',
@ -339,6 +347,7 @@ class TestOrderView(WebTestCase):
self.session.flush()
context = view.get_context_customer(batch)
self.assertEqual(context, {
'store_id': None,
'customer_is_known': False,
'customer_id': None,
'customer_name': 'Fred Flintstone',
@ -357,6 +366,7 @@ class TestOrderView(WebTestCase):
self.session.flush()
context = view.get_context_customer(batch)
self.assertEqual(context, {
'store_id': None,
'customer_is_known': True, # nb. this is for UI default
'customer_id': None,
'customer_name': None,
@ -408,6 +418,34 @@ class TestOrderView(WebTestCase):
self.session.flush()
self.assertEqual(self.session.query(model.NewOrderBatch).count(), 0)
def test_set_store(self):
model = self.app.model
view = self.make_view()
handler = NewOrderBatchHandler(self.config)
user = model.User(username='barney')
self.session.add(user)
self.session.flush()
with patch.object(view, 'batch_handler', create=True, new=handler):
with patch.object(view, 'Session', return_value=self.session):
with patch.object(self.request, 'user', new=user):
batch = view.get_current_batch()
self.assertIsNone(batch.store_id)
# store_id is required
result = view.set_store(batch, {})
self.assertEqual(result, {'error': "Must provide store_id"})
result = view.set_store(batch, {'store_id': ''})
self.assertEqual(result, {'error': "Must provide store_id"})
# store_id is set on batch
result = view.set_store(batch, {'store_id': '042'})
self.assertEqual(batch.store_id, '042')
self.assertIn('store_id', result)
self.assertEqual(result['store_id'], '042')
def test_assign_customer(self):
self.pyramid_config.add_route('orders.create', '/orders/new')
model = self.app.model
@ -432,6 +470,7 @@ class TestOrderView(WebTestCase):
self.assertIsNone(batch.pending_customer)
self.assertIs(batch.local_customer, weirdal)
self.assertEqual(context, {
'store_id': None,
'customer_is_known': True,
'customer_id': weirdal.uuid.hex,
'customer_name': 'Weird Al',
@ -470,6 +509,7 @@ class TestOrderView(WebTestCase):
self.assertIsNone(batch.customer_name)
self.assertIsNone(batch.local_customer)
self.assertEqual(context, {
'store_id': None,
'customer_is_known': True,
'customer_id': None,
'customer_name': None,
@ -510,6 +550,7 @@ class TestOrderView(WebTestCase):
context = view.set_pending_customer(batch, data)
self.assertIsInstance(batch.pending_customer, model.PendingCustomer)
self.assertEqual(context, {
'store_id': None,
'customer_is_known': False,
'customer_id': None,
'customer_name': 'Fred Flintstone',
@ -1078,7 +1119,11 @@ class TestOrderView(WebTestCase):
form = view.make_form(model_instance=order)
# nb. this is to avoid include/exclude ambiguity
form.remove('items')
# nb. store_id gets hidden by default
form.append('store_id')
self.assertIn('store_id', form)
view.configure_form(form)
self.assertNotIn('store_id', form)
schema = form.get_schema()
self.assertIn('pending_customer', form)
self.assertIsInstance(schema['total_price'].typ, WuttaMoney)
@ -1089,13 +1134,20 @@ class TestOrderView(WebTestCase):
self.session.add(local)
self.session.flush()
# nb. from now on we include store_id
self.config.setdefault('sideshow.orders.expose_store_id', 'true')
# viewing (local customer)
with patch.object(view, 'viewing', new=True):
with patch.object(order, 'local_customer', new=local):
form = view.make_form(model_instance=order)
# nb. this is to avoid include/exclude ambiguity
form.remove('items')
# nb. store_id will now remain
form.append('store_id')
self.assertIn('store_id', form)
view.configure_form(form)
self.assertIn('store_id', form)
self.assertNotIn('pending_customer', form)
schema = form.get_schema()
self.assertIsInstance(schema['total_price'].typ, WuttaMoney)
@ -1272,13 +1324,6 @@ class TestOrderView(WebTestCase):
class OrderItemViewTestMixin:
def test_common_order_handler(self):
view = self.make_view()
handler = view.order_handler
self.assertIsInstance(handler, OrderHandler)
handler2 = view.get_order_handler()
self.assertIs(handler2, handler)
def test_common_get_fallback_templates(self):
view = self.make_view()
@ -1294,18 +1339,29 @@ class OrderItemViewTestMixin:
def test_common_configure_grid(self):
model = self.app.model
view = self.make_view()
grid = view.make_grid(model_class=model.OrderItem)
self.assertNotIn('order_id', grid.linked_columns)
view.configure_grid(grid)
self.assertIn('order_id', grid.linked_columns)
def test_common_render_order_id(self):
# store_id is removed by default
grid = view.make_grid(model_class=model.OrderItem)
grid.append('store_id')
self.assertIn('store_id', grid.columns)
view.configure_grid(grid)
self.assertNotIn('store_id', grid.columns)
# store_id is shown if configured
self.config.setdefault('sideshow.orders.expose_store_id', 'true')
grid = view.make_grid(model_class=model.OrderItem)
grid.append('store_id')
self.assertIn('store_id', grid.columns)
view.configure_grid(grid)
self.assertIn('store_id', grid.columns)
def test_common_render_order_attr(self):
model = self.app.model
view = self.make_view()
order = model.Order(order_id=42)
item = model.OrderItem()
order.items.append(item)
self.assertEqual(view.render_order_id(item, None, None), 42)
self.assertEqual(view.render_order_attr(item, 'order_id', None), 42)
def test_common_render_status_code(self):
enum = self.app.enum