Beispiel #1
0
def prep_directory(client, mrepo):
    """
    Create an empty FS directory by performing an import and
    then deleting the created fileset.
    """

    from omero.cmd import Delete2, DoAll
    from omero.grid import ImportSettings

    from omero.model import ChecksumAlgorithmI
    from omero.model import FilesetI
    from omero.model import FilesetEntryI
    from omero.model import UploadJobI

    fs = FilesetI()
    fs.linkJob(UploadJobI())
    entry = FilesetEntryI()
    entry.clientPath = rstring("README.txt")
    fs.addFilesetEntry(entry)
    settings = ImportSettings()
    settings.checksumAlgorithm = ChecksumAlgorithmI()
    settings.checksumAlgorithm.value = rstring("SHA1-160")
    proc = mrepo.importFileset(fs, settings)
    try:

        tmp = create_path()
        prx = proc.getUploader(0)
        try:
            tmp.write_text("THIS IS A PLACEHOLDER")
            hash = client.sha1(tmp)
            with open(tmp, "r") as source:
                client.write_stream(source, prx)
        finally:
            prx.close()
        tmp.remove()

        handle = proc.verifyUpload([hash])
        try:
            req = handle.getRequest()
            fs = req.activity.parent
        finally:
            handle.close()

        dir = unwrap(mrepo.treeList(fs.templatePrefix.val))
        oid = dir.items()[0][1].get("id")
        ofile = client.sf.getQueryService().get("OriginalFile", oid)

        delete1 = Delete2(targetObjects={'Fileset': [fs.id.val]})
        delete2 = Delete2(targetObjects={'OriginalFile': [ofile.id.val]})
        doall = DoAll()
        doall.requests = [delete1, delete2]
        cb = client.submit(doall)
        cb.close(True)

    finally:
        proc.close()

    return fs.templatePrefix.val
Beispiel #2
0
    def testDeleteComment(self):
        comment = omero.model.CommentAnnotationI()
        comment = self.update.saveAndReturnObject(comment)
        images = list()
        # Single Comment linked to 3 Images and 3 Datasets
        for i in range(0, 3):
            img = self.new_image(name="testDeleteComment")
            img.linkAnnotation(comment)
            images.append(self.update.saveAndReturnObject(img))
            ds = self.make_dataset("testDeleteComment")
            ds.linkAnnotation(comment)
            self.update.saveAndReturnObject(ds)

        cid = comment.id.val
        assert self.query.find("CommentAnnotation", cid)

        # Remove comment from first image
        linkIds = []
        for l in images[0].copyAnnotationLinks():
            linkIds.append(l.id.val)
        command = Delete2(targetObjects={"ImageAnnotationLink": linkIds})
        handle = self.client.sf.submit(command)
        self.waitOnCmd(self.client, handle)
        handle.close()

        # Delete Dry Run...
        command = Delete2(targetObjects={"CommentAnnotation": [cid]},
                          dryRun=True)
        handle = self.client.sf.submit(command)
        self.waitOnCmd(self.client, handle)

        # ...Should tell us that remaining links will be deleted
        rsp = handle.getResponse()
        handle.close()
        assert ('ome.model.annotations.ImageAnnotationLink'
                in rsp.deletedObjects)
        links = rsp.deletedObjects['ome.model.annotations.ImageAnnotationLink']
        assert len(links) == 2
        dlnks = rsp.deletedObjects[
            'ome.model.annotations.DatasetAnnotationLink']
        assert len(dlnks) == 3

        # Comment should not yet be deleted
        assert self.query.find("CommentAnnotation", cid)

        # Finally, delete Comment
        command = Delete2(targetObjects={"CommentAnnotation": [cid]})
        handle = self.client.sf.submit(command)
        self.waitOnCmd(self.client, handle)
        handle.close()
        assert not self.query.find("CommentAnnotation", cid)
Beispiel #3
0
    def testStepsDuringDelete(self):
        img = self.make_image(name="delete test")

        command = Delete2(targetObjects={"Image": [img.id.val]})
        handle = self.client.sf.submit(command)

        end_by = time() + 5

        latest_step = 0

        try:
            while time() < end_by:
                # still within five seconds of request submission
                status = handle.getStatus()
                # current step increases monotonically
                assert latest_step <= status.currentStep
                latest_step = status.currentStep
                if status.stopTime > 0:
                    # request stops after last step commenced
                    assert status.currentStep == status.steps - 1
                    return
        except:
            handle.close()

        raise Exception('delete did not complete within five seconds')
Beispiel #4
0
def RemoveMapAnnotations(conn, dtype, Id):
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    obj = conn.getObject(dtype, int(Id))
    name = obj.getName()

    anns = list(obj.listAnnotations())
    mapann_ids = [
        ann.id for ann in anns
        if isinstance(ann, omero.gateway.MapAnnotationWrapper)
    ]

    print(mapann_ids)
    try:
        delete = Delete2(targetObjects={'MapAnnotation': mapann_ids})
        handle = conn.c.sf.submit(delete)
        conn.c.waitOnCmd(handle,
                         loops=10,
                         ms=500,
                         failonerror=True,
                         failontimeout=False,
                         closehandle=False)
        return 0
    except Exception as ex:
        print("Failed to delete links: {} ".format(ex.message))
        return 1
    return
Beispiel #5
0
    def testOddMessage(self):
        store = self.client.sf.createRawFileStore()

        images = list()
        for i in range(0, 10):
            img = self.make_image()
            iid = img.getId().getValue()

            oFile = omero.model.OriginalFileI()
            oFile.setName(rstring('companion_file.txt'))
            oFile.setPath(rstring('/my/path/to/the/file/'))
            oFile.setSize(rlong(7471))
            oFile.setHash(rstring("pending"))
            oFile.setMimetype(rstring('Companion/Deltavision'))

            ofid = self.update.saveAndReturnObject(oFile).id.val

            store.setFileId(ofid)
            binary = 'aaa\naaaa\naaaaa'
            store.write(binary, 0, 0)
            of = store.save()

            fa = omero.model.FileAnnotationI()
            fa.setNs(rstring(omero.constants.namespaces.NSCOMPANIONFILE))
            fa.setFile(of)

            self.link(img, fa)
            images.append(iid)

        command = Delete2(targetObjects={"Image": images})

        handle = self.client.sf.submit(command)
        callback = self.waitOnCmd(self.client, handle)
        callback.close(True)
Beispiel #6
0
    def test5793(self):
        uuid = self.ctx.sessionUuid

        img = self.new_image(name="delete tagset test")

        tag = omero.model.TagAnnotationI()
        tag.textValue = rstring("tag %s" % uuid)
        tag = self.update.saveAndReturnObject(tag)

        img.linkAnnotation(tag)
        img = self.update.saveAndReturnObject(img)

        tagset = omero.model.TagAnnotationI()
        tagset.textValue = rstring("tagset %s" % uuid)
        tagset.linkAnnotation(tag)
        tagset = self.update.saveAndReturnObject(tagset)

        tag = tagset.linkedAnnotationList()[0]

        command = Delete2(targetObjects={"Annotation": [tagset.id.val]})
        handle = self.client.sf.submit(command)
        self.waitOnCmd(self.client, handle)

        assert not self.query.find("TagAnnotation", tagset.id.val)
        assert tag.id.val == self.query.find("TagAnnotation",
                                             tag.id.val).id.val
Beispiel #7
0
def remove_MapAnnotations(conn, dtype, Id):
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    image = conn.getObject(dtype, int(Id))
    namespace = omero.constants.metadata.NSCLIENTMAPANNOTATION

    filename = image.getName()

    anns = list(image.listAnnotations())
    mapann_ids = [
        ann.id for ann in anns
        if isinstance(ann, omero.gateway.MapAnnotationWrapper)
    ]

    try:
        delete = Delete2(targetObjects={'MapAnnotation': mapann_ids})
        handle = conn.c.sf.submit(delete)
        conn.c.waitOnCmd(handle,
                         loops=10,
                         ms=500,
                         failonerror=True,
                         failontimeout=False,
                         closehandle=False)

    except Exception, ex:
        print("Failed to delete links: {}".format(ex.message))
Beispiel #8
0
    def testBasicUsage(self):
        img = self.new_image(name="delete test")
        tag = omero.model.TagAnnotationI()
        img.linkAnnotation(tag)

        img = self.update.saveAndReturnObject(img)

        command = Delete2(targetObjects={"Image": [img.id.val]})
        handle = self.client.sf.submit(command)
        self.waitOnCmd(self.client, handle)
Beispiel #9
0
    def testDeleteImagesTwoFilesetsErr(self):
        """
        If we try to partially delete 2 Filesets, both should be returned
        by the delete error
        """
        # 2 filesets, each with 2 images
        imagesFsOne = self.importMIF(2)
        imagesFsTwo = self.importMIF(2)

        # delete should fail...
        iids = [imagesFsOne[0].id.val, imagesFsTwo[0].id.val]
        delete = Delete2(targetObjects={"Image": iids})
        self.doSubmit(delete, self.client, test_should_pass=False)
Beispiel #10
0
    def testDeleteProjectWithoutContent(self):
        uuid = self.ctx.sessionUuid

        images = list()
        for i in range(0, 5):
            img = self.new_image(name="test-delete-image-%i" % i)
            tag = omero.model.TagAnnotationI()
            img.linkAnnotation(tag)
            images.append(self.update.saveAndReturnObject(img))

        # create dataset
        dataset = self.make_dataset('DS-test-2936-%s' % uuid)

        # create project
        project = self.make_project('PR-test-2936-%s' % uuid)

        # put dataset in project
        self.link(project, dataset)

        # put image in dataset
        for image in images:
            self.link(dataset, image)

        keep = ChildOption(excludeType=[
            "TagAnnotation", "TermAnnotation", "FileAnnotation", "Dataset",
            "Image"
        ])
        dc = Delete2(targetObjects={'Project': [project.id.val]},
                     childOptions=[keep])
        handle = self.client.sf.submit(dc)
        self.waitOnCmd(self.client, handle)

        assert not self.query.find('Project', project.id.val)
        assert dataset.id.val == self.query.find('Dataset',
                                                 dataset.id.val).id.val

        p = omero.sys.Parameters()
        p.map = {}
        p.map["oid"] = dataset.id

        sql = "select im from Image im "\
              "left outer join fetch im.datasetLinks dil "\
              "left outer join fetch dil.parent d " \
              "where d.id = :oid " \
              "order by im.id asc"
        res = self.query.findAllByQuery(sql, p)
        assert 5 == len(res)
        for e in res:
            if e.id.val not in [i.id.val for i in images]:
                self.assertRaises('Image %i is not in the [%s]' %
                                  (e.id.val, ",".join(images)))
Beispiel #11
0
    def testDeleteMany(self):
        images = list()
        for i in range(0, 5):
            img = self.new_image(name="delete test")
            tag = omero.model.TagAnnotationI()
            img.linkAnnotation(tag)

            images.append(self.update.saveAndReturnObject(img))

        ids = [image.id.val for image in images]
        command = Delete2(targetObjects={"Image": ids})

        handle = self.client.sf.submit(command)
        self.waitOnCmd(self.client, handle)
Beispiel #12
0
    def test7314(self):
        """
        Test the delete of an original file when a file annotation is present
        """
        o = self.client.upload(__file__)
        fa = omero.model.FileAnnotationI()
        fa.file = o.proxy()
        fa = self.update.saveAndReturnObject(fa)

        command = Delete2(targetObjects={"OriginalFile": [o.id.val]})
        handle = self.client.sf.submit(command)
        self.waitOnCmd(self.client, handle)

        with pytest.raises(omero.ServerError):
            self.query.get("FileAnnotation", fa.id.val)
Beispiel #13
0
    def testDeleteFilesetOK(self):
        """
        Simple example of the MIF delete good case:
        a single fileset containing 2 images.
        Delete the fileset, the delete should succeed.
        """
        images = self.importMIF(2)
        fsId = self.query.get("Image", images[0].id.val).fileset.id.val

        # Now delete the fileset, should succeed
        delete = Delete2(targetObjects={"Fileset": [fsId]})
        self.doSubmit(delete, self.client)

        # The dataset, fileset and both images should be deleted.
        assert not self.query.find("Fileset", fsId)
        assert not self.query.find("Image", images[0].id.val)
        assert not self.query.find("Image", images[1].id.val)
Beispiel #14
0
    def testDeleteOneImageFilesetErr(self):
        """
        Simple example of the MIF delete good case:
        two images in a MIF.
        Delete one image, the delete should fail.
        """
        images = self.importMIF(2)

        # Now delete one image
        delete = Delete2(targetObjects={"Image": [images[0].id.val]})
        self.doSubmit(delete, self.client, test_should_pass=False)

        # Neither image should be deleted.
        assert images[0].id.val == self.query.find("Image",
                                                   images[0].id.val).id.val
        assert images[1].id.val == self.query.find("Image",
                                                   images[1].id.val).id.val
Beispiel #15
0
    def testDeleteAllImagesFilesetOK(self):
        """
        Simple example of the MIF delete good case:
        two images in a MIF.
        Delete all images, the delete should succeed.
        """
        images = self.importMIF(2)
        fsId = self.query.get("Image", images[0].id.val).fileset.id.val

        # Now delete all images, should succeed
        iids = [images[0].id.val, images[1].id.val]
        delete = Delete2(targetObjects={"Image": iids})
        self.doSubmit(delete, self.client)

        # The fileset and both images should be deleted.
        assert not self.query.find("Fileset", fsId)
        assert not self.query.find("Image", images[0].id.val)
        assert not self.query.find("Image", images[1].id.val)
def remove_map_annotations(conn, object):
    """Remove ALL Map Annotations on the object"""
    anns = list(object.listAnnotations())
    mapann_ids = [
        ann.id for ann in anns
        if isinstance(ann, omero.gateway.MapAnnotationWrapper)
    ]

    try:
        delete = Delete2(targetObjects={'MapAnnotation': mapann_ids})
        handle = conn.c.sf.submit(delete)
        conn.c.waitOnCmd(handle,
                         loops=10,
                         ms=500,
                         failonerror=True,
                         failontimeout=False,
                         closehandle=False)

    except Exception as ex:
        print("Failed to delete links: {}".format(ex.message))
    return
Beispiel #17
0
    def delete(self, obj):
        """
        Deletes a list of model entities (ProjectI, DatasetI or ImageI)
        by creating Delete2 commands and calling
        :func:`~test.ITest.doSubmit`.

        :param obj: a list of objects to be deleted
        """
        if isinstance(obj[0], ProjectI):
            t = "Project"
        elif isinstance(obj[0], DatasetI):
            t = "Dataset"
        elif isinstance(obj[0], ImageI):
            t = "Image"
        else:
            assert False, "Object type not supported."

        ids = [i.id.val for i in obj]
        command = Delete2(targetObjects={t: ids})

        self.doSubmit(command, self.client)
Beispiel #18
0
    def testDeleteOneDatasetFilesetErr(self):
        """
        Simple example of the MIF delete bad case:
        a single fileset containing 2 images is split among 2 datasets.
        Delete one dataset, delete fails.
        """
        datasets = self.createDatasets(2, "testDeleteOneDatasetFilesetErr")
        images = self.importMIF(2)
        for i in range(2):
            self.link(datasets[i], images[i])

        # Now delete one dataset
        delete = Delete2(targetObjects={"Dataset": [datasets[0].id.val]})
        self.doSubmit(delete, self.client)

        # The dataset should be deleted, but not any images.
        assert not self.query.find("Dataset", datasets[0].id.val)
        assert images[0].id.val == self.query.find("Image",
                                                   images[0].id.val).id.val
        assert images[1].id.val == self.query.find("Image",
                                                   images[1].id.val).id.val
Beispiel #19
0
    def testDeleteDatasetFilesetOK(self):
        """
        Simple example of the MIF delete good case:
        a single fileset containing 2 images in one dataset.
        Delete the dataset, the delete should succeed.
        """
        ds = self.make_dataset("testDeleteDatasetFilesetOK")
        images = self.importMIF(2)
        fsId = self.query.get("Image", images[0].id.val).fileset.id.val

        for i in range(2):
            self.link(ds, images[i])

        # Now delete the dataset, should succeed
        delete = Delete2(targetObjects={"Dataset": [ds.id.val]})
        self.doSubmit(delete, self.client)

        # The dataset, fileset and both images should be deleted.
        assert not self.query.find("Dataset", ds.id.val)
        assert not self.query.find("Fileset", fsId)
        assert not self.query.find("Image", images[0].id.val)
        assert not self.query.find("Image", images[1].id.val)
Beispiel #20
0
    def testDeleteProjectWithEmptyDatasetLinkedToAnotherProjectHard(self):
        """
        P1->D
        P2->D
        Delete P1

        See https://trac.openmicroscopy.org.uk/ome/ticket/12452
        """
        p1 = self.make_project()
        p2 = self.make_project()
        d = self.make_dataset()
        self.link(p1, d)
        self.link(p2, d)

        hard = ChildOption(includeType=["Dataset"])
        delete = Delete2(targetObjects={"Project": [p1.id.val]},
                         childOptions=[hard])
        self.doSubmit(delete, self.client)

        assert self.query.find("Project", p2.id.val)
        assert not self.query.find("Project", p1.id.val)
        assert not self.query.find("Dataset", d.id.val)
Beispiel #21
0
    def testCheckIfDeleted(self):
        uuid = self.ctx.sessionUuid
        userName = self.ctx.userName

        img = self.new_image(name="to delete - test")
        tag = omero.model.TagAnnotationI()
        img.linkAnnotation(tag)

        iid = self.update.saveAndReturnObject(img).id.val

        cmd = Delete2(targetObjects={"Image": [iid]})
        handle = self.client.sf.submit(cmd)
        callback = self.waitOnCmd(self.client, handle)
        cbString = str(handle)

        callback.close(True)  # Don't close handle

        assert not self.query.find("Image", iid)

        # create new session and double check
        import os
        import Ice
        c = omero.client(
            pmap=['--Ice.Config=' + (os.environ.get("ICE_CONFIG"))])
        host = c.ic.getProperties().getProperty('omero.host')
        port = int(c.ic.getProperties().getProperty('omero.port'))
        cl1 = omero.client(host=host, port=port)
        cl1.createSession(userName, userName)

        with pytest.raises(Ice.ObjectNotExistException):
            omero.cmd.HandlePrx.checkedCast(cl1.ic.stringToProxy(cbString))

        # join session and double check
        cl2 = omero.client(host=host, port=port)
        cl2.joinSession(uuid)

        with pytest.raises(Ice.ObjectNotExistException):
            omero.cmd.HandlePrx.checkedCast(cl2.ic.stringToProxy(cbString))
Beispiel #22
0
    def testDeleteDatasetWithImageLinkedToAnotherDatasetHard(self):
        """
        D1->I
        D2->I
        Delete D1

        See https://trac.openmicroscopy.org.uk/ome/ticket/12452
        """

        d1 = self.make_dataset()
        d2 = self.make_dataset()
        i = self.make_image()
        self.link(d1, i)
        self.link(d2, i)

        hard = ChildOption(includeType=["Image"])
        delete = Delete2(targetObjects={"Dataset": [d1.id.val]},
                         childOptions=[hard])
        self.doSubmit(delete, self.client)

        assert not self.query.find("Dataset", d1.id.val)
        assert self.query.find("Dataset", d2.id.val)
        assert not self.query.find("Image", i.id.val)
Beispiel #23
0
    def testDeleteDatasetTwoFilesetsErr(self):
        """
        If we try to partially delete 2 Filesets, both should be returned
        by the delete error
        """
        # 2 filesets, each with 2 images
        imagesFsOne = self.importMIF(2)
        imagesFsTwo = self.importMIF(2)

        ds = self.make_dataset("testDeleteDatasetTwoFilesetsErr")
        self.importMIF(2)
        for i in (imagesFsOne, imagesFsTwo):
            self.link(ds, i[0])

        # delete should remove only the Dataset
        delete = Delete2(targetObjects={"Dataset": [ds.id.val]})
        self.doSubmit(delete, self.client)

        # The dataset should be deleted.
        assert not self.query.find("Dataset", ds.id.val)

        # Neither image should be deleted.
        for i in (imagesFsOne[0], imagesFsTwo[0]):
            assert i.id.val == self.query.find("Image", i.id.val).id.val
Beispiel #24
0
    def testCheckIfDeleted2(self):
        uuid = self.ctx.sessionUuid

        # dataset with many images
        images = list()
        for i in range(0, 50):
            img = self.new_image(name="test-delete-image-%i" % i)
            tag = omero.model.TagAnnotationI()
            img.linkAnnotation(tag)
            images.append(self.update.saveAndReturnObject(img))

        # create dataset
        dataset = self.make_dataset('DS-test-%s' % uuid)

        # put image in dataset
        for img in images:
            self.link(dataset, img)

        ids = [image.id.val for image in images]
        command = Delete2(targetObjects={"Image": ids})

        handle = self.client.sf.submit(command)
        callback = self.waitOnCmd(self.client, handle, ms=1000, loops=50)

        callback.close(True)

        p = omero.sys.Parameters()
        p.map = {}
        p.map["oid"] = dataset.id

        sql = "select im from Image im "\
              "left outer join fetch im.datasetLinks dil "\
              "left outer join fetch dil.parent d " \
              "where d.id = :oid " \
              "order by im.id asc"
        assert 0 == len(self.query.findAllByQuery(sql, p))
Beispiel #25
0
    def testDeleteAllDatasetsFilesetOK(self):
        """
        Simple example of the MIF delete bad case:
        a single fileset containing 2 images is split among 2 datasets.
        Delete all datasets, delete succeeds.
        """
        datasets = self.createDatasets(2, "testDeleteAllDatasetsFilesetOK")
        images = self.importMIF(2)
        fsId = self.query.get("Image", images[0].id.val).fileset.id.val

        for i in range(2):
            self.link(datasets[i], images[i])

        # Now delete all datasets, should succeed
        dids = [datasets[0].id.val, datasets[1].id.val]
        delete = Delete2(targetObjects={"Dataset": dids})
        self.doSubmit(delete, self.client)

        # Both datasets, the fileset and both images should be deleted.
        assert not self.query.find("Dataset", datasets[0].id.val)
        assert not self.query.find("Dataset", datasets[1].id.val)
        assert not self.query.find("Fileset", fsId)
        assert not self.query.find("Image", images[0].id.val)
        assert not self.query.find("Image", images[1].id.val)
Beispiel #26
0
    def testCleanseNonsenseName(self, capsys):
        """
        Test cleanse removes file on disk after OriginalFile
        name was changed to nonsense and its Image was deleted
        """
        # import image and retrieve the OriginalFile
        # (orig_file), its name and path
        image = self.import_fake_file()[0]
        fileset = self.get_fileset([image])
        params = omero.sys.ParametersI()
        params.addId(fileset.getId())
        q = ("select originalFile.path, originalFile.id "
             "from FilesetEntry where fileset.id = :id")
        queryService = self.root.sf.getQueryService()
        result = queryService.projection(q, params, self.group_ctx)
        path_in_mrepo = result[0][0].getValue()
        orig_file_path = self.make_path(path_in_mrepo)
        assert os.path.exists(orig_file_path)
        orig_file_id = result[0][1].getValue()
        orig_file = self.query.get("OriginalFile", orig_file_id)
        orig_file_name = orig_file.getName().getValue()
        orig_file_path_and_name = self.make_path(path_in_mrepo, orig_file_name)
        assert os.path.isfile(orig_file_path_and_name)

        # retrieve the logfile, its name and path
        q = ("select o from FilesetJobLink l "
             "join l.parent as fs join l.child as j "
             "join j.originalFileLinks l2 join l2.child as o "
             "where fs.id = :id and "
             "o.mimetype = 'application/omero-log-file'")
        logfile = queryService.findByQuery(q, params, self.group_ctx)
        logfile_name = logfile.getName().getValue()
        path_in_mrepo = logfile.getPath().getValue()
        logfile_path = self.make_path(path_in_mrepo)
        assert os.path.exists(logfile_path)
        logfile_path_and_name = self.make_path(path_in_mrepo, logfile_name)
        assert os.path.isfile(logfile_path_and_name)

        # change the names of original_file and logfile to nonsense
        name = "nonsensical"
        update_service = self.root.sf.getUpdateService()
        orig_file.setName(omero.rtypes.rstring(name))
        update_service.saveAndReturnObject(orig_file, self.group_ctx)
        logfile.setName(omero.rtypes.rstring(name))
        update_service.saveAndReturnObject(logfile, self.group_ctx)

        # run the cleanse command, which will not delete
        # the files on disk
        self.args += [self.data_dir]
        self.cli.invoke(self.args, strict=True)
        assert os.path.exists(orig_file_path)
        assert os.path.isfile(orig_file_path_and_name)
        assert os.path.exists(logfile_path)
        assert os.path.isfile(logfile_path_and_name)

        # delete the image, which will not delete
        # the files on disk because of the nonsensical name
        # of orig_file and logfile
        command = Delete2(targetObjects={"Image": [image.id.val]})
        handle = self.client.sf.submit(command)
        self.wait_on_cmd(self.client, handle)
        assert os.path.exists(orig_file_path)
        assert os.path.isfile(orig_file_path_and_name)
        assert os.path.exists(logfile_path)
        assert os.path.isfile(logfile_path_and_name)

        # run cleanse command again, which will now delete the
        # files on disk, the original file, the logfile
        # and their directories
        self.cli.invoke(self.args, strict=True)
        out, err = capsys.readouterr()
        assert not os.path.exists(orig_file_path)
        assert not os.path.isfile(orig_file_path_and_name)
        assert not os.path.exists(logfile_path)
        assert not os.path.isfile(logfile_path_and_name)
    def test_move_annotations(self, remove, script_runner):

        script_id = super(TestUtilScripts, self).get_script(move_annotations)
        assert script_id > 0

        # create new Admin and user in same group
        admin_client, admin = self.new_client_and_user(system=True)
        group = admin_client.sf.getAdminService().getEventContext().groupId
        client, user = self.new_client_and_user(group=group)
        user_id = user.id.val
        field_count = 2

        # User creates Plate and Adds annotations...
        plate = self.import_plates(client=client, fields=field_count)[0]

        well_ids = []
        for well in plate.copyWells():
            well_ids.append(well.id)
            for well_sample in well.copyWellSamples():
                image = well_sample.getImage()
                # Add annotations
                tag = omero.model.TagAnnotationI()
                tag.textValue = omero.rtypes.rstring("testTag")
                self.link(image, tag, client=client)
                comment = omero.model.CommentAnnotationI()
                comment.textValue = omero.rtypes.rstring("test Comment")
                self.link(image, comment, client=client)
                rating = omero.model.LongAnnotationI()
                rating.longValue = omero.rtypes.rlong(5)
                rating.ns = omero.rtypes.rstring(
                    omero.constants.metadata.NSINSIGHTRATING)
                self.link(image, rating, client=client)

        # Either the 'user' or 'root' will run the script
        if script_runner == 'user':
            script_runner_client = client
        else:
            script_runner_client = admin_client

        # Run script on each type, with/without removing Annotations
        for anntype in ('Tag', 'Comment', 'Rating'):
            args = {
                "Data_Type": omero.rtypes.rstring("Well"),
                "IDs": omero.rtypes.rlist(well_ids),
                "Annotation_Type": omero.rtypes.rstring(anntype),
                "Remove_Annotations_From_Images": omero.rtypes.rbool(remove)
            }
            message = run_script(script_runner_client, script_id,
                                 args, "Message")
            assert message.val == "Moved %s Annotations" % field_count

        # Check new links are owned by user
        # and remove annotations from Wells...
        query_service = client.getSession().getQueryService()
        query = ("select l from WellAnnotationLink as l"
                 " join fetch l.child as ann"
                 " join fetch l.details.owner as owner"
                 " where l.parent.id in (:ids)")
        params = omero.sys.ParametersI().addIds(well_ids)
        links = query_service.findAllByQuery(query, params)
        link_ids = [l.id.val for l in links]
        assert len(link_ids) == field_count * 3
        for l in links:
            assert l.getDetails().owner.id.val == user_id
        delete = Delete2(targetObjects={'WellAnnotationLink': link_ids})
        handle = client.sf.submit(delete)
        client.waitOnCmd(handle, loops=10, ms=500, failonerror=True,
                         failontimeout=False, closehandle=False)

        # Run again with 'All' annotations.
        args = {
            "Data_Type": omero.rtypes.rstring("Plate"),
            "IDs": omero.rtypes.rlist([plate.id]),
            "Annotation_Type": omero.rtypes.rstring("All"),
            "Remove_Annotations_From_Images": omero.rtypes.rbool(remove)
        }
        message = run_script(script_runner_client, script_id, args, "Message")
        # If we've been removing annotations above,
        # there will be None left to move
        if remove:
            expected = "No annotations moved. See info."
        else:
            expected = "Moved %s Annotations" % (field_count * 3)
        assert message.val == expected

        # Run again - None moved since Annotations are already on Well
        message = run_script(script_runner_client, script_id, args, "Message")
        assert message.val == "No annotations moved. See info."
Beispiel #28
0
 def delete(self, obj_type, obj):
     delete = Delete2(targetObjects={obj_type: [obj.id.val]})
     return self.submit(delete)
Beispiel #29
0
    def test3639(self):
        uuid = self.ctx.sessionUuid

        images = list()
        for i in range(0, 5):
            images.append(self.make_image())

        p = omero.sys.Parameters()
        p.map = {}
        p.map["oids"] = rlist([rlong(s.id.val) for s in images])

        # create dataset
        dataset = self.make_dataset('DS-test-2936-%s' % uuid)

        # put image in dataset
        for image in images:
            self.link(dataset, image)

        # log in as group owner:
        client_o, owner = self.new_client_and_user(group=self.group,
                                                   owner=True)
        query_o = client_o.sf.getQueryService()

        handlers = list()
        keep = ChildOption(excludeType=["Image"])
        dc = Delete2(targetObjects={'Dataset': [dataset.id.val]},
                     childOptions=[keep])
        handlers.append(str(client_o.sf.submit(dc)))

        imageToDelete = images[2].id.val
        dc2 = Delete2(targetObjects={'Image': [imageToDelete]})
        handlers.append(str(client_o.sf.submit(dc2)))

        def _formatReport(delete_handle):
            """
            Added as workaround to the changes made in #3006.
            """
            delete_report = delete_handle.getResponse()
            rv = []
            if isinstance(delete_report, omero.cmd.ERR):
                rv.append(str(delete_report))
            if len(rv) > 0:
                return "; ".join(rv)
            return None

        failure = list()
        in_progress = 0
        r = None

        while (len(handlers) > 0):
            for cbString in handlers:
                try:
                    with pytest.raises(Ice.ObjectNotExistException):
                        handle = omero.cmd.HandlePrx.checkedCast(
                            client_o.ic.stringToProxy(cbString))
                        cb = omero.callbacks.CmdCallbackI(client_o, handle)
                        if not cb.block(500):  # ms.
                            # No errors possible if in progress(
                            # (since no response)
                            print "in progress", _formatReport(handle)
                            in_progress += 1
                        else:
                            rsp = cb.getResponse()
                            if isinstance(rsp, omero.cmd.ERR):
                                r = _formatReport(handle)
                                if r is not None:
                                    failure.append(r)
                                else:
                                    failure.append("No report!!!")
                            else:
                                r = _formatReport(handle)
                                if r is not None:
                                    failure.append(r)
                                cb.close(True)  # Close handle
                            handlers.remove(cbString)
                except Exception:
                    if r is not None:
                        failure.append(traceback.format_exc())

        if len(failure) > 0:
            assert False, ";".join(failure)
        assert not query_o.find('Dataset', dataset.id.val)
def run_script():
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    data_types = [rstring('Dataset')]
    client = scripts.client(
        'Export_kvpairs_to_csv',
        """
    This script reads the key values pairs of the images "children" of the dataset and creates a csv file which is then attached to the dataset
        """,
        scripts.String(
            "Data_Type", optional=False, grouping="1",
            description="Choose source of images",
            values=data_types, default="Dataset"),

        scripts.List(
            "IDs", optional=False, grouping="2",
            description="dataset ID.").ofType(rlong(0)),


        authors=["Christian Evenhuis"],
        institutions=["MIF UTS"],
        contact="*****@*****.**"
    )

    try:
        # process the list of args above.
        script_params = {}
        for key in client.getInputKeys():
            if client.getInput(key):
                script_params[key] = client.getInput(key, unwrap=True)

        # wrap client to use the Blitz Gateway
        conn = BlitzGateway(client_obj=client)
        print("connection made")

        dataType = script_params["Data_Type"]
        print(dataType)
        ids      = script_params["IDs"]
        datasets = list(conn.getObjects(dataType, ids))    # generator of images or datasets
        print(ids)
        print("datasets:")
        print( datasets )
        for ds in datasets:
            # name of the file
            csv_name = "{}_metadata_out.csv".format(ds.getName())
            print(csv_name)

            # remove the csv if it exists
            for ann in ds.listAnnotations():
                if( isinstance(ann, omero.gateway.FileAnnotationWrapper) ):
                    if( ann.getFileName() == csv_name ):
                        # if the name matches delete it
                        try:
                            delete = Delete2(targetObjects={'FileAnnotation': [int(ann.getId())]})
                            handle = conn.c.sf.submit(delete)
                            conn.c.waitOnCmd(handle, loops=10, ms=500, failonerror=True,
                                         failontimeout=False, closehandle=False)
                            print("Deleted existing csv")
                        except Exception, ex:
                            print("Failed to delete existing csv: {}".format(ex.message))
                else:
                    print("No exisiting file")

            #                                 filename         key          multiple vals
            # assemble the metadata into an OrderedDict of ( OrderedDict of Sets          )
            file_names = [ img.getName() for img in list(ds.listChildren()) ]
            kv_dict = OrderedDict()
            for img in ds.listChildren():
                fn = img.getName()
                kv_dict[fn] = GetExistingMapAnnotions(img)

            # attach the data
            mess = attach_csv_file( conn, ds, kv_dict )
            print(mess)
        mess="done"
        client.setOutput("Message", rstring(mess))