""" open/dulcinea/lib/ui/permission.qpy """ from dulcinea.common import format_user from dulcinea.ui.form.search_widget import SearchSelectOneWidget from dulcinea.ui.table import Table from qp.fill.directory import Directory from qp.fill.form import Form from qp.fill.html import href from qp.fill.widget import SubmitWidget, RadiobuttonsWidget from qp.pub.common import get_user, redirect, page, get_users from qp.pub.user import get_users_with_permissions_for_granter from qp.pub.user import get_valid_permissions def default_decorate:xml(obj, body, title='Permissions'): page(title, '
', body, '
') class PermissionUI(Directory): def get_exports(self): yield ('', 'index', 'Permissions', 'Manage permissions') def __init__(self, granter, granter_title, decorate=default_decorate): self.granter = granter self.granter_title = granter_title self.decorate = decorate def get_user_permission_ui(self): return UserPermissionUI def index:xml(self): grants = show_grants(self.granter, get_valid_permissions(get_user(), self.granter), self.granter_title) user_select_form(self.granter, grants, decorate=self.decorate) def _q_lookup(self, component): user = get_users().get(component) if user: return self.get_user_permission_ui()( user, self.granter, self.granter_title, decorate=self.decorate) def user_can_manage_permissions(user, granter): if user.can_manage_permissions(): return True if hasattr(granter, 'can_be_managed_by') and granter.can_be_managed_by(get_user()): return True return False class UserPermissionUI(Directory): def get_exports(self): yield ('', 'index', 'View', 'View permissions') if user_can_manage_permissions(get_user(), self.granter): yield ('edit', 'edit', 'Edit', 'Edit permissions') def __init__(self, user, granter, granter_title, decorate=default_decorate): self.user = user self.granter = granter self.title = "%s: %s's Permissions" % ( granter_title, user.format_realname() or user.get_id()) self.decorate = decorate def index:xml(self): self.decorate(self.user, display_permissions(self.user, self.granter, get_valid_permissions), title=self.title) def edit(self): return edit_permission_form(self.user, self.granter, self.title, self.decorate) def display_permissions:xml(user, granter, get_valid_permissions): '
' '
' for permission, description in sorted(get_valid_permissions(user, granter).items()): '
%s: %s
' % ( permission, user.is_granted(permission, granter) and 'YES' or 'NO') '
%s
' % description '
' '
' def user_select_form(granter, grants, decorate): form = Form() form.add(SubmitWidget, 'select', 'Select') form.add(SubmitWidget, 'cancel', 'Cancel') if form.get('cancel'): redirect('.') form.add(SearchSelectOneWidget, "user", title="Search for a user", required=1, hint=("Locate a user you want to consider for permissions.")) if (not form.is_submitted() or form.has_errors() or form.get_widget('user').get_submit()): return decorate(None, grants + form.render(), title='Select User') redirect('%s/' % form.get('user').get_key()) def edit_permission_form(user, granter, title, decorate): form = Form() form.add(SubmitWidget, 'save', 'Save') form.add(SubmitWidget, 'cancel', 'Cancel') if form.get('cancel'): redirect('.') valid_permission_items = sorted(get_valid_permissions(user, granter).items()) for permission, description in valid_permission_items: form.add(RadiobuttonsWidget, permission, value=user.is_granted(permission, granter), hint=description, title=permission, options=[(True, 'Yes'), (False, 'No')]) if not form.is_submitted(): return decorate(user, form.render(), title=title) if form.get('save'): for permission, description in valid_permission_items: if form.get(permission) is True: user.get_permissions().grant(permission, granter) elif form.get(permission) is False: user.get_permissions().ungrant(permission, granter) if hasattr(granter, 'update_permission_cache'): granter.update_permission_cache(user) redirect('.') def show_grants:xml(granter, permissions, granter_title): users_with_permissions = get_users_with_permissions_for_granter(granter, permissions) if users_with_permissions: def edit_user_permission_link:xml(user): if user_can_manage_permissions(get_user(), granter): what = 'View/Edit' else: what = 'View' href('%s/' % user.get_id(), '[%s Permissions]' % what, "%s %s's permissions for %s" % ( what, user.format_realname(), granter_title), css_class="action") table = Table() table.column(user='User') table.column(permissions='Permissions') for user in users_with_permissions: table.row( user=format_user(user) + ' ' + edit_user_permission_link(user), permissions=', '.join(users_with_permissions[user])) table.set_caption('Granted permissions for %s' % granter_title) table.set_footer( 'Don\'t see the user you want?') table.render(css_class="pretty", style="width:100%; margin-bottom:1em") else: '
' 'There are no users granted permissions for %s. ' % granter_title '
To grant permissions, search for a user for which permissions will apply.' '
'