root/CMFPlone_membership_hotfix/tags/1.0.1/patch.py

Revision 519 (checked in by chervol, 2 years ago)

initail import

  • Property svn:eol-style set to native
Line 
1 from Products.CMFCore.CMFCorePermissions import SetOwnPassword
2 from Products.CMFCore.utils import getToolByName
3 from Products.CMFDefault.MembershipTool import MembershipTool as BaseTool
4 from Products.CMFPlone import ToolNames
5 from Products.CMFPlone.PloneUtilities import translate
6 from Products.CMFPlone.PloneUtilities import _createObjectByType
7 from OFS.Image import Image
8 from AccessControl import ClassSecurityInfo, getSecurityManager
9 from Globals import InitializeClass
10 from Acquisition import aq_base, aq_parent, aq_inner
11 from Products.CMFCore.CMFCorePermissions import View
12 from Products.CMFPlone.PloneBaseTool import PloneBaseTool
13
14 from utils import scale_image
15 from Globals import InitializeClass, DTMLFile
16 from ZODB.POSException import ConflictError
17 from Products.CMFCore.utils import _checkPermission
18
19 from Products.CMFPlone.MembershipTool import MembershipTool
20    
21 def 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
38 def 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
69 def 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
82 def 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
127 MembershipTool.manage_options = (MembershipTool.manage_options +
128                       ( { 'label' : 'Portraits'
129                      , 'action' : 'manage_portrait_fix'
130                      },))
131 MembershipTool.security = ClassSecurityInfo()
132 MembershipTool.security.declareProtected('Manage Portal', 'manage_portrait_fix')
133 MembershipTool.manage_portrait_fix = DTMLFile('www/portrait_fix', globals())
134 MembershipTool.security.declareProtected('Manage Portal', 'getBadMembers')
135 MembershipTool.getBadMembers = getBadMembers
136 MembershipTool.security.declareProtected('Manage Users', 'deleteMemberArea')
137 MembershipTool.deleteMemberArea = deleteMemberArea
138 MembershipTool.security.declareProtected('Manage Users', 'deleteMembers')
139 MembershipTool.deleteMembers = deleteMembers
140
141 InitializeClass(MembershipTool)
Note: See TracBrowser for help on using the browser.