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/>.
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
):
45 ... members=('p1','p2'),
46 ... alsoProvides=(IMembershipProvider,),
49 ... groups=('g1','g2'),
50 ... members=('p1', 'p3','p4'),
51 ... alsoProvides=(IMembershipProvider,),
54 ... groups=('g2','g3'),
55 ... members=('p1','p5'),
56 ... alsoProvides=(IMembershipProvider,),
59 >>> mu = RWMemberships()
60 >>> interact( locals() )
62 implements(IRWMemberships
)
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):
75 return tuple(set(self
._groups
[id]))
79 def getMembersForGroup(self
, id):
83 return tuple(set(self
._members
[id]))
87 def register(self
, obj
):
88 """Register an object.
90 It is assumed that an adapter lookup for IMembershipProvider
93 mp
= IMembershipProvider(obj
)
96 groups
= self
._groups
[id]
98 self
._groups
[id] = PersistentList()
99 groups
= self
._groups
[id]
100 groups
.extend(mp
.groups
)
104 members
= self
._members
[id]
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
:
121 self
._groups
[id].remove(x
)
125 self
._members
[id].remove(x
)