def versions(objects): """Get objects with all their versions.""" versions = [] for obj in objects: versions.extend(ObjectVersion.get_versions(obj.bucket, obj.key)) yield versions
def delete_file_object_version(bucket, obj): """Permanently delete a specific object version.""" obj.remove() # Set newest object as head if obj.is_head: latest = ObjectVersion.get_versions(obj.bucket, obj.key, desc=True).first() if latest: latest.is_head = True if obj.file_id: remove_file_data.delay(str(obj.file_id)) file_deleted.send(obj)
def test_object_copy(app, db, dummy_location): """Copy object.""" f = FileInstance(uri="f1", size=1, checksum="mychecksum") db.session.add(f) db.session.commit() b1 = Bucket.create() b2 = Bucket.create() # Delete markers cannot be copied obj_deleted = ObjectVersion.create(b1, "deleted") with pytest.raises(InvalidOperationError) as excinfo: obj_deleted.copy(b2) assert excinfo.value.get_body() != {} # Copy onto self. obj = ObjectVersion.create(b1, "selftest").set_file(f) db.session.commit() obj_copy = obj.copy() db.session.commit() assert obj_copy.version_id != obj.version_id assert obj_copy.key == obj.key assert obj_copy.bucket == obj.bucket assert obj_copy.file_id == obj.file_id versions = ObjectVersion.get_versions(b1, "selftest").all() assert versions[0] == obj_copy assert versions[1] == obj # Copy new key obj_copy2 = obj_copy.copy(key='newkeytest') db.session.commit() assert obj_copy2.version_id != obj_copy.version_id assert obj_copy2.key == "newkeytest" assert obj_copy2.bucket == obj_copy.bucket assert obj_copy2.file_id == obj_copy.file_id # Copy to bucket obj_copy3 = obj_copy2.copy(bucket=b2) assert obj_copy3.version_id != obj_copy2.version_id assert obj_copy3.key == obj_copy2.key assert obj_copy3.bucket == b2 assert obj_copy3.file_id == obj_copy2.file_id
def test_object_copy(app, db, dummy_location): """Copy object.""" f = FileInstance(uri="f1", size=1, checksum="mychecksum") db.session.add(f) db.session.commit() b1 = Bucket.create() b2 = Bucket.create() # Delete markers cannot be copied obj_deleted = ObjectVersion.create(b1, "deleted") assert pytest.raises(InvalidOperationError, obj_deleted.copy, b2) # Copy onto self. obj = ObjectVersion.create(b1, "selftest").set_file(f) db.session.commit() obj_copy = obj.copy() db.session.commit() assert obj_copy.version_id != obj.version_id assert obj_copy.key == obj.key assert obj_copy.bucket == obj.bucket assert obj_copy.file_id == obj.file_id versions = ObjectVersion.get_versions(b1, "selftest").all() assert versions[0] == obj_copy assert versions[1] == obj # Copy new key obj_copy2 = obj_copy.copy(key='newkeytest') db.session.commit() assert obj_copy2.version_id != obj_copy.version_id assert obj_copy2.key == "newkeytest" assert obj_copy2.bucket == obj_copy.bucket assert obj_copy2.file_id == obj_copy.file_id # Copy to bucket obj_copy3 = obj_copy2.copy(bucket=b2) assert obj_copy3.version_id != obj_copy2.version_id assert obj_copy3.key == obj_copy2.key assert obj_copy3.bucket == b2 assert obj_copy3.file_id == obj_copy2.file_id
def __delete_object_versions_except(obj: ObjectVersion, bucket: Bucket): for version in ObjectVersion.get_versions(bucket, obj.key): if version.version_id != obj.version_id: delete_file_instance(version)