From: Benoît Pin <benoit.pin@gmail.com>
Date: Tue, 11 Jun 2013 20:00:34 +0000 (+0200)
Subject: Merge branch 'zope-2.13' of ssh://ssh.cri.ensmp.fr/~pin/gitrepositories/Plinn into... 
X-Git-Url: https://scm.cri.minesparis.psl.eu/git/Plinn.git/commitdiff_plain/432b8b854c6dfc25301e4a465457bc4d9a00d207?hp=38cb3db32e933c357ff9e7e0e85eac1535fa0217

Merge branch 'zope-2.13' of ssh://ssh.cri.ensmp.fr/~pin/gitrepositories/Plinn into zope-2.13
---

diff --git a/MemberDataTool.py b/MemberDataTool.py
index a75f503..85fc4b2 100755
--- a/MemberDataTool.py
+++ b/MemberDataTool.py
@@ -27,16 +27,20 @@ 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.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
 
@@ -57,52 +61,11 @@ class MemberDataTool (BaseTool):
 		self._setProperty('given_name', '', 'string')
 		self._setProperty('wysiwyg_editor', 'FCK', 'string')
 		self._setProperty('photo_width', 800, 'int')
-
-#	security.declarePrivate('wrapUser')
-#	def wrapUser(self, u):
-#		'''
-#		If possible, returns the Member object that corresponds
-#		to the given User object.
-#		'''
-#		id = u.getId()
-#		members = self._members
-#		if not id in members:
-#			base = aq_base(self)
-#			members[id] = MemberData(base, id)
-#		# Return a wrapper with self as containment and
-#		# the user as context.
-#		return members[id].__of__(self).__of__(u)
-
-#	security.declarePrivate('wrapUser')
-#	def wrapUser(self, u):
-#		"""
-#		If possible, returns the Member object that corresponds
-#		to the given User object.
-#		"""
-#		id = u.getId()
-#		members = self._members
-#		if not members.has_key(id):
-#			# Get a temporary member that might be
-#			# registered later via registerMemberData().
-#			temps = self._v_temps
-#			if temps is not None and temps.has_key(id):
-#				m = temps[id]
-#			else:
-#				base = aq_base(self)
-#				m = MemberData(base, id)
-#				if temps is None:
-#					self._v_temps = {id:m}
-#					if hasattr(self, 'REQUEST'):
-#						# No REQUEST during tests.
-#						self.REQUEST._hold(CleanupTemp(self))
-#				else:
-#					temps[id] = m
-#		else:
-#			m = members[id]
-#		# Return a wrapper with self as containment and
-#		# the user as context.
-#		return m.__of__(self).__of__(u)
-
+	
+	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):
@@ -114,13 +77,15 @@ class MemberDataTool (BaseTool):
 InitializeClass(MemberDataTool)
 
 
-class MemberAdapter(BaseMemberAdapter):
+class MemberAdapter(BaseMemberAdapter, SimpleItem, DynamicType, CMFCatalogAware):
 
 	"""Member data adapter.
 	"""
 
 	adapts(IUser, IMemberDataTool)
 	implements(IMember)
+	
+	portal_type = 'Member Data'
 
 	security = ClassSecurityInfo()
 	
@@ -135,36 +100,28 @@ class MemberAdapter(BaseMemberAdapter):
 		memberGivenName = self.getProperty('given_name', default='')
 		memberId = self.getId()
 		return formatFullName(memberName, memberGivenName, memberId, nameBefore=nameBefore)
-    
-
-InitializeClass(MemberAdapter)
-
-
-class MemberData (BaseData, DynamicType, CMFCatalogAware):
-
-##		 __implements__ = IMemberData
-
-	portal_type = 'Member Data'
 
-	security = ClassSecurityInfo()
+	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 = 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
+		registration = getUtility(IRegistrationTool)
+		failMessage = registration.testPasswordValidity(password)
+		if failMessage is not None :
+			raise BadRequest(failMessage)
+
 		self.setSecurityProfile(password=password, domains=domains)
-		if user_folder.meta_type == 'Group User Folder' :
-			self.changePassword(password)
-	
-	
-	#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"""
@@ -172,60 +129,137 @@ class MemberData (BaseData, DynamicType, CMFCatalogAware):
 		# This is really hackish.  The Zope User API needs methods
 		# for performing these functions.
 		if password is not None:
-			u.__ = password
+			u.setPassword(password)
 		if roles is not None:
-			u.roles = roles
+			u.setRoles(roles)
 		if domains is not None:
-			u.domains = domains
-
-
-	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)
-
-	def getMemberSortableFormat(self) :
-		""" Return a specific format of full name for alphabetical sorting """
-		return self.getMemberFullName(nameBefore = 1).lower()
-
-
-	## overload default security declaration
-	security.declareProtected(SetMemberProperties, 'setMemberProperties')
-	def setMemberProperties(self, mapping):
-		BaseData.setMemberProperties(self, mapping)
-		self.reindexObject()
+			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 BaseData.getUserName(self)
+		return super(MemberAdapter, self).getUserName()
 
 	def getId(self):
-		return BaseData.getId(self)
+		return super(MemberAdapter, self).getId()
 
 	def getRoles(self):
-		return BaseData.getRoles(self)
+		return super(MemberAdapter, self).getRoles()
 
 	def getRolesInContext(self, object):
-		return BaseData.getRolesInContext(self, object)
+		return super(MemberAdapter, self).getRolesInContext(object)
 
 	def getDomains(self):
-		return BaseData.getDomains(self)
+		return super(MemberAdapter, self).getDomains()
 
 	def has_role(self, roles, object=None):
-		return BaseData.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)
 
 
 
diff --git a/MembershipTool.py b/MembershipTool.py
index d60ed39..0d7624e 100755
--- a/MembershipTool.py
+++ b/MembershipTool.py
@@ -77,26 +77,26 @@ class MembershipTool( BaseTool ):
 	memberareaPortalType = 'Folder'
 	
 
-	security.declareProtected(SetOwnPassword, 'setPassword')
-	def setPassword(self, password, domains=None):
-		'''Allows the authenticated member to set his/her own password.
-		'''
-		user_folder = self.__getPUS()
-		if user_folder.meta_type == 'Group User Folder' :
-			registration = getToolByName(self, 'portal_registration', None)
-			if not self.isAnonymousUser():
-				member = self.getAuthenticatedMember()
-				if registration:
-					failMessage = registration.testPasswordValidity(password)
-					if failMessage is not None:
-						raise 'Bad Request', failMessage
-				member.setSecurityProfile(password=password, domains=domains)
-				member.changePassword(password)
-			else:
-				raise 'Bad Request', 'Not logged in.'
-			
-		else :
-			BaseTool.setPassword(self, password, domains=None)
+#	security.declareProtected(SetOwnPassword, 'setPassword')
+#	def setPassword(self, password, domains=None):
+#		'''Allows the authenticated member to set his/her own password.
+#		'''
+#		user_folder = self.__getPUS()
+#		if user_folder.meta_type == 'Group User Folder' :
+#			registration = getToolByName(self, 'portal_registration', None)
+#			if not self.isAnonymousUser():
+#				member = self.getAuthenticatedMember()
+#				if registration:
+#					failMessage = registration.testPasswordValidity(password)
+#					if failMessage is not None:
+#						raise 'Bad Request', failMessage
+#				member.setSecurityProfile(password=password, domains=domains)
+#				member.changePassword(password)
+#			else:
+#				raise 'Bad Request', 'Not logged in.'
+#			
+#		else :
+#			BaseTool.setPassword(self, password, domains=None)
 
 
 
diff --git a/skins/generic/gruf_macros.pt b/skins/generic/gruf_macros.pt
index e09c0fa..60c2d76 100755
--- a/skins/generic/gruf_macros.pt
+++ b/skins/generic/gruf_macros.pt
@@ -377,13 +377,13 @@
           <tr>
 	          <th nowrap="nowrap" i18n:translate="">Name</th>
 	          <td>
-	            <input type="text" name="name" size="40" tal:attributes="value selectedMember/name" />
+	            <input type="text" name="name" size="40" tal:attributes="value python:selectedMember.getProperty('name')" />
 	          </td>
 	        </tr>
           <tr>
 	          <th nowrap="nowrap" i18n:translate="">Given Name</th>
 	          <td>
-	            <input type="text" name="given_name" size="40" tal:attributes="value selectedMember/given_name" />
+	            <input type="text" name="given_name" size="40" tal:attributes="value python:selectedMember.getProperty('given_name')" />
 	          </td>
 	        </tr>
 	        <tr>
@@ -401,7 +401,7 @@
 	        <tr>
 	          <th nowrap="nowrap" i18n:translate="">Email address</th>
 	          <td>
-	            <input type="text" name="email" size="40" tal:attributes="value selectedMember/email" />
+	            <input type="text" name="email" size="40" tal:attributes="value python:selectedMember.getProperty('email')" />
 	          </td>
 	        </tr>
 	        <tr>