"""
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.'
'
'