diff --git a/omero_marshal/decode/decoders/experimentergroup.py b/omero_marshal/decode/decoders/experimentergroup.py index 3c4e1dd7..739c33c5 100644 --- a/omero_marshal/decode/decoders/experimentergroup.py +++ b/omero_marshal/decode/decoders/experimentergroup.py @@ -11,7 +11,7 @@ from ... import SCHEMA_VERSION from .. import Decoder -from omero.model import ExperimenterGroupI +from omero.model import ExperimenterGroupI, GroupExperimenterMapI class ExperimenterGroup201501Decoder(Decoder): @@ -25,6 +25,14 @@ def decode(self, data): v = super(ExperimenterGroup201501Decoder, self).decode(data) self.set_property(v, 'description', data.get('Description')) self.set_property(v, 'name', data.get('Name')) + + for experimenter in data.get('Experimenters', list()): + experimenter_decoder = self.ctx.get_decoder(experimenter['@type']) + _map = GroupExperimenterMapI() + _map.parent = v + _map.child = experimenter_decoder.decode(experimenter) + self.set_property(_map, 'owner', experimenter.get('omero:owner')) + v.addGroupExperimenterMap(_map) return v diff --git a/omero_marshal/encode/encoders/experimentergroup.py b/omero_marshal/encode/encoders/experimentergroup.py index 3c64c314..45ea791a 100644 --- a/omero_marshal/encode/encoders/experimentergroup.py +++ b/omero_marshal/encode/encoders/experimentergroup.py @@ -25,6 +25,23 @@ def encode(self, obj): return v self.set_if_not_none(v, 'Description', obj.description) self.set_if_not_none(v, 'Name', obj.name) + + if obj.isGroupExperimenterMapLoaded() \ + and obj.sizeOfGroupExperimenterMap() > 0: + experimenters = list() + for group_experimenter_map in obj.copyGroupExperimenterMap(): + experimenter = group_experimenter_map.child + experimenter_encoder = self.ctx.get_encoder( + experimenter.__class__ + ) + experimenter_data = experimenter_encoder.encode(experimenter) + self.set_if_not_none( + experimenter_data, + 'omero:owner', + group_experimenter_map.owner + ) + experimenters.append(experimenter_data) + v['Experimenters'] = experimenters return v diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index 9ff23d12..d063068c 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -26,6 +26,7 @@ ExperimenterGroupI, \ ExternalInfoI, \ FormatI, \ + GroupExperimenterMapI, \ IlluminationI, \ ImageI, \ LabelI, \ @@ -350,6 +351,17 @@ def experimenter_group(): return o +@pytest.fixture() +def experimenter_group_with_experimenter( + experimenter_group, experimenter): + _map = GroupExperimenterMapI() + _map.parent = experimenter_group + _map.child = experimenter + _map.owner = rbool(True) + experimenter_group.addGroupExperimenterMap(_map) + return experimenter_group + + @pytest.fixture() def permissions(): o = PermissionsI() diff --git a/tests/unit/test_base_decoder.py b/tests/unit/test_base_decoder.py index 85f0791f..d1895b36 100644 --- a/tests/unit/test_base_decoder.py +++ b/tests/unit/test_base_decoder.py @@ -59,6 +59,15 @@ def test_null_string(self): v = decoder.decode(data) assert v.description is None + def test_experimentergroup_with_experimenter( + self, experimenter_group_with_experimenter): + encoder = get_encoder(experimenter_group_with_experimenter.__class__) + decoder = get_decoder(encoder.TYPE) + v = encoder.encode(experimenter_group_with_experimenter) + v = decoder.decode(v) + _map, = v.copyGroupExperimenterMap() + assert _map.owner.val is True + class TestPermissionsDecoder(object): diff --git a/tests/unit/test_base_encoder.py b/tests/unit/test_base_encoder.py index 61822867..d9a87cc8 100644 --- a/tests/unit/test_base_encoder.py +++ b/tests/unit/test_base_encoder.py @@ -103,6 +103,30 @@ def test_base_encoder_with_unloaded_details_children( } } + def test_experimentergroup_with_experimenter( + self, experimenter_group_with_experimenter): + encoder = get_encoder(experimenter_group_with_experimenter.__class__) + v = encoder.encode(experimenter_group_with_experimenter) + assert v == { + '@id': 1L, + '@type': '%s#ExperimenterGroup' % OME_SCHEMA_URL, + 'Description': 'the_description', + 'Name': 'the_name', + 'Experimenters': [{ + '@id': 1L, + '@type': '%s#Experimenter' % OME_SCHEMA_URL, + 'Email': 'the_email', + 'FirstName': 'the_firstName', + 'Institution': 'the_institution', + 'LastName': 'the_lastName', + 'MiddleName': 'the_middleName', + 'UserName': 'the_omeName', + 'omero:owner': True, + 'omero:details': {'@type': 'TBD#Details'} + }], + 'omero:details': {'@type': 'TBD#Details'} + } + class TestDetailsEncoder(object):