class Question(AttributesMixin): expert_uuids = ListAttribute(StringType()) question_type = StringAttribute(choices=QUESTION_TYPES) reference_uuids = ListAttribute(StringType()) required_level = IntegerAttribute(nullable=True) tag_uuids = ListAttribute(StringType()) text = StringAttribute(nullable=True) title = StringAttribute() uuid = StringAttribute()
class TemplateChangeDTO(AttributesMixin): allowed_packages = ListAttribute(ObjectType(TemplateAllowedPackage)) description = StringAttribute() formats = ListAttribute(ObjectType(TemplateFormat)) license = StringAttribute() metamodel_version = IntegerAttribute() name = StringAttribute() organization_id = StringAttribute() readme = StringAttribute() recommended_package_id = StringAttribute(nullable=True) template_id = StringAttribute() version = StringAttribute()
class QuestionnaireDTO(AttributesMixin): created_at = DateTimeAttribute() level = IntegerAttribute() name = StringAttribute() package = ObjectAttribute(PackageSimpleDTO) permissions = ListAttribute(ObjectType(QuestionnairePermRecordDTO)) report = ObjectType(QuestionnaireReportDTO) sharing = StringAttribute(choices=QUESTIONNAIRE_SHARING) state = StringAttribute(choices=QUESTIONNAIRE_STATES) updated_at = DateTimeAttribute() uuid = StringAttribute() visibility = StringAttribute(choices=QUESTIONNAIRE_VISIBILITIES)
class TemplateSimpleDTO(TemplateSimple): allowed_packages = ListAttribute(ObjectType(TemplateAllowedPackage)) created_at = DateTimeAttribute(read_only=True) license = StringAttribute() metamodel_version = IntegerAttribute() organization = ObjectAttribute(OrganizationSimple, nullable=True, read_only=True) organization_id = StringAttribute() readme = StringAttribute() recommended_package_id = StringAttribute(nullable=True) state = StringAttribute(choices=TEMPLATE_STATES, read_only=True) template_id = StringAttribute() usable_packages = ListAttribute(ObjectType(PackageSimpleDTO), read_only=True)
class Questionnaire(Model): created_at = DateTimeAttribute() creator_uuid = StringAttribute(nullable=True) events = ListAttribute(MappingType('type', { SET_REPLY_EVENT: ObjectType(SetReplyEvent), CLEAR_REPLY_EVENT: ObjectType(ClearReplyEvent), SET_LEVEL_EVENT: ObjectType(SetLevelEvent), SET_LABELS_EVENT: ObjectType(SetLabelsEvent), })) format = ObjectAttribute(TemplateFormat, nullable=True) format_uuid = StringAttribute(nullable=True) knowledge_model = ObjectAttribute(KnowledgeModel) labels = DictAttribute(StringType(), StringType()) level = IntegerAttribute() name = StringAttribute() package = ObjectAttribute(PackageSimpleDTO) permissions = ListAttribute(ObjectType(QuestionnairePermRecordDTO)) replies = DictAttribute(StringType(), ObjectType(Reply)) selected_tag_uuids = ListAttribute(StringType()) sharing = StringAttribute(choices=QUESTIONNAIRE_SHARING) state = StringAttribute(choices=QUESTIONNAIRE_STATES) template = ObjectAttribute(TemplateSimple, nullable=True) template_id = StringAttribute(nullable=True) updated_at = DateTimeAttribute() versions = ListAttribute(ObjectType(QuestionnaireVersion)) visibility = StringAttribute(choices=QUESTIONNAIRE_VISIBILITIES) documents = ListOfModelsAttribute(Document, default=[]) def _create(self): raise NotImplementedError('Cannot create questionnaires') def _update(self): raise NotImplementedError('Cannot update questionnaires') def _delete(self): raise NotImplementedError('Cannot delete questionnaires')
class Template(Model): allowed_packages: List[TemplateAllowedPackage] = ListAttribute( ObjectType(TemplateAllowedPackage), ) created_at: datetime = DateTimeAttribute(read_only=True) description: str = StringAttribute() formats: List[TemplateFormat] = ListAttribute(ObjectType(TemplateFormat)) id: str = Alias('uuid') license: str = StringAttribute() metamodel_version: int = IntegerAttribute() name: str = StringAttribute() organization: Optional[OrganizationSimple] = ObjectAttribute( OrganizationSimple, nullable=True, read_only=True, ) organization_id: str = StringAttribute() readme: str = StringAttribute() recommended_package_id: Optional[str] = StringAttribute(nullable=True) registry_link: Optional[str] = StringAttribute( nullable=True, read_only=True, ) remote_latest_version: Optional[str] = StringAttribute( nullable=True, read_only=True, ) state: str = StringAttribute(choices=TEMPLATE_STATES, read_only=True) template_id: str = StringAttribute() usable_packages: List[PackageSimpleDTO] = ListAttribute( ObjectType(PackageSimpleDTO), read_only=True, ) version: str = StringAttribute() versions: List[str] = ListAttribute(StringType(), read_only=True) assets: List[TemplateAsset] = ListOfModelsAttribute(TemplateAsset, default=[]) files: List[TemplateFile] = ListOfModelsAttribute(TemplateFile, default=[]) def _attr_to_str(self, name: str, value: Any) -> str: # Readme is usually quite long, so we display only the beginning if name == 'readme': return truncate_long_string(value, 50) return super()._attr_to_str(name, value) def _create_validate(self): for file in self.files: if file.template_id is not None: raise ValueError(CREATE_VALIDATE_ERR.format('files', 'file')) for asset in self.assets: if asset.template_id is not None: raise ValueError(CREATE_VALIDATE_ERR.format('assets', 'asset')) def _update_validate(self): for file in self.files: if (file.template_id is not None and file.template_id != self.uuid): raise ValueError(UPDATE_VALIDATE_ERR.format('files', 'file')) for asset in self.assets: if (asset.template_id is not None and asset.template_id != self.uuid): raise ValueError(UPDATE_VALIDATE_ERR.format('assets', 'asset')) def _save_template_files(self, diff: SnapshotDiff = SnapshotDiff()): modified_files_uuids = [ file['uuid'] for file in diff.modified.get('files', []) ] for file in self.files: if file.uuid in modified_files_uuids: modified_files_uuids.remove(file.uuid) file.template_id = self.uuid # If it is a new file, it gets created. If it is some old file, # that was just modified, it gets updated. If no there was no # change, `file.save()` won't do anything. file.save() for uuid_to_remove in modified_files_uuids: self._sdk.api.delete_template_file(self.uuid, uuid_to_remove) def _save_asset_files(self, diff: SnapshotDiff = SnapshotDiff()): modified_assets_uuids = [ asset['uuid'] for asset in diff.modified.get('assets', []) ] for asset in self.assets: if asset.uuid in modified_assets_uuids: modified_assets_uuids.remove(asset.uuid) asset.template_id = self.uuid asset.save() for uuid_to_remove in modified_assets_uuids: self._sdk.api.delete_template_asset(self.uuid, uuid_to_remove) def _create(self): self._create_validate() dto = TemplateChangeDTO(**self.attrs()) dto.validate() data = self._sdk.api.post_templates(body=dto.to_json()).json() # We must pop the `files` and `assets`, because they are not yet # created on the server, so there are only empty lists in `data`. data.pop('files', None) data.pop('assets', None) self._update_attrs(**data) self._save_template_files() self._save_asset_files() data = self._sdk.api.get_template(self.id).json() self._update_attrs(**data) def _update(self): self._update_validate() diff = snapshots_diff(self._snapshot, make_snapshot(self)) if 'files' in diff: self._save_template_files(diff) if 'assets' in diff: self._save_asset_files(diff) if len(diff) > 2 or ('files' not in diff and 'assets' not in diff): dto = TemplateChangeDTO(**self.attrs()) dto.validate() data = self._sdk.api.put_template( self.uuid, body=dto.to_json(), ).json() self._update_attrs(**data) def _delete(self): self._sdk.api.delete_template(self.uuid)
class Indication(AttributesMixin): answered_questions = IntegerAttribute() unanswered_questions = IntegerAttribute() indication_type = StringAttribute(choices=INDICATIONS_TYPES)
class SetLevelEvent(QuestionnaireEvent): level = IntegerAttribute()