[1] | 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) |
---|