X-Git-Url: https://svn.cri.mines-paristech.fr/git/Plinn.git/blobdiff_plain/3e0a2c257d49fb162da9c70d2f70194036235166..7b214c44a658439ccb762ca0e0467c1196828e2b:/Folder.py?ds=sidebyside

diff --git a/Folder.py b/Folder.py
index 9cd4d8b..0d395be 100644
--- a/Folder.py
+++ b/Folder.py
@@ -19,13 +19,14 @@
 #######################################################################################
 """ Plinn portal folder implementation
 
-$Id: Folder.py 1459 2009-02-02 00:57:24Z pin $
-$URL: http://svn.cri.ensmp.fr/svn/Plinn/branches/CMF-2.1/Folder.py $
+
+
 """
 
 from OFS.CopySupport import CopyError, eNoData, _cb_decode, eInvalid, eNotFound,\
 							eNotSupported, sanity_check, cookie_path
 from App.Dialogs import MessageDialog
+from zExceptions import BadRequest
 import sys
 import warnings
 from cgi import escape
@@ -34,15 +35,22 @@ from ZODB.POSException import ConflictError
 import OFS.subscribers
 from zope.event import notify
 from zope.lifecycleevent import ObjectCopiedEvent
-from zope.app.container.contained import ObjectMovedEvent
-from zope.app.container.contained import notifyContainerModified
+try :
+	from zope.app.container.contained import notifyContainerModified
+	from zope.app.container.contained import ObjectMovedEvent
+except ImportError :
+	## Zope-2.13 compat
+	from zope.container.contained import notifyContainerModified
+	from zope.container.contained import ObjectMovedEvent
 from OFS.event import ObjectClonedEvent
 from OFS.event import ObjectWillBeMovedEvent
 from zope.component.factory import Factory
 from Acquisition import aq_base, aq_inner, aq_parent
 
 from types import StringType
-from Products.CMFCore.permissions import ListFolderContents, View, ManageProperties, AddPortalFolders, AddPortalContent, ManagePortal
+from Products.CMFCore.permissions import ListFolderContents, View, ViewManagementScreens,\
+										 ManageProperties, AddPortalFolders, AddPortalContent,\
+										 ManagePortal, ModifyPortalContent
 from permissions import DeletePortalContents, DeleteObjects, DeleteOwnedObjects, SetLocalRoles, CheckMemberPermission
 from Products.CMFCore.utils import _checkPermission, getToolByName
 from Products.CMFCore.CMFCatalogAware import CMFCatalogAware
@@ -53,6 +61,7 @@ from zope.interface import implements
 from Products.CMFCore.interfaces import IContentish
 
 from utils import _checkMemberPermission
+from utils import Message as _
 from Globals import InitializeClass
 from AccessControl import ClassSecurityInfo
 
@@ -105,7 +114,7 @@ class PlinnFolder(CMFCatalogAware, PortalFolder, DefaultDublinCoreImpl) :
 
 	security.declareProtected(DeletePortalContents, 'manage_delObjects')
 	def manage_delObjects(self, ids=[], REQUEST=None):
-		"""Delete a subordinate object.
+		"""Delete subordinate objects.
 		   A member can delete his owned contents (if he has the 'Delete Portal Contents' permission)
 		   without 'Delete objects' permission in this folder.
 		   Return skipped object ids.
@@ -133,7 +142,38 @@ class PlinnFolder(CMFCatalogAware, PortalFolder, DefaultDublinCoreImpl) :
 				manage_tabs_message='Object(s) deleted.',
 				update_menu=1)
 		return notOwned
-				
+
+
+	security.declareProtected(AddPortalContent, 'manage_renameObjects')
+	def manage_renameObjects(self, ids=[], new_ids=[], REQUEST=None) :
+		""" Rename subordinate objects
+			A member can rename his owned contents if he has the 'Modify Portal Content' permission.
+			Returns skippend object ids.
+		"""
+		if len(ids) != len(new_ids):
+			raise BadRequest(_('Please rename each listed object.'))
+		
+		if _checkPermission(ViewManagementScreens, self) : # std zope perm
+			return super(PlinnFolder, self).manage_renameObjects(ids, new_ids, REQUEST)
+			
+		mtool = getToolByName(self, 'portal_membership')
+		authMember = mtool.getAuthenticatedMember()
+		skiped = []
+		for id, new_id in zip(ids, new_ids) :
+			if id == new_id : continue
+			
+			ob = self._getOb(id)
+			if authMember.allowed(ob, object_roles=['Owner'] ) and \
+			   _checkPermission(ModifyPortalContent, ob) :
+				self.manage_renameObject(id, new_id)
+			else :
+				skiped.append(id)
+		
+		if REQUEST is not None :
+			return self.manage_main(self, REQUEST, update_menu=1)
+
+		return skiped
+
 
 	security.declareProtected(ListFolderContents, 'listFolderContents')
 	def listFolderContents( self, contentFilter=None ):
@@ -242,164 +282,164 @@ class PlinnFolder(CMFCatalogAware, PortalFolder, DefaultDublinCoreImpl) :
 				self, REQUEST, portal_status_message="Folder added")
 
 	
-	## overload to maintain ownership if authenticated user has 'Manage portal' permission
-	def manage_pasteObjects(self, cb_copy_data=None, REQUEST=None):
-		"""Paste previously copied objects into the current object.
-
-		If calling manage_pasteObjects from python code, pass the result of a
-		previous call to manage_cutObjects or manage_copyObjects as the first
-		argument.
-
-		Also sends IObjectCopiedEvent and IObjectClonedEvent
-		or IObjectWillBeMovedEvent and IObjectMovedEvent.
-		"""
-		if cb_copy_data is not None:
-			cp = cb_copy_data
-		elif REQUEST is not None and REQUEST.has_key('__cp'):
-			cp = REQUEST['__cp']
-		else:
-			cp = None
-		if cp is None:
-			raise CopyError, eNoData
-
-		try:
-			op, mdatas = _cb_decode(cp)
-		except:
-			raise CopyError, eInvalid
-
-		oblist = []
-		app = self.getPhysicalRoot()
-		for mdata in mdatas:
-			m = Moniker.loadMoniker(mdata)
-			try:
-				ob = m.bind(app)
-			except ConflictError:
-				raise
-			except:
-				raise CopyError, eNotFound
-			self._verifyObjectPaste(ob, validate_src=op+1)
-			oblist.append(ob)
-
-		result = []
-		if op == 0:
-			# Copy operation
-			mtool = getToolByName(self, 'portal_membership')
-			utool = getToolByName(self, 'portal_url')
-			portal = utool.getPortalObject()
-			userIsPortalManager = mtool.checkPermission(ManagePortal, portal)
-
-			for ob in oblist:
-				orig_id = ob.getId()
-				if not ob.cb_isCopyable():
-					raise CopyError, eNotSupported % escape(orig_id)
-
-				try:
-					ob._notifyOfCopyTo(self, op=0)
-				except ConflictError:
-					raise
-				except:
-					raise CopyError, MessageDialog(
-						title="Copy Error",
-						message=sys.exc_info()[1],
-						action='manage_main')
-
-				id = self._get_id(orig_id)
-				result.append({'id': orig_id, 'new_id': id})
-
-				orig_ob = ob
-				ob = ob._getCopy(self)
-				ob._setId(id)
-				notify(ObjectCopiedEvent(ob, orig_ob))
-				
-				if not userIsPortalManager :
-					self._setObject(id, ob, suppress_events=True)
-				else :
-					self._setObject(id, ob, suppress_events=True, set_owner=0)
-				ob = self._getOb(id)
-				ob.wl_clearLocks()
-
-				ob._postCopy(self, op=0)
-
-				OFS.subscribers.compatibilityCall('manage_afterClone', ob, ob)
-
-				notify(ObjectClonedEvent(ob))
-
-			if REQUEST is not None:
-				return self.manage_main(self, REQUEST, update_menu=1,
-										cb_dataValid=1)
-
-		elif op == 1:
-			# Move operation
-			for ob in oblist:
-				orig_id = ob.getId()
-				if not ob.cb_isMoveable():
-					raise CopyError, eNotSupported % escape(orig_id)
-
-				try:
-					ob._notifyOfCopyTo(self, op=1)
-				except ConflictError:
-					raise
-				except:
-					raise CopyError, MessageDialog(
-						title="Move Error",
-						message=sys.exc_info()[1],
-						action='manage_main')
-
-				if not sanity_check(self, ob):
-					raise CopyError, "This object cannot be pasted into itself"
-
-				orig_container = aq_parent(aq_inner(ob))
-				if aq_base(orig_container) is aq_base(self):
-					id = orig_id
-				else:
-					id = self._get_id(orig_id)
-				result.append({'id': orig_id, 'new_id': id})
-
-				notify(ObjectWillBeMovedEvent(ob, orig_container, orig_id,
-											  self, id))
-
-				# try to make ownership explicit so that it gets carried
-				# along to the new location if needed.
-				ob.manage_changeOwnershipType(explicit=1)
-
-				try:
-					orig_container._delObject(orig_id, suppress_events=True)
-				except TypeError:
-					orig_container._delObject(orig_id)
-					warnings.warn(
-						"%s._delObject without suppress_events is discouraged."
-						% orig_container.__class__.__name__,
-						DeprecationWarning)
-				ob = aq_base(ob)
-				ob._setId(id)
-
-				try:
-					self._setObject(id, ob, set_owner=0, suppress_events=True)
-				except TypeError:
-					self._setObject(id, ob, set_owner=0)
-					warnings.warn(
-						"%s._setObject without suppress_events is discouraged."
-						% self.__class__.__name__, DeprecationWarning)
-				ob = self._getOb(id)
-
-				notify(ObjectMovedEvent(ob, orig_container, orig_id, self, id))
-				notifyContainerModified(orig_container)
-				if aq_base(orig_container) is not aq_base(self):
-					notifyContainerModified(self)
-
-				ob._postCopy(self, op=1)
-				# try to make ownership implicit if possible
-				ob.manage_changeOwnershipType(explicit=0)
-
-			if REQUEST is not None:
-				REQUEST['RESPONSE'].setCookie('__cp', 'deleted',
-									path='%s' % cookie_path(REQUEST),
-									expires='Wed, 31-Dec-97 23:59:59 GMT')
-				REQUEST['__cp'] = None
-				return self.manage_main(self, REQUEST, update_menu=1,
-										cb_dataValid=0)
-
-		return result
+#   ## overload to maintain ownership if authenticated user has 'Manage portal' permission
+#   def manage_pasteObjects(self, cb_copy_data=None, REQUEST=None):
+#   	"""Paste previously copied objects into the current object.
+#
+#   	If calling manage_pasteObjects from python code, pass the result of a
+#   	previous call to manage_cutObjects or manage_copyObjects as the first
+#   	argument.
+#
+#   	Also sends IObjectCopiedEvent and IObjectClonedEvent
+#   	or IObjectWillBeMovedEvent and IObjectMovedEvent.
+#   	"""
+#   	if cb_copy_data is not None:
+#   		cp = cb_copy_data
+#   	elif REQUEST is not None and REQUEST.has_key('__cp'):
+#   		cp = REQUEST['__cp']
+#   	else:
+#   		cp = None
+#   	if cp is None:
+#   		raise CopyError, eNoData
+#
+#   	try:
+#   		op, mdatas = _cb_decode(cp)
+#   	except:
+#   		raise CopyError, eInvalid
+#
+#   	oblist = []
+#   	app = self.getPhysicalRoot()
+#   	for mdata in mdatas:
+#   		m = Moniker.loadMoniker(mdata)
+#   		try:
+#   			ob = m.bind(app)
+#   		except ConflictError:
+#   			raise
+#   		except:
+#   			raise CopyError, eNotFound
+#   		self._verifyObjectPaste(ob, validate_src=op+1)
+#   		oblist.append(ob)
+#
+#   	result = []
+#   	if op == 0:
+#   		# Copy operation
+#   		mtool = getToolByName(self, 'portal_membership')
+#   		utool = getToolByName(self, 'portal_url')
+#   		portal = utool.getPortalObject()
+#   		userIsPortalManager = mtool.checkPermission(ManagePortal, portal)
+#
+#   		for ob in oblist:
+#   			orig_id = ob.getId()
+#   			if not ob.cb_isCopyable():
+#   				raise CopyError, eNotSupported % escape(orig_id)
+#
+#   			try:
+#   				ob._notifyOfCopyTo(self, op=0)
+#   			except ConflictError:
+#   				raise
+#   			except:
+#   				raise CopyError, MessageDialog(
+#   					title="Copy Error",
+#   					message=sys.exc_info()[1],
+#   					action='manage_main')
+#
+#   			id = self._get_id(orig_id)
+#   			result.append({'id': orig_id, 'new_id': id})
+#
+#   			orig_ob = ob
+#   			ob = ob._getCopy(self)
+#   			ob._setId(id)
+#   			notify(ObjectCopiedEvent(ob, orig_ob))
+#   			
+#   			if not userIsPortalManager :
+#   				self._setObject(id, ob, suppress_events=True)
+#   			else :
+#   				self._setObject(id, ob, suppress_events=True, set_owner=0)
+#   			ob = self._getOb(id)
+#   			ob.wl_clearLocks()
+#
+#   			ob._postCopy(self, op=0)
+#
+#   			OFS.subscribers.compatibilityCall('manage_afterClone', ob, ob)
+#
+#   			notify(ObjectClonedEvent(ob))
+#
+#   		if REQUEST is not None:
+#   			return self.manage_main(self, REQUEST, update_menu=1,
+#   									cb_dataValid=1)
+#
+#   	elif op == 1:
+#   		# Move operation
+#   		for ob in oblist:
+#   			orig_id = ob.getId()
+#   			if not ob.cb_isMoveable():
+#   				raise CopyError, eNotSupported % escape(orig_id)
+#
+#   			try:
+#   				ob._notifyOfCopyTo(self, op=1)
+#   			except ConflictError:
+#   				raise
+#   			except:
+#   				raise CopyError, MessageDialog(
+#   					title="Move Error",
+#   					message=sys.exc_info()[1],
+#   					action='manage_main')
+#
+#   			if not sanity_check(self, ob):
+#   				raise CopyError, "This object cannot be pasted into itself"
+#
+#   			orig_container = aq_parent(aq_inner(ob))
+#   			if aq_base(orig_container) is aq_base(self):
+#   				id = orig_id
+#   			else:
+#   				id = self._get_id(orig_id)
+#   			result.append({'id': orig_id, 'new_id': id})
+#
+#   			notify(ObjectWillBeMovedEvent(ob, orig_container, orig_id,
+#   										  self, id))
+#
+#   			# try to make ownership explicit so that it gets carried
+#   			# along to the new location if needed.
+#   			ob.manage_changeOwnershipType(explicit=1)
+#
+#   			try:
+#   				orig_container._delObject(orig_id, suppress_events=True)
+#   			except TypeError:
+#   				orig_container._delObject(orig_id)
+#   				warnings.warn(
+#   					"%s._delObject without suppress_events is discouraged."
+#   					% orig_container.__class__.__name__,
+#   					DeprecationWarning)
+#   			ob = aq_base(ob)
+#   			ob._setId(id)
+#
+#   			try:
+#   				self._setObject(id, ob, set_owner=0, suppress_events=True)
+#   			except TypeError:
+#   				self._setObject(id, ob, set_owner=0)
+#   				warnings.warn(
+#   					"%s._setObject without suppress_events is discouraged."
+#   					% self.__class__.__name__, DeprecationWarning)
+#   			ob = self._getOb(id)
+#
+#   			notify(ObjectMovedEvent(ob, orig_container, orig_id, self, id))
+#   			notifyContainerModified(orig_container)
+#   			if aq_base(orig_container) is not aq_base(self):
+#   				notifyContainerModified(self)
+#
+#   			ob._postCopy(self, op=1)
+#   			# try to make ownership implicit if possible
+#   			ob.manage_changeOwnershipType(explicit=0)
+#
+#   		if REQUEST is not None:
+#   			REQUEST['RESPONSE'].setCookie('__cp', 'deleted',
+#   								path='%s' % cookie_path(REQUEST),
+#   								expires='Wed, 31-Dec-97 23:59:59 GMT')
+#   			REQUEST['__cp'] = None
+#   			return self.manage_main(self, REQUEST, update_menu=1,
+#   									cb_dataValid=0)
+#
+#   	return result
 
 		
 InitializeClass(PlinnFolder)