class TestInstanceSchema(ResourceMetadataSchema): __envelope__ = {"single": None, "many": None} __model__ = models.TestInstance class Meta: model = models.TestInstance uuid = ma.auto_field() roc_instance = ma.auto_field() name = ma.auto_field() resource = ma.auto_field() managed = fields.Boolean(attribute="managed") service = fields.Method("get_testing_service") def get_testing_service(self, obj): logger.debug("Test current obj: %r", obj) assert obj.testing_service, "Missing testing service" return { 'uuid': obj.testing_service.uuid, 'url': obj.testing_service.url, 'type': obj.testing_service._type.replace('_testing_service', '') } @post_dump def remove_skip_values(self, data, **kwargs): return {key: value for key, value in data.items() if value is not None}
class WorkflowSchema(ResourceMetadataSchema): __envelope__ = {"single": None, "many": "items"} __model__ = models.WorkflowVersion class Meta: model = models.WorkflowVersion uuid = ma.auto_field() name = ma.auto_field()
class WorkflowRegistrySchema(BaseSchema): __envelope__ = {"single": None, "many": "items"} __model__ = models.WorkflowRegistry class Meta: model = models.WorkflowRegistry uuid = ma.auto_field() uri = ma.auto_field() type = ma.auto_field() name = fields.String(attributes="server_credentials.name")
class UserSchema(BaseSchema): __envelope__ = {"single": None, "many": "items"} __model__ = models.User class Meta: model = models.User id = ma.auto_field() username = ma.auto_field() # Uncomment to include all identities identities = fields.Dict(attribute="current_identity", keys=fields.String(), values=fields.Nested(IdentitySchema()))
class WorkflowRegistrySchema(ResourceMetadataSchema): __envelope__ = {"single": None, "many": "items"} __model__ = models.WorkflowRegistry class Meta: model = models.WorkflowRegistry uuid = ma.auto_field() uri = ma.auto_field() type = fields.Method("get_type") name = fields.String(attribute="server_credentials.name") def get_type(self, obj): return obj.type.replace('_registry', '')
class WorkflowVersionSchema(ResourceSchema): __envelope__ = {"single": None, "many": "items"} __model__ = models.WorkflowVersion class Meta: model = models.WorkflowVersion ordered = True uuid = fields.String(attribute="workflow.uuid") name = ma.auto_field() version = fields.Method("get_version") registry = ma.Nested(WorkflowRegistrySchema(exclude=('meta', )), attribute="workflow_registry") rocrate_metadata = False def __init__(self, *args, rocrate_metadata=False, **kwargs): super().__init__(*args, **kwargs) self.rocrate_metadata = rocrate_metadata def get_version(self, obj): exclude = ('rocrate_metadata', ) if not self.rocrate_metadata else () return VersionDetailsSchema(exclude=exclude).dump(obj) @post_dump def remove_skip_values(self, data, **kwargs): return {key: value for key, value in data.items() if value is not None}
class UserSchema(ResourceMetadataSchema): __envelope__ = {"single": None, "many": "items"} __model__ = models.User class Meta: model = models.User id = ma.auto_field() username = ma.auto_field() # identities = fields.Dict(attribute="current_identity", # keys=fields.String(), # values=fields.Nested(IdentitySchema())) identities = fields.Method("current_identity") def current_identity(self, user): # TODO: these should probably defined in a Model somewhere lm_identity_provider = { "name": "LifeMonitor", "type": "oauth2_identity_provider", "uri": get_external_server_url(), "userinfo_endpoint": get_external_server_url() + "/users/current" } lm_user_identity = { "sub": str(user.id), "username": user.username, "picture": user.picture, "provider": lm_identity_provider, } identities = {"lifemonitor": lm_user_identity} # Add any other identities that the user has if user.current_identity: for k, v in user.current_identity.items(): if k == 'lifemonitor': raise RuntimeError( "BUG: user has a second lifemonitor identity") try: identities[k] = IdentitySchema().dump(v) except Exception as e: logger.error( "Unable to retrieve profile" "of user % r from provider % r: % r", user.id, k, str(e)) return identities
class TestInstanceSchema(BaseSchema): __envelope__ = {"single": None, "many": None} __model__ = models.TestInstance class Meta: model = models.TestInstance uuid = ma.auto_field() name = ma.auto_field() service = fields.Method("get_testing_service") def get_testing_service(self, obj): logger.debug("Test current obj: %r", obj) return { 'uuid': obj.testing_service.uuid, 'url': obj.testing_service.url, 'type': obj.testing_service._type, 'resource': obj.resource }
class SuiteSchema(BaseSchema): __envelope__ = {"single": None, "many": "items"} __model__ = models.TestSuite class Meta: model = models.TestSuite uuid = ma.auto_field() test_suite_metadata = fields.Dict( attribute="test_definition") # TODO: rename the property to metadata instances = fields.Nested(TestInstanceSchema(), attribute="test_instances", many=True)
class WorkflowVersionSchema(ResourceSchema): __envelope__ = {"single": None, "many": "items"} __model__ = models.WorkflowVersion class Meta: model = models.WorkflowVersion ordered = True uuid = fields.String(attribute="workflow.uuid") name = ma.auto_field() version = fields.Method("get_version") def get_version(self, obj): return VersionDetailsSchema().dump(obj)
class SuiteSchema(ResourceMetadataSchema): __envelope__ = {"single": None, "many": "items"} __model__ = models.TestSuite class Meta: model = models.TestSuite uuid = ma.auto_field() roc_suite = fields.String(attribute="roc_suite") definition = fields.Method("get_definition") instances = fields.Nested(TestInstanceSchema(exclude=('meta', )), attribute="test_instances", many=True) def get_definition(self, obj): to_skip = ['path'] return {k: v for k, v in obj.definition.items() if k not in to_skip} @post_dump def remove_skip_values(self, data, **kwargs): return {key: value for key, value in data.items() if value is not None}