Source code for models

#!/usr/bin/python
"""
=======
INFOS
=======
* python version: 3.5
* connectVSD 0.8.1
* module: models
* @author: Michael Kistler 2016, Livia B.

========
CHANGES
========
* implemented objects as jsonmodels

"""

from jsonmodels import models, fields, errors, validators
from pathlib import Path, PurePath, WindowsPath


################################################
#Custom validators
################################################

[docs]class ListValidator(object): """Validator for a list.""" def __init__(self, itemlist): """Init. :param items: list of items to check against. :param bool exclusive: If `True`, then validated value must be strongly bigger than given threshold. """ self.itemlist = itemlist
[docs] def validate(self, value): """Validate value.""" if value not in self.itemlist: raise errors.ValidationError( "'{value}' is not accepted, acceptable values are: ('{itemlist}').".format( value=value, itemlist=self.itemlist))
[docs] def modify_schema(self, field_schema): """Modify field schema.""" field_schema['itemlist'] = self.itemlist
################################################ #Models parameters ################################################
[docs]class URLField(fields.StringField): pass #add url-specific fields?
########################################## # Attributes Data ##########################################
[docs]class PaginationParameter(models.Base): """ pagination parameters """ rpp = fields.IntField( required=True, validators=ListValidator([10, 25, 50, 100, 250, 500]) ) page = fields.IntField( required=True, validators=validators.Min(0) )
################################################ #View Models ################################################
[docs]class APIVersion(models.Base): """ the api version view model """ major = fields.IntField() minor = fields.IntField() build = fields.IntField() revision = fields.IntField() majorRevision = fields.IntField() minorRevision = fields.IntField()
[docs]class HttpContent(models.Base): """ header content """ headers = fields.StringField()
[docs]class HttpMethod(models.Base): """ http request method """ method = fields.IntField()
[docs]class HttpRequestMessage(models.Base): """ Http request view model """ version = fields.EmbeddedField(APIVersion) content = fields.EmbeddedField(HttpContent) method = fields.EmbeddedField(HttpMethod) requestUri = URLField() headers = fields.StringField() proertiews = fields.EmbeddedField(dict)
[docs]class HttpResponseMessage(models.Base): """ http response message view model """ version = fields.EmbeddedField(APIVersion) content = fields.EmbeddedField(HttpContent) statusCode = fields.IntField() reasonPhrase = fields.StringField() headers = fields.StringField() requestMessage = fields.EmbeddedField(HttpRequestMessage) isSuccessStatusCode = fields.BoolField()
[docs]class Token(models.Base): """ API class to work with the tokens Supported token: JWT """ tokenType = fields.StringField() tokenValue = fields.StringField()
[docs]class APIBase(models.Base): """ Basic for all classes with selfUrl """ selfUrl = fields.StringField() def __str__(self): return '{name} {url}'.format(name=self.__class__.__name__, url = self.selfUrl)
[docs] def get(self): """ get the object as json readable structure (dict) :return: json :rtype: json """ return json.dumps(self.to_struct())
[docs] def set(self, data): """ set the object content :param json data: the data for the object in json format :return: json :rtype: json """ # takes existing fields and sets its value from the input data for name, field in self.iterate_over_fields(): print('name: {0} - value: {1} - type: {2}'. format(name, data[name], type(field))) field.__set__(self, data[name])
[docs] def show(self): """ show the object as json readable structure (dict), nicely formated """ print(json.dumps(self.to_struct(), sort_keys = True, indent = 4))
[docs] def save(self, fp = 'object.json'): """ save the object as json to the given filepath :params Path fp: the filepath to the file :return: the path to the stored file :rtype: Path """ fp = Path(fp) if fp.is_file(): fp.unlink() fp.touch() else: fp.touch() with fp.open('w') as outfile: json.dump(self.to_struct(), outfile, indent = 4) return fp
[docs]class APIBaseID(APIBase): """ id and selfUrl """ id = fields.IntField() def __str__(self): return '{name} {url} {selfname}'.format(name=self.__class__.__name__, url = self.id, selfname = getattr(self, 'name', ""))
[docs]class APIBaseExt(APIBaseID): """ id, name, display name and selfUrl """ name = fields.StringField() displayName = fields.StringField()
[docs]class APIBaseN3(APIBase): """ for semantic triple storage """ subject = fields.EmbeddedField(APIBaseExt) # will be most likely a APIBaseExt predicate = fields.EmbeddedField(APIBaseExt) # will be most likely a APIBaseExt object = fields.EmbeddedField(APIBaseExt) # will be most likely a APIBaseExt
[docs]class Preview(APIBaseID): imageUrl = URLField() thumbnailUrl = URLField()
################################################ #FILES ################################################
[docs]class File(APIBaseID): createdDate = fields.StringField() downloadUrl = URLField() originalFileName = fields.StringField() anonymizedFileHashCode = fields.StringField() size = fields.IntField() fileHashCode = fields.StringField() objects = fields.EmbeddedField(Pagination) #ObjectPagination
################################################ #FOLDER ################################################
[docs]class Folder(APIBaseID): name = fields.StringField() level = fields.IntField() parentFolder = fields.EmbeddedField(APIBase) childFolders = fields.ListField(APIBase)#fields.ListField([ 'Folder']) folderGroupRights = fields.ListField(APIBase) folderUserRights = fields.ListField(APIBase) containedObjects = fields.ListField(APIBase)
[docs]class FolderPagination(Pagination): """ API class for Pagination results containing folders """ items = fields.ListField(Folder)
################################################ #FOLDER RIGHTS ################################################
[docs]class FolderRight(APIBaseID): """ represents a folder right """ name = fields.StringField() rightValue = fields.IntField()
[docs]class FolderRightPagination(Pagination): """ API class for pagination result containing folder rights """ items = fields.ListField(FolderRight)
[docs]class FolderRightSet(APIBaseID): """ folder rights set """ name = fields.StringField() folderRights = fields.ListField(APIBase)
[docs]class FolderRightSetPagination(Pagination): """ API class for pagination result containing folder rights """ items = fields.ListField(FolderRightSet)
[docs]class FolderGroupRight(APIBaseID): """ relations between folder, group and right (permission) """ relatedFolder = fields.EmbeddedField(APIBase) relatedGroup = fields.EmbeddedField(APIBase) relatedRights= fields.ListField(APIBase)
[docs]class FolderUserRight(APIBaseID): """ relations between folder, user and right (permission) """ relatedFolder = fields.EmbeddedField(APIBase) relatedUser = fields.EmbeddedField(APIBase) relatedRights= fields.ListField(APIBase)
[docs]class FolderGroupRightPagination(Pagination): """ API class for pagination result containing folder group rights """ items = fields.ListField(FolderGroupRight)
[docs]class FolderUserRightPagination(Pagination): """ API class for pagination result containing folder userrights """ items = fields.ListField(FolderUserRight)
################################################ #GROUP ################################################
[docs]class Group(APIBaseID): """ class for groups """ name = fields.StringField() chief = fields.EmbeddedField(APIBase)
[docs]class GroupPagination(Pagination): """ class for pagination results containing groups """ items = fields.ListField(Group)
################################################ #LICENSES ################################################
[docs]class License(APIBase): """ class for licenses """ name = fields.StringField() description = fields.StringField()
[docs]class LicensePagination(Pagination): """ class for pagination results containing groups """ items = fields.ListField(License)
################################################ #MODALITY ################################################
[docs]class Modality(APIBaseID): description = fields.StringField() name = fields.StringField()
[docs]class ModalityPagination(Pagination): """ class for pagination results containing modalities """ items = fields.ListField(Modality)
################################################ #OBJECTS LINKS ################################################ ################################################ #OBJECTS ONTOLOGY & ONTOLOGY ################################################
[docs]class ObjectOntology(APIBaseID): """ A relation between an object and an ontology item """ position = fields.IntField() type = fields.IntField() object = fields.EmbeddedField(APIBase) ontologyItem = fields.EmbeddedField(APIBase)
[docs]class OntologyItem(APIBaseID): """ An ontology item """ term = fields.StringField() type = fields.IntField()
[docs]class OntologyItemPagination(Pagination): """ class for pagination results containing ontology items """ items = fields.ListField(OntologyItem)
[docs]class OntologyOptions(models.Base): """ additional information for the ontologies resource. """ types = fields.ListField(dict)
################################################ #OBJECTS RIGHTS ################################################
[docs]class ObjectRight(APIBase): """ Represents an object right. """ name = fields.StringField() rightValue = fields.IntField()
[docs]class ObjectRightPagination(Pagination): """ class for pagination results containing object rights """ items = fields.ListField(ObjectRight)
[docs]class ObjectRightSet(APIBaseID): """ object rights set """ name = fields.StringField() objectRights = fields.ListField(APIBase)
[docs]class ObjectRightSetPagination(Pagination): """ API class for pagination result containing object rights """ items = fields.ListField(ObjectRightSet)
[docs]class ObjectGroupRight(APIBaseID): """ relations between object, group and right (permission) """ relatedObject = fields.EmbeddedField(APIBase) relatedGroup = fields.EmbeddedField(APIBase) relatedRights= fields.ListField(APIBase)
[docs]class ObjectUserRight(APIBaseID): """ relations between object, user and right (permission) """ relatedObject = fields.EmbeddedField(APIBase) relatedUser = fields.EmbeddedField(APIBase) relatedRights= fields.ListField(APIBase)
[docs]class ObjectGroupRightPagination(Pagination): """ API class for pagination result containing object group rights """ items = fields.ListField(FolderGroupRight)
[docs]class ObjectUserRightPagination(Pagination): """ API class for pagination result containing object userrights """ items = fields.ListField(ObjectUserRight)
################################################ #OBJECTS ################################################
[docs]class ObjectType(APIBase): """ for semantic triple storage """ name = fields.StringField() displayName = fields.StringField() displayNameShort = fields.StringField()
[docs]class APIObject(APIBaseID): """ base object class """ createdDate = fields.StringField() name = fields.StringField() description = fields.StringField() ontologyCount = fields.IntField() type = fields.EmbeddedField(ObjectType) downloadUrl = URLField() license = fields.EmbeddedField(APIBase) files = fields.EmbeddedField(Pagination) linkedObjects = fields.EmbeddedField(Pagination) linkedObjectRelations = fields.EmbeddedField(Pagination) ontologyItems = fields.EmbeddedField(Pagination) ontologyItemRelations = fields.EmbeddedField(Pagination) objectPreviews = fields.ListField(Preview) objectGroupRights = fields.ListField(ObjectGroupRight) objectUserRights = fields.ListField(ObjectUserRight)
[docs]class ObjectPagination(Pagination): """ API class for Pagination results containing objects """ items = fields.ListField(APIObject)
################################################ #specification for Object types ################################################
[docs]class RawImageData(models.Base): """ raw image attributes """ sliceThickness = fields.FloatField() kilovoltPeak = fields.FloatField() spaceBetweenSlices = fields.FloatField() modality = fields.EmbeddedField(Modality)
[docs]class RawImageObject(APIObject): """ API class for raw image view model """ rawImage = fields.EmbeddedField(RawImageData)
[docs]class SegmentationImageData(models.Base): """ segmentation specific attributes """ methodDescription = fields.StringField() segmentationMethod = fields.EmbeddedField(APIBase)
#{u'displayName': u'Manual', u'id': 3, u'selfUrl': u'https://www.virtualskeleton.ch/api/segmentation_methods/3', u'name': u'Manual'})
[docs]class SegmentationImageObject(APIObject): """ API class for segmenation image view model """ segmentationImage = fields.EmbeddedField(SegmentationImageData)
[docs]class StatisticalModelObject(APIObject): """ API class for Statistical model view model - empty """ pass
[docs]class SurfaceModelData(APIObject): """ attributes of surface model """ vectorCount = fields.IntField() minX = fields.FloatField() minY = fields.FloatField() minZ = fields.FloatField() maxX = fields.FloatField() maxY = fields.FloatField() maxZ = fields.FloatField()
[docs]class SurfaceModelObject(APIObject): """ API class for surface model view model """ surfaceModel = fields.EmbeddedField(SurfaceModelData)
[docs]class SubjectData(APIObject): """ attributes for subject data """ subjectKey = fields.StringField()
[docs]class SubjectObject(APIObject): """ API class for Subject view model """ subject = fields.EmbeddedField(SubjectData)
[docs]class ClinicalStudyDataObject(APIObject): """ API class for clinical trial data view model - empty """ subject = fields.EmbeddedField(SubjectData) clinicalStudyDefinition = fields.EmbeddedField(APIBase)
[docs]class ClincalStudyDefinitionData(models.Base): """ attributes for clinical study definition """ studyOID = fields.StringField() studyName = fields.StringField() studyDescription = fields.StringField() protocolName = fields.StringField() metaDataVersionOID = fields.StringField() metaDataVersionName = fields.StringField()
[docs]class ClinicalStudyDefinitionObject(APIObject): """ API class for clinical trail definition view model """ clincalStudyDefinition = fields.EmbeddedField(ClincalStudyDefinitionData)
[docs]class GenomicPlatformObject(APIObject): """ API class for genomic platform view model - empty """ pass
[docs]class GenomicSeriesObject(APIObject): """ API class for genomic series view model - empty """ pass
[docs]class GenomicSampleObject(APIObject): """ API class for genomic sample view model - empty """ pass
[docs]class StudyObject(APIObject): """ API class for study """ pass
[docs]class PlainObject(APIObject): """ API class for plain (undefined object) model view model """ pass
[docs]class PlainSubjectObject(APIObject): """ API class for plain subject (undefined subject object) model view model """ pass
[docs]class ObjectOptions(models.Base): """ class for additional information of the API objects """ genomicPlatform = fields.EmbeddedField(GenomicPlatformObject) genomicSample = fields.EmbeddedField(GenomicSampleObject) genomicSeries = fields.EmbeddedField(GenomicSeriesObject) rawImage = fields.EmbeddedField(RawImageObject) segmentationImage = fields.EmbeddedField(SegmentationImageObject) statisticalModel = fields.EmbeddedField(StatisticalModelObject) clinicalStudyData = fields.EmbeddedField(ClinicalStudyDataObject) clinicalStudyDefinition = fields.EmbeddedField(ClinicalStudyDefinitionObject) study = fields.EmbeddedField(StudyObject) subject = fields.EmbeddedField(StudyObject) surfaceModel = fields.EmbeddedField(SurfaceModelObject)
################################################ #SEGMENTATION METHOD ################################################
[docs]class SegmentationMethod(APIBaseID): """ segmentation methods view model """ name = fields.StringField() displayName = fields.StringField()
################################################ #SEARCH ################################################
[docs]class DynamicSearchLogicalOperator(models.Base): """ logical operator view model """ name = fields.StringField() displayName = fields.StringField() position = fields.IntField()
[docs]class DynamicSearchComparisonOperator(models.Base): """ docstring """ name = fields.StringField() displayName = fields.StringField() position = fields.IntField() typeaheadUrl = fields.StringField()
[docs]class DynamicSearchSourceField(models.Base): """ fiels view model for dynamic search """ name = fields.StringField() displayName = fields.StringField() position = fields.IntField() comparisonOperators = fields.ListField(DynamicSearchComparisonOperator)
[docs]class DynamicSearchSourceType(models.Base): """ source type view model for search """ name = fields.StringField() displayName = fields.StringField() position = fields.IntField() sourceFields = fields.ListField(DynamicSearchSourceField)
[docs]class DynamicSearchOptions(models.Base): """ for DynamicSearchOptions""" logicalOperators = fields.ListField(DynamicSearchLogicalOperator) sourceTypes = fields.ListField(DynamicSearchSourceType)
[docs]class DynamicSearchInputItem(models.Base): """ docstring""" data = fields.EmbeddedField(APIObject) displayName = fields.StringField() isTypeahead = fields.BoolField()
[docs]class DynamicSearchCondition(models.Base): """docstring """ sourceField = fields.EmbeddedField(DynamicSearchSourceField) comparisonOperator = fields.EmbeddedField(DynamicSearchComparisonOperator) inputItem = fields.EmbeddedField(DynamicSearchInputItem)
[docs]class DynamicSearchGroup(models.Base): """docstring""" sourceType = fields.EmbeddedField(DynamicSearchSourceType) logicalOperator = fields.EmbeddedField(DynamicSearchLogicalOperator) conditions = fields.ListField(DynamicSearchCondition) groups = fields.ListField(dict) # DynamicSearchGroup -> recursive...
################################################ #UPLOAD ################################################
[docs]class UploadResponse(models.Base): """ a response consisting of a combination between a file and an object after the upload """ file = fields.EmbeddedField(APIBase) relatedObject = fields.EmbeddedField(APIBase)
################################################ #USERS ################################################
[docs]class User(APIBaseID): """ Users of the repository """ username = fields.StringField()
############################### # API url dictionary ############################ resourceTypes = { 'files': File, 'folders': Folder, 'objects': APIObject, 'object-links' : ObjectLinks }