def restoreTo(self, sParentId, trans): """ Restores the deleted object to the specified container. @param sParentId: The ID of the container in which the item will be restored @type sParentId: str @param trans: A valid transaction handle @return: None """ ## TODO: check if oDeleted exists oDeleted = _db.getDeletedItem(self._deletedId, trans) oParent = _db.getItem(sParentId, trans) if not(oDeleted.getContentclass() in oParent.containment): raise exceptions.ContainmentError, \ 'The target container does not accept ' + \ 'objects of type "%s".' % oDeleted.getContentclass() # try to restore original item self._restore(oDeleted, oParent, trans) self.delete(trans, False) # update container oParent._addItemReference(oDeleted) _db.putItem(oParent, trans)
def getDeletedItem(self): """ Use this method to get the item that was logically deleted. @return: the deleted item @rtype: type """ oDeleted = _db.getDeletedItem(self._deletedId) return(oDeleted)
def on_create(item, attr, trans): if item._isDeleted and attr.cascadeDelete and attr.value: from porcupine.systemObjects import DeletedItem oItemRef = _db.getDeletedItem(attr.value, trans) parent = _db.getItem(oItemRef._parentid, trans) # update container parent._addItemReference(oItemRef) _db.putItem(parent, trans) deletedItem = DeletedItem(oItemRef, trans) deletedItem._undelete(oItemRef, trans) Relator1EventHandler.on_update(item, attr, None, trans)
def delete(self, trans, _removeDeleted=True): """ Deletes the deleted object permanently. @param trans: A valid transaction handle @param _removeDeleted: Leave as is @return: None """ Removeable.delete(self, trans) if _removeDeleted: # we got a direct call. remove deleted item ## TODO: check if oDeleted exists oDeleted = _db.getDeletedItem(self._deletedId, trans) _db.removeDeletedItem(oDeleted, trans)
def _undelete(self, deletedItem, trans): """ Undeletes a logically deleted item. Returns: None """ _db.handle_update(deletedItem, None, trans) deletedItem._isDeleted = False if deletedItem.isCollection: lstChildren = deletedItem._items.values() + deletedItem._subfolders.values() for sID in lstChildren: oChild = _db.getDeletedItem(sID, trans) self._undelete(oChild, trans) _db.putItem(deletedItem, trans)
def on_delete(item, attr, trans, bPermanent): lstValue = attr.value if not item._isDeleted: from porcupine import datatypes if lstValue and attr.respectsReferences: raise exceptions.ReferentialIntegrityError, ( 'Cannot delete object "%s" ' % item.displayName.value + 'because it is being referenced by other objects.') # remove references for sID in lstValue: ref_item = _db.getItem(sID, trans) if ref_item.getContentclass() in attr.relCc: oAttrRef = getattr(ref_item, attr.relAttr) if isinstance(oAttrRef, datatypes.RelatorN): try: oAttrRef.value.remove(item._id) except ValueError: pass elif isinstance(oAttrRef, datatypes.Relator1): oAttrRef.value = '' _db.putItem(ref_item, trans) else: attr.value.remove(sID) if attr.cascadeDelete: oParent = _db.getItem(oItemRef._parentid, trans) try: oParent._removeItemReference(oItemRef) _db.putItem(oParent, trans) except KeyError: pass if attr.cascadeDelete: for sID in lstValue: if item._isDeleted: oItemRef = _db.getDeletedItem(sID, trans) else: oItemRef = _db.getItem(sID, trans) if bPermanent: oItemRef._delete(trans) else: oItemRef._recycle(trans)
def delete(self, trans, _removeDeleted=True): """ Deletes the deleted object permanently. @param trans: A valid transaction handle @param _removeDeleted: Leave as is @return: None """ Removeable.delete(self, trans) if _removeDeleted: # we got a direct call. remove deleted item ## TODO: check if oDeleted exists oDeleted = _db.getDeletedItem(self._deletedId, trans) _db.removeDeletedItem(oDeleted, trans) else: # we got a call from "restore" or "restoreTo" # do not replay in case of txn abort del trans.actions[-1]
def restore(self, trans): """ Restores the deleted item to its original location, if it still exists. @param trans: A valid transaction handle @return: None @raise L{porcupine.exceptions.ObjectNotFound}: If the original location no longer exists. """ ## TODO: check if oDeleted exists oDeleted = _db.getDeletedItem(self._deletedId, trans) oOriginalParent = _db.getItem(oDeleted._parentid, trans) # update container oOriginalParent._addItemReference(oDeleted) _db.putItem(oOriginalParent, trans) # try to restore original item self._restore(oDeleted, oOriginalParent, trans) self.delete(trans, False)
def on_create(cls, item, attr, trans): if item._isDeleted: attr.value = [_db.getDeletedItem(sID, trans) for sID in attr.value] CompositionEventHandler.on_update(item, attr, None, trans)