[Zope-Checkins] CVS: Zope3/lib/python/Zope/App/Security - RolePermissionView.py:1.1.2.1

Jim Fulton jim@zope.com
Thu, 3 Jan 2002 14:08:21 -0500


Update of /cvs-repository/Zope3/lib/python/Zope/App/Security
In directory cvs.zope.org:/tmp/cvs-serv12383

Added Files:
      Tag: Zope-3x-branch
	RolePermissionView.py 
Log Message:
Added view component for managing role-permission settings

=== Added File Zope3/lib/python/Zope/App/Security/RolePermissionView.py ===
##############################################################################
#
# Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
# 
# This software is subject to the provisions of the Zope Public License,
# Version 2.0 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE
# 
##############################################################################
"""

Revision information: $Id: RolePermissionView.py,v 1.1.2.1 2002/01/03 19:08:20 jim Exp $
"""

import os, time
from Zope.PageTemplate.PageTemplateFile import PageTemplateFile
from Zope.Publisher.Browser.AttributePublisher import AttributePublisher
from Zope.ComponentArchitecture.ContextDependent import ContextDependent
from Zope.ComponentArchitecture import getService, getAdapter
from Zope.App.Security.IRolePermissionManager import IRolePermissionManager
from Zope.App.Security.IPermission import IPermission

class RolePermissionView(AttributePublisher, ContextDependent):

    index = PageTemplateFile( 'manage_access.pt'
                            , '%s/pt' % os.path.dirname(__file__)
                            )
    
    def roles(self):
        roles = getattr(self, '_roles', None)
        if roles is None:
            roles = self._roles = getService(
                self.getContext(), 'RoleService'
                ).getRoles()
        return roles

    def permissions(self):
        permissions = getattr(self, '_permissions', None)
        if permissions is None:
            permissions = self._permissions = getService(
                self.getContext(), 'PermissionService'
                ).getPermissions()
        return permissions

        
    def permissionRoles(self):
        context = self.getContext()
        roles = self.roles()
        return [PermissionRoles(permission, context, roles)
                for permission in self.permissions()]

    def action(self, REQUEST):
        roles       = [r.getId() for r in self.roles()]
        permissions = [p.getId() for p in self.permissions()]
        prm         = getAdapter(self.getContext(), IRolePermissionManager)
        for ip in range(len(permissions)):
            rperm = REQUEST.get("p%s" % ip)
            if rperm not in permissions: continue
            for ir in range(len(roles)):
                rrole = REQUEST.get("r%s" % ir)
                if rrole not in roles: continue
                if REQUEST.has_key("p%sr%s" % (ip, ir)):
                    prm.grantPermissionToRole(rperm, rrole)
                else:
                    prm.retractPermissionFromRole(rperm, rrole)

        return self.index(
            message="Settings changed at %s" % time.ctime(time.time())
            )

class PermissionRoles:

    __implements__ = IPermission

    def __init__(self, permission, context, roles):
        self._permission = permission
        self._context    = context
        self._roles      = [role.getId() for role in roles]

    def getId(self):
        return self._permission.getId()

    def getTitle(self):
        return self._permission.getTitle()

    def getDescription():
        return self._permission.getDescription()

    def roles(self):
        prm = getAdapter(self._context, IRolePermissionManager)
        proles = prm.getRolesForPermission(self._permission.getId())
        return [((role in proles) and '1' or None) for role in self._roles]