Add full set of default menus
plus dynamic set of integration menus, from providers
This commit is contained in:
		
							parent
							
								
									39d53617bd
								
							
						
					
					
						commit
						9d2bcff96b
					
				
					 3 changed files with 269 additions and 95 deletions
				
			
		|  | @ -26,8 +26,12 @@ Tailbone Handler | ||||||
| 
 | 
 | ||||||
| from __future__ import unicode_literals, absolute_import | from __future__ import unicode_literals, absolute_import | ||||||
| 
 | 
 | ||||||
|  | import six | ||||||
|  | 
 | ||||||
| from rattail.app import GenericHandler | from rattail.app import GenericHandler | ||||||
| 
 | 
 | ||||||
|  | from tailbone.providers import get_all_providers | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| class TailboneHandler(GenericHandler): | class TailboneHandler(GenericHandler): | ||||||
|     """ |     """ | ||||||
|  | @ -46,4 +50,9 @@ class TailboneHandler(GenericHandler): | ||||||
|                                    default='tailbone.menus:MenuHandler') |                                    default='tailbone.menus:MenuHandler') | ||||||
|             Handler = self.app.load_object(spec) |             Handler = self.app.load_object(spec) | ||||||
|             self.menu_handler = Handler(self.config) |             self.menu_handler = Handler(self.config) | ||||||
|  |             self.menu_handler.tb = self | ||||||
|         return self.menu_handler |         return self.menu_handler | ||||||
|  | 
 | ||||||
|  |     def iter_providers(self): | ||||||
|  |         providers = get_all_providers(self.config) | ||||||
|  |         return six.itervalues(providers) | ||||||
|  |  | ||||||
|  | @ -258,24 +258,191 @@ class MenuHandler(GenericHandler): | ||||||
|         This method provides a semi-sane menu set by default, but it |         This method provides a semi-sane menu set by default, but it | ||||||
|         is expected for most apps to override it. |         is expected for most apps to override it. | ||||||
|         """ |         """ | ||||||
|         return [ |         menus = [ | ||||||
|             self.make_admin_menu(request), |             self.make_people_menu(request), | ||||||
|  |             self.make_products_menu(request), | ||||||
|  |             self.make_vendors_menu(request), | ||||||
|         ] |         ] | ||||||
| 
 | 
 | ||||||
|     def make_admin_menu(self, request, include_stores=False, **kwargs): |         integration_menus = self.make_integration_menus(request) | ||||||
|  |         if integration_menus: | ||||||
|  |             menus.extend(integration_menus) | ||||||
|  | 
 | ||||||
|  |         menus.extend([ | ||||||
|  |             # TODO: add reporting menu | ||||||
|  |             self.make_batches_menu(request), | ||||||
|  |             self.make_admin_menu(request), | ||||||
|  |         ]) | ||||||
|  | 
 | ||||||
|  |         return menus | ||||||
|  | 
 | ||||||
|  |     def make_integration_menus(self, request, **kwargs): | ||||||
|  |         """ | ||||||
|  |         Make a set of menus for all registered system integrations. | ||||||
|  |         """ | ||||||
|  |         menus = [] | ||||||
|  |         for provider in self.tb.iter_providers(): | ||||||
|  |             menu = provider.make_integration_menu(request) | ||||||
|  |             if menu: | ||||||
|  |                 menus.append(menu) | ||||||
|  |         menus.sort(key=lambda menu: menu['title'].lower()) | ||||||
|  |         return menus | ||||||
|  | 
 | ||||||
|  |     def make_people_menu(self, request, **kwargs): | ||||||
|  |         """ | ||||||
|  |         Generate a typical People menu | ||||||
|  |         """ | ||||||
|  |         return { | ||||||
|  |             'title': "People", | ||||||
|  |             'type': 'menu', | ||||||
|  |             'items': [ | ||||||
|  |                 { | ||||||
|  |                     'title': "Members", | ||||||
|  |                     'route': 'members', | ||||||
|  |                     'perm': 'members.list', | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     'title': "Customers", | ||||||
|  |                     'route': 'customers', | ||||||
|  |                     'perm': 'customers.list', | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     'title': "Customer Groups", | ||||||
|  |                     'route': 'customergroups', | ||||||
|  |                     'perm': 'customergroups.list', | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     'title': "Employees", | ||||||
|  |                     'route': 'employees', | ||||||
|  |                     'perm': 'employees.list', | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     'title': "All People", | ||||||
|  |                     'route': 'people', | ||||||
|  |                     'perm': 'people.list', | ||||||
|  |                 }, | ||||||
|  |             ], | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     def make_products_menu(self, request, **kwargs): | ||||||
|  |         """ | ||||||
|  |         Generate a typical Products menu | ||||||
|  |         """ | ||||||
|  |         return { | ||||||
|  |             'title': "Products", | ||||||
|  |             'type': 'menu', | ||||||
|  |             'items': [ | ||||||
|  |                 { | ||||||
|  |                     'title': "Products", | ||||||
|  |                     'route': 'products', | ||||||
|  |                     'perm': 'products.list', | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     'title': "Departments", | ||||||
|  |                     'route': 'departments', | ||||||
|  |                     'perm': 'departments.list', | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     'title': "Subdepartments", | ||||||
|  |                     'route': 'subdepartments', | ||||||
|  |                     'perm': 'subdepartments.list', | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     'title': "Brands", | ||||||
|  |                     'route': 'brands', | ||||||
|  |                     'perm': 'brands.list', | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     'title': "Families", | ||||||
|  |                     'route': 'families', | ||||||
|  |                     'perm': 'families.list', | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     'title': "Report Codes", | ||||||
|  |                     'route': 'reportcodes', | ||||||
|  |                     'perm': 'reportcodes.list', | ||||||
|  |                 }, | ||||||
|  |             ], | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     def make_vendors_menu(self, request, **kwargs): | ||||||
|  |         """ | ||||||
|  |         Generate a typical Vendors menu | ||||||
|  |         """ | ||||||
|  |         return { | ||||||
|  |             'title': "Vendors", | ||||||
|  |             'type': 'menu', | ||||||
|  |             'items': [ | ||||||
|  |                 { | ||||||
|  |                     'title': "Vendors", | ||||||
|  |                     'route': 'vendors', | ||||||
|  |                     'perm': 'vendors.list', | ||||||
|  |                 }, | ||||||
|  |                 {'type': 'sep'}, | ||||||
|  |                 { | ||||||
|  |                     'title': "Ordering", | ||||||
|  |                     'route': 'ordering', | ||||||
|  |                     'perm': 'ordering.list', | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     'title': "Receiving", | ||||||
|  |                     'route': 'receiving', | ||||||
|  |                     'perm': 'receiving.list', | ||||||
|  |                 }, | ||||||
|  |                 {'type': 'sep'}, | ||||||
|  |                 { | ||||||
|  |                     'title': "Purchases", | ||||||
|  |                     'route': 'purchases', | ||||||
|  |                     'perm': 'purchases.list', | ||||||
|  |                 }, | ||||||
|  |                 { | ||||||
|  |                     'title': "Credits", | ||||||
|  |                     'route': 'purchases.credits', | ||||||
|  |                     'perm': 'purchases.credits.list', | ||||||
|  |                 }, | ||||||
|  |                 # {'type': 'sep'}, | ||||||
|  |                 # { | ||||||
|  |                 #     'title': "Catalogs", | ||||||
|  |                 #     'route': 'vendorcatalogs', | ||||||
|  |                 #     'perm': 'vendorcatalogs.list', | ||||||
|  |                 # }, | ||||||
|  |                 ], | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     def make_batches_menu(self, request, **kwargs): | ||||||
|  |         """ | ||||||
|  |         Generate a typical Batches menu | ||||||
|  |         """ | ||||||
|  |         return { | ||||||
|  |             'title': "Batches", | ||||||
|  |             'type': 'menu', | ||||||
|  |             'items': [ | ||||||
|  |                 { | ||||||
|  |                     'title': "Handheld", | ||||||
|  |                     'route': 'batch.handheld', | ||||||
|  |                     'perm': 'batch.handheld.list', | ||||||
|  |                 }, | ||||||
|  |                 # { | ||||||
|  |                 #     'title': "Inventory", | ||||||
|  |                 #     'route': 'batch.inventory', | ||||||
|  |                 #     'perm': 'batch.inventory.list', | ||||||
|  |                 # }, | ||||||
|  |                 ], | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     def make_admin_menu(self, request, **kwargs): | ||||||
|         """ |         """ | ||||||
|         Generate a typical Admin menu |         Generate a typical Admin menu | ||||||
|         """ |         """ | ||||||
|         items = [] |         return { | ||||||
| 
 |             'title': "Admin", | ||||||
|         if include_stores: |             'type': 'menu', | ||||||
|             items.append({ |             'items': [ | ||||||
|  |                 { | ||||||
|                     'title': "Stores", |                     'title': "Stores", | ||||||
|                     'route': 'stores', |                     'route': 'stores', | ||||||
|                     'perm': 'stores.list', |                     'perm': 'stores.list', | ||||||
|             }) |                 }, | ||||||
| 
 |  | ||||||
|         items.extend([ |  | ||||||
|                 { |                 { | ||||||
|                     'title': "Users", |                     'title': "Users", | ||||||
|                     'route': 'users', |                     'route': 'users', | ||||||
|  | @ -353,12 +520,7 @@ class MenuHandler(GenericHandler): | ||||||
|                     'route': 'upgrades', |                     'route': 'upgrades', | ||||||
|                     'perm': 'upgrades.list', |                     'perm': 'upgrades.list', | ||||||
|                 }, |                 }, | ||||||
|         ]) |             ], | ||||||
| 
 |  | ||||||
|         return { |  | ||||||
|             'title': "Admin", |  | ||||||
|             'type': 'menu', |  | ||||||
|             'items': items, |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -478,7 +640,7 @@ def make_menu_entry(request, item): | ||||||
|         try: |         try: | ||||||
|             entry['url'] = request.route_url(entry['route']) |             entry['url'] = request.route_url(entry['route']) | ||||||
|         except KeyError:        # happens if no such route |         except KeyError:        # happens if no such route | ||||||
|             log.warning("invalid route name for menu entry: %s", entry) |             log.debug("invalid route name for menu entry: %s", entry) | ||||||
|             entry['url'] = entry['route'] |             entry['url'] = entry['route'] | ||||||
|         entry['key'] = entry['route'] |         entry['key'] = entry['route'] | ||||||
|     else: |     else: | ||||||
|  |  | ||||||
|  | @ -2,7 +2,7 @@ | ||||||
| ################################################################################ | ################################################################################ | ||||||
| # | # | ||||||
| #  Rattail -- Retail Software Framework | #  Rattail -- Retail Software Framework | ||||||
| #  Copyright © 2010-2022 Lance Edgar | #  Copyright © 2010-2023 Lance Edgar | ||||||
| # | # | ||||||
| #  This file is part of Rattail. | #  This file is part of Rattail. | ||||||
| # | # | ||||||
|  | @ -48,6 +48,9 @@ class TailboneProvider(object): | ||||||
|     def get_provided_views(self): |     def get_provided_views(self): | ||||||
|         return {} |         return {} | ||||||
| 
 | 
 | ||||||
|  |     def make_integration_menu(self, request, **kwargs): | ||||||
|  |         pass | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| def get_all_providers(config): | def get_all_providers(config): | ||||||
|     """ |     """ | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Lance Edgar
						Lance Edgar