class AppConfigQuestionnaire(AttributesMixin): feedback = ObjectAttribute(AppConfigQuestionnaireFeedback) levels = ObjectAttribute(SimpleFeature) questionnaire_sharing = ObjectAttribute(AppConfigQuestionnaireSharing) questionnaire_visibility = ObjectAttribute( AppConfigQuestionnaireVisibility ) summary_report = ObjectAttribute(SimpleFeature)
class AppConfigChangeDTO(AttributesMixin): authentication = ObjectAttribute(AppConfigAuth) dashboard = ObjectAttribute(AppConfigDashboard) look_and_feel = ObjectAttribute(AppConfigLookAndFeel) organization = ObjectAttribute(AppConfigOrganization) privacy_and_support = ObjectAttribute(AppConfigPrivacyAndSupport) questionnaire = ObjectAttribute(AppConfigQuestionnaire) registry = ObjectAttribute(AppConfigRegistry) submission = ObjectAttribute(AppConfigSubmission) template = ObjectAttribute(AppConfigTemplate)
class QuestionnaireVersion(AttributesMixin): created_at = DateTimeAttribute() created_by = ObjectAttribute(UserSuggestion) description = StringAttribute(nullable=True) event_uuid = StringAttribute() name = StringAttribute() updated_at = DateTimeAttribute() uuid = StringAttribute()
class AppConfigSubmissionService(AttributesMixin): description = StringAttribute() id = StringAttribute() name = StringAttribute() props = ListAttribute(StringType()) request = ObjectAttribute(AppConfigSubmissionServiceRequest) supported_formats = ListAttribute( ObjectType(AppConfigSubmissionServiceSupportedFormat) )
class Document(Model): created_at = DateTimeAttribute() creator_uuid = StringAttribute(nullable=True) format_uuid = StringAttribute() name = StringAttribute() questionnaire = ObjectAttribute(QuestionnaireDTO, nullable=True) questionnaire_event_uuid = StringAttribute(nullable=True) state = StringAttribute(choices=DOCUMENT_STATES) template = ObjectAttribute(TemplateSimpleDTO) def _create(self): raise NotImplementedError('Cannot create documents') def _update(self): raise NotImplementedError('Cannot update documents') def _delete(self): raise NotImplementedError('Cannot delete documents')
class AppConfigAuthExternalService(AttributesMixin): client_id = StringAttribute() client_secret = StringAttribute() id = StringAttribute() name = StringAttribute() parameteres = ListAttribute( ObjectType(AppConfigAuthExternalServiceParameter) ) style = ObjectAttribute(AppConfigAuthExternalServiceStyle, nullable=True) url = StringAttribute()
class PackageSimpleDTO(AttributesMixin): created_at = DateTimeAttribute() description = StringAttribute() id = StringAttribute() km_id = StringAttribute() name = StringAttribute() organization = ObjectAttribute(OrganizationSimple, nullable=True) organization_id = StringAttribute() state = StringAttribute(choices=PACKAGE_STATES) version = StringAttribute() versions = ListAttribute(StringType())
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 Reply(AttributesMixin): created_at = DateTimeAttribute() created_by = ObjectAttribute(UserSuggestion) value = Attribute( MappingType( 'type', { ANSWER_REPLY: ObjectType(AnswerReply), INTEGRATION_REPLY: ObjectType(IntegrationReply), ITEM_LIST_REPLY: ObjectType(ItemListReply), MULTI_CHOICE_REPLY: ObjectType(MultiChoiceReply), STRING_REPLY: ObjectType(StringReply), }))
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 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 AppConfig(Model): authentication = ObjectAttribute(AppConfigAuth) created_at = DateTimeAttribute() dashboard = ObjectAttribute(AppConfigDashboard) look_and_feel = ObjectAttribute(AppConfigLookAndFeel) organization = ObjectAttribute(AppConfigOrganization) privacy_and_support = ObjectAttribute(AppConfigPrivacyAndSupport) questionnaire = ObjectAttribute(AppConfigQuestionnaire) registry = ObjectAttribute(AppConfigRegistry) submission = ObjectAttribute(AppConfigSubmission) template = ObjectAttribute(AppConfigTemplate) updated_at = DateTimeAttribute() def _create(self): raise NotImplementedError('Cannot create config') def _update(self): dto = AppConfigChangeDTO(**self.attrs()) dto.validate() data = self._sdk.api.put_configs_app(body=dto.to_json()).json() self._update_attrs(**data) def _delete(self): raise NotImplementedError('Cannot delete config')
class AppConfigDashboard(AttributesMixin): welcome_info = StringAttribute(nullable=True) welcome_warning = StringAttribute(nullable=True) widgets = ObjectAttribute(AppConfigDashboardWidgets, nullable=True)
class AppConfigAuth(AttributesMixin): default_role = StringAttribute() internal = ObjectAttribute(AppConfigAuthInternal) external = ObjectAttribute(AppConfigAuthExternal)
class QuestionnaireEvent(AttributesMixin): created_at = DateTimeAttribute() created_by = ObjectAttribute(UserSuggestion, nullable=True) type = StringAttribute(choices=EVENT_TYPES) uuid = StringAttribute()
class AppConfigAuthInternal(AttributesMixin): registration = ObjectAttribute(SimpleFeature)
class KnowledgeModel(AttributesMixin): chapter_uuids = ListAttribute(StringType()) entities = ObjectAttribute(KnowledgeModelEntities) integration_uuids = ListAttribute(StringType()) tag_uuids = ListAttribute(StringType()) uuid = StringAttribute()
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 AppConfigSubmissionServiceRequest(AttributesMixin): headers = DictAttribute(StringType(), StringType()) method = StringAttribute() multipart = ObjectAttribute(AppConfigSubmissionServiceRequestMultipart) url = StringAttribute()