Improve grids for custorder items
main grid as well as rows grid for Pending Product
This commit is contained in:
		
							parent
							
								
									67ec6f7773
								
							
						
					
					
						commit
						e793ba6630
					
				
					 3 changed files with 103 additions and 58 deletions
				
			
		| 
						 | 
				
			
			@ -3,27 +3,6 @@
 | 
			
		|||
 | 
			
		||||
<%def name="object_helpers()">
 | 
			
		||||
  ${parent.object_helpers()}
 | 
			
		||||
  % if instance.custorder_item_records:
 | 
			
		||||
      <nav class="panel">
 | 
			
		||||
        <p class="panel-heading">Cross-Reference</p>
 | 
			
		||||
        <div class="panel-block">
 | 
			
		||||
          <div style="display: flex; flex-direction: column;">
 | 
			
		||||
            <p class="block">
 | 
			
		||||
              This ${model_title} is referenced by the following<br />
 | 
			
		||||
              Customer Order Items:
 | 
			
		||||
            </p>
 | 
			
		||||
            <ul class="list">
 | 
			
		||||
              % for item in instance.custorder_item_records:
 | 
			
		||||
                  <li class="list-item">
 | 
			
		||||
                    ${h.link_to('#{}-{}'.format(item.order.id, item.sequence), url('custorders.items.view', uuid=item.uuid))}
 | 
			
		||||
                  </li>
 | 
			
		||||
              % endfor
 | 
			
		||||
            </ul>
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
      </nav>
 | 
			
		||||
  % endif
 | 
			
		||||
 | 
			
		||||
  % if instance.status_code == enum.PENDING_PRODUCT_STATUS_PENDING and master.has_perm('resolve_product'):
 | 
			
		||||
      <nav class="panel">
 | 
			
		||||
        <p class="panel-heading">Tools</p>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,14 +58,18 @@ class CustomerOrderItemView(MasterView):
 | 
			
		|||
    grid_columns = [
 | 
			
		||||
        'order_id',
 | 
			
		||||
        'person',
 | 
			
		||||
        '_product_key_',
 | 
			
		||||
        'product_brand',
 | 
			
		||||
        'product_description',
 | 
			
		||||
        'product_size',
 | 
			
		||||
        'department_name',
 | 
			
		||||
        'case_quantity',
 | 
			
		||||
        'order_quantity',
 | 
			
		||||
        'order_uom',
 | 
			
		||||
        'case_quantity',
 | 
			
		||||
        'total_price',
 | 
			
		||||
        'order_created',
 | 
			
		||||
        'status_code',
 | 
			
		||||
        'flagged',
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    has_rows = True
 | 
			
		||||
| 
						 | 
				
			
			@ -114,42 +118,55 @@ class CustomerOrderItemView(MasterView):
 | 
			
		|||
                               .joinedload(model.CustomerOrder.person))
 | 
			
		||||
 | 
			
		||||
    def configure_grid(self, g):
 | 
			
		||||
        super(CustomerOrderItemView, self).configure_grid(g)
 | 
			
		||||
        super().configure_grid(g)
 | 
			
		||||
        batch_handler = self.get_batch_handler()
 | 
			
		||||
 | 
			
		||||
        # order_id
 | 
			
		||||
        g.set_renderer('order_id', self.render_order_id)
 | 
			
		||||
        g.set_link('order_id')
 | 
			
		||||
 | 
			
		||||
        g.set_joiner('person', lambda q: q.outerjoin(model.Person))
 | 
			
		||||
 | 
			
		||||
        g.filters['person'] = g.make_filter('person', model.Person.display_name,
 | 
			
		||||
                                            default_active=True, default_verb='contains')
 | 
			
		||||
 | 
			
		||||
        g.set_sorter('person', model.Person.display_name)
 | 
			
		||||
        g.set_sorter('order_created', model.CustomerOrder.created)
 | 
			
		||||
 | 
			
		||||
        g.set_sort_defaults('order_created', 'desc')
 | 
			
		||||
 | 
			
		||||
        g.set_type('case_quantity', 'quantity')
 | 
			
		||||
        g.set_type('cases_ordered', 'quantity')
 | 
			
		||||
        g.set_type('units_ordered', 'quantity')
 | 
			
		||||
        g.set_type('total_price', 'currency')
 | 
			
		||||
        g.set_type('order_quantity', 'quantity')
 | 
			
		||||
 | 
			
		||||
        g.set_enum('order_uom', self.enum.UNIT_OF_MEASURE)
 | 
			
		||||
 | 
			
		||||
        g.set_renderer('person', self.render_person_text)
 | 
			
		||||
        g.set_renderer('order_created', self.render_order_created)
 | 
			
		||||
 | 
			
		||||
        g.set_renderer('status_code', self.render_status_code_column)
 | 
			
		||||
 | 
			
		||||
        # person
 | 
			
		||||
        g.set_label('person', "Person Name")
 | 
			
		||||
        g.set_renderer('person', self.render_person_text)
 | 
			
		||||
        g.set_link('person')
 | 
			
		||||
        g.set_joiner('person', lambda q: q.outerjoin(model.Person))
 | 
			
		||||
        g.set_sorter('person', model.Person.display_name)
 | 
			
		||||
        g.set_filter('person', model.Person.display_name,
 | 
			
		||||
                     default_active=True, default_verb='contains')
 | 
			
		||||
 | 
			
		||||
        # product_key
 | 
			
		||||
        field = self.get_product_key_field()
 | 
			
		||||
        g.set_renderer(field, lambda item, field: getattr(item, f'product_{field}'))
 | 
			
		||||
 | 
			
		||||
        # product_*
 | 
			
		||||
        g.set_label('product_brand', "Brand")
 | 
			
		||||
        g.set_link('product_brand')
 | 
			
		||||
        g.set_label('product_description', "Description")
 | 
			
		||||
        g.set_link('product_description')
 | 
			
		||||
        g.set_label('product_size', "Size")
 | 
			
		||||
 | 
			
		||||
        g.set_link('order_id')
 | 
			
		||||
        g.set_link('person')
 | 
			
		||||
        g.set_link('product_brand')
 | 
			
		||||
        g.set_link('product_description')
 | 
			
		||||
        # "numbers"
 | 
			
		||||
        g.set_type('case_quantity', 'quantity')
 | 
			
		||||
        g.set_type('order_quantity', 'quantity')
 | 
			
		||||
        g.set_type('total_price', 'currency')
 | 
			
		||||
        # TODO: deprecate / remove these
 | 
			
		||||
        g.set_type('cases_ordered', 'quantity')
 | 
			
		||||
        g.set_type('units_ordered', 'quantity')
 | 
			
		||||
 | 
			
		||||
        # order_uom
 | 
			
		||||
        # nb. this is not relevant if "case orders only"
 | 
			
		||||
        if not batch_handler.allow_unit_orders():
 | 
			
		||||
            g.remove('order_uom')
 | 
			
		||||
        else:
 | 
			
		||||
            g.set_enum('order_uom', self.enum.UNIT_OF_MEASURE)
 | 
			
		||||
 | 
			
		||||
        # order_created
 | 
			
		||||
        g.set_renderer('order_created', self.render_order_created)
 | 
			
		||||
        g.set_sorter('order_created', model.CustomerOrder.created)
 | 
			
		||||
        g.set_sort_defaults('order_created', 'desc')
 | 
			
		||||
 | 
			
		||||
        # status_code
 | 
			
		||||
        g.set_renderer('status_code', self.render_status_code_column)
 | 
			
		||||
 | 
			
		||||
    def render_order_id(self, item, field):
 | 
			
		||||
        return item.order.id
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2257,15 +2257,28 @@ class PendingProductView(MasterView):
 | 
			
		|||
    # TODO: add support for this someday
 | 
			
		||||
    rows_viewable = False
 | 
			
		||||
 | 
			
		||||
    # TODO: this clearly needs help
 | 
			
		||||
    row_labels = {
 | 
			
		||||
        'order_id': "Order ID",
 | 
			
		||||
        'product_brand': "Brand",
 | 
			
		||||
        'product_description': "Description",
 | 
			
		||||
        'product_size': "Size",
 | 
			
		||||
        'order_created': "Ordered",
 | 
			
		||||
        'status_code': "Status",
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    row_grid_columns = [
 | 
			
		||||
        # 'upc',
 | 
			
		||||
        'brand_name',
 | 
			
		||||
        'description',
 | 
			
		||||
        'size',
 | 
			
		||||
        'vendor_name',
 | 
			
		||||
        # 'regular_price',
 | 
			
		||||
        # 'current_price',
 | 
			
		||||
        'order_id',
 | 
			
		||||
        'customer',
 | 
			
		||||
        'person',
 | 
			
		||||
        '_product_key_',
 | 
			
		||||
        'product_brand',
 | 
			
		||||
        'product_description',
 | 
			
		||||
        'product_size',
 | 
			
		||||
        'order_quantity',
 | 
			
		||||
        'total_price',
 | 
			
		||||
        'order_created',
 | 
			
		||||
        'status_code',
 | 
			
		||||
        'flagged',
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    def configure_grid(self, g):
 | 
			
		||||
| 
						 | 
				
			
			@ -2468,6 +2481,42 @@ class PendingProductView(MasterView):
 | 
			
		|||
    def get_parent(self, item):
 | 
			
		||||
        return item.pending_product
 | 
			
		||||
 | 
			
		||||
    def configure_row_grid(self, g):
 | 
			
		||||
        super().configure_row_grid(g)
 | 
			
		||||
        app = self.get_rattail_app()
 | 
			
		||||
 | 
			
		||||
        # order_id
 | 
			
		||||
        g.set_renderer('order_id', lambda item, field: item.order.id)
 | 
			
		||||
 | 
			
		||||
        # contact
 | 
			
		||||
        handler = app.get_batch_handler('custorder')
 | 
			
		||||
        if handler.new_order_requires_customer():
 | 
			
		||||
            g.remove('person')
 | 
			
		||||
            g.set_renderer('customer', lambda item, field: item.order.customer)
 | 
			
		||||
        else:
 | 
			
		||||
            g.remove('customer')
 | 
			
		||||
            g.set_renderer('person', lambda item, field: item.order.person)
 | 
			
		||||
 | 
			
		||||
        # product_key
 | 
			
		||||
        field = self.get_product_key_field()
 | 
			
		||||
        if not self.rows_viewable:
 | 
			
		||||
            g.set_link(field, False)
 | 
			
		||||
        g.set_renderer(field, lambda item, field: getattr(item, f'product_{field}'))
 | 
			
		||||
 | 
			
		||||
        # "numbers"
 | 
			
		||||
        g.set_type('order_quantity', 'quantity')
 | 
			
		||||
        g.set_type('total_price', 'currency')
 | 
			
		||||
 | 
			
		||||
        # order_created
 | 
			
		||||
        g.set_renderer('order_created',
 | 
			
		||||
                       lambda item, field: raw_datetime(self.rattail_config,
 | 
			
		||||
                                                        app.localtime(item.order.created,
 | 
			
		||||
                                                                      from_utc=True),
 | 
			
		||||
                                                        as_date=True))
 | 
			
		||||
 | 
			
		||||
        # status_code
 | 
			
		||||
        g.set_enum('status_code', self.enum.CUSTORDER_ITEM_STATUS)
 | 
			
		||||
 | 
			
		||||
    @classmethod
 | 
			
		||||
    def defaults(cls, config):
 | 
			
		||||
        cls._defaults(config)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue