diff --git a/rattail_demo/config.py b/rattail_demo/config.py
index 1ff335b..8cd6ccb 100644
--- a/rattail_demo/config.py
+++ b/rattail_demo/config.py
@@ -18,3 +18,4 @@ class DemoConfigExtension(ConfigExtension):
# tell rattail where our stuff lives
config.setdefault('rattail.mail', 'emails', 'rattail_demo.emails')
+ config.setdefault('tailbone', 'menus', 'rattail_demo.web.menus')
diff --git a/rattail_demo/web/menus.py b/rattail_demo/web/menus.py
new file mode 100644
index 0000000..37a818a
--- /dev/null
+++ b/rattail_demo/web/menus.py
@@ -0,0 +1,232 @@
+# -*- coding: utf-8; -*-
+"""
+Web Menus
+"""
+
+from __future__ import unicode_literals, absolute_import
+
+
+def simple_menus(request):
+ url = request.route_url
+
+ menus = [
+ {
+ 'title': "Time Clock",
+ 'type': 'menu',
+ 'items': [
+ {
+ 'title': "Personal Schedule",
+ 'url': url('schedule.employee'),
+ 'perm': 'schedule.view',
+ },
+ {
+ 'title': "Full Schedule",
+ 'url': url('schedule'),
+ 'perm': 'schedule.viewall',
+ },
+ {
+ 'title': "Edit Schedule",
+ 'url': url('schedule.edit'),
+ 'perm': 'schedule.edit',
+ },
+ {
+ 'title': "Raw Scheduled Shifts",
+ 'url': url('scheduledshifts'),
+ 'perm': 'scheduledshifts.list',
+ },
+ ],
+ },
+ {
+ 'title': "Products",
+ 'type': 'menu',
+ 'items': [
+ {
+ 'title': "Products",
+ 'url': url('products'),
+ 'perm': 'products.list',
+ },
+ {
+ 'title': "Vendors",
+ 'url': url('vendors'),
+ 'perm': 'vendors.list',
+ },
+ {
+ 'title': "Departments",
+ 'url': url('departments'),
+ 'perm': 'departments.list',
+ },
+ {
+ 'title': "Subdepartments",
+ 'url': url('subdepartments'),
+ 'perm': 'subdepartments.list',
+ },
+ {
+ 'title': "Brands",
+ 'url': url('brands'),
+ 'perm': 'brands.list',
+ },
+ {
+ 'title': "Families",
+ 'url': url('families'),
+ 'perm': 'families.list',
+ },
+ {
+ 'title': "Report Codes",
+ 'url': url('reportcodes'),
+ 'perm': 'reportcodes.list',
+ },
+ ],
+ },
+ {
+ 'title': "People",
+ 'type': 'menu',
+ 'items': [
+ {
+ 'title': "All People",
+ 'url': url('people'),
+ 'perm': 'people.list',
+ },
+ {
+ 'title': "Customers",
+ 'url': url('customers'),
+ 'perm': 'customers.list',
+ },
+ {
+ 'title': "Employees",
+ 'url': url('employees'),
+ 'perm': 'employees.list',
+ },
+ ],
+ },
+ {
+ 'title': "CORE-POS",
+ 'type': 'menu',
+ 'items': [
+ {
+ 'title': "Departments",
+ 'url': url('corepos.departments'),
+ 'perm': 'corepos.departments.list',
+ },
+ {
+ 'title': "Subdepartments",
+ 'url': url('corepos.subdepartments'),
+ 'perm': 'corepos.subdepartments.list',
+ },
+ {
+ 'title': "Vendors",
+ 'url': url('corepos.vendors'),
+ 'perm': 'corepos.vendors.list',
+ },
+ {
+ 'title': "Products",
+ 'url': url('corepos.products'),
+ 'perm': 'corepos.products.list',
+ },
+ {
+ 'title': "Customers",
+ 'url': url('corepos.customers'),
+ 'perm': 'corepos.customers.list',
+ },
+ {
+ 'title': "Employees",
+ 'url': url('corepos.employees'),
+ 'perm': 'corepos.employees.list',
+ },
+ {
+ 'title': "Transaction Details",
+ 'url': url('corepos.transaction_details'),
+ 'perm': 'corepos.transaction_details.list',
+ },
+ ],
+ },
+ {
+ 'title': "Batches",
+ 'type': 'menu',
+ 'items': [
+ {
+ 'title': "Handheld",
+ 'url': url('batch.handheld'),
+ 'perm': 'batch.handheld.list',
+ },
+ {
+ 'title': "Inventory",
+ 'url': url('batch.inventory'),
+ 'perm': 'batch.inventory.list',
+ },
+ {
+ 'title': "Import / Export",
+ 'url': url('batch.importer'),
+ 'perm': 'batch.importer.list',
+ },
+ ],
+ },
+ {
+ 'title': "TempMon",
+ 'type': 'menu',
+ 'items': [
+ {
+ 'title': "Clients",
+ 'url': url('tempmon.clients'),
+ 'perm': 'tempmon.clients.list',
+ },
+ {
+ 'title': "Probes",
+ 'url': url('tempmon.probes'),
+ 'perm': 'tempmon.probes.list',
+ },
+ {
+ 'title': "Readings",
+ 'url': url('tempmon.readings'),
+ 'perm': 'tempmon.readings.list',
+ },
+ ],
+ },
+ {
+ 'title': "Admin",
+ 'type': 'menu',
+ 'items': [
+ {
+ 'title': "Stores",
+ 'url': url('stores'),
+ 'perm': 'stores.list',
+ },
+ {
+ 'title': "Users",
+ 'url': url('users'),
+ 'perm': 'users.list',
+ },
+ {
+ 'title': "User Events",
+ 'url': url('userevents'),
+ 'perm': 'userevents.list',
+ },
+ {
+ 'title': "Roles",
+ 'url': url('roles'),
+ 'perm': 'roles.list',
+ },
+ {
+ 'title': "Email Settings",
+ 'url': url('emailprofiles'),
+ 'perm': 'emailprofiles.list',
+ },
+ {
+ 'title': "Raw Settings",
+ 'url': url('settings'),
+ 'perm': 'settings.list',
+ },
+ {
+ 'title': "DataSync Changes",
+ 'url': url('datasyncchanges'),
+ 'perm': 'datasync.list',
+ },
+ {
+ 'title': "Rattail Demo Upgrades",
+ 'url': url('upgrades'),
+ 'perm': 'upgrades.list',
+ },
+ ],
+ },
+ ]
+
+ return menus
diff --git a/rattail_demo/web/templates/menu.mako b/rattail_demo/web/templates/menu.mako
index d8bdad0..966e724 100644
--- a/rattail_demo/web/templates/menu.mako
+++ b/rattail_demo/web/templates/menu.mako
@@ -1,161 +1,58 @@
## -*- coding: utf-8; -*-
+<%def name="make_simple_menu()">
+
+ % for topitem in menus:
+
+ ${topitem.title}
+
+ % for subitem in topitem.items:
+ - ${h.link_to(subitem.title, subitem.url)}
+ % endfor
+
+
+ % endfor
+
+ ## User Menu
+ % if request.user:
+
+ ${request.user}${" ({})".format(inbox_count) if inbox_count else ''}
+
+ % if request.is_root:
+ - ${h.link_to("Stop being root", url('stop_root'))}
+ % elif request.is_admin:
+ - ${h.link_to("Become root", url('become_root'))}
+ % endif
+ - ${h.link_to("Messages{}".format(" ({})".format(inbox_count) if inbox_count else ''), url('messages.inbox'))}
+ - ${h.link_to("Change Password", url('change_password'))}
+ - ${h.link_to("Logout", url('logout'))}
+
+
+ % else:
+ ${h.link_to("Login", url('login'))}
+ % endif
+
+%def>
+
<%def name="main_menu_items()">
- % if request.has_any_perm('schedule.view', 'schedule.viewall', 'schedule.edit', 'scheduledshifts.list'):
-
- Time Clock
-
- % if request.has_perm('schedule.view'):
- - ${h.link_to("Personal Schedule", url('schedule.employee'))}
- % endif
- % if request.has_perm('schedule.viewall'):
- - ${h.link_to("Full Schedule", url('schedule'))}
- % endif
- % if request.has_perm('schedule.edit'):
- - ${h.link_to("Edit Schedule", url('schedule.edit'))}
- % endif
- % if request.has_perm('scheduledshifts.list'):
- - ${h.link_to("Raw Scheduled Shifts", url('scheduledshifts'))}
- % endif
-
-
- % endif
+ % if request.rattail_config.getbool('tailbone', 'menus.simple', default=False):
+ ${self.make_simple_menu()}
+ % else:
- % if request.has_any_perm('products.list', 'vendors.list', 'departments.list', 'subdepartments.list', 'brands.list', 'families.list', 'reportcodes.list'):
-
- Products
-
- % if request.has_perm('products.list'):
- - ${h.link_to("Products", url('products'))}
- % endif
- % if request.has_perm('vendors.list'):
- - ${h.link_to("Vendors", url('vendors'))}
- % endif
- % if request.has_perm('departments.list'):
- - ${h.link_to("Departments", url('departments'))}
- % endif
- % if request.has_perm('subdepartments.list'):
- - ${h.link_to("Subdepartments", url('subdepartments'))}
- % endif
- % if request.has_perm('brands.list'):
- - ${h.link_to("Brands", url('brands'))}
- % endif
- % if request.has_perm('families.list'):
- - ${h.link_to("Families", url('families'))}
- % endif
- % if request.has_perm('reportcodes.list'):
- - ${h.link_to("Report Codes", url('reportcodes'))}
- % endif
-
-
- % endif
-
- % if request.has_any_perm('people.list', 'customers.list', 'employees.list'):
-
- People
-
- % if request.has_perm('people.list'):
- - ${h.link_to("All People", url('people'))}
- % endif
- % if request.has_perm('customers.list'):
- - ${h.link_to("Customers", url('customers'))}
- % endif
- % if request.has_perm('employees.list'):
- - ${h.link_to("Employees", url('employees'))}
- % endif
-
-
- % endif
-
- % if request.has_any_perm('corepos.departments.list', 'corepos.subdepartments.list', 'corepos.vendors.list', 'corepos.products.list', 'corepos.customers.list', 'corepos.employees.list', 'corepos.transaction_details.list'):
-
- CORE-POS
-
- % if request.has_perm('corepos.departments.list'):
- - ${h.link_to("Departments", url('corepos.departments'))}
- % endif
- % if request.has_perm('corepos.subdepartments.list'):
- - ${h.link_to("Subdepartments", url('corepos.subdepartments'))}
- % endif
- % if request.has_perm('corepos.vendors.list'):
- - ${h.link_to("Vendors", url('corepos.vendors'))}
- % endif
- % if request.has_perm('corepos.products.list'):
- - ${h.link_to("Products", url('corepos.products'))}
- % endif
- % if request.has_perm('corepos.customers.list'):
- - ${h.link_to("Customers", url('corepos.customers'))}
- % endif
- % if request.has_perm('corepos.employees.list'):
- - ${h.link_to("Employees", url('corepos.employees'))}
- % endif
- % if request.has_perm('corepos.transaction_details.list'):
- - ${h.link_to("Transaction Details", url('corepos.transaction_details'))}
- % endif
-
-
- % endif
-
- % if request.has_any_perm('batch.handheld.list', 'batch.inventory.list', 'batch.importer.list'):
-
- Batches
-
- % if request.has_perm('batch.handheld.list'):
- - ${h.link_to("Handheld", url('batch.handheld'))}
- % endif
- % if request.has_perm('batch.inventory.list'):
- - ${h.link_to("Inventory", url('batch.inventory'))}
- % endif
- % if request.has_perm('batch.importer.list'):
- - ${h.link_to("Import / Export", url('batch.importer'))}
- % endif
-
-
- % endif
-
- % if request.has_any_perm('tempmon.clients.list', 'tempmon.probes.list', 'tempmon.readings.list'):
-
- TempMon
-
- % if request.has_perm('tempmon.clients.list'):
- - ${h.link_to("Clients", url('tempmon.clients'))}
- % endif
- % if request.has_perm('tempmon.probes.list'):
- - ${h.link_to("Probes", url('tempmon.probes'))}
- % endif
- % if request.has_perm('tempmon.readings.list'):
- - ${h.link_to("Readings", url('tempmon.readings'))}
- % endif
-
-
- % endif
-
- % if request.has_any_perm('stores.list', 'users.list', 'userevents.list', 'roles.list', 'emailprofiles.list', 'datasync.list', 'settings.list', 'upgrades.list'):
+ % if request.has_any_perm('users.list', 'roles.list', 'settings.list', 'upgrades.list'):
Admin
- % if request.has_perm('stores.list'):
- - ${h.link_to("Stores", url('stores'))}
- % endif
% if request.has_perm('users.list'):
- ${h.link_to("Users", url('users'))}
% endif
- % if request.has_perm('userevents.list'):
- - ${h.link_to("User Events", url('userevents'))}
- % endif
% if request.has_perm('roles.list'):
- ${h.link_to("Roles", url('roles'))}
% endif
- % if request.has_perm('emailprofiles.list'):
- - ${h.link_to("Email Settings", url('emailprofiles'))}
- % endif
% if request.has_perm('settings.list'):
- ${h.link_to("Raw Settings", url('settings'))}
% endif
- % if request.has_perm('datasync.list'):
- - ${h.link_to("DataSync Changes", url('datasyncchanges'))}
- % endif
% if request.has_perm('upgrades.list'):
- ${h.link_to("Rattail Demo Upgrades", url('upgrades'))}
% endif
@@ -181,4 +78,5 @@
- ${h.link_to("Login", url('login'))}
% endif
+ % endif
%def>
diff --git a/rattail_demo/web/templates/themes/bobcat/menu.mako b/rattail_demo/web/templates/themes/bobcat/menu.mako
index 10fe535..5cd4fe3 100644
--- a/rattail_demo/web/templates/themes/bobcat/menu.mako
+++ b/rattail_demo/web/templates/themes/bobcat/menu.mako
@@ -1,170 +1,67 @@
## -*- coding: utf-8; -*-
-<%def name="main_menu_items()">
+<%def name="make_simple_menu()">
- ## Time Clock
- % if request.has_any_perm('schedule.view', 'schedule.viewall', 'schedule.edit', 'scheduledshifts.list'):
+ % for topitem in menus:
-
Time Clock
+
${topitem.title}
- % if request.has_perm('schedule.view'):
- ${h.link_to("Personal Schedule", url('schedule.employee'), class_='navbar-item')}
- % endif
- % if request.has_perm('schedule.viewall'):
- ${h.link_to("Full Schedule", url('schedule'), class_='navbar-item')}
- % endif
- % if request.has_perm('schedule.edit'):
- ${h.link_to("Edit Schedule", url('schedule.edit'), class_='navbar-item')}
- % endif
- % if request.has_perm('scheduledshifts.list'):
- ${h.link_to("Raw Scheduled Shifts", url('scheduledshifts'), class_='navbar-item')}
- % endif
+ % for subitem in topitem.items:
+ ${h.link_to(subitem.title, subitem.url, class_='navbar-item root-user')}
+ % endfor
+ % endfor
+
+
+
+
+ ## User Menu
+ % if request.user:
+
+
${request.user}${" ({})".format(inbox_count) if inbox_count else ''}
+
+ % if request.is_root:
+ ${h.link_to("Stop being root", url('stop_root'), class_='navbar-item root-user')}
+ % elif request.is_admin:
+ ${h.link_to("Become root", url('become_root'), class_='navbar-item root-user')}
+ % endif
+ ${h.link_to("Messages{}".format(" ({})".format(inbox_count) if inbox_count else ''), url('messages.inbox'), class_='navbar-item')}
+ ${h.link_to("Change Password", url('change_password'), class_='navbar-item')}
+ ${h.link_to("Logout", url('logout'), class_='navbar-item')}
+
+
+ % else:
+ ${h.link_to("Login", url('login'), class_='navbar-item')}
% endif
- ## Products
- % if request.has_any_perm('products.list', 'vendors.list', 'departments.list', 'subdepartments.list', 'brands.list', 'families.list', 'reportcodes.list'):
-
-
Products
-
- % if request.has_perm('products.list'):
- ${h.link_to("Products", url('products'), class_='navbar-item')}
- % endif
- % if request.has_perm('vendors.list'):
- ${h.link_to("Vendors", url('vendors'), class_='navbar-item')}
- % endif
- % if request.has_perm('departments.list'):
- ${h.link_to("Departments", url('departments'), class_='navbar-item')}
- % endif
- % if request.has_perm('subdepartments.list'):
- ${h.link_to("Subdepartments", url('subdepartments'), class_='navbar-item')}
- % endif
- % if request.has_perm('brands.list'):
- ${h.link_to("Brands", url('brands'), class_='navbar-item')}
- % endif
- % if request.has_perm('families.list'):
- ${h.link_to("Families", url('families'), class_='navbar-item')}
- % endif
- % if request.has_perm('reportcodes.list'):
- ${h.link_to("Report Codes", url('reportcodes'), class_='navbar-item')}
- % endif
-
-
- % endif
+
+%def>
- ## People
- % if request.has_any_perm('people.list', 'customers.list', 'employees.list'):
-
-
People
-
- % if request.has_perm('people.list'):
- ${h.link_to("All People", url('people'), class_='navbar-item')}
- % endif
- % if request.has_perm('customers.list'):
- ${h.link_to("Customers", url('customers'), class_='navbar-item')}
- % endif
- % if request.has_perm('employees.list'):
- ${h.link_to("Employees", url('employees'), class_='navbar-item')}
- % endif
-
-
- % endif
+<%def name="main_menu_items()">
- ## CORE-POS
- % if request.has_any_perm('corepos.departments.list', 'corepos.subdepartments.list', 'corepos.vendors.list', 'corepos.products.list', 'corepos.customers.list', 'corepos.employees.list', 'corepos.transaction_details.list'):
-
-
CORE-POS
-
- % if request.has_perm('corepos.departments.list'):
- ${h.link_to("Departments", url('corepos.departments'), class_='navbar-item')}
- % endif
- % if request.has_perm('corepos.subdepartments.list'):
- ${h.link_to("Subdepartments", url('corepos.subdepartments'), class_='navbar-item')}
- % endif
- % if request.has_perm('corepos.vendors.list'):
- ${h.link_to("Vendors", url('corepos.vendors'), class_='navbar-item')}
- % endif
- % if request.has_perm('corepos.products.list'):
- ${h.link_to("Products", url('corepos.products'), class_='navbar-item')}
- % endif
- % if request.has_perm('corepos.customers.list'):
- ${h.link_to("Customers", url('corepos.customers'), class_='navbar-item')}
- % endif
- % if request.has_perm('corepos.employees.list'):
- ${h.link_to("Employees", url('corepos.employees'), class_='navbar-item')}
- % endif
- % if request.has_perm('corepos.transaction_details.list'):
- ${h.link_to("Transaction Details", url('corepos.transaction_details'), class_='navbar-item')}
- % endif
-
-
- % endif
+ % if request.rattail_config.getbool('tailbone', 'menus.simple', default=False):
+ ${self.make_simple_menu()}
+ % else:
- ## Batches
- % if request.has_any_perm('batch.handheld.list', 'batch.inventory.list', 'batch.importer.list'):
-
-
Batches
-
- % if request.has_perm('batch.handheld.list'):
- ${h.link_to("Handheld", url('batch.handheld'), class_='navbar-item')}
- % endif
- % if request.has_perm('batch.inventory.list'):
- ${h.link_to("Inventory", url('batch.inventory'), class_='navbar-item')}
- % endif
- % if request.has_perm('batch.importer.list'):
- ${h.link_to("Import / Export", url('batch.importer'), class_='navbar-item')}
- % endif
-
-
- % endif
-
- ## TempMon
- % if request.has_any_perm('tempmon.clients.list', 'tempmon.probes.list', 'tempmon.readings.list'):
-
-
TempMon
-
- % if request.has_perm('tempmon.clients.list'):
- ${h.link_to("Clients", url('tempmon.clients'), class_='navbar-item')}
- % endif
- % if request.has_perm('tempmon.probes.list'):
- ${h.link_to("Probes", url('tempmon.probes'), class_='navbar-item')}
- % endif
- % if request.has_perm('tempmon.readings.list'):
- ${h.link_to("Readings", url('tempmon.readings'), class_='navbar-item')}
- % endif
-
-
- % endif
+
## Admin
- % if request.has_any_perm('stores.list', 'users.list', 'userevents.list', 'roles.list', 'emailprofiles.list', 'datasync.list', 'settings.list', 'upgrades.list'):
+ % if request.has_any_perm('users.list', 'roles.list', 'settings.list', 'upgrades.list'):
Admin
- % if request.has_perm('stores.list'):
- ${h.link_to("Stores", url('stores'), class_='navbar-item')}
- % endif
% if request.has_perm('users.list'):
${h.link_to("Users", url('users'), class_='navbar-item')}
% endif
- % if request.has_perm('userevents.list'):
- ${h.link_to("User Events", url('userevents'), class_='navbar-item')}
- % endif
% if request.has_perm('roles.list'):
${h.link_to("Roles", url('roles'), class_='navbar-item')}
% endif
- % if request.has_perm('emailprofiles.list'):
- ${h.link_to("Email Settings", url('emailprofiles'), class_='navbar-item')}
- % endif
% if request.has_perm('settings.list'):
${h.link_to("Raw Settings", url('settings'), class_='navbar-item')}
% endif
- % if request.has_perm('datasync.list'):
- ${h.link_to("DataSync Changes", url('datasyncchanges'), class_='navbar-item')}
- % endif
% if request.has_perm('upgrades.list'):
${h.link_to("Rattail Demo Upgrades", url('upgrades'), class_='navbar-item')}
% endif
@@ -195,4 +92,6 @@
% endif
+
+ % endif
%def>