paula: removed empty dirs
[paula.git] / paula.grouputil / trunk / src / paula / grouputil / utils.py
blob0e0cd9caf589c92be4d326dbaaf9375cf9e29654
1 # Copyright (c) 2008 by Florian Friesdorf
3 # GNU Affero General Public License (AGPL)
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License as
7 # published by the Free Software Foundation; either version 3 of the
8 # License, or (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU Affero General Public License for more details.
15 # You should have received a copy of the GNU Affero General Public
16 # License along with this program. If not, see
17 # <http://www.gnu.org/licenses/>.
18 """
19 """
20 __author__ = "Florian Friesdorf <flo@chaoflow.net>"
21 __docformat__ = "plaintext"
23 from BTrees import OOBTree
24 from persistent import Persistent
25 from persistent.list import PersistentList
27 from zope.app.container.contained import Contained
29 from zope.component import adapter, queryUtility
30 from zope.component.interfaces import IFactory
32 from zope.interface import implements
34 from paula.grouputil.interfaces import IMembershipProvider
36 from paula.grouputil.interfaces import IMembershipProviderAdaptable
37 from paula.grouputil.interfaces import IRWMemberships
40 class RWMemberships(Persistent, Contained):
41 """
43 >>> mp1 = Mock(
44 ... groups=('g1',),
45 ... members=('p1','p2'),
46 ... alsoProvides=(IMembershipProvider,),
47 ... )
48 >>> mp2 = Mock(
49 ... groups=('g1','g2'),
50 ... members=('p1', 'p3','p4'),
51 ... alsoProvides=(IMembershipProvider,),
52 ... )
53 >>> mp3 = Mock(
54 ... groups=('g2','g3'),
55 ... members=('p1','p5'),
56 ... alsoProvides=(IMembershipProvider,),
57 ... )
59 >>> mu = RWMemberships()
60 >>> interact( locals() )
61 """
62 implements(IRWMemberships)
64 def __init__(self):
65 """
66 """
67 self._objs = PersistentList()
68 self._members = queryUtility(IFactory, 'OOBTree', OOBTree.OOBTree)()
69 self._groups = queryUtility(IFactory, 'OOBTree', OOBTree.OOBTree)()
71 def getGroupsForPrincipal(self, id):
72 """
73 """
74 try:
75 return tuple(set(self._groups[id]))
76 except KeyError:
77 return ()
79 def getMembersForGroup(self, id):
80 """
81 """
82 try:
83 return tuple(set(self._members[id]))
84 except KeyError:
85 return ()
87 def register(self, obj):
88 """Register an object.
90 It is assumed that an adapter lookup for IMembershipProvider
91 succeeds.
92 """
93 mp = IMembershipProvider(obj)
94 for id in mp.members:
95 try:
96 groups = self._groups[id]
97 except KeyError:
98 self._groups[id] = PersistentList()
99 groups = self._groups[id]
100 groups.extend(mp.groups)
102 for id in mp.groups:
103 try:
104 members = self._members[id]
105 except KeyError:
106 self._members[id] = PersistentList()
107 members = self._members[id]
108 members.extend(mp.members)
110 self._objs.append(obj)
112 def unregister(self, obj):
113 """Unregister an object.
115 Fails with ValueError, if the object is not registered.
117 mp = IMembershipProvider(obj)
118 self._objs[id].remove(obj)
119 for id in mp.members:
120 for x in mp.groups:
121 self._groups[id].remove(x)
123 for id in mp.groups:
124 for x in mp.members:
125 self._members[id].remove(x)