def manage_pasteObjects(self, cb_copy_data=None, REQUEST=None): """Paste previously copied objects into the current object, making folders into chapters and RhaptosModuleEditors into ContentPointers (and not destroying their originals). Other objects will be as usual. Largely copied from OFS.CopySupport. If calling manage_pasteObjects from python code, pass the result of a previous call to manage_cutObjects or manage_copyObjects as the first argument.""" cp = None if cb_copy_data is not None: cp = cb_copy_data else: if REQUEST and REQUEST.has_key('__cp'): cp = REQUEST['__cp'] if cp is None: raise CopyError, eNoData try: cp = _cb_decode(cp) except: raise CopyError, eInvalid oblist = [] op = cp[0] app = self.getPhysicalRoot() result = [] duplicates = [] for mdata in cp[1]: m = Moniker.loadMoniker(mdata) try: ob = m.bind(app) except: raise CopyError, eNotFound oblist.append(ob) for ob in oblist: self._verifyObjectPaste(ob) if op == 0: # Copy operation for ob in oblist: if not ob.cb_isCopyable(): raise CopyError, eNotSupported % ob.getId() try: ob._notifyOfCopyTo(self, op=0) except: raise CopyError, MessageDialog(title='Copy Error', message=sys.exc_info()[1], action='manage_main') #ob=ob._getCopy(self) orig_id = ob.getId() id = self._get_id(ob.getId()) ob, dupes = self._getTransformCopy(ob, op, id, self) # NEW duplicates.extend(dupes) if ob: result.append({'id': orig_id, 'new_id': id}) #ob._setId(id) #self._setObject(id, ob) #ob = self._getOb(id) ob.manage_afterClone(ob) if REQUEST is not None: return self.manage_main(self, REQUEST, update_menu=1, cb_dataValid=1) if op == 1: # Move operation for ob in oblist: id = ob.getId() if not ob.cb_isMoveable(): raise CopyError, eNotSupported % id try: ob._notifyOfCopyTo(self, op=1) 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' ### NEW BELOW ### if self._transformableType(ob): # do the "copy" procedure orig_id = ob.getId() id = self._get_id(ob.getId()) ob, dupes = self._getTransformCopy(ob, op, id) duplicates.extend(dupes) if ob: result.append({'id': orig_id, 'new_id': id}) ob.manage_afterClone(ob) else: ### NEW ABOVE (below is ++indented compared to original) ### # try to make ownership explicit so that it gets carried # along to the new location if needed. old = ob orig_id = ob.getId() id = self._get_id(ob.getId()) ob, dupes = self._getTransformCopy(ob, op, id) duplicates.extend(dupes) if ob: result.append({'id': orig_id, 'new_id': id}) ob.manage_afterClone(ob) aq_parent(aq_inner(old))._delObject(id) 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) if duplicates: raise "DuplicateError", duplicates return result
def _duplicate(self, cp): try: cp = _cb_decode(cp) except: raise CopyError, 'Clipboard Error' oblist = [] op = cp[0] app = self.getPhysicalRoot() result = [] for mdata in cp[1]: m = Moniker.loadMoniker(mdata) try: ob = m.bind(app) except: raise CopyError, 'Not Found' self._verifyObjectPaste(ob, validate_src=1) oblist.append(ob) if op == 0: for ob in oblist: if not ob.cb_isCopyable(): raise CopyError, 'Not Supported' try: ob._notifyOfCopyTo(self, op=0) except: raise CopyError, 'Copy Error' ob = ob._getCopy(self) orig_id = ob.getId() id = self._get_id(ob.getId()) result.append({'id': orig_id, 'new_id': id}) ob._setId(id) self._setObject(id, ob) ob = self._getOb(id) ob._postCopy(self, op=0) ob._postDuplicate() ob.wl_clearLocks() if op == 1: # Move operation for ob in oblist: id = ob.getId() if not ob.cb_isMoveable(): raise CopyError, 'Not Supported' try: ob._notifyOfCopyTo(self, op=1) except: raise CopyError, 'Move Error' if not sanity_check(self, ob): raise CopyError, 'This object cannot be pasted into itself' # try to make ownership explicit so that it gets carried # along to the new location if needed. ob.manage_changeOwnershipType(explicit=1) aq_parent(aq_inner(ob))._delObject(id) ob = aq_base(ob) orig_id = id id = self._get_id(id) result.append({'id': orig_id, 'new_id': id}) ob._setId(id) self._setObject(id, ob, set_owner=0) ob = self._getOb(id) ob._postCopy(self, op=1) # try to make ownership implicit if possible ob.manage_changeOwnershipType(explicit=0) return result
def manage_pasteObjects(self, cb_copy_data=None, is_indexable=True, 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. If is_indexable is False, we will avoid indexing the pasted objects and subobjects """ cp = None if cb_copy_data is not None: cp = cb_copy_data else: if REQUEST and REQUEST.has_key('__cp'): cp = REQUEST['__cp'] if cp is None: raise CopyError, eNoData try: cp = _cb_decode(cp) except: raise CopyError, eInvalid oblist = [] op = cp[0] app = self.getPhysicalRoot() result = [] for mdata in cp[1]: m = Moniker.loadMoniker(mdata) try: ob = m.bind(app) except: raise CopyError, eNotFound self._verifyObjectPaste(ob, validate_src=op + 1) oblist.append(ob) if op == 0: # Copy operation for ob in oblist: if not ob.cb_isCopyable(): raise CopyError, eNotSupported % escape(ob.getId()) try: ob._notifyOfCopyTo(self, op=0) except: raise CopyError, MessageDialog(title='Copy Error', message=sys.exc_info()[1], action='manage_main') ob = ob._getCopy(self) orig_id = ob.getId() id = self._get_id(ob.getId()) result.append({'id': orig_id, 'new_id': id}) ob._setId(id) if not is_indexable: ob._setNonIndexable() self._setObject(id, ob) ob = self._getOb(id) ob._postCopy(self, op=0) ob.manage_afterClone(ob) ob.wl_clearLocks() if REQUEST is not None: return self.manage_main(self, REQUEST, update_menu=1, cb_dataValid=1) if op == 1: # Move operation for ob in oblist: id = ob.getId() if not ob.cb_isMoveable(): raise CopyError, eNotSupported % escape(id) try: ob._notifyOfCopyTo(self, op=1) 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' # try to make ownership explicit so that it gets carried # along to the new location if needed. ob.manage_changeOwnershipType(explicit=1) aq_parent(aq_inner(ob))._delObject(id) ob = aq_base(ob) orig_id = id id = self._get_id(id) result.append({'id': orig_id, 'new_id': id}) ob._setId(id) if not is_indexable: ob._setNonIndexable() self._setObject(id, ob, set_owner=0) ob = self._getOb(id) 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
def manage_pasteObjects_no_events(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. """ anno = IAnnotations(self) job_id = anno.get('async_move_job') if not REQUEST: # Create a request to work with REQUEST = create_request() 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() cat = getToolByName(self, 'portal_catalog') for mdata in mdatas: m = 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 = [] steps = oblist and int(100/len(oblist)) or 0 notify(AsyncMoveSaveProgress( self, operation='initialize', job_id=job_id, oblist_id=[ (o.getId(), o.Title()) for o in oblist ])) if op == 0: # Copy operation for i, ob in enumerate(oblist): orig_id = ob.getId() if not ob.cb_isCopyable(): raise CopyError(eNotSupported % escape(orig_id)) oid = self._get_id(orig_id) result.append({'id': orig_id, 'new_id': oid}) notify(AsyncMoveSaveProgress( self, operation='sub_progress', job_id=job_id, obj_id=ob.getId(), progress=.25 )) ob = ob._getCopy(self) ob._setId(oid) notify(AsyncMoveSaveProgress( self, operation='sub_progress', job_id=job_id, obj_id=ob.getId(), progress=.50 )) self._setObject(oid, ob) ob = self._getOb(oid) ob.wl_clearLocks() notify(AsyncMoveSaveProgress( self, operation='sub_progress', job_id=job_id, obj_id=ob.getId(), progress=.75 )) ob._postCopy(self, op=0) compatibilityCall('manage_afterClone', ob, ob) notify(AsyncMoveSaveProgress( self, operation='sub_progress', job_id=job_id, obj_id=ob.getId(), progress=1 )) notify(AsyncMoveSaveProgress( self, operation='progress', job_id=job_id, progress=steps*(i+1)/100 )) if op == 1: # Move operation for i, ob in enumerate(oblist): orig_id = ob.getId() 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): oid = orig_id else: oid = self._get_id(orig_id) result.append({'id': orig_id, 'new_id': oid}) unindex_object(ob, recursive=1) # try to make ownership explicit so that it gets carried # along to the new location if needed. ob.manage_changeOwnershipType(explicit=1) notify(AsyncMoveSaveProgress( self, operation='sub_progress', job_id=job_id, obj_id=ob.getId(), progress=.25 )) try: obj_path = '/'.join( orig_container.getPhysicalPath()) + '/' + orig_id orig_container._delObject(orig_id, suppress_events=True) uncatalog_path = obj_path try: uncatalog_objs = cat(path=obj_path) for obj_brain in uncatalog_objs: uncatalog_path = obj_brain.getPath() cat.uncatalog_object(uncatalog_path) except AttributeError: logger.warn("%s could not be found", uncatalog_path) except TypeError: orig_container._delObject(orig_id) logger.warn( "%s._delObject without suppress_events is discouraged.", orig_container.__class__.__name__) notify(AsyncMoveSaveProgress( self, operation='sub_progress', job_id=job_id, obj_id=ob.getId(), progress=.50 )) ob = aq_base(ob) ob._setId(oid) try: self._setObject(oid, ob, set_owner=0, suppress_events=True) except TypeError: self._setObject(oid, ob, set_owner=0) logger.warn( "%s._setObject without suppress_events is discouraged.", self.__class__.__name__) ob = self._getOb(oid) ob._postCopy(self, op=1) # try to make ownership implicit if possible ob.manage_changeOwnershipType(explicit=0) notify(AsyncMoveSaveProgress( self, operation='sub_progress', job_id=job_id, obj_id=ob.getId(), progress=.75 )) reindex_object(ob, recursive=1) notify(AsyncMoveSaveProgress( self, operation='sub_progress', job_id=job_id, obj_id=ob.getId(), progress=1 )) notify(AsyncMoveSaveProgress( self, operation='progress', job_id=job_id, progress=steps*(i+1)/100 )) notify(AsyncMoveSaveProgress( self, operation='progress', job_id=job_id, progress=1 )) del anno['async_move_job'] return result
class MoveActionExecutor(object): """The executor for this action. """ implements(IExecutable) adapts(Interface, IMoveAction, Interface) def __init__(self, context, element, event): self.context = context self.element = element self.event = event def __call__(self): portal_url = getToolByName(self.context, 'portal_url', None) if portal_url is None: return False obj = self.event.object parent = aq_parent(aq_inner(obj)) path = self.element.target_folder if len(path) > 1 and path[0] == '/': path = path[1:] target = portal_url.getPortalObject().unrestrictedTraverse( str(path), None) if target is None: self.error( obj, _(u"Target folder ${target} does not exist.", mapping={'target': path})) return False if target.absolute_url() == parent.absolute_url(): # We're already here! return True try: obj._notifyOfCopyTo(target, op=1) except ConflictError: raise except Exception, e: self.error(obj, str(e)) return False # Are we trying to move into the same container that we copied from? if not sanity_check(target, obj): return False old_id = obj.getId() new_id = self.generate_id(target, old_id) notify(ObjectWillBeMovedEvent(obj, parent, old_id, target, new_id)) obj.manage_changeOwnershipType(explicit=1) try: parent._delObject(old_id, suppress_events=True) except TypeError: # BBB: removed in Zope 2.11 parent._delObject(old_id) obj = aq_base(obj) obj._setId(new_id) try: target._setObject(new_id, obj, set_owner=0, suppress_events=True) except TypeError: # BBB: removed in Zope 2.11 target._setObject(new_id, obj, set_owner=0) obj = target._getOb(new_id) notify(ObjectMovedEvent(obj, parent, old_id, target, new_id)) notifyContainerModified(parent) if aq_base(parent) is not aq_base(target): notifyContainerModified(target) obj._postCopy(target, op=1) # try to make ownership implicit if possible obj.manage_changeOwnershipType(explicit=0) return True
def _duplicate(self, cp): try: cp = _cb_decode(cp) except: raise CopyError, 'Clipboard Error' oblist=[] op=cp[0] app = self.getPhysicalRoot() result = [] for mdata in cp[1]: m = Moniker.loadMoniker(mdata) try: ob = m.bind(app) except: raise CopyError, 'Not Found' self._verifyObjectPaste(ob, validate_src=1) oblist.append(ob) if op==0: for ob in oblist: if not ob.cb_isCopyable(): raise CopyError, 'Not Supported' try: ob._notifyOfCopyTo(self, op=0) except: raise CopyError, 'Copy Error' ob = ob._getCopy(self) orig_id = ob.getId() id = self._get_id(ob.getId()) result.append({'id':orig_id, 'new_id':id}) ob._setId(id) self._setObject(id, ob) ob = self._getOb(id) ob._postCopy(self, op=0) ob._postDuplicate() ob.wl_clearLocks() if op==1: # Move operation for ob in oblist: id = ob.getId() if not ob.cb_isMoveable(): raise CopyError, 'Not Supported' try: ob._notifyOfCopyTo(self, op=1) except: raise CopyError, 'Move Error' if not sanity_check(self, ob): raise CopyError, 'This object cannot be pasted into itself' # try to make ownership explicit so that it gets carried # along to the new location if needed. ob.manage_changeOwnershipType(explicit=1) aq_parent(aq_inner(ob))._delObject(id) ob = aq_base(ob) orig_id = id id = self._get_id(id) result.append({'id':orig_id, 'new_id':id }) ob._setId(id) self._setObject(id, ob, set_owner=0) ob = self._getOb(id) ob._postCopy(self, op=1) # try to make ownership implicit if possible ob.manage_changeOwnershipType(explicit=0) return result
def manage_pasteObjects(self, cb_copy_data=None, is_indexable=True, 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. If is_indexable is False, we will avoid indexing the pasted objects and subobjects """ cp=None if cb_copy_data is not None: cp=cb_copy_data else: if REQUEST and REQUEST.has_key('__cp'): cp=REQUEST['__cp'] if cp is None: raise CopyError, eNoData try: cp=_cb_decode(cp) except: raise CopyError, eInvalid oblist=[] op=cp[0] app = self.getPhysicalRoot() result = [] for mdata in cp[1]: m = Moniker.loadMoniker(mdata) try: ob = m.bind(app) except: raise CopyError, eNotFound self._verifyObjectPaste(ob, validate_src=op+1) oblist.append(ob) if op==0: # Copy operation for ob in oblist: if not ob.cb_isCopyable(): raise CopyError, eNotSupported % escape(ob.getId()) try: ob._notifyOfCopyTo(self, op=0) except: raise CopyError, MessageDialog( title='Copy Error', message=sys.exc_info()[1], action ='manage_main') ob=ob._getCopy(self) orig_id=ob.getId() id=self._get_id(ob.getId()) result.append({'id':orig_id, 'new_id':id}) ob._setId(id) if not is_indexable: ob._setNonIndexable() self._setObject(id, ob) ob = self._getOb(id) ob._postCopy(self, op=0) ob.manage_afterClone(ob) ob.wl_clearLocks() if REQUEST is not None: return self.manage_main(self, REQUEST, update_menu=1, cb_dataValid=1) if op==1: # Move operation for ob in oblist: id=ob.getId() if not ob.cb_isMoveable(): raise CopyError, eNotSupported % escape(id) try: ob._notifyOfCopyTo(self, op=1) 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' # try to make ownership explicit so that it gets carried # along to the new location if needed. ob.manage_changeOwnershipType(explicit=1) aq_parent(aq_inner(ob))._delObject(id) ob = aq_base(ob) orig_id=id id=self._get_id(id) result.append({'id':orig_id, 'new_id':id }) ob._setId(id) if not is_indexable: ob._setNonIndexable() self._setObject(id, ob, set_owner=0) ob=self._getOb(id) 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
def manage_pasteObjects_Version(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. """ # due to the ticket #14598: the need to also handle a cb_copy_data # structure that contains the desired new id on a copy/paste operation. # this feature will be used when creating a new version for an object. # if there is no new id also incapsulated in the cb_copy_data then # the copy/paste will work as default. # also the cut/paste remains the same. if cb_copy_data is not None: cp = cb_copy_data elif REQUEST is not None and '__cp' in REQUEST: cp = REQUEST['__cp'] else: cp = None if cp is None: raise CopyError(eNoData) try: op, mdatas, newids = _cb_decode(cp) except Exception: try: op, mdatas = _cb_decode(cp) newids = [] except Exception: raise CopyError(eInvalid) else: if len(mdatas) != len(newids): raise CopyError(eInvalid) oblist = [] app = self.getPhysicalRoot() for mdata in mdatas: m = loadMoniker(mdata) try: ob = m.bind(app) except ConflictError: raise except Exception: raise CopyError(eNotFound) self._verifyObjectPaste(ob, validate_src=op + 1) oblist.append(ob) if len(newids) == 0: newids = [''] * len(oblist) result = [] if op == 0: # Copy operation for ob, new_id in zip(oblist, newids): 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 Exception: raise CopyError( MessageDialog(title="Copy Error", message=sys.exc_info()[1], action='manage_main')) if new_id == '': new_id = self._get_id(orig_id) result.append({'id': orig_id, 'new_id': new_id}) orig_ob = ob ob = ob._getCopy(self) ob._setId(new_id) notify(ObjectCopiedEvent(ob, orig_ob)) self._setObject(new_id, ob) ob = self._getOb(new_id) ob.wl_clearLocks() ob._postCopy(self, op=0) 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 Exception: 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): new_id = orig_id else: new_id = self._get_id(orig_id) result.append({'id': orig_id, 'new_id': new_id}) notify( ObjectWillBeMovedEvent(ob, orig_container, orig_id, self, new_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(new_id) try: self._setObject(new_id, ob, set_owner=0, suppress_events=True) except TypeError: self._setObject(new_id, ob, set_owner=0) warnings.warn( "%s._setObject without suppress_events is discouraged." % self.__class__.__name__, DeprecationWarning) ob = self._getOb(new_id) notify(ObjectMovedEvent(ob, orig_container, orig_id, self, new_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
def unrestricted_move(self, ob): """Move an object from one container to another bypassing certain checks.""" orig_id = ob.getId() if not ob.cb_isMoveable(): raise CopyError('Not supported {}'.format(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) 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: # BBB: removed in Zope 2.11 orig_container._delObject(orig_id) warnings.warn( "%s._delObject without suppress_events is deprecated " "and will be removed in Zope 2.11." % 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: # BBB: removed in Zope 2.11 self._setObject(id, ob, set_owner=0) warnings.warn( "%s._setObject without suppress_events is deprecated " "and will be removed in Zope 2.11." % 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)
from redomino.revision.interfaces import IRevisionFileInfo from redomino.revision.interfaces import IRevisionWorkflowUtility from redomino.revision.browser.interfaces import IEnableRevisionView from redomino.revision.browser.interfaces import ICloneRevisionView def _move(parent, obj, target, old_id, new_id): try: obj._notifyOfCopyTo(target, op=1) except ConflictError: raise except Exception, e: raise e # Are we trying to move into the same container that we copied from? if not sanity_check(target, obj): return False notify(ObjectWillBeMovedEvent(obj, parent, old_id, target, new_id)) obj.manage_changeOwnershipType(explicit=1) try: parent._delObject(old_id, suppress_events=True) except TypeError: # BBB: removed in Zope 2.11 parent._delObject(old_id) obj = aq_base(obj) obj._setId(new_id)
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 or 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 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)) self._setObject(id, ob) ob = self._getOb(id) ob.wl_clearLocks() ob._postCopy(self, op=0) 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: # BBB: removed in Zope 2.11 orig_container._delObject(orig_id) warnings.warn( "%s._delObject without suppress_events is deprecated " "and will be removed in Zope 2.11." % 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: # BBB: removed in Zope 2.11 self._setObject(id, ob, set_owner=0) warnings.warn( "%s._setObject without suppress_events is deprecated " "and will be removed in Zope 2.11." % 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
def unrestricted_move(self, ob): """Move an object from one container to another bypassing certain checks.""" orig_id = ob.getId() if not ob.cb_isMoveable(): raise CopyError('Not supported {}'.format(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) 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: # BBB: removed in Zope 2.11 orig_container._delObject(orig_id) warnings.warn( "%s._delObject without suppress_events is deprecated " "and will be removed in Zope 2.11." % 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: # BBB: removed in Zope 2.11 self._setObject(id, ob, set_owner=0) warnings.warn( "%s._setObject without suppress_events is deprecated " "and will be removed in Zope 2.11." % 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)
def manage_pasteObjects(self, cb_copy_data=None, REQUEST=None): """Paste previously copied objects into the current object, making folders into chapters and RhaptosModuleEditors into ContentPointers (and not destroying their originals). Other objects will be as usual. Largely copied from OFS.CopySupport. If calling manage_pasteObjects from python code, pass the result of a previous call to manage_cutObjects or manage_copyObjects as the first argument.""" cp=None if cb_copy_data is not None: cp=cb_copy_data else: if REQUEST and REQUEST.has_key('__cp'): cp=REQUEST['__cp'] if cp is None: raise CopyError, eNoData try: cp=_cb_decode(cp) except: raise CopyError, eInvalid oblist=[] op=cp[0] app = self.getPhysicalRoot() result = [] duplicates = [] for mdata in cp[1]: m = Moniker.loadMoniker(mdata) try: ob = m.bind(app) except: raise CopyError, eNotFound oblist.append(ob) for ob in oblist: self._verifyObjectPaste(ob) if op==0: # Copy operation for ob in oblist: if not ob.cb_isCopyable(): raise CopyError, eNotSupported % ob.getId() try: ob._notifyOfCopyTo(self, op=0) except: raise CopyError, MessageDialog( title='Copy Error', message=sys.exc_info()[1], action ='manage_main') #ob=ob._getCopy(self) orig_id=ob.getId() id=self._get_id(ob.getId()) ob, dupes = self._getTransformCopy(ob, op, id, self) # NEW duplicates.extend(dupes) if ob: result.append({'id':orig_id, 'new_id':id}) #ob._setId(id) #self._setObject(id, ob) #ob = self._getOb(id) ob.manage_afterClone(ob) if REQUEST is not None: return self.manage_main(self, REQUEST, update_menu=1, cb_dataValid=1) if op==1: # Move operation for ob in oblist: id=ob.getId() if not ob.cb_isMoveable(): raise CopyError, eNotSupported % id try: ob._notifyOfCopyTo(self, op=1) 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' ### NEW BELOW ### if self._transformableType(ob): # do the "copy" procedure orig_id=ob.getId() id=self._get_id(ob.getId()) ob, dupes = self._getTransformCopy(ob, op, id) duplicates.extend(dupes) if ob: result.append({'id':orig_id, 'new_id':id}) ob.manage_afterClone(ob) else: ### NEW ABOVE (below is ++indented compared to original) ### # try to make ownership explicit so that it gets carried # along to the new location if needed. old = ob orig_id=ob.getId() id=self._get_id(ob.getId()) ob, dupes = self._getTransformCopy(ob, op, id) duplicates.extend(dupes) if ob: result.append({'id':orig_id, 'new_id':id}) ob.manage_afterClone(ob) aq_parent(aq_inner(old))._delObject(id) 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) if duplicates: raise "DuplicateError", duplicates return result
def __call__(self): portal_url = getToolByName(self.context, 'portal_url', None) if portal_url is None: return False obj = self.event.object parent = aq_parent(aq_inner(obj)) path = self.element.target_folder if len(path) > 1 and path[0] == '/': path = path[1:] target = portal_url.getPortalObject().unrestrictedTraverse( str(path), None, ) if target is None: self.error( obj, _( u'Target folder ${target} does not exist.', mapping={'target': path}, ) ) return False if target.absolute_url() == parent.absolute_url(): # We're already here! return True try: obj._notifyOfCopyTo(target, op=1) except ConflictError: raise except Exception as e: self.error(obj, str(e)) return False # Are we trying to move into the same container that we copied from? if not sanity_check(target, obj): return False old_id = obj.getId() new_id = self.generate_id(target, old_id) notify(ObjectWillBeMovedEvent(obj, parent, old_id, target, new_id)) obj.manage_changeOwnershipType(explicit=1) parent._delObject(old_id, suppress_events=True) obj = aq_base(obj) obj._setId(new_id) target._setObject(new_id, obj, set_owner=0, suppress_events=True) obj = target._getOb(new_id) notify(ObjectMovedEvent(obj, parent, old_id, target, new_id)) notifyContainerModified(parent) if aq_base(parent) is not aq_base(target): notifyContainerModified(target) obj._postCopy(target, op=1) # try to make ownership implicit if possible obj.manage_changeOwnershipType(explicit=0) return True
def manage_pasteObjects_Version(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. """ ### due to the ticket #14598: the need to also handle a cb_copy_data ### structure that contains the desired new id on a copy/paste operation. ### this feature will be used when creating a new version for an object. ### if there is no new id also incapsulated in the cb_copy_data then ### the copy/paste will work as default. ### also the cut/paste remains the same. 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, newids = _cb_decode(cp) except Exception: try: op, mdatas = _cb_decode(cp) newids = [] except Exception: raise CopyError(eInvalid) else: if len(mdatas) != len(newids): raise CopyError(eInvalid) oblist = [] app = self.getPhysicalRoot() for mdata in mdatas: m = loadMoniker(mdata) try: ob = m.bind(app) except ConflictError: raise except: raise CopyError(eNotFound) self._verifyObjectPaste(ob, validate_src=op+1) oblist.append(ob) if len(newids) == 0: newids = ['']*len(oblist) result = [] if op == 0: # Copy operation for ob, new_id in zip(oblist, newids): 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')) if new_id == '': new_id = self._get_id(orig_id) result.append({'id': orig_id, 'new_id': new_id}) orig_ob = ob ob = ob._getCopy(self) ob._setId(new_id) notify(ObjectCopiedEvent(ob, orig_ob)) self._setObject(new_id, ob) ob = self._getOb(new_id) ob.wl_clearLocks() ob._postCopy(self, op=0) 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): new_id = orig_id else: new_id = self._get_id(orig_id) result.append({'id': orig_id, 'new_id': new_id}) notify(ObjectWillBeMovedEvent(ob, orig_container, orig_id, self, new_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(new_id) try: self._setObject(new_id, ob, set_owner=0, suppress_events=True) except TypeError: self._setObject(new_id, ob, set_owner=0) warnings.warn( "%s._setObject without suppress_events is discouraged." % self.__class__.__name__, DeprecationWarning) ob = self._getOb(new_id) notify(ObjectMovedEvent(ob, orig_container, orig_id, self, new_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
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 or 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 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)) self._setObject(id, ob) ob = self._getOb(id) ob.wl_clearLocks() ob._postCopy(self, op=0) 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: # BBB: removed in Zope 2.11 orig_container._delObject(orig_id) warnings.warn( "%s._delObject without suppress_events is deprecated " "and will be removed in Zope 2.11." % 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: # BBB: removed in Zope 2.11 self._setObject(id, ob, set_owner=0) warnings.warn( "%s._setObject without suppress_events is deprecated " "and will be removed in Zope 2.11." % 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