diff --git a/.gitignore b/.gitignore
index 2b0d3df..c44aa15 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-rattail_poser.egg-info/
+rattail_demo.egg-info/
diff --git a/MANIFEST.in b/MANIFEST.in
index ad763db..71cd135 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,6 +1,6 @@
# -*- mode: conf -*-
-recursive-include poser/web/static *.css
-recursive-include poser/web/static *.js
+recursive-include rattail_demo/web/static *.css
+recursive-include rattail_demo/web/static *.js
-recursive-include poser/web/templates *.mako
+recursive-include rattail_demo/web/templates *.mako
diff --git a/README.rst b/README.rst
index 1a247c1..d9633ac 100644
--- a/README.rst
+++ b/README.rst
@@ -1,6 +1,6 @@
-Rattail 'Poser'
-===============
+Rattail Demo
+============
This project serves as a working demo, to illustrate various concepts of the
Rattail software framework. See the `Rattail Wiki`_ for more info.
diff --git a/poser/web/templates/menu.mako b/poser/web/templates/menu.mako
deleted file mode 100644
index e0fa107..0000000
--- a/poser/web/templates/menu.mako
+++ /dev/null
@@ -1,139 +0,0 @@
-## -*- coding: utf-8 -*-
-
-<%def name="main_menu_items()">
-
- % if request.has_any_perm('schedule.view', 'timesheet.view'):
-
- Time Clock
-
- % if request.has_perm('schedule.view'):
- - ${h.link_to("Employee Schedule", url('schedule.employee'))}
- % endif
- % if request.has_perm('timesheet.view'):
- - ${h.link_to("Employee Time Sheet", url('timesheet.employee'))}
- % endif
- % if request.has_any_perm('schedule.viewall', 'timesheet.viewall'):
- - -
- % if request.has_perm('schedule.viewall'):
- - ${h.link_to("Full Schedule", url('schedule'))}
- % endif
- % if request.has_perm('timesheet.viewall'):
- - ${h.link_to("Full Time Sheet", url('timesheet'))}
- % endif
- % endif
-
-
- % endif
-
-
- Products
-
- % if request.has_perm('products.list'):
- - ${h.link_to("Products", url('products'))}
- % 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
-
-
-
-
- Vendors
-
- - ${h.link_to("Vendors", url('vendors'))}
- % if request.has_any_perm('vendorcatalogs.list', 'vendorcatalogs.create'):
- - -
- % if request.has_perm('vendorcatalogs.list'):
- - ${h.link_to("Catalogs", url('vendorcatalogs'))}
- % endif
- % if request.has_perm('vendorcatalogs.create'):
- - ${h.link_to("Upload New Catalog", url('vendorcatalogs.create'))}
- % endif
- % endif
-
-
-
-
- Company
-
- - ${h.link_to("Stores", url('stores'))}
- - ${h.link_to("Departments", url('departments'))}
- - ${h.link_to("Subdepartments", url('subdepartments'))}
- - -
- - ${h.link_to("Employees", url('employees'))}
- - -
- - ${h.link_to("Customers", url('customers'))}
- % if request.has_perm('customergroups.list'):
- - ${h.link_to("Customer Groups", url('customergroups'))}
- % endif
-
-
-
-
- Reports
-
- - ${h.link_to("Ordering Worksheet", url('reports.ordering'))}
- - ${h.link_to("Inventory Worksheet", url('reports.inventory'))}
-
-
-
- % if request.has_any_perm('batch.handheld.list', 'batch.inventory.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
-
-
- % endif
-
- % if request.has_any_perm('users.list', 'roles.list', 'labelprofiles.list', 'settings.list', 'emailprofiles.list', 'datasyncchanges.list'):
-
- Admin
-
- % if request.has_perm('users.list'):
- - ${h.link_to("Users", url('users'))}
- % endif
- % if request.has_perm('roles.list'):
- - ${h.link_to("Roles", url('roles'))}
- % endif
- % if request.has_perm('labelprofiles.list'):
- - ${h.link_to("Label Profiles", url('labelprofiles'))}
- % endif
- % if request.has_perm('settings.list'):
- - ${h.link_to("Settings", url('settings'))}
- % endif
- % if request.has_perm('emailprofiles.list'):
- - ${h.link_to("Email Profiles", url('emailprofiles'))}
- % endif
- % if request.has_perm('datasyncchanges.list'):
- - ${h.link_to("DataSync Changes", url('datasyncchanges'))}
- % endif
-
-
- % endif
-
- % if request.user:
-
- ${request.user}${" ({})".format(inbox_count) if inbox_count else ''}
-
- - ${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>
diff --git a/poser/__init__.py b/rattail_demo/__init__.py
similarity index 80%
rename from poser/__init__.py
rename to rattail_demo/__init__.py
index 489a9b0..30e5b51 100644
--- a/poser/__init__.py
+++ b/rattail_demo/__init__.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
"""
-Rattail 'Poser' (demo project)
+Rattail Demo
"""
from __future__ import unicode_literals, absolute_import
diff --git a/poser/_version.py b/rattail_demo/_version.py
similarity index 100%
rename from poser/_version.py
rename to rattail_demo/_version.py
diff --git a/poser/web/__init__.py b/rattail_demo/web/__init__.py
similarity index 100%
rename from poser/web/__init__.py
rename to rattail_demo/web/__init__.py
diff --git a/poser/web/app.py b/rattail_demo/web/app.py
similarity index 67%
rename from poser/web/app.py
rename to rattail_demo/web/app.py
index 9eff28d..dbb35bb 100644
--- a/poser/web/app.py
+++ b/rattail_demo/web/app.py
@@ -15,8 +15,8 @@ def main(global_config, **settings):
# set some defaults for PostgreSQL
app.provide_postgresql_settings(settings)
- # prefer Poser templates over Tailbone; use 'better' theme
- settings.setdefault('mako.directories', ['poser.web:templates',
+ # prefer demo templates over tailbone; use 'better' theme
+ settings.setdefault('mako.directories', ['rattail_demo.web:templates',
'tailbone:templates/themes/better',
'tailbone:templates',])
@@ -24,15 +24,10 @@ def main(global_config, **settings):
rattail_config = app.make_rattail_config(settings)
pyramid_config = app.make_pyramid_config(settings)
- # bring in the rest of Tailbone
+ # bring in rest of rattail-demo etc.
pyramid_config.include('tailbone.static')
pyramid_config.include('tailbone.subscribers')
- pyramid_config.include('tailbone.views')
-
- # # bring in the rest of Poser
- # pyramid_config.include('poser.web.subscribers')
- # pyramid_config.include('poser.web.static')
- # pyramid_config.include('poser.web.views')
+ pyramid_config.include('rattail_demo.web.views')
# configure PostgreSQL some more
app.configure_postgresql(pyramid_config)
diff --git a/rattail_demo/web/templates/base.mako b/rattail_demo/web/templates/base.mako
new file mode 100644
index 0000000..deb08b7
--- /dev/null
+++ b/rattail_demo/web/templates/base.mako
@@ -0,0 +1,14 @@
+## -*- coding: utf-8 -*-
+<%inherit file="tailbone:templates/themes/better/base.mako" />
+
+<%def name="global_title()">${"[STAGE] " if not request.rattail_config.production() else ''}Rattail Demo%def>
+
+<%def name="favicon()">
+
+%def>
+
+<%def name="header_logo()">
+ ${h.image(request.static_url('tailbone:static/img/rattail.ico'), "Header Logo", height='49')}
+%def>
+
+${parent.body()}
diff --git a/rattail_demo/web/templates/home.mako b/rattail_demo/web/templates/home.mako
new file mode 100644
index 0000000..f67c76d
--- /dev/null
+++ b/rattail_demo/web/templates/home.mako
@@ -0,0 +1,7 @@
+## -*- coding: utf-8 -*-
+<%inherit file="tailbone:templates/home.mako" />
+
+
+ ${h.image(request.static_url('tailbone:static/img/home_logo.png'), "Rattail Logo")}
+
Welcome to the Rattail Demo
+
diff --git a/rattail_demo/web/templates/menu.mako b/rattail_demo/web/templates/menu.mako
new file mode 100644
index 0000000..5571b55
--- /dev/null
+++ b/rattail_demo/web/templates/menu.mako
@@ -0,0 +1,110 @@
+## -*- coding: utf-8 -*-
+
+<%def name="main_menu_items()">
+
+ % if request.has_any_perm('products.list', 'vendors.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('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('stores.list', 'departments.list', 'subdepartments.list'):
+
+ Company
+
+ % if request.has_perm('stores.list'):
+ - ${h.link_to("Stores", url('stores'))}
+ % 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
+
+
+ % endif
+
+ % if request.has_any_perm('batch.handheld.list', 'batch.inventory.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
+
+
+ % endif
+
+ % if request.has_any_perm('users.list', 'roles.list', 'settings.list'):
+
+ Admin
+
+ % if request.has_perm('users.list'):
+ - ${h.link_to("Users", url('users'))}
+ % endif
+ % if request.has_perm('roles.list'):
+ - ${h.link_to("Roles", url('roles'))}
+ % endif
+ % if request.has_perm('settings.list'):
+ - ${h.link_to("Settings", url('settings'))}
+ % endif
+
+
+ % endif
+
+ % 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("Change Password", url('change_password'))}
+ - ${h.link_to("Logout", url('logout'))}
+
+
+ % else:
+ ${h.link_to("Login", url('login'))}
+ % endif
+
+%def>
diff --git a/rattail_demo/web/views/__init__.py b/rattail_demo/web/views/__init__.py
new file mode 100644
index 0000000..2c2c3eb
--- /dev/null
+++ b/rattail_demo/web/views/__init__.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+"""
+Web views
+"""
+
+from __future__ import unicode_literals, absolute_import
+
+from tailbone import views as base
+
+
+def bogus_error(request):
+ """
+ A special view which simply raises an error, for the sake of testing
+ uncaught exception handling.
+ """
+ raise Exception("Congratulations, you have triggered a bogus error.")
+
+
+def includeme(config):
+
+ config.add_route('home', '/')
+ config.add_view(base.home, route_name='home', renderer='/home.mako')
+
+ config.add_route('bogus_error', '/bogus-error')
+ config.add_view(bogus_error, route_name='bogus_error',
+ permission='admin')
+
+ # TODO: merge above views into common
+ # core views
+ config.include('rattail_demo.web.views.common')
+ config.include('tailbone.views.auth')
+
+ # main table views
+ config.include('tailbone.views.brands')
+ config.include('tailbone.views.customers')
+ config.include('tailbone.views.departments')
+ config.include('tailbone.views.employees')
+ config.include('tailbone.views.families')
+ config.include('tailbone.views.people')
+ config.include('tailbone.views.products')
+ config.include('tailbone.views.reportcodes')
+ config.include('tailbone.views.roles')
+ config.include('tailbone.views.settings')
+ config.include('tailbone.views.stores')
+ config.include('tailbone.views.subdepartments')
+ config.include('tailbone.views.users')
+ config.include('tailbone.views.vendors')
+
+ # batch views
+ config.include('tailbone.views.handheld')
+ config.include('tailbone.views.inventory')
diff --git a/rattail_demo/web/views/common.py b/rattail_demo/web/views/common.py
new file mode 100644
index 0000000..0098090
--- /dev/null
+++ b/rattail_demo/web/views/common.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+"""
+Common views
+"""
+
+from __future__ import unicode_literals, absolute_import
+
+from tailbone.views import common as base
+
+import rattail_demo
+
+
+class CommonView(base.CommonView):
+
+ project_title = "Rattail Demo"
+ project_version = rattail_demo.__version__
+
+
+def includeme(config):
+ CommonView.defaults(config)
diff --git a/setup.py b/setup.py
index 28cc8a9..53148a4 100644
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
"""
-Setup script for Rattail 'Poser'
+Setup script for Rattail Demo
"""
from __future__ import unicode_literals, absolute_import
@@ -10,7 +10,7 @@ from setuptools import setup, find_packages
here = os.path.abspath(os.path.dirname(__file__))
-execfile(os.path.join(here, 'poser', '_version.py'))
+execfile(os.path.join(here, 'rattail_demo', '_version.py'))
README = open(os.path.join(here, 'README.rst')).read()
@@ -44,12 +44,13 @@ requires = [
# package # low high
'psycopg2', # 2.6.2
- 'rattail', # 0.7.25
+ 'Tailbone', # 0.5.49
+ 'xlrd', # 1.0.0
]
setup(
- name = "rattail-poser",
+ name = "rattail-demo",
version = __version__,
author = "Lance Edgar",
author_email = "lance@edbob.org",
@@ -58,9 +59,7 @@ setup(
long_description = README,
classifiers = [
- 'Private :: Do No Upload',
'Development Status :: 3 - Alpha',
- 'Environment :: Console',
'Intended Audience :: Developers',
'Natural Language :: English',
'Operating System :: OS Independent',
@@ -75,7 +74,7 @@ setup(
entry_points = {
'paste.app_factory': [
- 'main = poser.web.app:main',
+ 'main = rattail_demo.web.app:main',
],
},
)