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 OFS.Image import Image |
---|
6 | from AccessControl import ClassSecurityInfo, getSecurityManager |
---|
7 | from Globals import InitializeClass |
---|
8 | from Acquisition import aq_base, aq_parent, aq_inner |
---|
9 | from Products.CMFCore.CMFCorePermissions import View |
---|
10 | from Products.CMFPlone.PloneBaseTool import PloneBaseTool |
---|
11 | |
---|
12 | from utils import scale_image |
---|
13 | from Globals import InitializeClass, DTMLFile |
---|
14 | from ZODB.POSException import ConflictError |
---|
15 | from Products.CMFCore.utils import _checkPermission |
---|
16 | |
---|
17 | from Products.CMFPlone.MembershipTool import MembershipTool |
---|
18 | |
---|
19 | def changeMemberPortrait(self, portrait, member_id=None): |
---|
20 | """ |
---|
21 | given a portrait we will modify the users portrait |
---|
22 | we put this method here because we do not want |
---|
23 | .personal or portrait in the catalog |
---|
24 | """ |
---|
25 | if not member_id: |
---|
26 | member_id = self.getAuthenticatedMember().getUserName() |
---|
27 | |
---|
28 | if portrait and portrait.filename: |
---|
29 | scaled, mimetype = scale_image(portrait) |
---|
30 | portrait = Image(id=member_id, file=scaled, title='') |
---|
31 | membertool = getToolByName(self, 'portal_memberdata') |
---|
32 | membertool._setPortrait(portrait, member_id) |
---|
33 | |
---|
34 | |
---|
35 | |
---|
36 | def getBadMembers(self): |
---|
37 | """Will search for members with bad images in the portal_memberdata |
---|
38 | delete their portraits and return their member ids""" |
---|
39 | memberdata = getToolByName(self, 'portal_memberdata') |
---|
40 | portraits = getattr(memberdata, 'portraits', None) |
---|
41 | if portraits is None: |
---|
42 | return [] |
---|
43 | bad_member_ids = [] |
---|
44 | TXN_THRESHOLD = 50 |
---|
45 | counter = 1 |
---|
46 | for member_id in tuple(portraits.objectIds()): |
---|
47 | portrait = portraits[member_id] |
---|
48 | portrait_data = str(portrait.data) |
---|
49 | if portrait_data == '': |
---|
50 | continue |
---|
51 | try: |
---|
52 | img = PIL.Image.open(StringIO(portrait_data)) |
---|
53 | except ConflictError: |
---|
54 | pass |
---|
55 | except: |
---|
56 | # Anything else we have a bad bad image and we destroy it |
---|
57 | # and ask questions later. |
---|
58 | portraits._delObject(member_id) |
---|
59 | bad_member_ids.append(member_id) |
---|
60 | if not counter%TXN_THRESHOLD: |
---|
61 | get_transaction().commit() |
---|
62 | counter = counter + 1 |
---|
63 | |
---|
64 | return bad_member_ids |
---|
65 | |
---|
66 | MembershipTool.manage_options = (MembershipTool.manage_options + |
---|
67 | ( { 'label' : 'Portraits' |
---|
68 | , 'action' : 'manage_portrait_fix' |
---|
69 | },)) |
---|
70 | MembershipTool.security = ClassSecurityInfo() |
---|
71 | MembershipTool.security.declareProtected('Manage Portal', 'manage_portrait_fix') |
---|
72 | MembershipTool.manage_portrait_fix = DTMLFile('www/portrait_fix', globals()) |
---|
73 | MembershipTool.security.declareProtected('Manage Portal', 'getBadMembers') |
---|
74 | MembershipTool.getBadMembers = getBadMembers |
---|
75 | |
---|
76 | InitializeClass(MembershipTool) |
---|