diff --git a/tailbone/newgrids/alchemy.py b/tailbone/newgrids/alchemy.py index eb42237a..b7a2a40b 100644 --- a/tailbone/newgrids/alchemy.py +++ b/tailbone/newgrids/alchemy.py @@ -61,8 +61,8 @@ class AlchemyGrid(Grid): def __init__(self, *args, **kwargs): super(AlchemyGrid, self).__init__(*args, **kwargs) - self._fa_grid = formalchemy.Grid(self.model_class, session=Session(), - request=self.request) + self._fa_grid = formalchemy.Grid(self.model_class, instances=self.data, + session=Session(), request=self.request) def __delattr__(self, attr): delattr(self._fa_grid, attr) diff --git a/tailbone/static/css/layout.css b/tailbone/static/css/layout.css index 54ae6e44..c1312823 100644 --- a/tailbone/static/css/layout.css +++ b/tailbone/static/css/layout.css @@ -71,6 +71,7 @@ body > #body-wrapper { #context-menu { float: right; list-style-type: none; + text-align: right; } diff --git a/tailbone/static/js/jquery.ui.tailbone.js b/tailbone/static/js/jquery.ui.tailbone.js index 688fa356..f0f810a6 100644 --- a/tailbone/static/js/jquery.ui.tailbone.js +++ b/tailbone/static/js/jquery.ui.tailbone.js @@ -46,9 +46,8 @@ select.selectmenu('refresh'); if (select.find('option:enabled').length == 1) { // prompt is always enabled select.selectmenu('disable'); - } else { - that.apply_filters.button('enable'); } + that.apply_filters.button('enable'); } }); diff --git a/tailbone/templates/master/edit.mako b/tailbone/templates/master/edit.mako index ffb47d8b..df7f379c 100644 --- a/tailbone/templates/master/edit.mako +++ b/tailbone/templates/master/edit.mako @@ -8,6 +8,9 @@ % if request.has_perm('{0}.view'.format(permission_prefix)):
The guest role is implied for all users.
- -% elif role.users: - -The following users are assigned to this role:
-Username | -Full Name | - - - % for i, user in enumerate(role.users, 1): -
---|---|
${user.username} - | ${user.display_name} | -
There are no users assigned to this role.
- -% endif diff --git a/tailbone/templates/roles/view.mako b/tailbone/templates/roles/view.mako new file mode 100644 index 00000000..f7b43608 --- /dev/null +++ b/tailbone/templates/roles/view.mako @@ -0,0 +1,27 @@ +## -*- coding: utf-8 -*- +<%inherit file="/master/view.mako" /> + +<%def name="head_tags()"> + ${parent.head_tags()} + ${h.stylesheet_link(request.static_url('tailbone:static/css/perms.css'))} +%def> + +<%def name="context_menu_items()"> + ${parent.context_menu_items()} + % if version_count is not Undefined and request.has_perm('role.versions.view'): +The guest role is implied for all users.
+% elif users: +The following users are assigned to this role:
+ ${users.render_grid()|n} +% else: +There are no users assigned to this role.
+% endif diff --git a/tailbone/views/master.py b/tailbone/views/master.py index 923ecf46..f1f47633 100644 --- a/tailbone/views/master.py +++ b/tailbone/views/master.py @@ -106,8 +106,7 @@ class MasterView(View): self.request.session.flash("{0} {1} has been updated.".format( self.get_model_title(), instance)) return HTTPFound(location=self.get_action_url('view', instance)) - return self.render_to_response('edit', { - 'instance': instance, 'form': form}) + return self.render_to_response('edit', {'instance': instance, 'form': form}) def delete(self): """ @@ -117,6 +116,12 @@ class MasterView(View): instance = Session.query(self.model_class).get(key) if not instance: return HTTPNotFound() + + # Let derived classes prep for (or cancel) deletion. + result = self.before_delete(instance) + if result is not None: + return result + # Flush immediately to force any pending integrity errors etc.; that # way we don't set flash message until we know we have success. Session.delete(instance) @@ -238,6 +243,9 @@ class MasterView(View): 'index_url': self.get_index_url(), 'action_url': self.get_action_url, }) + data.update(self.template_kwargs(**data)) + if hasattr(self, 'template_kwargs_{0}'.format(template)): + data.update(getattr(self, 'template_kwargs_{0}'.format(template))(**data)) try: return render_to_response('{0}/{1}.mako'.format(self.get_template_prefix(), template), data, request=self.request) @@ -245,6 +253,12 @@ class MasterView(View): return render_to_response('/master/{0}.mako'.format(template), data, request=self.request) + def redirect(self, url): + """ + Convenience method to return a HTTP 302 response. + """ + return HTTPFound(location=url) + ############################## # Grid Stuff ############################## @@ -408,6 +422,11 @@ class MasterView(View): fieldset.prettify = prettify return fieldset + def template_kwargs(self, **kwargs): + """ + Supplement the template context, for all views. + """ + return kwargs ############################## # Config Stuff diff --git a/tailbone/views/roles.py b/tailbone/views/roles.py index 9e70032c..c133e5e6 100644 --- a/tailbone/views/roles.py +++ b/tailbone/views/roles.py @@ -1,9 +1,8 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- ################################################################################ # # Rattail -- Retail Software Framework -# Copyright © 2010-2012 Lance Edgar +# Copyright © 2010-2015 Lance Edgar # # This file is part of Rattail. # @@ -21,171 +20,28 @@ # along with Rattail. If not, see