--- /dev/null
+# -*- coding: utf-8 -*-
+#######################################################################################
+# Plinn - http://plinn.org #
+# Copyright (C) 2005-2007 Benoît PIN <benoit.pin@ensmp.fr> #
+# #
+# This program is free software; you can redistribute it and/or #
+# modify it under the terms of the GNU General Public License #
+# as published by the Free Software Foundation; either version 2 #
+# of the License, or (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program; if not, write to the Free Software #
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #
+#######################################################################################
+"""
+
+
+"""
+
+from Globals import InitializeClass
+from AccessControl import ClassSecurityInfo
+from Acquisition import aq_inner, aq_parent, aq_base
+
+from Products.GroupUserFolder.GroupDataTool import GroupDataTool as BaseTool
+from Products.GroupUserFolder.GroupDataTool import GroupData as BaseGroupData
+from Products.GroupUserFolder.GroupsToolPermissions import ManageGroups, ViewGroups
+from Products.CMFCore.utils import getToolByName
+from ZPublisher.Converters import type_converters
+
+from GroupsTool import CACHE_ROOT_GROUPS, CACHE_GROUPS_OF_GROUP, CACHE_USER_NAMES_OF_GROUP
+
+try:
+ from Products.CMFCore.MemberDataTool import CleanupTemp
+ _have_cleanup_temp = 1
+except:
+ _have_cleanup_temp = None
+
+
+class GroupDataTool(BaseTool) :
+ """ Group Data Tool """
+
+ meta_type = 'Plinn Group Data Tool'
+
+ security = ClassSecurityInfo()
+
+ security.declarePrivate('wrapGroup')
+ def wrapGroup(self, g):
+ """Returns an object implementing the GroupData interface"""
+ id = g.getId()
+ members = self._members
+ if not members.has_key(id):
+ # Get a temporary member that might be
+ # registered later via registerMemberData().
+ temps = self._v_temps
+ if temps is not None and temps.has_key(id):
+ portal_group = temps[id]
+ else:
+ base = aq_base(self)
+ portal_group = GroupData(base, id)
+ if temps is None:
+ self._v_temps = {id:portal_group}
+ if hasattr(self, 'REQUEST'):
+ # No REQUEST during tests.
+ # XXX jcc => CleanupTemp doesn't seem to work on Plone 1.0.3.
+ # Have to find a way to pass around...
+ if _have_cleanup_temp:
+ self.REQUEST._hold(CleanupTemp(self))
+ else:
+ temps[id] = portal_group
+ else:
+ portal_group = members[id]
+ # Return a wrapper with self as containment and
+ # the user as context.
+ return portal_group.__of__(self).__of__(g)
+
+class GroupData(BaseGroupData) :
+ """ """
+
+ security = ClassSecurityInfo()
+
+ security.declareProtected(ViewGroups, 'getGroups')
+ security.declareProtected(ManageGroups, 'setGroupProperties')
+ def setGroupProperties(self, mapping):
+ '''Sets the properties of the group.
+ '''
+ # Sets the properties given in the MemberDataTool.
+ tool = self.getTool()
+ self = self.aq_inner.aq_self
+ for id in tool.propertyIds():
+ if mapping.has_key(id):
+ if not self.__class__.__dict__.has_key(id):
+ value = mapping[id]
+ if type(value)==type(''):
+ proptype = tool.getPropertyType(id) or 'string'
+ if type_converters.has_key(proptype):
+ value = type_converters[proptype](value)
+ setattr(self, id, value)
+ # Hopefully we can later make notifyModified() implicit.
+ self.notifyModified()
+
+ security.declareProtected(ManageGroups, 'removeMember')
+ def removeMember(self, id):
+ """ Remove the member with the provided id from the group """
+
+ user = self.acl_users.getUser(id)
+
+ groups = list(user.getGroups(no_recurse=1))
+ prefix = self.acl_users.getGroupPrefix()
+ try : groups.remove(prefix + self.getGroupName())
+ except ValueError : return # the user (id) is an implicit member of this group (self)
+
+ roles_no_recurse = tuple(filter(lambda x: x not in ('Authenticated', 'Shared'), user.getUserRoles()))
+
+ if user.isGroup() :
+ self.acl_users._doChangeGroup(id, roles_no_recurse, groups = groups)
+ else :
+ self.acl_users._doChangeUser(id,
+ None,
+ roles_no_recurse,
+ user.getDomains(),
+ groups=tuple(groups))
+
+ gtool = getToolByName(self, "portal_groups")
+ if gtool.ZCacheable_isCachingEnabled() :
+ # humm... there's a bug on Cacheable / RamCacheManger
+ #gtool.ZCacheable_invalidate(view_name=CACHE_USER_NAMES_OF_GROUP)
+ gtool.ZCacheable_set(None, view_name=CACHE_USER_NAMES_OF_GROUP, keywords={'no_recurse' : 0})
+ gtool.ZCacheable_set(None, view_name=CACHE_USER_NAMES_OF_GROUP, keywords={'no_recurse' : 1})
+
+
+
+ security.declareProtected(ManageGroups, 'addMember')
+ def addMember(self, id):
+ """ Add the existing member with the given id to the group"""
+ aclu = self.aq_inner.acl_users
+ user = aclu.getUser(id)
+ prefix = aclu.getGroupPrefix()
+
+ userRoles = tuple(filter(lambda x: x not in ('Authenticated', 'Shared'), user.getUserRoles()))
+ groups = user.getGroups(no_recurse = 1)
+ groups += (self.id, )
+
+ aclu.changeUser(user.id, groups = groups, roles = userRoles)
+ gtool = getToolByName(self, 'portal_groups')
+ if gtool.ZCacheable_isCachingEnabled() :
+ # humm... there's a bug on Cacheable / RamCacheManger
+ #gtool.ZCacheable_invalidate(view_name=CACHE_USER_NAMES_OF_GROUP)
+ gtool.ZCacheable_set(None, view_name=CACHE_USER_NAMES_OF_GROUP, keywords={'no_recurse' : 0})
+ gtool.ZCacheable_set(None, view_name=CACHE_USER_NAMES_OF_GROUP, keywords={'no_recurse' : 1})
+
+
+
+ security.declareProtected(ManageGroups, 'removeGroup')
+ def removeGroup(self, id) :
+ """ Remove the existing group with the given id to the group"""
+ aclu = self.aq_inner.acl_users
+ groupPrefix = aclu.getGroupPrefix()
+ group = aclu.getGroup(id)
+
+ # get group roles
+ groupRoles = tuple(filter(lambda x: x not in ('Authenticated', 'Shared'), group.getUserRoles()))
+ superGroupIds = list(group.getGroups(no_recurse = 1))
+ superGroupIds.remove(self.id)
+
+ aclu.changeUser(groupPrefix + group.id, groups = superGroupIds, roles = groupRoles)
+
+ gtool = getToolByName(self, "portal_groups")
+ if gtool.ZCacheable_isCachingEnabled() :
+ gtool.ZCacheable_set(None, view_name=CACHE_GROUPS_OF_GROUP)
+ if not superGroupIds :
+ gtool.ZCacheable_set(None, view_name=CACHE_ROOT_GROUPS)
+
+
+ security.declareProtected(ManageGroups, 'addGroup')
+ def addGroup(self, id) :
+ """ Add the existing group with the given id to the group"""
+ aclu = self.aq_inner.acl_users
+ groupPrefix = aclu.getGroupPrefix()
+ group = aclu.getGroup(id)
+
+ # get group roles
+ groupRoles = tuple(filter(lambda x: x not in ('Authenticated', 'Shared'), group.getUserRoles()))
+ superGroupIds = list(group.getGroups(no_recurse = 1))
+ newSuperGroupIds = superGroupIds[:]
+ newSuperGroupIds.append(self.id)
+
+ aclu.changeUser(groupPrefix + group.id, groups = newSuperGroupIds, roles = groupRoles)
+
+ gtool = getToolByName(self, "portal_groups")
+ if gtool.ZCacheable_isCachingEnabled() :
+ gtool.ZCacheable_set(None, view_name=CACHE_GROUPS_OF_GROUP)
+ if not superGroupIds :
+ gtool.ZCacheable_set(None, view_name=CACHE_ROOT_GROUPS)
+
+
+
+InitializeClass(GroupDataTool)