source: products/CMFPlone_membership_hotfix/tags/1.0/patch.py @ 1656

Last change on this file since 1656 was 1, checked in by myroslav, 18 years ago

Building directory structure

  • Property svn:eol-style set to native
File size: 5.2 KB
Line 
1from Products.CMFCore.CMFCorePermissions import SetOwnPassword
2from Products.CMFCore.utils import getToolByName
3from Products.CMFDefault.MembershipTool import MembershipTool as BaseTool
4from Products.CMFPlone import ToolNames
5from Products.CMFPlone.PloneUtilities import translate
6from Products.CMFPlone.PloneUtilities import _createObjectByType
7from OFS.Image import Image
8from AccessControl import ClassSecurityInfo, getSecurityManager
9from Globals import InitializeClass
10from Acquisition import aq_base, aq_parent, aq_inner
11from Products.CMFCore.CMFCorePermissions import View
12from Products.CMFPlone.PloneBaseTool import PloneBaseTool
13
14from utils import scale_image
15from Globals import InitializeClass, DTMLFile
16from ZODB.POSException import ConflictError
17from Products.CMFCore.utils import _checkPermission
18
19from Products.CMFPlone.MembershipTool import MembershipTool
20   
21def changeMemberPortrait(self, portrait, member_id=None):
22    """
23    given a portrait we will modify the users portrait
24    we put this method here because we do not want
25    .personal or portrait in the catalog
26    """
27    if not member_id:
28        member_id = self.getAuthenticatedMember().getUserName()
29
30    if portrait and portrait.filename:
31        scaled, mimetype = scale_image(portrait)
32        portrait = Image(id=member_id, file=scaled, title='')
33        membertool   = getToolByName(self, 'portal_memberdata')
34        membertool._setPortrait(portrait, member_id)
35
36
37
38def getBadMembers(self):
39    """Will search for members with bad images in the portal_memberdata
40    delete their portraits and return their member ids"""
41    memberdata = getToolByName(self, 'portal_memberdata')
42    portraits = getattr(memberdata, 'portraits', None)
43    if portraits is None:
44        return []
45    bad_member_ids = []
46    TXN_THRESHOLD = 50
47    counter = 1
48    for member_id in tuple(portraits.objectIds()):
49        portrait = portraits[member_id]
50        portrait_data = str(portrait.data)
51        if portrait_data == '':
52            continue
53        try:
54            img = PIL.Image.open(StringIO(portrait_data))
55        except ConflictError:
56            pass
57        except:
58            # Anything else we have a bad bad image and we destroy it
59            # and ask questions later.
60            portraits._delObject(member_id)
61            bad_member_ids.append(member_id)
62        if not counter%TXN_THRESHOLD:               
63            get_transaction().commit()
64        counter = counter + 1
65
66    return bad_member_ids
67
68
69def deleteMemberArea(self, member_id):
70    """ Delete member area of member specified by member_id.
71    """
72    members = self.getMembersFolder()
73    if not members:
74        return 0
75    if hasattr( aq_base(members), member_id ):
76        members.manage_delObjects(member_id)
77        return 1
78    else:
79        return 0
80
81
82def deleteMembers(self, member_ids, delete_memberareas=1,
83                    delete_localroles=1):
84    """ Delete members specified by member_ids.
85    """
86
87    # Delete members in acl_users.
88    acl_users = self.acl_users
89    if _checkPermission('Manage Users', acl_users):
90        if isinstance(member_ids, basestring):
91            member_ids = (member_ids,)
92        member_ids = list(member_ids)
93        for member_id in member_ids[:]:
94            if not acl_users.getUserById(member_id, None):
95                member_ids.remove(member_id)
96        try:
97            acl_users.userFolderDelUsers(member_ids)
98        except (NotImplementedError, 'NotImplemented'):
99            raise NotImplementedError('The underlying User Folder '
100                                        'doesn\'t support deleting members.')
101    else:
102        raise AccessControl_Unauthorized('You need the \'Manage users\' '
103                                'permission for the underlying User Folder.')
104
105    # Delete member data in portal_memberdata.
106    mdtool = getToolByName(self, 'portal_memberdata', None)
107    if mdtool is not None:
108        for member_id in member_ids:
109            members = mdtool._members
110            if members.has_key(member_id):
111                del members[member_id]
112
113    # Delete members' home folders including all content items.
114    if delete_memberareas:
115        for member_id in member_ids:
116                self.deleteMemberArea(member_id)
117
118    # Delete members' local roles.
119    if delete_localroles:
120        utool = getToolByName(self, 'portal_url', None)
121        self.deleteLocalRoles( utool.getPortalObject(), member_ids,
122                                reindex=1 )
123
124    return tuple(member_ids)
125
126
127MembershipTool.manage_options = (MembershipTool.manage_options +
128                      ( { 'label' : 'Portraits'
129                     , 'action' : 'manage_portrait_fix'
130                     },))
131MembershipTool.security = ClassSecurityInfo()
132MembershipTool.security.declareProtected('Manage Portal', 'manage_portrait_fix')
133MembershipTool.manage_portrait_fix = DTMLFile('www/portrait_fix', globals())
134MembershipTool.security.declareProtected('Manage Portal', 'getBadMembers')
135MembershipTool.getBadMembers = getBadMembers
136MembershipTool.security.declareProtected('Manage Users', 'deleteMemberArea')
137MembershipTool.deleteMemberArea = deleteMemberArea
138MembershipTool.security.declareProtected('Manage Users', 'deleteMembers')
139MembershipTool.deleteMembers = deleteMembers
140
141InitializeClass(MembershipTool)
Note: See TracBrowser for help on using the repository browser.