source: main/waeup.sirp/trunk/src/waeup/sirp/users.py @ 6693

Last change on this file since 6693 was 6527, checked in by uli, 13 years ago

When removing a complete site, it can happen that the user folder is
not available any more and the local role notifier should be aware of
that possibility.

File size: 2.3 KB
Line 
1"""Users (principals) for the WAeUP portal.
2"""
3import grok
4from zope.event import notify
5from zope.interface import Interface
6from zope.securitypolicy.interfaces import IPrincipalRoleMap
7from waeup.sirp.authentication import Account
8from waeup.sirp.interfaces import IUserContainer, ILocalRoleSetEvent
9
10class UserContainer(grok.Container):
11    """A container for principals.
12
13    See interfaces.py and users.txt for extensive description.
14    """
15    grok.implements(IUserContainer)
16    grok.require('waeup.manageUsers')
17
18    def addUser(self, name, password, title=None, description=None, roles=[]):
19        """Add a new Account instance, created from parameters.
20        """
21        if title is None:
22            title = name
23        if description is None:
24            description = title
25        self[name] = Account(name, password, title, description, roles)
26
27    def addAccount(self, account):
28        """Add the account passed.
29        """
30        self[account.name] = account
31
32    def delUser(self, name):
33        """Delete user, if an account with the given name exists.
34
35        Do not complain, if the name does not exist.
36        """
37        if name in self.keys():
38            del self[name]
39
40class LocalRoleSetEvent(object):
41
42    grok.implements(ILocalRoleSetEvent)
43
44    def __init__(self, object, role_id, principal_id, granted=True):
45        self.object = object
46        self.role_id = role_id
47        self.principal_id = principal_id
48        self.granted = granted
49
50@grok.subscribe(Interface, ILocalRoleSetEvent)
51def handle_local_role_changed(obj, event):
52    site = grok.getSite()
53    if site is None:
54        return
55    users = site.get('users', None)
56    if users is None:
57        return
58    role_id = event.role_id
59    if event.principal_id not in users.keys():
60        return
61    user = users[event.principal_id]
62    user.notifyLocalRoleChanged(event.object, event.role_id, event.granted)
63    return
64
65@grok.subscribe(Interface, grok.IObjectRemovedEvent)
66def handle_local_roles_on_obj_removal(obj, event):
67    try:
68        role_map = IPrincipalRoleMap(obj)
69    except TypeError:
70        # no map, no roles to remove
71        return
72    for local_role, user_name, setting in role_map.getPrincipalsAndRoles():
73        notify(LocalRoleSetEvent(
74                obj, local_role, user_name, granted=False))
75    return
Note: See TracBrowser for help on using the repository browser.