# deleteCMFUser.py # Sam Brauer 2003-06-03 # This is an External method that I created to delete a CMF user. # It was necessary to do this as an External Method in order to # access the "private" _members attribute of portal_memberdata. # # Be sure to set the Security options on the External Method that you create # via the ZMI. You probably want to make sure that only Manager can View. # from Products.CMFCore import utils def handler(self, id, newowner, deleteobjects, deleteLocalRoles) : portal_memberdata = utils.getToolByName(self, 'portal_memberdata') portal_membership = utils.getToolByName(self, 'portal_membership') portal_catalog = utils.getToolByName(self, 'portal_catalog') portal_url = utils.getToolByName(self, 'portal_url') acl = self.acl_users # delete the CMF member data del portal_memberdata._members[id] # delete the Zope acl user del acl.data[id] # delete the member's CMF folder home = portal_membership.getHomeFolder(id) if(home): parentfolder = home.aq_parent parentfolder.manage_delObjects([home.getId(),]) if(deleteobjects): for result in portal_catalog.searchResults(Creator=id): obj = result.getObject() if(obj): obj.aq_parent.manage_delObjects([obj.getId()]) else: if(not newowner): raise RuntimeError, "Must delete objects or change ownership!" # reassign ownership of member's non-home stuff to the newowner ID # (credit: http://www.zopelabs.com/cookbook/997307749) newuser = acl.getUser(newowner).__of__(acl) for result in portal_catalog.searchResults(Creator=id): obj = result.getObject() if(obj): obj.changeOwnership(newuser) obj.manage_delLocalRoles((id,)) obj.manage_addLocalRoles(newowner, ('Owner',)) obj.reindexObject() # Now delete all local roles for this user (this can be intense if # there are a lot of objects in the system, since we have to do a brute # force search; yuck!). if(deleteLocalRoles): root = portal_url.getPortalObject() deleteFolderLocalRolesForUserId( root, id ) from Acquisition import aq_base def deleteFolderLocalRolesForUserId( folder, userid ): if(folder.get_local_roles_for_userid(userid)): folder.manage_delLocalRoles((userid,)) #folder.reindexObject() # local roles aren't indexed for obj in folder.contentValues(): #if(getattr(aq_base(obj), 'isPrincipiaFolderish', 0)): if(getattr(obj, 'isPrincipiaFolderish', 0)): deleteFolderLocalRolesForUserId( obj, userid )