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

Janko Hauser jh@comunit.de
Sat, 9 Feb 2002 16:05:19 -0500


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

Added Files:
      Tag: Zope-3x-branch
	PrincipalPermissionView.py 
Log Message:
A view component for the management of explicitly set permissions
for a specific principal.


=== Added File Zope3/lib/python/Zope/App/Security/PrincipalPermissionView.py ===
import 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 IPrincipalPermissionMap import IPrincipalPermissionMap
from IPrincipalPermissionManager import IPrincipalPermissionManager
from Settings import Allow, Deny, Unset

class PrincipalPermissionView(AttributePublisher, ContextDependent):

    index = PageTemplateFile('pt/principal_permission_edit.pt')

    def get_permission_service(self):
        return getService(self.getContext(), 'PermissionService')

    def get_principal(self, principal_id):
        return getService(self.getContext(),
                          'AuthenticationService'
                          ).getPrincipal(principal_id)

    def unsetPermissions(self, principal_id, permission_ids, REQUEST=None):
        """Form action unsetting a principals permissions"""
        permission_service = self.get_permission_service()
        principal = self.get_principal(principal_id)
        ppm = getAdapter(self.getContext(), IPrincipalPermissionManager)

        for perm_id in permission_ids:
            permission = permission_service.getPermission(perm_id)
            ppm.unsetPermissionForPrincipal(permission , principal)

        if REQUEST is not None:
            return self.index(message="Settings changed at %s" % time.ctime(time.time()))

    def grantPermissions(self, principal_id, permission_ids, REQUEST=None):
        """Form action granting a list of permissions to a principal"""
        permission_service = self.get_permission_service()
        principal = self.get_principal(principal_id)
        ppm = getAdapter(self.getContext(), IPrincipalPermissionManager)

        for perm_id in permission_ids:
            permission = permission_service.getPermission(perm_id)
            ppm.grantPermissionToPrincipal(permission , principal)
        if REQUEST is not None:
            return self.index(message="Settings changed at %s" % time.ctime(time.time()))

    def denyPermissions(self, principal_id, permission_ids, REQUEST=None):
        """Form action denying a list of permissions for a principal"""
        permission_service = self.get_permission_service()
        principal = self.get_principal(principal_id)
        ppm = getAdapter(self.getContext(), IPrincipalPermissionManager)

        for perm_id in permission_ids:
            permission = permission_service.getPermission(perm_id)
            ppm.denyPermissionToPrincipal(permission , principal)
        if REQUEST is not None:
            return self.index(message="Settings changed at %s" % time.ctime(time.time()))

    # Methods only called from the zpt view
    def getUnsetPermissionsForPrincipal(self, principal_id):
        """Returns all unset permissions for this principal"""

        ppmap = getAdapter(self.getContext(), IPrincipalPermissionMap)
        principal = self.get_principal(principal_id)
        perm_serv = getService(self.getContext(), 'PermissionService')
        result = []
        for perm in perm_serv.getPermissions():
            if ppmap.getSetting(perm, principal) == Unset:
                result.append(perm)

        return result
        
    def getPermissionsForPrincipal(self, principal_id, setting_name):
        """Returns list of permissions with the given setting_name string for the principal
        Return empty list if there are no permissions"""
    
        ppmap = getAdapter(self.getContext(), IPrincipalPermissionMap)
        principal = self.get_principal(principal_id)
        
        permission_settings = ppmap.getPermissionsForPrincipal(principal)
        setting_map = {'Deny': Deny, 'Allow':Allow}
        asked_setting = setting_map[setting_name]

        result = []
        for permission, setting in permission_settings:
            if asked_setting == setting:
                result.append(permission)
            
        return result