X-Git-Url: https://scm.cri.ensmp.fr/git/Plinn.git/blobdiff_plain/3c4367d8e03450e9a73e61f4247145d2b6c86a33..959d888c17d1403d2eeecc19bc4b5e2c8d1debf6:/Products/Plinn/MemberDataTool.py diff --git a/Products/Plinn/MemberDataTool.py b/Products/Plinn/MemberDataTool.py new file mode 100755 index 0000000..c83ff49 --- /dev/null +++ b/Products/Plinn/MemberDataTool.py @@ -0,0 +1,267 @@ +# -*- coding: utf-8 -*- +####################################################################################### +# Plinn - http://plinn.org # +# Copyright (C) 2005-2007 Benoît PIN # +# # +# This program is free software; you can redistribute it and/or # +# modify it under the terms of the GNU General Public License # +# as published by the Free Software Foundation; either version 2 # +# of the License, or (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program; if not, write to the Free Software # +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # +####################################################################################### +""" Workflow aware MemberData to provide reviewed member registration. + + + +""" +from AccessControl.interfaces import IUser +from Products.CMFCore.interfaces import IMemberDataTool +from Globals import InitializeClass +from Acquisition import aq_inner, aq_parent, aq_base +from AccessControl import ClassSecurityInfo +from OFS.SimpleItem import SimpleItem +from Products.CMFCore.MemberDataTool import MemberDataTool as BaseTool +from Products.CMFCore.MemberDataTool import MemberData as BaseData +from Products.CMFCore.MemberDataTool import MemberAdapter as BaseMemberAdapter +from zope.component import adapts +from zope.component import getUtility +from zope.interface import implements +from Products.CMFCore.interfaces import IMember +from Products.CMFCore.interfaces import IRegistrationTool +# from Products.CMFCore.MemberDataTool import CleanupTemp +#from Products.CMFCore.utils import getToolByName +from Products.CMFCore.CMFCatalogAware import CMFCatalogAware +from Products.CMFCore.DynamicType import DynamicType +from Products.CMFCore.exceptions import BadRequest +from utils import formatFullName +from permissions import SetMemberProperties, SetMemberPassword + + +class MemberDataTool (BaseTool): + """ This tool wraps user objects, making them act as Member objects. + """ + + meta_type = 'Plinn Member Data Tool' +## __implements__ = (IMemberDataTool, ActionProviderBase.__implements__) + + security = ClassSecurityInfo() + + def __init__(self): + BaseTool.__init__(self) + # Create the default properties. + self._setProperty('name', '', 'string') + self._setProperty('given_name', '', 'string') + self._setProperty('wysiwyg_editor', 'FCK', 'string') + self._setProperty('photo_width', 800, 'int') + + def wrapUser(self, u) : + wu = super(MemberDataTool, self).wrapUser(u) + return wu.__of__(self).__of__(u) + + + def __bobo_traverse__(self, REQUEST, name): + if hasattr(self,name): + return getattr(self,name) + else: + if self._members.has_key(name) : + return self.wrapUser(self.acl_users.getUser(name)) + +InitializeClass(MemberDataTool) + + +class MemberAdapter(BaseMemberAdapter, SimpleItem, DynamicType, CMFCatalogAware): + + """Member data adapter. + """ + + adapts(IUser, IMemberDataTool) + implements(IMember) + + portal_type = 'Member Data' + + security = ClassSecurityInfo() + + def __init__(self, user, tool): + super(MemberAdapter, self).__init__(user, tool) + self.id = self.getId() + + security.declarePublic('getMemberFullName') + def getMemberFullName(self, nameBefore=1) : + """ Return the best full name representation """ + memberName = self.getProperty('name', default='') + memberGivenName = self.getProperty('given_name', default='') + memberId = self.getId() + return formatFullName(memberName, memberGivenName, memberId, nameBefore=nameBefore) + + def getMemberSortableFormat(self) : + """ Return a specific format of full name for alphabetical sorting """ + return self.getMemberFullName(nameBefore = 1).lower() + + # security overload + security.declareProtected(SetMemberProperties, 'setMemberProperties') + def setMemberProperties(self, mapping): + super(MemberAdapter, self).setMemberProperties(mapping) + self.reindexObject() + + security.declareProtected(SetMemberPassword, 'setMemberPassword') + def setMemberPassword(self, password, domains=None) : + """ set member password """ + + registration = getUtility(IRegistrationTool) + failMessage = registration.testPasswordValidity(password) + if failMessage is not None : + raise BadRequest(failMessage) + + self.setSecurityProfile(password=password, domains=domains) + + security.declarePrivate('setSecurityProfile') + def setSecurityProfile(self, password=None, roles=None, domains=None): + """Set the user's basic security profile""" + u = self.getUser() + # This is really hackish. The Zope User API needs methods + # for performing these functions. + if password is not None: + u.setPassword(password) + if roles is not None: + u.setRoles(roles) + if domains is not None: + u.setDomains(domains) + + security.declarePrivate('manage_beforeDelete') + def manage_beforeDelete(self) : + """ uncatalog object """ + self.unindexObject() + + def _setPortalTypeName(self, pt) : + """ Static Dynamic Type ;-) """ + pass + + # user object interface + # overloads to make methods not publishable + + def getUserName(self): + return super(MemberAdapter, self).getUserName() + + def getId(self): + return super(MemberAdapter, self).getId() + + def getRoles(self): + return self._user.aq_inner.getRoles() + # return super(MemberAdapter, self).getRoles() + + def getRolesInContext(self, object): + return super(MemberAdapter, self).getRolesInContext(object) + + def getDomains(self): + return super(MemberAdapter, self).getDomains() + + def has_role(self, roles, object=None): + return super(MemberAdapter, self).has_role(roles, object=None) + +InitializeClass(MemberAdapter) + + +class MemberData (BaseData, DynamicType, CMFCatalogAware): + +## __implements__ = IMemberData + + portal_type = 'Member Data' + + security = ClassSecurityInfo() +# migré +# security.declareProtected(SetMemberPassword, 'setMemberPassword') +# def setMemberPassword(self, password, domains=None) : +# """ set member password """ +# +# registration = getToolByName(self, 'portal_registration', None) +# if registration: +# failMessage = registration.testPasswordValidity(password) +# if failMessage is not None: +# raise 'Bad Request', failMessage +# +# user_folder = self.acl_users +# self.setSecurityProfile(password=password, domains=domains) +# if user_folder.meta_type == 'Group User Folder' : +# self.changePassword(password) + + +#migré + #XXX restore the previous implementation for GRUF 2 I'll remove that later... +# security.declarePrivate('setSecurityProfile') +# def setSecurityProfile(self, password=None, roles=None, domains=None): +# """Set the user's basic security profile""" +# u = self.getUser() +# # This is really hackish. The Zope User API needs methods +# # for performing these functions. +# if password is not None: +# u.__ = password +# if roles is not None: +# u.roles = roles +# if domains is not None: +# u.domains = domains + +# migré +# def getMemberFullName(self, nameBefore=1) : +# """ Return the best full name representation """ +# memberName = self.getProperty('name', default='') +# memberGivenName = self.getProperty('given_name', default='') +# memberId = self.getProperty('id', default='') +# return formatFullName(memberName, memberGivenName, memberId, nameBefore=nameBefore) + +# migré +# def getMemberSortableFormat(self) : +# """ Return a specific format of full name for alphabetical sorting """ +# return self.getMemberFullName(nameBefore = 1).lower() + + +# migré +# ## overload default security declaration +# security.declareProtected(SetMemberProperties, 'setMemberProperties') +# def setMemberProperties(self, mapping): +# BaseData.setMemberProperties(self, mapping) +# self.reindexObject() + +# migré +# security.declarePrivate('manage_beforeDelete') +# def manage_beforeDelete(self) : +# """ uncatalog object """ +# self.unindexObject() + +# migré +# def _setPortalTypeName(self, pt) : +# """ Static Dynamic Type ;-) """ +# pass + +# migré +# # user object interface +# # overloads to make methods not publishable +# +# def getUserName(self): +# return BaseData.getUserName(self) +# +# def getId(self): +# return BaseData.getId(self) +# +# def getRoles(self): +# return BaseData.getRoles(self) +# +# def getRolesInContext(self, object): +# return BaseData.getRolesInContext(self, object) +# +# def getDomains(self): +# return BaseData.getDomains(self) +# +# def has_role(self, roles, object=None): +# return BaseData.has_role(self, roles, object=None) + + + +InitializeClass(MemberData)