def test_screen_decoder(self, screen): encoder = get_encoder(screen.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(screen) v = decoder.decode(v) self.assert_screen(v) assert v.sizeOfPlateLinks() == 0
def test_roi_with_shapes_and_annotations(self, roi_with_shapes_and_annotations): encoder = get_encoder(roi_with_shapes_and_annotations.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(roi_with_shapes_and_annotations) v = decoder.decode(v) self.assert_roi_with_shapes(v, has_annotations=True)
def test_well_color_decoder(self, color, well): """Test different combinations of r, g, b, a.""" well.red = rint(color[0]) well.green = rint(color[1]) well.blue = rint(color[2]) well.alpha = rint(color[3]) encoder = get_encoder(well.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(well) # Check we get the expected Integer assert v.get('Color') == color[4] v = decoder.decode(v) # If red is None, all are None if color[0] is None: assert v.red is None assert v.green is None assert v.blue is None assert v.alpha is None elif color[3] is None: # alpha None -> 255 by default assert v.red.val == color[0] assert v.green.val == color[1] assert v.blue.val == color[2] assert v.alpha.val == 255 else: # Otherwise, all preserved assert v.red.val == color[0] assert v.green.val == color[1] assert v.blue.val == color[2] assert v.alpha.val == color[3]
def test_roi_with_shapes_and_annotations( self, roi_with_shapes_and_annotations): encoder = get_encoder(roi_with_shapes_and_annotations.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(roi_with_shapes_and_annotations) v = decoder.decode(v) self.assert_roi_with_shapes(v, has_annotations=True)
def test_decoder(self, mask): encoder = get_encoder(mask.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(mask) v = decoder.decode(v) self.assert_shape(v) assert v.id.val == 8
def test_project_decoder(self, project): encoder = get_encoder(project.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(project) v = decoder.decode(v) self.assert_project(v) assert v.sizeOfDatasetLinks() == 0
def test_base_decoder(self, roi): encoder = get_encoder(roi.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(roi) v = decoder.decode(v) self.assert_roi(v) self.assert_externalInfo(v.details.externalInfo)
def test_project_validation(self, user_A): """ Test to demonstrate details bug on encode->decode. Test illustrates the ValidationException we see when Project is encoded to dict then decoded back to Project and saved. No exception is seen if the original Project is simply saved without encode & decode OR if the details are unloaded before saving """ conn = get_connection(user_A) project = ProjectI() project.name = rstring('test_project_validation') project = conn.getUpdateService().saveAndReturnObject(project) # Saving original Project again is OK conn.getUpdateService().saveObject(project) # encode and decode before Save raises Validation Exception project_json = get_encoder(project.__class__).encode(project) decoder = get_decoder(project_json['@type']) p = decoder.decode(project_json) with pytest.raises(ValidationException): conn.getUpdateService().saveObject(p) p = decoder.decode(project_json) # Unloading details allows Save without exception p.unloadDetails() conn.getUpdateService().saveObject(p)
def test_decoder(self, polygon): encoder = get_encoder(polygon.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(polygon) v = decoder.decode(v) self.assert_shape(v) assert v.id.val == 5L assert v.points.val == '0,0 1,2 3,5'
def test_permissions_cannot_delete(self, permissions_cannot_delete): encoder = get_encoder(permissions_cannot_delete.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(permissions_cannot_delete) v = decoder.decode(v) assert v.canLink() assert v.canEdit() assert not v.canDelete() assert v.canAnnotate()
def test_decoder(self, opt_unit_label): encoder = get_encoder(opt_unit_label.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(opt_unit_label) v = decoder.decode(v) self.assert_shape(v, has_unit_information=False) assert v.id.val == 7L assert v.x.__class__ is RDoubleI assert v.x.val == 1.0 assert v.y.__class__ is RDoubleI assert v.y.val == 2.0
def test_project_with_datasets_and_images_decoder( self, project_with_datasets_and_images): encoder = get_encoder(project_with_datasets_and_images.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(project_with_datasets_and_images) v = decoder.decode(v) assert v.id.val == 1L assert v.name.val == 'the_name' assert v.description.val == 'the_description' assert v.sizeOfDatasetLinks() == 2 dataset_1, dataset_2 = v.linkedDatasetList() assert dataset_1.id.val == 1L assert dataset_1.name.val == 'dataset_name_1' assert dataset_1.description.val == 'dataset_description_1' image_1, image_2 = dataset_1.linkedImageList() assert image_1.id.val == 1L assert image_1.acquisitionDate.val == 1L assert image_1.archived.val is False assert image_1.description.val == 'image_description_1' assert image_1.name.val == 'image_name_1' assert image_1.partial.val is False assert image_1.format.id.val == 1L assert image_1.format.value.val == 'PNG' assert image_2.id.val == 2L assert image_2.acquisitionDate.val == 1L assert image_2.archived.val is False assert image_2.description.val == 'image_description_2' assert image_2.name.val == 'image_name_2' assert image_2.partial.val is False assert image_2.format.id.val == 1L assert image_2.format.value.val == 'PNG' assert dataset_2.id.val == 2L assert dataset_2.name.val == 'dataset_name_2' assert dataset_2.description.val == 'dataset_description_2' image_3, image_4 = dataset_2.linkedImageList() assert image_3.id.val == 3L assert image_3.acquisitionDate.val == 1L assert image_3.archived.val is False assert image_3.description.val == 'image_description_3' assert image_3.name.val == 'image_name_3' assert image_3.partial.val is False assert image_3.format.id.val == 1L assert image_3.format.value.val == 'PNG' assert image_4.id.val == 4L assert image_4.acquisitionDate.val == 1L assert image_4.archived.val is False assert image_4.description.val == 'image_description_4' assert image_4.name.val == 'image_name_4' assert image_4.partial.val is False assert image_4.format.id.val == 1L assert image_4.format.value.val == 'PNG'
def test_base_decoder_from_string(self): data_as_string = """{ "@type": "http://www.openmicroscopy.org/Schemas/ROI/2015-01#ROI", "@id": 1, "Name": "the_name", "Description": "the_description" }""" data = json.loads(data_as_string) decoder = get_decoder(data['@type']) v = decoder.decode(data) self.assert_roi(v)
def test_decoder(self, polyline): encoder = get_encoder(polyline.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(polyline) v = decoder.decode(v) self.assert_shape(v) assert v.id.val == 4L assert v.points.val == '0,0 1,2 3,5' if SCHEMA_VERSION != '2015-01': assert v.markerStart.val == 'Arrow' assert v.markerEnd.val == 'Arrow'
def test_screen_with_plates_decoder(self, screen_with_plates): encoder = get_encoder(screen_with_plates.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(screen_with_plates) v = decoder.decode(v) self.assert_screen(v) assert v.id.val == 4L assert v.sizeOfPlateLinks() == 2 plate_1, plate_2 = v.linkedPlateList() self.assert_plate(plate_1, 5L) self.assert_plate(plate_2, 6L)
def test_decoder(self, label): encoder = get_encoder(label.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(label) v = decoder.decode(v) self.assert_shape(v) assert v.id.val == 7L assert v.x.__class__ is RDoubleI assert v.x.val == 1.0 assert v.y.__class__ is RDoubleI assert v.y.val == 2.0
def test_decoder(self, point): encoder = get_encoder(point.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(point) v = decoder.decode(v) self.assert_shape(v) assert v.id.val == 3L assert v.cx.__class__ is RDoubleI assert v.cx.val == 1.0 assert v.cy.__class__ is RDoubleI assert v.cy.val == 2.0
def test_decoder(self, line): encoder = get_encoder(line.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(line) v = decoder.decode(v) self.assert_shape(v) assert v.id.val == 6L assert v.x1.__class__ is RDoubleI assert v.x1.val == 0.0 assert v.y1.__class__ is RDoubleI assert v.y1.val == 0.0 assert v.x2.__class__ is RDoubleI assert v.x2.val == 1.0 assert v.y2.__class__ is RDoubleI assert v.y2.val == 2.0
def test_shape_decoder(self, point, translation_transform): encoder = get_encoder(point.__class__) decoder = get_decoder(encoder.TYPE) if SCHEMA_VERSION == '2015-01': point.transform = translation_transform.svg_transform else: point.transform = translation_transform v = encoder.encode(point) v = decoder.decode(v) t = v.transform if SCHEMA_VERSION == '2015-01': assert t.val == 'matrix(1.0 0.0 0.0 1.0 3.0 4.0)' else: assert t.id.val == 8L self.assert_translation_transform(t)
def _save_object(self, request, conn, object_json, **kwargs): """Here we handle the saving for PUT and POST.""" # Try to get group from request, OR from details below... group = getIntOrDefault(request, 'group', None) decoder = None objType = object_json['@type'] decoder = get_decoder(objType) # If we are passed incomplete object, or decoder couldn't be found... if decoder is None: raise BadRequestError('No decoder found for type: %s' % objType) # Any marshal errors most likely due to invalid input. status=400 try: obj = decoder.decode(object_json) except Exception: msg = 'Error in decode of json data by omero_marshal' raise BadRequestError(msg, traceback.format_exc()) if group is None: try: # group might be None or unloaded group = obj.getDetails().group.id.val except AttributeError: # Instead of default stack trace, give nicer message: msg = ("Specify Group in omero:details or " "query parameters ?group=:id") raise BadRequestError(msg) # If owner was unloaded (E.g. from get() above) or if missing # ome.model.meta.Experimenter.ldap (not supported by omero_marshal) # then saveObject() will give ValidationException. # Therefore we ignore any details for now: obj.unloadDetails() # TODO: Unlink children for Projects, Datasets and Screens to avoid # breaking links. See PR #4930 if hasattr(obj, 'unloadDatasetLinks'): obj.unloadDatasetLinks() if hasattr(obj, 'unloadImageLinks'): obj.unloadImageLinks() if hasattr(obj, 'unloadPlateLinks'): obj.unloadPlateLinks() conn.SERVICE_OPTS.setOmeroGroup(group) obj = conn.getUpdateService().saveAndReturnObject( obj, conn.SERVICE_OPTS) encoder = get_encoder(obj.__class__) return {'data': encoder.encode(obj)}
def test_project_with_datasets_decoder(self, project_with_datasets): encoder = get_encoder(project_with_datasets.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(project_with_datasets) v = decoder.decode(v) assert v.id.val == 1L assert v.name.val == 'the_name' assert v.description.val == 'the_description' assert v.sizeOfDatasetLinks() == 2 dataset_1, dataset_2 = v.linkedDatasetList() assert dataset_1.id.val == 1L assert dataset_1.name.val == 'dataset_name_1' assert dataset_1.description.val == 'dataset_description_1' assert dataset_2.id.val == 2L assert dataset_2.name.val == 'dataset_name_2' assert dataset_2.description.val == 'dataset_description_2'
def test_shape_decoder(self, point, rotation_transform): encoder = get_encoder(point.__class__) decoder = get_decoder(encoder.TYPE) if SCHEMA_VERSION == '2015-01': point.transform = rotation_transform.svg_transform else: point.transform = rotation_transform v = encoder.encode(point) v = decoder.decode(v) t = v.transform if SCHEMA_VERSION == '2015-01': assert t.val == ( 'matrix(0.707106781187 0.707106781187 -0.707106781187 ' '0.707106781187 85.3553390593 -6.06601717798)') else: assert t.id.val == 8L self.assert_rotation_transform(t)
def test_decoder(self, point): encoder = get_encoder(point.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(point) v = decoder.decode(v) self.assert_shape(v) assert v.id.val == 3L if SCHEMA_VERSION == '2016-06': assert v.x.__class__ is RDoubleI assert v.x.val == 1.0 assert v.y.__class__ is RDoubleI assert v.y.val == 2.0 else: assert v.cx.__class__ is RDoubleI assert v.cx.val == 1.0 assert v.cy.__class__ is RDoubleI assert v.cy.val == 2.0
def test_decoder(self, line): encoder = get_encoder(line.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(line) v = decoder.decode(v) self.assert_shape(v) assert v.id.val == 6L assert v.x1.__class__ is RDoubleI assert v.x1.val == 0.0 assert v.y1.__class__ is RDoubleI assert v.y1.val == 0.0 assert v.x2.__class__ is RDoubleI assert v.x2.val == 1.0 assert v.y2.__class__ is RDoubleI assert v.y2.val == 2.0 if SCHEMA_VERSION != '2015-01': assert v.markerStart.val == 'Arrow' assert v.markerEnd.val == 'Arrow'
def test_roi_decoder_registered(self): decoder = get_decoder('%s#ROI' % ROI_SCHEMA_URL) assert decoder is not None
def test_image_pixels_decoder(self, image_pixels): encoder = get_encoder(image_pixels.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(image_pixels) v = decoder.decode(v) self.assert_image(v) pixels = v.getPrimaryPixels() assert pixels.id.val == 1L assert pixels.methodology.val == 'methodology' assert pixels.physicalSizeX.getUnit() == UnitsLength.MICROMETER assert pixels.physicalSizeX.getValue() == 1.0 assert pixels.physicalSizeY.getUnit() == UnitsLength.MICROMETER assert pixels.physicalSizeY.getValue() == 2.0 assert pixels.physicalSizeZ.getUnit() == UnitsLength.MICROMETER assert pixels.physicalSizeZ.getValue() == 3.0 assert pixels.sha1.val == '61ee8b5601a84d5154387578466c8998848ba089' assert pixels.significantBits.val == 16 assert pixels.sizeX.val == 1 assert pixels.sizeY.val == 2 assert pixels.sizeZ.val == 3 assert pixels.sizeC.val == 4 assert pixels.sizeT.val == 5 assert pixels.timeIncrement.getUnit() == UnitsTime.MILLISECOND assert pixels.timeIncrement.getValue() == 1.0 assert pixels.waveIncrement.val == 2.0 assert pixels.waveStart.val == 1 assert pixels.dimensionOrder.id.val == 1L assert pixels.dimensionOrder.value.val == 'XYZCT' assert pixels.pixelsType.id.val == 1L assert pixels.pixelsType.value.val == 'bit' channel_1, channel_2 = pixels.copyChannels() assert channel_1.id.val == 1L assert channel_1.alpha.val == 255 assert channel_1.blue.val == 0 assert channel_1.green.val == 255 assert channel_1.red.val == 0 assert channel_1.lookupTable.val == 'rainbow' logical_channel_1 = channel_1.logicalChannel assert logical_channel_1.id.val == 1L assert logical_channel_1.emissionWave.getUnit() \ == UnitsLength.NANOMETER assert logical_channel_1.emissionWave.getValue() == 509.0 assert logical_channel_1.excitationWave.getUnit() \ == UnitsLength.NANOMETER assert logical_channel_1.excitationWave.getValue() == 488.0 assert logical_channel_1.fluor.val == 'GFP' assert logical_channel_1.name.val == 'GFP/488' assert logical_channel_1.ndFilter.val == 1.0 assert logical_channel_1.pinHoleSize.getUnit() == UnitsLength.NANOMETER assert logical_channel_1.pinHoleSize.getValue() == 1.0 assert logical_channel_1.pockelCellSetting.val == 0 assert logical_channel_1.samplesPerPixel.val == 2 assert logical_channel_1.contrastMethod.value.val == 'Fluorescence' assert logical_channel_1.illumination.value.val == 'Transmitted' assert logical_channel_1.mode.value.val == 'WideField' assert logical_channel_1.photometricInterpretation.value.val == 'RGB' assert channel_2.id.val == 2L assert channel_2.alpha.val == 255 assert channel_2.blue.val == 255 assert channel_2.green.val == 0 assert channel_2.red.val == 0 assert channel_2.lookupTable.val == 'rainbow' logical_channel_2 = channel_2.logicalChannel assert logical_channel_2.id.val == 2L assert logical_channel_2.emissionWave.getUnit() \ == UnitsLength.NANOMETER assert logical_channel_2.emissionWave.getValue() == 470.0 assert logical_channel_2.excitationWave.getUnit() \ == UnitsLength.NANOMETER assert logical_channel_2.excitationWave.getValue() == 405.0 assert logical_channel_2.fluor.val == 'DAPI' assert logical_channel_2.name.val == 'DAPI/405' assert logical_channel_2.ndFilter.val == 1.0 assert logical_channel_2.pinHoleSize.getUnit() == UnitsLength.NANOMETER assert logical_channel_2.pinHoleSize.getValue() == 2.0 assert logical_channel_2.pockelCellSetting.val == 0 assert logical_channel_2.samplesPerPixel.val == 2 assert logical_channel_2.contrastMethod.value.val == 'Fluorescence' assert logical_channel_2.illumination.value.val == 'Transmitted' assert logical_channel_2.mode.value.val == 'WideField' assert logical_channel_2.photometricInterpretation.value.val == 'RGB'
def test_image_decoder(self, image): encoder = get_encoder(image.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(image) v = decoder.decode(v) self.assert_image(v)
def test_decoder(self, rectangle): encoder = get_encoder(rectangle.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(rectangle) v = decoder.decode(v) self.assert_rectangle(v)
def test_image_pixels_decoder(self, image_pixels): encoder = get_encoder(image_pixels.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(image_pixels) v = decoder.decode(v) self.assert_image(v) pixels = v.getPrimaryPixels() assert pixels.id.val == 1L assert pixels.methodology.val == 'methodology' assert pixels.physicalSizeX.getUnit() == UnitsLength.MICROMETER assert pixels.physicalSizeX.getValue() == 1.0 assert pixels.physicalSizeY.getUnit() == UnitsLength.MICROMETER assert pixels.physicalSizeY.getValue() == 2.0 assert pixels.physicalSizeZ.getUnit() == UnitsLength.MICROMETER assert pixels.physicalSizeZ.getValue() == 3.0 assert pixels.sha1.val == '61ee8b5601a84d5154387578466c8998848ba089' assert pixels.significantBits.val == 16 assert pixels.sizeX.val == 1 assert pixels.sizeY.val == 2 assert pixels.sizeZ.val == 3 assert pixels.sizeC.val == 4 assert pixels.sizeT.val == 5 assert pixels.timeIncrement.getUnit() == UnitsTime.MILLISECOND assert pixels.timeIncrement.getValue() == 1.0 assert pixels.waveIncrement.val == 2.0 assert pixels.waveStart.val == 1 assert pixels.dimensionOrder.id.val == 1L assert pixels.dimensionOrder.value.val == 'XYZCT' assert pixels.pixelsType.id.val == 1L assert pixels.pixelsType.value.val == 'bit' channel_1, channel_2 = pixels.copyChannels() assert channel_1.id.val == 1L assert channel_1.alpha.val == 255 assert channel_1.blue.val == 255 assert channel_1.green.val == 255 assert channel_1.red.val == 255 assert channel_1.lookupTable.val == 'rainbow' logical_channel_1 = channel_1.logicalChannel assert logical_channel_1.id.val == 1L assert logical_channel_1.emissionWave.getUnit() \ == UnitsLength.NANOMETER assert logical_channel_1.emissionWave.getValue() == 509.0 assert logical_channel_1.excitationWave.getUnit() \ == UnitsLength.NANOMETER assert logical_channel_1.excitationWave.getValue() == 488.0 assert logical_channel_1.fluor.val == 'GFP' assert logical_channel_1.name.val == 'GFP/488' assert logical_channel_1.ndFilter.val == 1.0 assert logical_channel_1.pinHoleSize.getUnit() == UnitsLength.NANOMETER assert logical_channel_1.pinHoleSize.getValue() == 1.0 assert logical_channel_1.pockelCellSetting.val == 0 assert logical_channel_1.samplesPerPixel.val == 2 assert logical_channel_1.contrastMethod.value.val == 'Fluorescence' assert logical_channel_1.illumination.value.val == 'Transmitted' assert logical_channel_1.mode.value.val == 'WideField' assert logical_channel_1.photometricInterpretation.value.val == 'RGB' assert channel_2.id.val == 2L assert channel_2.alpha.val == 255 assert channel_2.blue.val == 255 assert channel_2.green.val == 0 assert channel_2.red.val == 255 assert channel_2.lookupTable.val == 'rainbow' logical_channel_2 = channel_2.logicalChannel assert logical_channel_2.id.val == 2L assert logical_channel_2.emissionWave.getUnit() \ == UnitsLength.NANOMETER assert logical_channel_2.emissionWave.getValue() == 470.0 assert logical_channel_2.excitationWave.getUnit() \ == UnitsLength.NANOMETER assert logical_channel_2.excitationWave.getValue() == 405.0 assert logical_channel_2.fluor.val == 'DAPI' assert logical_channel_2.name.val == 'DAPI/405' assert logical_channel_2.ndFilter.val == 1.0 assert logical_channel_2.pinHoleSize.getUnit() == UnitsLength.NANOMETER assert logical_channel_2.pinHoleSize.getValue() == 2.0 assert logical_channel_2.pockelCellSetting.val == 0 assert logical_channel_2.samplesPerPixel.val == 2 assert logical_channel_2.contrastMethod.value.val == 'Fluorescence' assert logical_channel_2.illumination.value.val == 'Transmitted' assert logical_channel_2.mode.value.val == 'WideField' assert logical_channel_2.photometricInterpretation.value.val == 'RGB'
def test_decoder(self, ellipse): encoder = get_encoder(ellipse.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(ellipse) v = decoder.decode(v) self.assert_ellipse(v)
def test_encoder_with_annotations(self, ellipse_with_annotations): encoder = get_encoder(ellipse_with_annotations.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(ellipse_with_annotations) v = decoder.decode(v) self.assert_ellipse(v, has_annotations=True)
def persist_rois(request, conn=None, **kwargs): if not request.method == 'POST': return JsonResponse({"errors": ["Use HTTP POST to send data!"]}) try: rois_dict = json.loads(request.body) except Exception as e: return JsonResponse({"errors": ["Failed to load json: " + repr(e)]}) # some preliminary checks are following... image_id = rois_dict.get('imageId', None) if image_id is None: return JsonResponse({"errors": ["No image id provided!"]}) rois = rois_dict.get('rois', None) if rois is None: return JsonResponse({"errors": ["Could not find rois object!"]}) # get the associated image and an instance of the update service image = conn.getObject("Image", image_id, opts=conn.SERVICE_OPTS) if image is None: return JsonResponse({"errors": ["Could not find associated image!"]}) # prepare services update_service = conn.getUpdateService() if update_service is None: return JsonResponse({"errors": ["Could not get update service!"]}) # when persisting we use the specific group context conn.SERVICE_OPTS['omero.group'] = image.getDetails().getGroup().getId() # for id syncing ids_to_sync = {} # keep track of errors errors = [] # insert new ones try: new = rois.get('new', []) new_count = len(new) if new_count > 0: decoded_rois = [] for n in new: new_roi = { "@type": "http://www.openmicroscopy.org/Schemas/OME/2016-06#ROI", "shapes": [n] } decoder = omero_marshal.get_decoder(new_roi.get("@type")) decoded_roi = decoder.decode(new_roi) decoded_roi.setImage(image._obj) decoded_rois.append(decoded_roi) decoded_rois = update_service.saveAndReturnArray( decoded_rois, conn.SERVICE_OPTS) # sync ids for r in range(new_count): ids_to_sync[new[r]['oldId']] = \ str(decoded_rois[r].getId().getValue()) + ':' + \ str(decoded_rois[r].getShape(0).getId().getValue()) except Exception as marshal_or_persistence_exception: errors.append('Error persisting new rois: ' + repr(marshal_or_persistence_exception)) # modify existing ones try: modified = rois.get('modified', []) modified_count = len(modified) if modified_count > 0: decoded_shapes = [] for m in modified: decoder = omero_marshal.get_decoder(m.get("@type")) decoded_shapes.append(decoder.decode(m)) update_service.saveArray(decoded_shapes, conn.SERVICE_OPTS) # set ids after successful modification for r in range(modified_count): ids_to_sync[modified[r]['oldId']] = modified[r]['oldId'] except Exception as marshal_or_persistence_exception: errors.append('Error modifying rois: ' + repr(marshal_or_persistence_exception)) # delete entire (empty) rois try: empty_rois = rois.get('empty_rois', {}) empty_rois_ids = [int(k) for k in list(empty_rois.keys())] if (len(empty_rois_ids) > 0): conn.deleteObjects("Roi", empty_rois_ids, wait=True) # set ids after successful deletion, for e in empty_rois: for s in empty_rois[e]: ids_to_sync[s] = s except Exception as deletion_exception: errors.append('Error deleting empty rois: ' + repr(deletion_exception)) # remove individual shapes (so as to not punch holes into shape index) try: deleted = rois.get('deleted', {}) deleted_rois_ids = deleted.keys() if len(deleted_rois_ids) > 0: rois_service = conn.getRoiService() rois_to_be_updated = [] for d in deleted_rois_ids: r = rois_service.findByRoi(int(d), None, conn.SERVICE_OPTS).rois[0] for s in r.copyShapes(): roi_shape_id = str(d) + ':' + str(s.getId().getValue()) if roi_shape_id in deleted[d]: r.removeShape(s) rois_to_be_updated.append(r) update_service.saveArray(rois_to_be_updated, conn.SERVICE_OPTS) # set ids after successful deletion, for d in deleted: for s in deleted[d]: ids_to_sync[s] = s except Exception as deletion_exception: errors.append('Error deleting shapes: ' + repr(deletion_exception)) # prepare response ret = {'ids': ids_to_sync} if len(errors) > 0: ret['errors'] = errors return JsonResponse(ret)
def test_null_string(self): data = json.loads(self.AS_STRING) data['Description'] = None decoder = get_decoder(data['@type']) v = decoder.decode(data) assert v.description is None
def test_roi_decoder_registered(self): decoder = get_decoder("http://www.openmicroscopy.org/Schemas/ROI/2015-01#ROI") assert decoder is not None
def test_base_decoder_from_string(self): data = json.loads(self.AS_STRING) decoder = get_decoder(data['@type']) v = decoder.decode(data) self.assert_roi(v)
def test_roi_with_shapes(self, roi_with_shapes): encoder = get_encoder(roi_with_shapes.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(roi_with_shapes) v = decoder.decode(v) self.assert_roi_with_shapes(v)
def test_base_decoder(self, roi): encoder = get_encoder(roi.__class__) decoder = get_decoder(encoder.TYPE) v = encoder.encode(roi) v = decoder.decode(v) self.assert_roi(v)