From d7a5fc20da4152a0f3868df63dbbe42fac642164 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 01:22:25 +0000 Subject: [PATCH 01/11] Bump actions/checkout from 6 to 7 Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/sphinx.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml index a7d456c..9afd857 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/sphinx.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Check out repository - uses: actions/checkout@v6 + uses: actions/checkout@v7 - name: Set up Python uses: actions/setup-python@v6 From 9e7cb38710bbf91ca74bfc485e4ce4e49dd16ace Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Jul 2026 01:22:24 +0000 Subject: [PATCH 02/11] Bump actions/setup-python from 6 to 7 Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6 to 7. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/setup-python dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/sphinx.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml index a7d456c..77d7f36 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/sphinx.yml @@ -20,7 +20,7 @@ jobs: uses: actions/checkout@v6 - name: Set up Python - uses: actions/setup-python@v6 + uses: actions/setup-python@v7 with: python-version: 3.12 cache: pip From fff1753617dca1845b588e69877b35a11ae2793d Mon Sep 17 00:00:00 2001 From: krystofkomanec Date: Wed, 5 Aug 2026 09:03:04 +0200 Subject: [PATCH 03/11] Update deps --- docs/requirements.direct.txt | 1 + docs/requirements.txt | 85 ++++++++++++++++++------------------ 2 files changed, 44 insertions(+), 42 deletions(-) diff --git a/docs/requirements.direct.txt b/docs/requirements.direct.txt index 1970dc2..39aba47 100644 --- a/docs/requirements.direct.txt +++ b/docs/requirements.direct.txt @@ -1,5 +1,6 @@ furo Sphinx +sphinx-notfound-page sphinx-toolbox sphinx-reredirects Sphinx-Substitution-Extensions diff --git a/docs/requirements.txt b/docs/requirements.txt index eed8f40..49d73e4 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,60 +1,61 @@ +accessible-pygments==0.0.5 alabaster==1.0.0 apeye==1.4.1 apeye-core==1.1.5 -autodocsumm==0.2.14 -babel==2.17.0 -beartype==0.21.0 -beautifulsoup4==4.13.4 -CacheControl==0.14.3 -certifi==2025.4.26 -charset-normalizer==3.4.2 -cssutils==2.11.1 -dict2css==0.3.0.post1 -docutils==0.21.2 +autodocsumm==0.2.15 +babel==2.18.0 +beartype==0.22.9 +beautifulsoup4==4.15.0 +CacheControl==0.14.4 +certifi==2026.7.22 +charset-normalizer==3.4.9 +dict2css==0.6.0 +docutils==0.22.4 domdf_python_tools==3.10.0 -filelock==3.18.0 -furo==2024.8.6 +filelock==3.32.2 +furo==2025.12.19 html5lib==1.1 -idna==3.10 -imagesize==1.4.1 +idna==3.18 +imagesize==2.0.0 Jinja2==3.1.6 -markdown-it-py==3.0.0 -MarkupSafe==3.0.2 -mdit-py-plugins==0.4.2 +markdown-it-py==4.2.0 +MarkupSafe==3.0.3 +mdit-py-plugins==0.6.1 mdurl==0.1.2 -more-itertools==10.7.0 -msgpack==1.1.0 -myst-parser==4.0.1 +msgpack==1.2.1 +myst-parser==5.1.0 natsort==8.4.0 -packaging==25.0 -platformdirs==4.3.8 -Pygments==2.19.1 -PyYAML==6.0.2 -requests==2.32.3 -roman-numerals-py==3.1.0 -ruamel.yaml==0.18.12 -ruamel.yaml.clib==0.2.12 +packaging==26.3 +platformdirs==4.11.0 +Pygments==2.20.0 +PyYAML==6.0.3 +requests==2.34.2 +roman==5.2 +roman-numerals==4.1.0 +ruamel.yaml==0.19.1 six==1.17.0 -snowballstemmer==3.0.1 -soupsieve==2.7 -Sphinx==8.2.3 -sphinx-autodoc-typehints==3.2.0 +snowballstemmer==3.1.1 +soupsieve==2.9.1 +Sphinx==9.1.0 +sphinx-autodoc-typehints==3.5.2 sphinx-basic-ng==1.0.0b2 -sphinx-jinja2-compat==0.3.0 +sphinx-jinja2-compat==0.4.1 sphinx-notfound-page==1.1.0 -sphinx-prompt==1.9.0 -sphinx-reredirects==1.0.0 -sphinx-substitution-extensions==2025.4.3 -sphinx-tabs==3.4.5 -sphinx-toolbox==4.0.0 +sphinx-prompt==1.10.2 +sphinx-reredirects==1.1.0 +sphinx-substitution-extensions==2026.8.2 +sphinx-tabs==3.5.0 +sphinx-toolbox==4.3.0 sphinxcontrib-applehelp==2.0.0 sphinxcontrib-devhelp==2.0.0 sphinxcontrib-htmlhelp==2.1.0 sphinxcontrib-jsmath==1.0.1 sphinxcontrib-qthelp==2.0.0 sphinxcontrib-serializinghtml==2.0.0 -sphinxcontrib-youtube==1.4.1 -tabulate==0.9.0 -typing_extensions==4.13.2 -urllib3==2.4.0 +sphinxcontrib-youtube==1.5.0 +standard-imghdr==3.10.14 +tabulate==0.10.0 +tinycss2==1.5.1 +typing_extensions==4.16.0 +urllib3==2.7.0 webencodings==0.5.1 From 976833f87ca6fa81b5956c8ae5577e63843efdf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Such=C3=A1nek?= Date: Wed, 5 Aug 2026 09:06:42 +0200 Subject: [PATCH 04/11] Update info about DT metamodel v18.2 --- .../document-templates/document-context.rst | 3 + .../document-templates/document-context.svg | 2963 +++++++++-------- .../document-templates/document-context.uxf | 46 +- .../document-templates/specification.rst | 7 + docs/more/development/metamodel-schemas.rst | 4 + 5 files changed, 1528 insertions(+), 1495 deletions(-) diff --git a/docs/more/development/document-templates/document-context.rst b/docs/more/development/document-templates/document-context.rst index be3ac65..73a1c5e 100644 --- a/docs/more/development/document-templates/document-context.rst +++ b/docs/more/development/document-templates/document-context.rst @@ -42,6 +42,7 @@ Document context is an object that carries all information related to a DSW proj * ``description`` = optional description of the project * ``files`` = list of project files (each has ``uuid``, ``fileName``, ``fileSize``, and ``contentType``) * ``labels`` = path-list map of labels on questions (i.e. TODOs) + * ``language`` = language of the project (optional language code) * ``name`` = name of the project * ``phaseUuid`` = UUID of the current phase selected * ``replies`` = path-object map of replies to questions @@ -163,6 +164,7 @@ KnowledgeModelPackage - ``versions`` (``list[str]``) - ``name`` (``str``) - ``description`` (``Optional[str]``) +- ``language`` (``str``) - ``created_at`` (``datetime``) @@ -174,6 +176,7 @@ Project - ``uuid`` (``str``) - ``name`` (``str``) - ``description`` (``Optional[str]``) +- ``language`` (``Optional[str]``) - ``version`` (``Optional[``\ :ref:`odc-project-version`\ ``]``) - ``versions`` (``list[``\ :ref:`odc-project-version`\ ``]``) - ``phase`` (``Optional[``\ :ref:`odc-phase`\ ``]``) diff --git a/docs/more/development/document-templates/document-context.svg b/docs/more/development/document-templates/document-context.svg index ecdcaac..9a53cd4 100644 --- a/docs/more/development/document-templates/document-context.svg +++ b/docs/more/development/document-templates/document-context.svg @@ -6,7 +6,7 @@ text-rendering="auto" stroke="#000000" stroke-linecap="square" - width="2751.2126" + width="2767.0173" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" @@ -14,8 +14,8 @@ stroke-dasharray="none" font-weight="normal" stroke-width="1" - viewBox="-20 -20 2751.2126 1618.7135" - height="1618.7135" + viewBox="-20 -20 2767.0173 1627.9188" + height="1627.9188" font-family="Dialog" font-style="normal" stroke-linejoin="miter" @@ -23,43 +23,44 @@ stroke-dashoffset="0" image-rendering="auto" version="1.1" - id="svg704" + id="svg707" sodipodi:docname="document-context.svg" - inkscape:version="1.3.2 (091e20e, 2023-11-25)" + inkscape:version="1.4.3 (0d15f75, 2025-12-25)" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> + inkscape:current-layer="svg707" /> + style="fill:#ffffff" + id="rect707" + width="2766.0173" + height="1626.9188" + x="-19.5" + y="-19.5" /> + id="g707" + transform="translate(8.1620979,3.0540333)"> + + + + + + + id="g107"> + id="rect107" /> + id="g110"> + id="rect108" /> CrossReference + id="text108">CrossReference + id="path108" /> target_uuid: str + id="text109">target_uuid: str description: str + id="text110">description: str + id="g111"> + id="rect110" /> + id="g121"> + id="rect111" /> ApiIntegration + id="text111">ApiIntegration + id="path111" /> allow_custom_reply: bool + id="text112">allow_custom_reply: bool request_method: str + id="text113">request_method: str request_url: str + id="text114">request_url: str request_headers: dict[str,str] + id="text115">request_headers: dict[str,str] request_body: str + id="text116">request_body: str request_allow_empty_search: bool + id="text117">request_allow_empty_search: bool response_list_field: Optional[str] + id="text118">response_list_field: Optional[str] response_item_id: Optional[str] + id="text119">response_item_id: Optional[str] response_item_template: str + id="text120">response_item_template: str response_item_template_for_selection: Optional[str] + id="text121">response_item_template_for_selection: Optional[str] + id="g122"> + id="rect121" /> + id="g125"> + id="rect122" /> ValueQuestionValidation + id="text122">ValueQuestionValidation + id="path122" /> type: str + id="text123">type: str full_type: str + id="text124">full_type: str value: str | int | float | None + id="text125">value: str | int | float | None + id="g126"> + id="rect125" /> + id="g128"> + id="rect126" /> FileQuestion + id="text126">FileQuestion + id="path126" /> max_size: Optional[str] + id="text127">max_size: Optional[str] file_types: Optional[str] + id="text128">file_types: Optional[str] + id="g129"> + id="rect128" /> + id="g132"> + id="rect129" /> FileReply + id="text129">FileReply + id="path129" /> file_uuid: str + id="text130">file_uuid: str file: Optional[QuestionnaireFile] + id="text131">file: Optional[QuestionnaireFile] + id="path131" /> value: str + id="text132">value: str + id="g133"> + id="rect132" /> + id="g139"> + id="rect133" /> QuestionnaireFile + id="text133">QuestionnaireFile + id="path133" /> uuid: str + id="text134">uuid: str name: str + id="text135">name: str size: int + id="text136">size: int content_type: str + id="text137">content_type: str reply: Optional[FileReply] + id="text138">reply: Optional[FileReply] download_url: str + id="text139">download_url: str + id="g140"> + id="rect139" /> + id="g144"> + id="rect140" /> UserGroup + id="text140">UserGroup + id="path140" /> uuid: str + id="text141">uuid: str name: str + id="text142">name: str description: Optional[str] + id="text143">description: Optional[str] private: bool + id="text144">private: bool + id="g145"> + id="rect144" /> + id="g147"> + id="rect145" /> GroupPermission + id="text145">GroupPermission + id="path145" /> group: UserGroup + id="text146">group: UserGroup permissions: list[str] + id="text147">permissions: list[str] + id="g148"> + id="rect147" /> + id="g150"> + id="rect148" /> UserPermission + id="text148">UserPermission + id="path148" /> user: User + id="text149">user: User permissions: list[str] + id="text150">permissions: list[str] + id="g151"> + id="rect150" /> + id="g155"> + id="rect151" /> ResourcePage + id="text151">ResourcePage + id="path151" /> uuid: str + id="text152">uuid: str title: str + id="text153">title: str content: str + id="text154">content: str annotations: dict[str,str] + id="text155">annotations: dict[str,str] + id="g156"> + id="rect155" /> + id="g161"> + id="rect156" /> ResourceCollection + id="text156">ResourceCollection + id="path156" /> uuid: str + id="text157">uuid: str title: str + id="text158">title: str page_uuids: list[str] + id="text159">page_uuids: list[str] pages: list[ResourcePage] + id="text160">pages: list[ResourcePage] annotations: dict[str,str] + id="text161">annotations: dict[str,str] + id="g162"> + id="rect161" /> + id="g165"> + id="rect162" /> ItemSelectReply + id="text162">ItemSelectReply + id="path162" /> item_uuid: str + id="text163">item_uuid: str item_title: str + id="text164">item_title: str + id="path164" /> value: str + id="text165">value: str + id="g166"> + id="rect165" /> + id="g168"> + id="rect166" /> ItemSelectQuestion + id="text166">ItemSelectQuestion + id="path166" /> list_question_uuid: str + id="text167">list_question_uuid: str list_question: ListQuestion + id="text168">list_question: ListQuestion + id="g169"> + id="rect168" /> + id="g172"> + id="rect169" /> PluginIntegration + id="text169">PluginIntegration + id="path169" /> plugin_uuid: str + id="text170">plugin_uuid: str integration_id: str + id="text171">integration_id: str settings: dict + id="text172">settings: dict + id="g173"> + id="rect172" /> + id="g175"> + id="rect173" /> ResourcePageReference + id="text173">ResourcePageReference + id="path173" /> resource_page_uuid: str + id="text174">resource_page_uuid: str resource_page: ResourcePage + id="text175">resource_page: ResourcePage + id="g176"> + id="rect175" /> + id="g178"> + id="rect176" /> URLReference + id="text176">URLReference + id="path176" /> label: str + id="text177">label: str url: str + id="text178">url: str + id="g179"> + id="rect178" /> + id="g182"> + id="rect179" /> Reference + id="text179">Reference + id="path179" /> uuid: str + id="text180">uuid: str type: str + id="text181">type: str annotations: dict[str,str] + id="text182">annotations: dict[str,str] + id="g183"> + id="rect182" /> + id="g187"> + id="rect183" /> Expert + id="text183">Expert + id="path183" /> uuid: str + id="text184">uuid: str name: str + id="text185">name: str email: str + id="text186">email: str annotations: dict[str,str] + id="text187">annotations: dict[str,str] + id="g188"> + id="rect187" /> + id="g191"> + id="rect188" /> ReportItem + id="text188">ReportItem + id="path188" /> indications: list[ReportIndication] + id="text189">indications: list[ReportIndication] metrics: list[ReportMetric] + id="text190">metrics: list[ReportMetric] chapter: Optional[Chapter] + id="text191">chapter: Optional[Chapter] + id="g192"> + id="rect191" /> + id="g199"> + id="rect192" /> ReportIndication + id="text192">ReportIndication + id="path192" /> indication_type: str + id="text193">indication_type: str answered: int + id="text194">answered: int unanswered: int + id="text195">unanswered: int total: int + id="text196">total: int percentage: float + id="text197">percentage: float is_for_phase: bool + id="text198">is_for_phase: bool is_overall: bool + id="text199">is_overall: bool + id="g200"> + id="rect199" /> + id="g202"> + id="rect200" /> ReportMetric + id="text200">ReportMetric + id="path200" /> measure: float + id="text201">measure: float metric: Metric + id="text202">metric: Metric + id="g203"> + id="rect202" /> + id="g208"> + id="rect203" /> Report + id="text203">Report + id="path203" /> uuid: str + id="text204">uuid: str total_report: ReportItem + id="text205">total_report: ReportItem chapter_reports: list[ReportItem] + id="text206">chapter_reports: list[ReportItem] created_at: datetime + id="text207">created_at: datetime updated_at: datetime + id="text208">updated_at: datetime + id="g209"> + id="rect208" /> + id="g216"> + id="rect209" /> Answer + id="text209">Answer + id="path209" /> uuid: str + id="text210">uuid: str label: str + id="text211">label: str advice: Optional[str] + id="text212">advice: Optional[str] metric_measures: list[MetricMeasure] + id="text213">metric_measures: list[MetricMeasure] followups: list[Question] + id="text214">followups: list[Question] parent: OptionsQuestion + id="text215">parent: OptionsQuestion annotations: dict[str,str] + id="text216">annotations: dict[str,str] + id="g217"> + id="rect216" /> + id="g221"> + id="rect217" /> Choice + id="text217">Choice + id="path217" /> uuid: str + id="text218">uuid: str label: str + id="text219">label: str parent: MultiChoiceQuestion + id="text220">parent: MultiChoiceQuestion annotations: dict[str,str] + id="text221">annotations: dict[str,str] + id="g222"> + id="rect221" /> + id="g225"> + id="rect222" /> MetricMeasure + id="text222">MetricMeasure + id="path222" /> measure: float + id="text223">measure: float weight: float + id="text224">weight: float metric: Metric + id="text225">metric: Metric + id="g226"> + id="rect225" /> + id="g229"> + id="rect226" /> StringReply + id="text226">StringReply + id="path226" /> value: str + id="text227">value: str + id="path227" /> as_number: Optional[float] + id="text228">as_number: Optional[float] as_datetime: Optional[datetime] + id="text229">as_datetime: Optional[datetime] + id="g230"> + id="rect229" /> + id="g233"> + id="rect230" /> MultiChoiceReply + id="text230">MultiChoiceReply + id="path230" /> choice_uuids: list[str] + id="text231">choice_uuids: list[str] choices: list[Choice] + id="text232">choices: list[Choice] + id="path232" /> value: list[str] + id="text233">value: list[str] + id="g234"> + id="rect233" /> + id="g236"> + id="rect234" /> ItemListReply + id="text234">ItemListReply + id="path234" /> items: list[str] + id="text235">items: list[str] + id="path235" /> value: list[str] + id="text236">value: list[str] + id="g237"> + id="rect236" /> + id="g242"> + id="rect237" /> IntegrationReply + id="text237">IntegrationReply + id="path237" /> type: str + id="text238">type: str value: str + id="text239">value: str raw: Optional[Any] + id="text240">raw: Optional[Any] + id="path240" /> is_plain: bool + id="text241">is_plain: bool is_integration: bool + id="text242">is_integration: bool + id="g243"> + id="rect242" /> + id="g250"> + id="rect243" /> RepliesContainer + id="text243">RepliesContainer + id="path243" /> replies: dict[str, Reply] + id="text244">replies: dict[str, Reply] + id="path244" /> get(path: str) -> Optional[Reply] + id="text245">get(path: str) -> Optional[Reply] values(path: str) -> Iterable[Reply] + id="text246">values(path: str) -> Iterable[Reply] keys(path: str) -> Iterable[str] + id="text247">keys(path: str) -> Iterable[str] items(path: str) -> ItemsView[str,Reply] + id="text248">items(path: str) -> ItemsView[str,Reply] iterate_by_prefix(path_prefix: str): Iterable[Reply] + id="text249">iterate_by_prefix(path_prefix: str): Iterable[Reply] iterate_by_suffix(path_suffix: str): Iterable[Reply] + id="text250">iterate_by_suffix(path_suffix: str): Iterable[Reply] + id="g251"> + id="rect250" /> + id="g256"> + id="rect251" /> SimpleAuthor + id="text251">SimpleAuthor + id="path251" /> uuid: str + id="text252">uuid: str first_name: str + id="text253">first_name: str last_name: str + id="text254">last_name: str image_url: Optional[str] + id="text255">image_url: Optional[str] gravatar_hash: Optional[str] + id="text256">gravatar_hash: Optional[str] + id="g257"> + id="rect256" /> + id="g265"> + id="rect257" /> User + id="text257">User + id="path257" /> uuid: str + id="text258">uuid: str first_name: str + id="text259">first_name: str last_name: str + id="text260">last_name: str email: str + id="text261">email: str image_url: Optional[str] + id="text262">image_url: Optional[str] affiliation: Optional[str] + id="text263">affiliation: Optional[str] created_at: datetime + id="text264">created_at: datetime updated_at: datetime + id="text265">updated_at: datetime + id="g266"> + id="rect265" /> + transform="translate(200,770)" + id="g280"> + id="rect266" /> Questionnaire + id="text266">Project + id="path266" /> uuid: str + id="text267">uuid: str name: str + id="text268">name: str description: str + id="text269">description: str project_tags: list[str] + id="text270">project_tags: list[str] version: QuestionnaireVersion + id="text271">version: QuestionnaireVersion versions: list[QuestionnaireVersion] + id="text272">versions: list[QuestionnaireVersion] todos: list[str] + id="text273">todos: list[str] phase: Optional[Phase] + id="text274">phase: Optional[Phase] replies: RepliesContainer + id="text275">language: Optional[str] files: dict[str, QuestionnaireFile] + id="text276">replies: RepliesContainer created_by: User + id="text277">files: dict[str, QuestionnaireFile] created_at: datetime + id="text278">created_by: User updated_at: datetime + id="text279">created_at: datetime + updated_at: datetime + id="g281"> + id="rect280" /> + id="g288"> + id="rect281" /> QuestionnaireVersion + id="text281">QuestionnaireVersion + id="path281" /> uuid: str + id="text282">uuid: str event_uuid: str + id="text283">event_uuid: str name: str + id="text284">name: str description: str + id="text285">description: str created_by: Optional[SimpleAuthor] + id="text286">created_by: Optional[SimpleAuthor] created_at: datetime + id="text287">created_at: datetime updated_at: datetime + id="text288">updated_at: datetime + id="g289"> + id="rect288" /> + transform="translate(250,530)" + id="g298"> + id="rect289" /> Package + id="text289">KnowledgeModelPackage + id="path289" /> id: str + id="text290">id: str organization_id: str + id="text291">organization_id: str km_id: str + id="text292">km_id: str version: str + id="text293">version: str versions: list[str] + id="text294">versions: list[str] name: str + id="text295">name: str description: str + id="text296">description: str created_at: datetime - + id="text297">language: str org_id: str + id="text298">created_at: datetime + id="g299"> + id="rect298" /> + transform="translate(250,430)" + id="g303"> + id="rect299" /> Organization + id="text299">Organization + id="path299" /> id: str + id="text300">id: str name: str + id="text301">name: str description: Optional[str] + id="text302">description: Optional[str] affiliation: list[str] + id="text303">affiliation: list[str] + id="g304"> + id="rect303" /> + id="g311"> + id="rect304" /> Document + id="text304">Document + id="path304" /> uuid: str + id="text305">uuid: str name: str + id="text306">name: str document_template_id: str + id="text307">document_template_id: str format_uuid: str + id="text308">format_uuid: str created_by: User + id="text309">created_by: User created_at: datetime + id="text310">created_at: datetime updated_at: datetime + id="text311">updated_at: datetime + id="g312"> + id="rect311" /> + id="g313"> + id="rect312" /> ContextConfig + id="text312">ContextConfig + id="path312" /> client_url: str + id="text313">client_url: str + id="g314"> + id="rect313" /> + id="g320"> + id="rect314" /> Reply + id="text314">Reply + id="path314" /> path: str + id="text315">path: str fragments: list[str] + id="text316">fragments: list[str] reply_type: str + id="text317">reply_type: str question: Question + id="text318">question: Question created_by: Optional[SimpleAuthor] + id="text319">created_by: Optional[SimpleAuthor] created_at: datetime + id="text320">created_at: datetime + id="g321"> + id="rect320" /> + id="g324"> + id="rect321" /> AnswerReply + id="text321">AnswerReply + id="path321" /> answer_uuid: str + id="text322">answer_uuid: str answer: Answer + id="text323">answer: Answer + id="path323" /> value: str + id="text324">value: str + id="g325"> + id="rect324" /> + id="g335"> + id="rect325" /> KnowledgeModelEntities + id="text325">KnowledgeModelEntities + id="path325" /> answers: dict[str,Answer] + id="text326">answers: dict[str,Answer] chapters: dict[str,Chapter] + id="text327">chapters: dict[str,Chapter] choices: dict[str,Choice] + id="text328">choices: dict[str,Choice] experts: dict[str,Expert] + id="text329">experts: dict[str,Expert] integrations: dict[str,Integration] + id="text330">integrations: dict[str,Integration] metrics: dict[str,Metric] + id="text331">metrics: dict[str,Metric] phases: dict[str,Phase] + id="text332">phases: dict[str,Phase] questions: dict[str,Question] + id="text333">questions: dict[str,Question] references: dict[str,Reference] + id="text334">references: dict[str,Reference] tags: dict[str,Tag] + id="text335">tags: dict[str,Tag] + id="g336"> + id="rect335" /> + id="g341"> + id="rect336" /> Tag + id="text336">Tag + id="path336" /> uuid: str + id="text337">uuid: str name: str + id="text338">name: str description: Optional[str] + id="text339">description: Optional[str] color: str + id="text340">color: str annotations: dict[str,str] + id="text341">annotations: dict[str,str] + id="g342"> + id="rect341" /> + id="g347"> + id="rect342" /> Integration + id="text342">Integration + id="path342" /> uuid: str + id="text343">uuid: str name: str + id="text344">name: str type: str + id="text345">type: str variables: dict[str,str] + id="text346">variables: dict[str,str] annotations: dict[str,str] + id="text347">annotations: dict[str,str] + id="g348"> + id="rect347" /> + id="g353"> + id="rect348" /> Metric + id="text348">Metric + id="path348" /> uuid: str + id="text349">uuid: str title: str + id="text350">title: str description: Optional[str] + id="text351">description: Optional[str] abbreviation: str + id="text352">abbreviation: str annotations: dict[str,str] + id="text353">annotations: dict[str,str] + id="g354"> + id="rect353" /> + id="g359"> + id="rect354" /> Phase + id="text354">Phase + id="path354" /> uuid: str + id="text355">uuid: str title: str + id="text356">title: str description: Optional[str] + id="text357">description: Optional[str] order: int + id="text358">order: int annotations: dict[str,str] + id="text359">annotations: dict[str,str] + id="g360"> + id="rect359" /> + id="g362"> + id="rect360" /> IntegrationQuestion + id="text360">IntegrationQuestion + id="path360" /> integration: Integration + id="text361">integration: Integration variables: dict[str,str] + id="text362">variables: dict[str,str] + id="g363"> + id="rect362" /> + id="g364"> + id="rect363" /> MultiChoiceQuestion + id="text363">MultiChoiceQuestion + id="path363" /> choices: list[Choice] + id="text364">choices: list[Choice] + id="g365"> + id="rect364" /> + id="g366"> + id="rect365" /> ListQuestion + id="text365">ListQuestion + id="path365" /> followups: list[Question] + id="text366">followups: list[Question] + id="g367"> + id="rect366" /> + id="g369"> + id="rect367" /> ValueQuestion + id="text367">ValueQuestion + id="path367" /> value_type: str + id="text368">value_type: str validations: list[VQV] + id="text369">validations: list[VQV] + id="g370"> + id="rect369" /> + id="g371"> + id="rect370" /> OptionsQuestion + id="text370">OptionsQuestion + id="path370" /> answers: list[Answer] + id="text371">answers: list[Answer] + id="g372"> + id="rect371" /> + id="g386"> + id="rect372" /> Question + id="text372">Question + id="path372" /> uuid: str + id="text373">uuid: str type: str + id="text374">type: str title: str + id="text375">title: str text: Optional[str] + id="text376">text: Optional[str] experts: list[Expert] + id="text377">experts: list[Expert] references: list[Reference] + id="text378">references: list[Reference] tags: list[Tag] + id="text379">tags: list[Tag] required_phase: Optional[Phase] + id="text380">required_phase: Optional[Phase] is_required: bool + id="text381">is_required: bool replies: dict[str, Reply] + id="text382">replies: dict[str, Reply] parent: Union[Chapter,ListQuestion,Answer] + id="text383">parent: Union[Chapter,ListQuestion,Answer] annotations: dict[str,str] + id="text384">annotations: dict[str,str] + id="path384" /> url_references: list[URLReference] + id="text385">url_references: list[URLReference] resource_page_references: list[ResourcePageReference] + id="text386">resource_page_references: list[ResourcePageReference] + id="g387"> + id="rect386" /> + id="g393"> + id="rect387" /> Chapter + id="text387">Chapter + id="path387" /> uuid: str + id="text388">uuid: str title: str + id="text389">title: str text: Optional[str] + id="text390">text: Optional[str] questions: list[Question] + id="text391">questions: list[Question] reports: list[ReportItem] + id="text392">reports: list[ReportItem] annotations: dict[str,str] + id="text393">annotations: dict[str,str] + id="g394"> + id="rect393" /> + id="g405"> + id="rect394" /> KnowledgeModel + id="text394">KnowledgeModel + id="path394" /> uuid: str + id="text395">uuid: str chapters: list[Chapter] + id="text396">chapters: list[Chapter] integrations: list[Integration] + id="text397">integrations: list[Integration] metrics: list[Metric] + id="text398">metrics: list[Metric] phases: list[Phase] + id="text399">phases: list[Phase] resource_collections: list[ResourceCollections] + id="text400">resource_collections: list[ResourceCollections] tags: list[Tag] + id="text401">tags: list[Tag] entities: KnowledgeModelEntities + id="text402">entities: KnowledgeModelEntities annotations: dict[str,str] + id="text403">annotations: dict[str,str] + id="path403" /> a: dict[str,str] + id="text404">a: dict[str,str] e: KnowledgeModelEntities + id="text405">e: KnowledgeModelEntities + id="g406"> + id="rect405" /> + id="g423"> + id="rect406" /> DocumentContext + id="text406">DocumentContext + id="path406" /> config: ContextConfig + id="text407">config: ContextConfig current_phase: Optional[Phase] + id="text408">current_phase: Optional[Phase] document: Document + id="text409">document: Document km: KnowledgeModel + id="text410">km: KnowledgeModel organization: Organization + id="text411">organization: Organization package: Package + id="text412">package: Package questionnaire: Questionnaire + id="text413">questionnaire: Questionnaire report: Report + id="text414">report: Report users: list[UserPermission] + id="text415">users: list[UserPermission] groups: list[GroupPermissions] + id="text416">groups: list[GroupPermissions] + id="path416" /> e: KnowledgeModelEntities + id="text417">e: KnowledgeModelEntities cfg: ContextConfig + id="text418">cfg: ContextConfig doc: Document + id="text419">doc: Document qtn: Questionnaire + id="text420">qtn: Questionnaire org: Organization + id="text421">org: Organization pkg: Package + id="text422">pkg: Package replies: RepliesContainer + id="text423">replies: RepliesContainer + id="g425"> + id="path423" /> + id="path424" /> + id="path425" /> + id="g429"> + id="path426" /> + id="path427" /> + id="path428" /> + id="path429" /> + id="g433"> + id="path430" /> + id="path431" /> + id="path432" /> validations + id="text432">validations 0..* + id="text433">0..* + id="g437"> + id="path433" /> + id="path434" /> + id="path435" /> + id="path436" /> + id="path437" /> + id="g441"> + id="path438" /> + id="path439" /> + id="path440" /> 0..* + id="text440">0..* files + id="text441">files + id="g443"> + id="path441" /> + id="path442" /> 0..1 + id="text442">0..1 reply + id="text443">reply + id="g445"> + id="path443" /> + id="path444" /> 0..1 + id="text444">0..1 file + id="text445">file + id="g449"> + id="path445" /> + id="path446" /> + id="path447" /> + id="path448" /> + id="path449" /> + id="g453"> + id="path450" /> + id="path451" /> + id="path452" /> 1 + id="text452">1 group + id="text453">group + id="g458"> + id="path453" /> + id="path454" /> + id="path455" /> + id="path456" /> + id="path457" /> 1 + id="text457">1 user + id="text458">user + id="g463"> + id="path458" /> + id="path459" /> + id="path460" /> + id="path461" /> + id="path462" /> * + id="text462">* groups + id="text463">groups + id="g467"> + id="path463" /> + id="path464" /> + id="path465" /> + id="path466" /> * + id="text466">* users + id="text467">users + id="g470"> + id="path467" /> + id="path468" /> + id="path469" /> 1 + id="text469">1 created_by + id="text470">created_by + id="g479"> + id="path470" /> + id="path471" /> + id="path472" /> + id="path473" /> + id="path474" /> + id="path475" /> + id="path476" /> + id="path477" /> 0..* + id="text477">0..* resource_ + id="text478">resource_ collections + id="text479">collections + id="g481"> + id="path479" /> + id="path480" /> 0..* + id="text480">0..* resource_page + id="text481">resource_page + id="g483"> + id="path481" /> + id="path482" /> 0..* + id="text482">0..* pages + id="text483">pages + id="g487"> + id="path483" /> + id="path484" /> + id="path485" /> + id="path486" /> followups + id="text486">followups 0..1 + id="text487">0..1 + id="g491"> + id="path487" /> + id="path488" /> + id="path489" /> + id="path490" /> + id="path491" /> + id="g495"> + id="path492" /> + id="path493" /> + id="path494" /> + id="path495" /> + id="g496"> 1 + id="text495">1 parent + id="text496">parent + id="g499"> + id="path496" /> + id="path497" /> + id="path498" /> + id="path499" /> + id="g500"> 0..1 + id="text499">0..1 parent + id="text500">parent + id="g501"> + id="path500" /> + id="path501" /> + id="g502"> 1 + id="text501">1 parent + id="text502">parent + id="g505"> + id="path502" /> + id="path503" /> + id="path504" /> + id="path505" /> + id="g506"> 1 + id="text505">1 question + id="text506">question + id="g510"> + id="path506" /> + id="path507" /> + id="path508" /> + id="path509" /> metric + id="text509">metric 1 + id="text510">1 + id="g511"> + id="path510" /> + id="path511" /> + id="g512"> 0..1 + id="text511">0..1 parent + id="text512">parent + id="g514"> + id="path512" /> + id="path513" /> answers + id="text513">answers 0..* + id="text514">0..* + id="g516"> + id="path514" /> + id="path515" /> + id="path516" /> + id="g521"> + id="path517" /> + id="path518" /> + id="path519" /> + id="path520" /> 0..* + id="text520">0..* references + id="text521">references + id="g523"> + id="path521" /> + id="path522" /> + id="path523" /> + id="g524"> 0..* + id="text523">0..* + id="g525"> + id="path524" /> + id="path525" /> + id="g526"> 0..* + id="text525">0..* + id="g530"> + id="path526" /> + id="path527" /> + id="path528" /> + id="path529" /> + id="path530" /> + id="g535"> + clip-path="url(#clipPath64)" + id="path531" /> + clip-path="url(#clipPath64)" + id="path532" /> + clip-path="url(#clipPath64)" + id="path533" /> + id="path534" /> + clip-path="url(#clipPath64)" + id="path535" /> + id="g539"> + clip-path="url(#clipPath65)" + id="path536" /> + clip-path="url(#clipPath65)" + id="path537" /> + clip-path="url(#clipPath65)" + id="path538" /> 0..* + id="text538">0..* experts + id="text539">experts + id="g542"> + clip-path="url(#clipPath66)" + id="path539" /> + clip-path="url(#clipPath66)" + id="path540" /> + clip-path="url(#clipPath66)" + id="path541" /> + id="path542" /> + id="g543"> 0..1 + id="text542">0..1 parent + id="text543">parent + id="g544"> - + + id="path544" /> + id="g545"> 0..1 + id="text544">0..1 parent + id="text545">parent + id="g548"> + clip-path="url(#clipPath68)" + id="path545" /> + clip-path="url(#clipPath68)" + id="path546" /> + clip-path="url(#clipPath68)" + id="path547" /> + id="path548" /> + id="g549"> 0..1 + id="text548">0..1 chapter + id="text549">chapter + id="g553"> + id="path549" /> + id="path550" /> + id="path551" /> + id="path552" /> replies + id="text552">replies 0..* + id="text553">0..* + id="g555"> + clip-path="url(#clipPath69)" + id="path553" /> + clip-path="url(#clipPath69)" + id="path554" /> 0..* + id="text554">0..* chapter_reports + id="text555">chapter_reports + id="g556"> + clip-path="url(#clipPath70)" + id="path555" /> + id="path556" /> + id="g557"> replies + id="text556">replies 1 + id="text557">1 + id="g558"> + clip-path="url(#clipPath71)" + id="path557" /> + id="path558" /> + id="g559"> 1 + id="text558">1 e + id="text559">e + id="g561"> + clip-path="url(#clipPath72)" + id="path559" /> + clip-path="url(#clipPath72)" + id="path560" /> 1 + id="text560">1 e + id="text561">e + id="g565"> + clip-path="url(#clipPath73)" + id="path561" /> + clip-path="url(#clipPath73)" + id="path562" /> + clip-path="url(#clipPath73)" + id="path563" /> + clip-path="url(#clipPath73)" + id="path564" /> phase + id="text564">phase 0..1 + id="text565">0..1 + id="g567"> + clip-path="url(#clipPath74)" + id="path565" /> + clip-path="url(#clipPath74)" + id="path566" /> + id="path567" /> + id="g568"> current_phase + id="text567">current_phase 0..1 + id="text568">0..1 + id="g572"> + clip-path="url(#clipPath75)" + id="path568" /> + clip-path="url(#clipPath75)" + id="path569" /> + clip-path="url(#clipPath75)" + id="path570" /> + clip-path="url(#clipPath75)" + id="path571" /> choices + id="text571">choices 0..* + id="text572">0..* + id="g576"> + clip-path="url(#clipPath76)" + id="path572" /> + clip-path="url(#clipPath76)" + id="path573" /> + clip-path="url(#clipPath76)" + id="path574" /> + clip-path="url(#clipPath76)" + id="path575" /> followups + id="text575">followups 0..* + id="text576">0..* + id="g580"> + clip-path="url(#clipPath77)" + id="path576" /> + clip-path="url(#clipPath77)" + id="path577" /> + clip-path="url(#clipPath77)" + id="path578" /> + clip-path="url(#clipPath77)" + id="path579" /> followups + id="text579">followups 0..* + id="text580">0..* + id="g584"> + clip-path="url(#clipPath78)" + id="path580" /> + clip-path="url(#clipPath78)" + id="path581" /> + clip-path="url(#clipPath78)" + id="path582" /> + clip-path="url(#clipPath78)" + id="path583" /> answer + id="text583">answer 1 + id="text584">1 + id="g586"> + clip-path="url(#clipPath79)" + id="path584" /> + clip-path="url(#clipPath79)" + id="path585" /> metric_measures + id="text585">metric_measures 0..* + id="text586">0..* + id="g590"> + clip-path="url(#clipPath80)" + id="path586" /> + clip-path="url(#clipPath80)" + id="path587" /> + clip-path="url(#clipPath80)" + id="path588" /> + clip-path="url(#clipPath80)" + id="path589" /> integration + id="text589">integration 1 + id="text590">1 + id="g592"> + clip-path="url(#clipPath67)" + id="path590" /> + clip-path="url(#clipPath67)" + id="path591" /> required_phase + id="text591">required_phase 0..1 + id="text592">0..1 + id="g594"> + clip-path="url(#clipPath67)" + id="path592" /> + clip-path="url(#clipPath67)" + id="path593" /> 0..* + id="text593">0..* questions + id="text594">questions + id="g597"> + clip-path="url(#clipPath81)" + id="path594" /> + clip-path="url(#clipPath81)" + id="path595" /> + clip-path="url(#clipPath81)" + id="path596" /> 0..* + id="text596">0..* tags + id="text597">tags + id="g600"> + clip-path="url(#clipPath82)" + id="path597" /> + clip-path="url(#clipPath82)" + id="path598" /> + clip-path="url(#clipPath82)" + id="path599" /> 0..* + id="text599">0..* integrations + id="text600">integrations + id="g602"> + clip-path="url(#clipPath83)" + id="path600" /> + clip-path="url(#clipPath83)" + id="path601" /> 0..* + id="text601">0..* phases + id="text602">phases + id="g606"> + clip-path="url(#clipPath84)" + id="path602" /> + clip-path="url(#clipPath84)" + id="path603" /> + clip-path="url(#clipPath84)" + id="path604" /> + clip-path="url(#clipPath84)" + id="path605" /> 0..* + id="text605">0..* metrics + id="text606">metrics + id="g608"> + clip-path="url(#clipPath83)" + id="path606" /> + clip-path="url(#clipPath83)" + id="path607" /> 0..* + id="text607">0..* chapters + id="text608">chapters + id="g611"> + id="path608" /> + id="path609" /> + id="path610" /> km + id="text610">km 1 + id="text611">1 + id="g613"> + clip-path="url(#clipPath85)" + id="path611" /> + clip-path="url(#clipPath85)" + id="path612" /> metric + id="text612">metric 1 + id="text613">1 + id="g617"> + clip-path="url(#clipPath86)" + id="path613" /> + clip-path="url(#clipPath86)" + id="path614" /> + clip-path="url(#clipPath86)" + id="path615" /> + clip-path="url(#clipPath86)" + id="path616" /> 0..* + id="text616">0..* reports + id="text617">reports + id="g620"> + clip-path="url(#clipPath87)" + id="path617" /> + clip-path="url(#clipPath87)" + id="path618" /> + clip-path="url(#clipPath87)" + id="path619" /> metrics + id="text619">metrics 0..1 + id="text620">0..1 + id="g622"> + clip-path="url(#clipPath88)" + id="path620" /> + clip-path="url(#clipPath88)" + id="path621" /> indications + id="text621">indications 0..* + id="text622">0..* + id="g624"> + clip-path="url(#clipPath69)" + id="path622" /> + clip-path="url(#clipPath69)" + id="path623" /> 1 + id="text623">1 total_report + id="text624">total_report + id="g626"> + clip-path="url(#clipPath89)" + id="path624" /> + clip-path="url(#clipPath89)" + id="path625" /> report + id="text625">report 1 + id="text626">1 + id="g628"> + clip-path="url(#clipPath90)" + id="path626" /> + clip-path="url(#clipPath90)" + id="path627" /> 1 + id="text627">1 cfg + id="text628">cfg + id="g630"> + clip-path="url(#clipPath90)" + id="path628" /> + clip-path="url(#clipPath90)" + id="path629" /> doc + id="text629">doc 1 + id="text630">1 + id="g632"> + clip-path="url(#clipPath90)" + id="path630" /> + clip-path="url(#clipPath90)" + id="path631" /> org + id="text631">org 1 + id="text632">1 + id="g635"> + clip-path="url(#clipPath91)" + id="path632" /> + clip-path="url(#clipPath91)" + id="path633" /> + clip-path="url(#clipPath91)" + id="path634" /> pkg + id="text634">pkg 1 + id="text635">1 + id="g637"> + clip-path="url(#clipPath92)" + id="path635" /> + clip-path="url(#clipPath92)" + id="path636" /> replies + id="text636">replies 0..* + id="text637">0..* + id="g639"> + clip-path="url(#clipPath83)" + id="path637" /> + clip-path="url(#clipPath83)" + id="path638" /> replies + id="text638">replies 1 + id="text639">1 + id="g643"> + d="m 10.5,279.5 v -59" + clip-path="url(#clipPath93)" + id="path639" /> + d="m 10.5,220.5 h 300" + clip-path="url(#clipPath93)" + id="path640" /> + d="M 310.5,220.5 V 10.5" + clip-path="url(#clipPath93)" + id="path641" /> + d="M 17,268.7417 10.5,280 4,268.7417" + clip-path="url(#clipPath93)" + id="path642" /> 1 + id="text642">1 qtn + id="text643">qtn + id="g646"> + clip-path="url(#clipPath94)" + id="path643" /> + clip-path="url(#clipPath94)" + id="path644" /> + clip-path="url(#clipPath94)" + id="path645" /> 1 + id="text645">1 created_by + id="text646">created_by + transform="translate(300,1010)" + id="g648"> + d="m 10.5,69.5 v -59" + clip-path="url(#clipPath95)" + id="path646" /> + d="M 17,58.7417 10.5,70 4,58.7417" + clip-path="url(#clipPath95)" + id="path647" /> 0..* + id="text647">0..* versions + id="text648">versions + transform="translate(300,1210)" + id="g651"> + d="M 169.5,50.5 H 10.5" + clip-path="url(#clipPath12)" + id="path648" /> + d="m 10.5,50.5 v -40" + clip-path="url(#clipPath12)" + id="path649" /> + d="M 158.7417,44 170,50.5 158.7417,57" + clip-path="url(#clipPath12)" + id="path650" /> 0..1 + id="text650">0..1 created_by + id="text651">created_by + id="g655"> + clip-path="url(#clipPath96)" + id="path651" /> + clip-path="url(#clipPath96)" + id="path652" /> + clip-path="url(#clipPath96)" + id="path653" /> + clip-path="url(#clipPath96)" + id="path654" /> 0..1 + id="text654">0..1 created_by + id="text655">created_by + id="g659"> + clip-path="url(#clipPath97)" + id="path655" /> + clip-path="url(#clipPath97)" + id="path656" /> + clip-path="url(#clipPath97)" + id="path657" /> + id="path658" /> + clip-path="url(#clipPath97)" + id="path659" /> + id="g664"> + clip-path="url(#clipPath98)" + id="path660" /> + clip-path="url(#clipPath98)" + id="path661" /> + clip-path="url(#clipPath98)" + id="path662" /> + id="path663" /> + clip-path="url(#clipPath98)" + id="path664" /> + id="g667"> + clip-path="url(#clipPath99)" + id="path665" /> + id="path666" /> + clip-path="url(#clipPath99)" + id="path667" /> + id="g672"> + clip-path="url(#clipPath100)" + id="path668" /> + clip-path="url(#clipPath100)" + id="path669" /> + clip-path="url(#clipPath100)" + id="path670" /> + id="path671" /> + clip-path="url(#clipPath100)" + id="path672" /> + id="g677"> + clip-path="url(#clipPath101)" + id="path673" /> + clip-path="url(#clipPath101)" + id="path674" /> + clip-path="url(#clipPath101)" + id="path675" /> + id="path676" /> + clip-path="url(#clipPath101)" + id="path677" /> + id="g682"> + clip-path="url(#clipPath102)" + id="path678" /> + clip-path="url(#clipPath102)" + id="path679" /> + clip-path="url(#clipPath102)" + id="path680" /> + id="path681" /> + clip-path="url(#clipPath102)" + id="path682" /> + id="g687"> + clip-path="url(#clipPath89)" + id="path683" /> + clip-path="url(#clipPath89)" + id="path684" /> + clip-path="url(#clipPath89)" + id="path685" /> + id="path686" /> + clip-path="url(#clipPath89)" + id="path687" /> + id="g692"> + clip-path="url(#clipPath103)" + id="path688" /> + clip-path="url(#clipPath103)" + id="path689" /> + clip-path="url(#clipPath103)" + id="path690" /> + id="path691" /> + clip-path="url(#clipPath103)" + id="path692" /> + id="g697"> + clip-path="url(#clipPath104)" + id="path693" /> + clip-path="url(#clipPath104)" + id="path694" /> + clip-path="url(#clipPath104)" + id="path695" /> + id="path696" /> + clip-path="url(#clipPath104)" + id="path697" /> + id="g700"> + clip-path="url(#clipPath105)" + id="path698" /> + id="path699" /> + clip-path="url(#clipPath105)" + id="path700" /> + id="g703"> + clip-path="url(#clipPath106)" + id="path701" /> + clip-path="url(#clipPath106)" + id="path702" /> 0..* + id="text702">0..* choices + id="text703">choices + id="g706"> + clip-path="url(#clipPath107)" + id="path703" /> + clip-path="url(#clipPath107)" + id="path704" /> + clip-path="url(#clipPath107)" + id="path705" /> 0..* + id="text705">0..* tags + id="text706">tags diff --git a/docs/more/development/document-templates/document-context.uxf b/docs/more/development/document-templates/document-context.uxf index fd99cf6..9622262 100644 --- a/docs/more/development/document-templates/document-context.uxf +++ b/docs/more/development/document-templates/document-context.uxf @@ -327,10 +327,10 @@ updated_at: datetime UMLClass - 232 + 200 344 - 128 - 80 + 160 + 72 Organization -- @@ -343,12 +343,12 @@ affiliation: list[str] UMLClass - 232 - 432 - 128 - 144 + 200 + 424 + 160 + 136 - Package + KnowledgeModelPackage -- id: str organization_id: str @@ -357,9 +357,8 @@ version: str versions: list[str] name: str description: str -created_at: datetime --- -org_id: str +language: str +created_at: datetime @@ -368,7 +367,7 @@ org_id: str 176 864 184 - 120 + 112 QuestionnaireVersion -- @@ -385,11 +384,11 @@ updated_at: datetime UMLClass 160 - 632 + 616 200 - 176 + 200 - Questionnaire + Project -- uuid: str name: str @@ -399,6 +398,7 @@ version: QuestionnaireVersion versions: list[QuestionnaireVersion] todos: list[str] phase: Optional[Phase] +language: Optional[str] replies: RepliesContainer files: dict[str, QuestionnaireFile] created_by: User @@ -801,31 +801,31 @@ m2=created_by Relation 240 - 976 + 968 152 - 56 + 64 lt=<- m1=0..1 m2=created_by - 170.0;40.0;10.0;40.0;10.0;10.0 + 170.0;50.0;10.0;50.0;10.0;10.0 Relation 240 - 800 + 808 64 - 80 + 72 lt=<- m1=0..* m2=versions - 10.0;80.0;10.0;10.0 + 10.0;70.0;10.0;10.0 Relation @@ -848,13 +848,13 @@ m2=created_by 272 392 280 - 256 + 240 lt=<- m1=1 m2=qtn - 10.0;300.0;10.0;260.0;310.0;260.0;310.0;10.0 + 10.0;280.0;10.0;220.0;310.0;220.0;310.0;10.0 Relation diff --git a/docs/more/development/document-templates/specification.rst b/docs/more/development/document-templates/specification.rst index 6263fbf..3766c3e 100644 --- a/docs/more/development/document-templates/specification.rst +++ b/docs/more/development/document-templates/specification.rst @@ -93,6 +93,13 @@ Document Template Metamodel Versions Here are described the changes in metamodel for template specification as well as :doc:`document context` so developers can easily update their templates to a newer metamodel version when needed. It is also possible to check JSON schemas in higher detail, see :doc:`../metamodel-schemas`. +Version 18.2 (since 4.31.0) +--------------------------- + +* Added: + + * ``language`` = new field on Knowledge Model Package and Project objects in document context (see :ref:`document-context`) + Version 18.1 (since 4.31.0) --------------------------- diff --git a/docs/more/development/metamodel-schemas.rst b/docs/more/development/metamodel-schemas.rst index bad849d..e7204e8 100644 --- a/docs/more/development/metamodel-schemas.rst +++ b/docs/more/development/metamodel-schemas.rst @@ -63,6 +63,8 @@ Document Context is provided to the document templates by document worker. It co +-------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------+--------+ | Metamodel Version | Schema file | Changes (brief) | Since | +===================+==========================================================================================================================+=========================================================+========+ +| 18.2 | `JSON Schema `__ | Language field added | 4.33.0 | ++-------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------+--------+ | 18.1 | `JSON Schema `__ | Python datetime and zoneinfo support | 4.31.0 | +-------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------+--------+ | 18.0 | `JSON Schema `__ | Renaming project and KM package, PluginIntegration | 4.29.0 | @@ -112,6 +114,8 @@ Each template has its descriptor file ``template.json`` which contains all the i +-------------------+------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+--------+ | Metamodel Version | Schema file | Changes (brief) | Since | +===================+==============================================================================================================================+=============================================================+========+ +| 18.2 | `JSON Schema `__ | Language field added | 4.33.0 | ++-------------------+------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+--------+ | 18.1 | `JSON Schema `__ | Python datetime and zoneinfo support | 4.31.0 | +-------------------+------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+--------+ | 18.0 | `JSON Schema `__ | Renaming project and KM package, PluginIntegration | 4.29.0 | From 68b3e23f5b748809effbdb1a61dec3ee8c98c2d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kry=C5=A1tof=20Komanec?= <54114006+krystofkomanec@users.noreply.github.com> Date: Thu, 6 Aug 2026 14:59:19 +0100 Subject: [PATCH 05/11] Add configurable global roles (#273) --- docs/Makefile | 5 +- docs/application/administration/index.rst | 3 +- .../administration/roles/index.rst | 90 +++++++++++++++++++ .../settings/content/projects.rst | 8 ++ .../administration/settings/index.rst | 4 +- .../settings/system/authentication.rst | 10 ++- .../dashboard-and-login-screen.rst | 22 ++--- .../administration/users/create.rst | 4 +- .../administration/users/detail.rst | 64 +------------ .../administration/users/index.rst | 5 +- .../document-templates/editors/index.rst | 2 +- .../document-templates/list/index.rst | 2 +- .../knowledge-models/editors/index.rst | 3 +- .../knowledge-models/list/detail.rst | 4 +- .../knowledge-models/list/index.rst | 7 +- .../knowledge-models/list/preview.rst | 4 +- .../profile/settings/submission-settings.rst | 3 +- docs/application/projects/documents.rst | 3 +- docs/application/projects/files.rst | 5 +- docs/application/projects/list/create.rst | 4 +- .../projects/list/detail/questionnaire.rst | 2 +- .../projects/list/detail/settings.rst | 8 +- .../projects/list/detail/sharing.rst | 14 +-- docs/application/projects/list/index.rst | 4 +- docs/application/projects/list/templates.rst | 4 +- docs/more/development/api.rst | 2 +- docs/more/development/submission-service.rst | 2 +- .../self-hosted-dsw/configuration/index.rst | 5 +- docs/more/self-hosted-dsw/faq-notes.rst | 2 +- .../self-hosted-dsw/upgrade-guidelines.rst | 2 +- docs/requirements.txt | 10 +++ 31 files changed, 182 insertions(+), 125 deletions(-) create mode 100644 docs/application/administration/roles/index.rst diff --git a/docs/Makefile b/docs/Makefile index 5c3d717..9a50d8e 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -3,7 +3,8 @@ # You can set these variables from the command line. SPHINXOPTS = -SPHINXBUILD = sphinx-build +SPHINXBUILD = $(shell if [ -x .venv/bin/sphinx-build ]; then echo .venv/bin/sphinx-build; else echo sphinx-build; fi) +SPHINXAUTOBUILD = $(shell if [ -x .venv/bin/sphinx-autobuild ]; then echo .venv/bin/sphinx-autobuild; else echo sphinx-autobuild; fi) SOURCEDIR = . BUILDDIR = _build @@ -16,7 +17,7 @@ help: .PHONY: watch watch: - sphinx-autobuild . _build/html + $(SPHINXAUTOBUILD) "$(SOURCEDIR)" "$(BUILDDIR)/html" # Catch-all target: route all unknown targets to Sphinx using the new diff --git a/docs/application/administration/index.rst b/docs/application/administration/index.rst index db06130..6086039 100644 --- a/docs/application/administration/index.rst +++ b/docs/application/administration/index.rst @@ -3,7 +3,7 @@ Administration ************** -Administration section serves as the name suggests to admins with managing the |project_name| instance. By navigating via :guilabel:`Administration` item from the main menu, we can manage the things listed below. +Administration section serves as the name suggests to users with permission to manage the |project_name| instance. By navigating via :guilabel:`Administration` item from the main menu, we can manage the things listed below. ---- @@ -16,5 +16,6 @@ Administration section serves as the name suggests to admins with managing the | :maxdepth: 2 settings/index + roles/index users/index locales/index diff --git a/docs/application/administration/roles/index.rst b/docs/application/administration/roles/index.rst new file mode 100644 index 0000000..d306579 --- /dev/null +++ b/docs/application/administration/roles/index.rst @@ -0,0 +1,90 @@ +.. _roles: + +Roles +***** + +Roles define what users can do across the |project_name| instance. Each user has one global role. The role contains a set of permissions, such as whether the user can manage users, configure settings, work with knowledge models, or access all projects. + +Default Roles +============= + +New |project_name| instances include default roles for the usual workflows: + +- **Researcher** for users who mainly create and work on their own projects. +- **Data Steward** for users who prepare content such as knowledge models, document templates, and project templates. +- **Admin** for users who manage the instance. + +The **Admin** role cannot be changed or deleted. Other default roles can be adjusted or deleted if they are not assigned to users and are not configured as the default role for new users. + +Custom Roles +============ + +Users with permission to manage settings can create custom roles when the default roles do not match the way an organization works. A role has a name, an optional description, and selected permissions. + +Custom roles are useful for cases such as: + +- a data support role that can view or comment on all projects +- a user-management role that can manage users without managing settings +- an analytics role that can access reporting without broader administration access +- a content-management role that can work with knowledge models or document templates + +.. TODO:: + + Add a screenshot of the roles list showing default roles, custom roles, and the number of users assigned to each role. + +Role Permissions +================ + +Permissions are grouped by the type of work they enable. The available groups depend on the |project_name| edition and enabled features. + +Project-related permissions can allow a role to: + +- manage project templates +- view all projects +- comment on all projects +- edit all projects +- manage all projects + +Content-related permissions can allow a role to: + +- create and use knowledge model editors +- manage knowledge models +- manage knowledge model secrets +- create and use document template editors +- manage document templates +- manage locales + +Administration permissions can allow a role to: + +- manage users +- manage settings +- manage automations +- access audit log +- access integration hub +- access analytics + +.. TODO:: + + Add a screenshot of the role create/edit form with permission groups and toggles visible. + +Global Roles and Project Sharing +================================ + +Global roles and :ref:`project sharing` are related but separate. + +Project sharing controls access to a specific project. It is used for inviting collaborators as viewers, commenters, editors, or owners. + +Global role permissions can grant access across projects. For example, a role may allow a user to view, comment on, edit, or manage all projects in the instance. In that case, the user does not need to be listed explicitly in every project's sharing settings for that level of access. + +Project sharing is still used to manage collaboration inside a specific project, especially for project ownership and external/public access. + +Editing Roles +============= + +When a role is changed, users assigned to that role receive the updated permissions. Before changing a role, check how many users are assigned to it. + +A role cannot be deleted if it is assigned to users. A role also cannot be deleted if it is configured as the :ref:`default role` for new users. + +.. TODO:: + + Add a screenshot of a role detail page or edit form showing a role that cannot be deleted because it is assigned to users. diff --git a/docs/application/administration/settings/content/projects.rst b/docs/application/administration/settings/content/projects.rst index 39d91f9..2a706ae 100644 --- a/docs/application/administration/settings/content/projects.rst +++ b/docs/application/administration/settings/content/projects.rst @@ -11,6 +11,10 @@ If we want to let users select visibility of their projects within the |project_ * **Visible - Comment** = the project is visible in comment mode to all logged-in users, i.e. all users will be able to see the project in their :ref:`projects list`, access it and comment it (but not edit anything unless they are invited with different permissions). * **Visible - Edit** = the project is visible in edit mode to all logged-in users, i.e. all users will be able to see the project in their :ref:`projects list`, access it, comment it, and also edit it (e.g. answer questions or editor notes). +.. NOTE:: + + Project visibility controls access granted through the project itself. Users with global project permissions from their :ref:`role` may have access to projects independently of these visibility settings. + Project Sharing =============== @@ -22,6 +26,10 @@ If we want to let users select sharing option of their projects within the |proj * **Comment with the link** = anyone with the link to the project may open it in comment mode, i.e. browse it and comment on questions. * **Edit with the link** = anyone with the link to the project may open it in edit mode, i.e. browse it, comment on questions, and also edit it (e.g. answer questions or editor notes). +.. NOTE:: + + Project sharing settings control direct project collaboration and public-link access. They do not replace global project permissions configured in :ref:`roles`. + Anonymous Projects ================== diff --git a/docs/application/administration/settings/index.rst b/docs/application/administration/settings/index.rst index 899c704..c82b92c 100644 --- a/docs/application/administration/settings/index.rst +++ b/docs/application/administration/settings/index.rst @@ -3,7 +3,7 @@ Settings ******** -This section covers different settings available to admin users. The settings are categorized as listed below. +This section covers different settings available to users with permission to manage settings. The settings are categorized as listed below. .. NOTE:: @@ -22,4 +22,4 @@ This section covers different settings available to admin users. The settings ar System User Interface Content - Info \ No newline at end of file + Info diff --git a/docs/application/administration/settings/system/authentication.rst b/docs/application/administration/settings/system/authentication.rst index 791a9b8..cf73af6 100644 --- a/docs/application/administration/settings/system/authentication.rst +++ b/docs/application/administration/settings/system/authentication.rst @@ -1,12 +1,18 @@ +.. _authentication: + Authentication ************** -The **Default Role** settings option allows us to define which role is assigned to new users (see :ref:`user roles` for details about permissions). +The **Default Role** settings option allows us to define which :ref:`role` is assigned to new users. .. WARNING:: - It is recommended to set this to the lowest role possible, i.e. **Researchers**. Otherwise, new users will be able to change the content for all other users in the |project_name| instance. + It is recommended to set this to the lowest-privilege role that fits new users. Otherwise, new users may be able to change content or settings for other users in the |project_name| instance. + +.. NOTE:: + + A role configured as the default role for new users cannot be deleted. Internal diff --git a/docs/application/administration/settings/user-interface/dashboard-and-login-screen.rst b/docs/application/administration/settings/user-interface/dashboard-and-login-screen.rst index 1de8c1d..2b31e01 100644 --- a/docs/application/administration/settings/user-interface/dashboard-and-login-screen.rst +++ b/docs/application/administration/settings/user-interface/dashboard-and-login-screen.rst @@ -1,30 +1,30 @@ Dashboard & Login Screen ************************ -The dashboard settings allows us to adjust what users will see after they log in, i.e. on the application initial page called the dashboard. +Dashboard settings allow us to adjust what users will see after they log in, i.e. on the application initial page called the dashboard. Dashboard Style =============== -We can select the **Dashboard Style** whether the user should see a standard **welcome** screen which just greets the user in the application, or a **role-based** dashboard which contains widgets based on current user's role (see :ref:`user-roles`): +We can select the **Dashboard Style** to decide whether the user should see a standard **welcome** screen, or a **role-based** dashboard with widgets based on the current user's :ref:`role` and permissions: -* **Researcher** +* **Project work** * **Recent Projects Widget** contains a list of recent projects of the user for a quick navigation. * **Create Project Widget** lets the user quickly start a new project. -* **Data Steward** +* **Content management** - * **Create KM / Project Template Widgets** let the user to quickly start a new knowledge model editor or project template. + * **Create KM / Project Template Widgets** let the user quickly start a new knowledge model editor or project template. - * **Outdated KM / Document Templates Widgets** allow to quickly see outdated packages and document templates in case the DSW Registry connection is configured. + * **Outdated KM / Document Templates Widgets** allow the user to quickly see outdated packages and document templates when the DSW Registry connection is configured. - * **Import KM / Document Template Widgets** allow to proceed easily to import of a knowledge model or a document template in case the DSW Registry connection is configured. + * **Import KM / Document Template Widgets** make it easier to import a knowledge model or document template when the DSW Registry connection is configured. -* **Administrator** +* **Instance administration** - * **Outdated KM / Document Templates Widgets** allow to quickly see outdated packages and document templates in case the DSW Registry connection is configured. + * **Outdated KM / Document Templates Widgets** allow the user to quickly see outdated packages and document templates when the DSW Registry connection is configured. * **Usage Widget** summarizes the usage just as is also possible to see in the :doc:`../info/usage`. @@ -32,9 +32,9 @@ We can select the **Dashboard Style** whether the user should see a standard **w * **Configure Look and Feel Widget** quickly navigates to :doc:`../user-interface/look-and-feel` to adjust style of the |project_name| instance. - * **Connect DSW Registry Widget** quickly navigates to :doc:`../content/dsw-registry` to configure the connection (if not yet been done). + * **Connect DSW Registry Widget** quickly navigates to :doc:`../content/dsw-registry` to configure the connection if it has not been configured yet. - * **Add OpenID Widget** quickly navigates to :doc:`../system/authentication` to configure the identity provider services (if not yet been done). + * **Add OpenID Widget** quickly navigates to :doc:`../system/authentication` to configure identity provider services if they have not been configured yet. .. _login-info: diff --git a/docs/application/administration/users/create.rst b/docs/application/administration/users/create.rst index 33fd102..81e3849 100644 --- a/docs/application/administration/users/create.rst +++ b/docs/application/administration/users/create.rst @@ -3,7 +3,7 @@ Create User *********** -As admins, we can create new users manually by clicking :guilabel:`Create` on the :ref:`users list` and submitting the form. Each user must have a unique email address, first name and last name, assigned :ref:`role`, and a password. Optionally, a user can have affiliation specified. +Users with permission to manage users can create new users manually by clicking :guilabel:`Create` on the :ref:`users list` and submitting the form. Each user must have a unique email address, first name and last name, assigned :ref:`role`, and a password. Optionally, a user can have affiliation specified. .. figure:: create/create.png :width: 500 @@ -13,4 +13,4 @@ As admins, we can create new users manually by clicking :guilabel:`Create` on th .. NOTE:: - If the user is created by administrator, the user is activated by default and no email is sent to the user. + If the user is created manually by a user manager, the user is activated by default and no email is sent to the user. diff --git a/docs/application/administration/users/detail.rst b/docs/application/administration/users/detail.rst index 91df389..8c9f77a 100644 --- a/docs/application/administration/users/detail.rst +++ b/docs/application/administration/users/detail.rst @@ -3,7 +3,7 @@ User Detail *********** -As admins, we can edit existing users manually on the detail (selected user from the :ref:`users list`). It is possible to change all properties of the user, including possibility to change whether the user account is active or inactive. +Users with permission to manage users can edit existing users manually on the detail (selected user from the :ref:`users list`). It is possible to change all properties of the user, including whether the user account is active or inactive. .. figure:: detail/profile.png @@ -21,64 +21,8 @@ The password can be also changed (after selecting :guilabel:`Password` from the User Roles ========== -There are three user roles available: researchers, data steward, and admin. Permissions are associated with the roles, basically they affect what the users can do in a |project_name| instance: +Each user has one global :ref:`role`. The role determines which parts of the |project_name| instance the user can access and what actions they can perform. -.. raw:: html - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ResearcherData StewardAdmin
Projects✔ (all)
Knowledge Models✔ (read-only)
Knowledge Models Editors
Document Templates
Settings
Locales
Users
-
+Default roles cover the common researcher, data steward, and admin workflows. Users with permission to manage settings can also create custom roles when they need a different combination of permissions. +Changing the role of a user updates the permissions assigned to that user. diff --git a/docs/application/administration/users/index.rst b/docs/application/administration/users/index.rst index 8071df8..8ee75bc 100644 --- a/docs/application/administration/users/index.rst +++ b/docs/application/administration/users/index.rst @@ -3,9 +3,9 @@ Users ***** -Users list allows admins to see and manage all users in a |project_name| instance. The list can be filtered using role, searched based using name or email fragment, and sorted via various properties of users. The list shows the role of a user next to its name and also indicates in case the user is inactive. Next to the email, we can quickly see what authentication services the user uses to log-in. +Users list allows users with permission to manage users to see and manage all users in a |project_name| instance. The list can be filtered using :ref:`roles`, searched based using name or email fragment, and sorted via various properties of users. The list shows the role of a user next to its name and also indicates in case the user is inactive. Next to the email, we can quickly see what authentication services the user uses to log-in. -A :ref:`user detail` can be opened by clicking the name of a user or by selecting :guilabel:`Edit` in the right dropdown menu for the desired row. There, a user can be also deleted via the :guilabel:`Delete` action. Finally, administrator can :ref:`create a new user` by clicking :guilabel:`Create`. +A :ref:`user detail` can be opened by clicking the name of a user or by selecting :guilabel:`Edit` in the right dropdown menu for the desired row. There, a user can be also deleted via the :guilabel:`Delete` action. Finally, a new user can be :ref:`created` by clicking :guilabel:`Create`. .. figure:: index/list.png @@ -24,4 +24,3 @@ A :ref:`user detail` can be opened by clicking the name of a user o Create Detail - diff --git a/docs/application/document-templates/editors/index.rst b/docs/application/document-templates/editors/index.rst index 7df2046..5e19900 100644 --- a/docs/application/document-templates/editors/index.rst +++ b/docs/application/document-templates/editors/index.rst @@ -3,7 +3,7 @@ Document Template Editors ************************* -On this page, we can see a list of all document template editors. Everyone with the data steward role assigned can see all the document template editors and use them. +On this page, users with permission to use document template editors can see all document template editors and use them. .. figure:: index/list.png diff --git a/docs/application/document-templates/list/index.rst b/docs/application/document-templates/list/index.rst index 54f7c81..a509199 100644 --- a/docs/application/document-templates/list/index.rst +++ b/docs/application/document-templates/list/index.rst @@ -1,7 +1,7 @@ Document Template List ********************** -As **data stewards** and **admins**, we can check and manage all document templates from the list accessible from the main menu via :guilabel:`Document Templates`. The list can be filtered and sorted by name. +Users with permission to manage document templates can check and manage all document templates from the list accessible from the main menu via :guilabel:`Document Templates`. The list can be filtered and sorted by name. For each document template, we can see the latest version present; however, we can see all the versions by accessing the :doc:`./detail` by clicking the name of the template or via :guilabel:`View detail` from the right dropdown item menu. The dropdown menu also offers :guilabel:`Export` of the latest document template or :guilabel:`Delete` of entire template (all its versions). diff --git a/docs/application/knowledge-models/editors/index.rst b/docs/application/knowledge-models/editors/index.rst index ba73e61..baed544 100644 --- a/docs/application/knowledge-models/editors/index.rst +++ b/docs/application/knowledge-models/editors/index.rst @@ -3,7 +3,7 @@ Knowledge Model Editors *********************** -As admins and data stewards, we can see a list of all knowledge model editors. +Users with permission to use knowledge model editors can see a list of all knowledge model editors. .. figure:: index/knowledge-model-editors-list.png @@ -36,4 +36,3 @@ If there is an ongoing :ref:`knowledge model migration Detail Migration - \ No newline at end of file diff --git a/docs/application/knowledge-models/list/detail.rst b/docs/application/knowledge-models/list/detail.rst index 00adc52..78c8ee6 100644 --- a/docs/application/knowledge-models/list/detail.rst +++ b/docs/application/knowledge-models/list/detail.rst @@ -9,7 +9,7 @@ The main part of the detail is the README of the KM that should contain basic in In the top bar, we can :guilabel:`Export` the knowledge model as a KM file or :guilabel:`Delete` this version of the knowledge model (only if it is not already used for some projects or other KMs and editors). -In the top pane, we can see the options based on our role: +In the top pane, we can see the options based on our permissions: - :guilabel:`Preview` can be used to check the content of the KM via the :doc:`./preview` feature. - :guilabel:`Export` for exporting the latest version of the KM as a file. @@ -17,7 +17,7 @@ In the top pane, we can see the options based on our role: - :guilabel:`Create KM editor` is a shortcut for :doc:`../editors/create` for creating a new version. - :guilabel:`Fork KM` is again a shortcut for :doc:`../editors/create` for to create a fork (some more specific KM based on this one). - :guilabel:`Create project` is a shortcut to :doc:`../../projects/list/create` with this KM. -- :guilabel:`Set deprecated` or :guilabel:`Restore` for setting a KM deprecated when we no longer want the **researchers** to use it. +- :guilabel:`Set deprecated` or :guilabel:`Restore` for setting a KM deprecated when we no longer want users to use it for new projects. - :guilabel:`Set public` or :guilabel:`Set private` for changing the visibility of the KM. Public KM can be viewed by non-logged in users. - :guilabel:`Delete` the specific version of the KM (possible only if is not used in any projects or linked in other KMs and editors, cannot be undone). diff --git a/docs/application/knowledge-models/list/index.rst b/docs/application/knowledge-models/list/index.rst index 6b9839b..65f9295 100644 --- a/docs/application/knowledge-models/list/index.rst +++ b/docs/application/knowledge-models/list/index.rst @@ -3,7 +3,7 @@ Knowledge Model List ******************** -As **data stewards** and **admins**, we can manage the knowledge models that are in our |project_name|. We can access the list of knowledge model from the main menu via :guilabel:`Knowledge Model`. The list can be filtered and sorted by name or creation date. We can also search for a specific knowledge model by its id, name or version. The list shows the name, version, id, author, description and last update. +Users with permission to manage knowledge models can manage the knowledge models that are in our |project_name|. We can access the list of knowledge model from the main menu via :guilabel:`Knowledge Model`. The list can be filtered and sorted by name or creation date. We can also search for a specific knowledge model by its id, name or version. The list shows the name, version, id, author, description and last update. For each knowledge model (KM), we can see the latest version in the list. If we want to read more about a specific KM or see the older versions, we need to access the :doc:`./detail` by clicking the name of KM or clicking :guilabel:`Open` from the right item menu (three dots). There are also other options for each item: @@ -14,7 +14,7 @@ For each knowledge model (KM), we can see the latest version in the list. If we - :guilabel:`Create KM editor` is a shortcut for :doc:`../editors/create` for creating a new version. - :guilabel:`Fork KM` is again a shortcut for :doc:`../editors/create` for to create a fork (some more specific KM based on this one). - :guilabel:`Create project` is a shortcut to :doc:`../../projects/list/create` with this KM. -- :guilabel:`Set deprecated` or :guilabel:`Restore` for setting a KM deprecated when we no longer want the **researchers** to use it. +- :guilabel:`Set deprecated` or :guilabel:`Restore` for setting a KM deprecated when we no longer want users to use it for new projects. - :guilabel:`Set public` or :guilabel:`Set private` for changing the visibility of the KM. Public KM can be viewed by non-logged in users. - :guilabel:`Delete` for all versions of the KM. (Single version can be deleted from the KM's :doc:`./detail` page). @@ -34,7 +34,7 @@ Finally, there is an option to :doc:`./import` by clicking the :guilabel:`Import You can import multiple knowledge models from file at once. -For **data stewards** and **admins**, :guilabel:`update available` badge may appear if there is a newer version of the knowledge model in the `DSW Registry `__ (and if configured). +For users with permission to manage knowledge models, :guilabel:`update available` badge may appear if there is a newer version of the knowledge model in the `DSW Registry `__ (and if configured). Finally, there is an option to :doc:`./import` by click the :guilabel:`Import` button in the top right part of the screen. @@ -59,4 +59,3 @@ Finally, there is an option to :doc:`./import` by click the :guilabel:`Import` b Detail Preview Compare - \ No newline at end of file diff --git a/docs/application/knowledge-models/list/preview.rst b/docs/application/knowledge-models/list/preview.rst index 6a83201..5760286 100644 --- a/docs/application/knowledge-models/list/preview.rst +++ b/docs/application/knowledge-models/list/preview.rst @@ -9,6 +9,6 @@ The preview feature for knowledge models allows us to check the content, i.e. ho https://researchers.ds-wizard.org/knowledge-models/dsw:root:2.4.4/preview?questionUuid=0b12fb8c-ee0f-40c0-9c53-b6826b786a0c -For a nested question, all needed question above in the tree will be automatically prefilled. The KM preview may be also available to non-logged-in users, if configured by admins. +For a nested question, all needed question above in the tree will be automatically prefilled. The KM preview may be also available to non-logged-in users, if configured by users with permission to manage settings. -A user can directly create a new project from the KM preview. Again, this can be available also for non-logged-in users if anonymous projects are enabled by administrations in :doc:`../../administration/settings/content/projects`. +A user can directly create a new project from the KM preview. Again, this can be available also for non-logged-in users if anonymous projects are enabled in :doc:`../../administration/settings/content/projects`. diff --git a/docs/application/profile/settings/submission-settings.rst b/docs/application/profile/settings/submission-settings.rst index 9c0da7b..81afbc7 100644 --- a/docs/application/profile/settings/submission-settings.rst +++ b/docs/application/profile/settings/submission-settings.rst @@ -9,5 +9,4 @@ If there is no submission service that requires additional properties, there is .. NOTE:: - The admin should notify users about the required properties for the submission service. - + The person responsible for submission service settings should notify users about the required properties for the submission service. diff --git a/docs/application/projects/documents.rst b/docs/application/projects/documents.rst index 2bf5455..586017f 100644 --- a/docs/application/projects/documents.rst +++ b/docs/application/projects/documents.rst @@ -1,7 +1,7 @@ Documents ********* -As admins, we can quickly browse all documents stored in the |project_name| instance by navigating to :guilabel:`Documents` from the projects menu. It is possible to search for a document by name or sort them using their name or creation timestamp. +Users with permission to manage all projects can quickly browse all documents stored in the |project_name| instance by navigating to :guilabel:`Documents` from the projects menu. It is possible to search for a document by name or sort them using their name or creation timestamp. Each document has a name, format, specific size (if the generation is completed), a link to the project it was generated from, and a template used for its creation. The document can be directly downloaded or deleted from the list. @@ -10,4 +10,3 @@ In case that there is a document that was not generated due to an error, we can .. figure:: documents/documents.png List of all documents across projects. - diff --git a/docs/application/projects/files.rst b/docs/application/projects/files.rst index 16ef5ea..fe40be4 100644 --- a/docs/application/projects/files.rst +++ b/docs/application/projects/files.rst @@ -1,16 +1,15 @@ Files ***** -As admins, we can quickly browse all files stored in the |project_name| instance by navigating to :guilabel:`Files` from the projects menu. It is possible to search for a file by name or sort them using their creation timestamp, name or size. +Users with permission to manage all projects can quickly browse all files stored in the |project_name| instance by navigating to :guilabel:`Files` from the projects menu. It is possible to search for a file by name or sort them using their creation timestamp, name or size. Each file has a name, size, a link to the project it was uploaded to and user who uploaded it. The file can be directly downloaded or deleted from the list. .. WARNING:: - It is not recommended to delete files from the list without informing the project team, as it can lead to confusion among researchers. Admins should always communicate with the project team before deleting files. + It is not recommended to delete files from the list without informing the project team, as it can lead to confusion among users. Users with permission to manage all projects should always communicate with the project team before deleting files. .. figure:: files/files.png List of all files across projects. - diff --git a/docs/application/projects/list/create.rst b/docs/application/projects/list/create.rst index 9e99721..8bdb9b1 100644 --- a/docs/application/projects/list/create.rst +++ b/docs/application/projects/list/create.rst @@ -7,7 +7,7 @@ We can create a new project by navigating to :guilabel:`Projects` in the main me .. NOTE:: - If we have **Researcher** role we also have a **Create Project** widget on our dashboard right after logging in. We can click on :guilabel:`Create` button there, too. + Depending on our :ref:`role` and dashboard settings, we may also have a **Create Project** widget on our dashboard right after logging in. We can click on :guilabel:`Create` button there, too. Based on our instance configuration, we can create the new project from a project template, custom, or both. @@ -24,7 +24,7 @@ Based on our instance configuration, we can create the new project from a projec From Project Template ===================== -There are many options how to create and configure a project, such as what :ref:`knowledge model` or :ref:`document template` to use. :ref:`Project templates` are prepared projects by data stewards with possibly pre-selected knowledge models and document templates, they can have some pre-filled answers, comments and TODOs as well. +There are many options how to create and configure a project, such as what :ref:`knowledge model` or :ref:`document template` to use. :ref:`Project templates` are prepared projects with possibly pre-selected knowledge models and document templates, they can have some pre-filled answers, comments and TODOs as well. So if there are any project templates created in our instance, we can use them to have a smoother start of our project. We just need to give our project a **name** and choose the **project template** from offered options. diff --git a/docs/application/projects/list/detail/questionnaire.rst b/docs/application/projects/list/detail/questionnaire.rst index 923c735..507914c 100644 --- a/docs/application/projects/list/detail/questionnaire.rst +++ b/docs/application/projects/list/detail/questionnaire.rst @@ -65,7 +65,7 @@ Some additional information can also be part of the question: - **List of references** - links to additional external resources related to the question - **List of experts** - whom to contact when help is needed with answering the question -Based on our role in the project and specific instance settings there are some additional actions besides answering the question: +Based on our project sharing role, global permissions, and specific instance settings there are some additional actions besides answering the question: - :ref:`Add TODO` - :ref:`Add comment` diff --git a/docs/application/projects/list/detail/settings.rst b/docs/application/projects/list/detail/settings.rst index e82d8ae..1b7d88e 100644 --- a/docs/application/projects/list/detail/settings.rst +++ b/docs/application/projects/list/detail/settings.rst @@ -28,14 +28,14 @@ We can set a **default document template** and a **default document format**. Th Project Template ================ -We can use the project as a :ref:`project template`. If we enable this option, researchers can use it when creating a new project :ref:`from project template`. Note that we also need to make it visible for other logged-in users in :ref:`sharing` settings. +We can use the project as a :ref:`project template`. If we enable this option, users can use it when creating a new project :ref:`from project template`. Note that we also need to make it visible for other logged-in users in :ref:`sharing` settings. .. NOTE:: - Project template options are visible only for Data Stewards or Admins. + Project template options are visible only for users with permission to manage project templates. -:guilabel:`Unsupported metamodel` badge can appear, when the document template is not compatible with the version of |project_name|. Researchers should contact their Data Steward or Administrator in this case. +:guilabel:`Unsupported metamodel` badge can appear, when the document template is not compatible with the version of |project_name|. Users should contact the person responsible for document templates or instance administration in this case. Knowledge Model =============== @@ -46,4 +46,4 @@ We can see the :ref:`knowledge model` and its tags used for cre Danger Zone =========== -In the danger zone, we can delete the project. Once the project is deleted it can **no longer be recovered**. \ No newline at end of file +In the danger zone, we can delete the project. Once the project is deleted it can **no longer be recovered**. diff --git a/docs/application/projects/list/detail/sharing.rst b/docs/application/projects/list/detail/sharing.rst index 9a898a6..9b5a4c7 100644 --- a/docs/application/projects/list/detail/sharing.rst +++ b/docs/application/projects/list/detail/sharing.rst @@ -3,7 +3,7 @@ Sharing ******* -We can share project with other |project_name| users or even external collaborators. We can access all the sharing option by clicking the :guilabel:`Share` button in the top right. +We can share a project with other |project_name| users or external collaborators. We can access all sharing options by clicking the :guilabel:`Share` button in the top right. .. figure:: sharing/share-modal.png :width: 540 @@ -13,7 +13,7 @@ We can share project with other |project_name| users or even external collaborat .. NOTE:: - It is not possible to remove last project owner. To change the project owner, we need to add another user as an owner first. + It is not possible to remove the last project owner. To change the project owner, we need to add another user as an owner first. If we want to only see how Sharing is set up or copy the project link, we can use the arrow button which is a part of the :guilabel:`Share` button. @@ -26,10 +26,14 @@ If we want to only see how Sharing is set up or copy the project link, we can us .. NOTE:: - When the sharing settings is changed, the changes are saved automatically. + When sharing settings are changed, the changes are saved automatically. -There are different roles how we can share the project that can access different project features: +There are different project sharing roles that grant access to different project features: + +.. NOTE:: + + These are project sharing roles. They apply to this specific project and are separate from global :ref:`roles`. A global role can also grant access to all projects, depending on its permissions. .. raw:: html @@ -150,7 +154,7 @@ The following video tutorial explains and showcases sharing options and tools th Users ===== -We can choose specific users from the |project_name| instance and their role on the project to grant them access to project features based on the table above. This is a good way to add other collaborators that work together with us on the project. Also, this is the only way to add other project owners. +We can choose specific users from the |project_name| instance and their project sharing role to grant them access to project features based on the table above. This is a good way to add other collaborators that work together with us on the project. Also, this is the only way to add other project owners. Visible by all other logged-in users diff --git a/docs/application/projects/list/index.rst b/docs/application/projects/list/index.rst index 57f7622..79427cc 100644 --- a/docs/application/projects/list/index.rst +++ b/docs/application/projects/list/index.rst @@ -3,7 +3,7 @@ Project List ************ -In the project list, we can see a list of all projects we have access to. Those are the projects where we were assigned to with any role or that are visible by all other logged-in users in the :ref:`project sharing settings`. The projects are filtered to those we are explicitly assigned to by default. +In the project list, we can see a list of all projects we have access to. Those are the projects where we were assigned with a project sharing role, projects that are visible to all logged-in users in the :ref:`project sharing settings`, or projects available through our global :ref:`role` permissions. The projects are filtered to those we are explicitly assigned to by default. We can see projects name, label :guilabel:`Template` if the project is a template, and icon indicating sharing settings: @@ -25,7 +25,7 @@ We can search for specific projects using the search field or filter them using .. NOTE:: - Note that some of the filters can be disabled based on the |project_name| instance settings or user role. + Note that some of the filters can be disabled based on the |project_name| instance settings or user permissions. We can :ref:`create a new project` by clicking the :guilabel:`Create` button. diff --git a/docs/application/projects/list/templates.rst b/docs/application/projects/list/templates.rst index 80257ab..5622c27 100644 --- a/docs/application/projects/list/templates.rst +++ b/docs/application/projects/list/templates.rst @@ -5,11 +5,11 @@ Project Templates .. NOTE:: - Only the data stewards or admins can create project templates. + Project templates can be created by users with permission to manage project templates. When creating a new project, we need to choose a knowledge model and optionally select some question tags. After the project is created, we should also choose a :ref:`default document template` and format to enable :ref:`preview`. It can be overwhelming for new researchers to set up everything when they are new to all this. -Project templates are special type of projects where we can set up everything -- choose a knowledge model and question tags, set up default document template, pre-fill some answers, add TODOs, comments or editor notes. Researchers can then pick from these project templates when :ref:`creating a new project`. The new project will be the exact copy of the project template so they don't have to set those things themselves and they have an easier start to their data management planning. +Project templates are special type of projects where we can set up everything -- choose a knowledge model and question tags, set up default document template, pre-fill some answers, add TODOs, comments or editor notes. Users can then pick from these project templates when :ref:`creating a new project`. The new project will be the exact copy of the project template so they don't have to set those things themselves and they have an easier start to their data management planning. When we want to turn a project into a project template we need to go to the :ref:`project settings` and check the :guilabel:`Project Template` checkbox. diff --git a/docs/more/development/api.rst b/docs/more/development/api.rst index de18c08..175a29c 100644 --- a/docs/more/development/api.rst +++ b/docs/more/development/api.rst @@ -15,7 +15,7 @@ DSW utilizes JSON Web Tokens (JWT) for both authentication and authorization, en * **OpenID Identity Provider** (for our client only): This method involves a more complex OpenID/OAuth flow, utilizing redirects with the ``/auth/{id}/`` endpoints to authenticate. * **API Keys**: You can generate an API key in your user profile, which remains valid until its specified expiration date. -While several public endpoints are accessible without authentication, most endpoints require it. The system will check if you are authorized to perform specific operations based on your :ref:`roles` and their permissions. These roles are defined globally and can also be specific to projects. This ensures that only authorized users can access and manipulate with sensitive resources. +While several public endpoints are accessible without authentication, most endpoints require it. The system will check if you are authorized to perform specific operations based on your global :ref:`role` and project sharing permissions. This ensures that only authorized users can access and manipulate with sensitive resources. Example ======= diff --git a/docs/more/development/submission-service.rst b/docs/more/development/submission-service.rst index 6ef9551..b6fb949 100644 --- a/docs/more/development/submission-service.rst +++ b/docs/more/development/submission-service.rst @@ -3,7 +3,7 @@ Submission Service ****************** -As admins, we can configure submission services using :doc:`../../application/administration/settings/content/document-submission`. The configured HTTP request is then used when a user clicks :guilabel:`Submit` for an allowed document for submission and selected the desired submission service. The document is sent as a body of the request (or as multipart, based on the configuration) to the external service that should process it and return HTTP response with status code, and possibly also the `Location` header and some textual message. +Users with permission to manage settings can configure submission services using :doc:`../../application/administration/settings/content/document-submission`. The configured HTTP request is then used when a user clicks :guilabel:`Submit` for an allowed document for submission and selected the desired submission service. The document is sent as a body of the request (or as multipart, based on the configuration) to the external service that should process it and return HTTP response with status code, and possibly also the `Location` header and some textual message. Usually, we will need a simple proxy service to be developed that will accommodate this to API of some information system, database, storage, or other service. For example, such a proxy service will be able to receive the JSON documents from |project_name|, retrieve additional information through |project_name| API as needed, transform it to some other resulting artifact and store it in some local database that is used by other systems. diff --git a/docs/more/self-hosted-dsw/configuration/index.rst b/docs/more/self-hosted-dsw/configuration/index.rst index 1583fc6..c7ab366 100644 --- a/docs/more/self-hosted-dsw/configuration/index.rst +++ b/docs/more/self-hosted-dsw/configuration/index.rst @@ -5,7 +5,7 @@ This section explains how to configure |project_name| instance on your own. .. _config-settings: -Most of the configuration is done through :ref:`Settings` (accessible by Administrator). +Most of the configuration is done through :ref:`Settings` (accessible to users with permission to manage settings). @@ -21,5 +21,4 @@ Most of the configuration is done through :ref:`Settings` (accessible document-templates email-templates plugins - - \ No newline at end of file + diff --git a/docs/more/self-hosted-dsw/faq-notes.rst b/docs/more/self-hosted-dsw/faq-notes.rst index 6e5c2de..bb610e2 100644 --- a/docs/more/self-hosted-dsw/faq-notes.rst +++ b/docs/more/self-hosted-dsw/faq-notes.rst @@ -69,7 +69,7 @@ To connect to the DSW Registry and import new templates from there, you can foll .. NOTE:: - The Sign up to the DSW Registry must be done by an admin. Once the admin signs up, data stewards can import and update templates from the DSW Registry. + The Sign up to the DSW Registry must be done by a user with permission to manage settings. Once the registry is connected, users with the relevant content permissions can import and update templates from the DSW Registry. Templates imported this way will have the :guilabel:`Update Available` badge when a new version is available in the Registry. diff --git a/docs/more/self-hosted-dsw/upgrade-guidelines.rst b/docs/more/self-hosted-dsw/upgrade-guidelines.rst index 842435e..1f71aaf 100644 --- a/docs/more/self-hosted-dsw/upgrade-guidelines.rst +++ b/docs/more/self-hosted-dsw/upgrade-guidelines.rst @@ -48,7 +48,7 @@ Usually, nothing special is required for the upgrade. Internal structure changes 4.31.X to 4.32.X ---------------- -*(nothing)* +- Review migrated roles after the upgrade. Check which permissions each role has, confirm the default role for new users, and verify any organization-specific access expectations such as project support, user management, analytics, or content management. 4.30.X to 4.31.X ---------------- diff --git a/docs/requirements.txt b/docs/requirements.txt index 49d73e4..79d0122 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,5 +1,6 @@ accessible-pygments==0.0.5 alabaster==1.0.0 +anyio==4.9.0 apeye==1.4.1 apeye-core==1.1.5 autodocsumm==0.2.15 @@ -9,11 +10,14 @@ beautifulsoup4==4.15.0 CacheControl==0.14.4 certifi==2026.7.22 charset-normalizer==3.4.9 +click==8.2.1 +colorama==0.4.6 dict2css==0.6.0 docutils==0.22.4 domdf_python_tools==3.10.0 filelock==3.32.2 furo==2025.12.19 +h11==0.16.0 html5lib==1.1 idna==3.18 imagesize==2.0.0 @@ -34,9 +38,11 @@ roman==5.2 roman-numerals==4.1.0 ruamel.yaml==0.19.1 six==1.17.0 +sniffio==1.3.1 snowballstemmer==3.1.1 soupsieve==2.9.1 Sphinx==9.1.0 +sphinx-autobuild==2024.10.3 sphinx-autodoc-typehints==3.5.2 sphinx-basic-ng==1.0.0b2 sphinx-jinja2-compat==0.4.1 @@ -53,9 +59,13 @@ sphinxcontrib-jsmath==1.0.1 sphinxcontrib-qthelp==2.0.0 sphinxcontrib-serializinghtml==2.0.0 sphinxcontrib-youtube==1.5.0 +starlette==0.46.2 standard-imghdr==3.10.14 tabulate==0.10.0 tinycss2==1.5.1 typing_extensions==4.16.0 urllib3==2.7.0 +uvicorn==0.34.3 +watchfiles==1.2.0 webencodings==0.5.1 +websockets==15.0.1 From e0cea2a740a6e5ce11ee5a2ed7b12485db3a149c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kry=C5=A1tof=20Komanec?= <54114006+krystofkomanec@users.noreply.github.com> Date: Thu, 6 Aug 2026 15:43:00 +0100 Subject: [PATCH 06/11] Polish guide wording and links (#274) --- docs/about/introduction/knowledge-model.rst | 4 +-- docs/about/introduction/project.rst | 2 +- docs/application/administration/index.rst | 2 +- .../administration/locales/create.rst | 5 ++- .../administration/locales/detail.rst | 2 +- .../administration/locales/import.rst | 4 +-- .../administration/locales/index.rst | 10 +++--- .../administration/roles/index.rst | 6 ++-- .../settings/content/dsw-registry.rst | 6 ++-- .../settings/content/projects.rst | 10 +++--- .../administration/settings/info/index.rst | 2 +- .../administration/settings/info/usage.rst | 2 +- .../settings/system/authentication.rst | 4 +-- .../settings/system/authentication/openid.png | Bin 206043 -> 0 bytes .../administration/settings/system/index.rst | 2 +- .../administration/settings/system/openid.rst | 25 ++++++-------- .../settings/system/organization.rst | 2 +- .../dashboard-and-login-screen.rst | 6 ++-- .../settings/user-interface/index.rst | 2 +- .../settings/user-interface/look-and-feel.rst | 9 +++-- .../administration/users/detail.rst | 4 +-- .../administration/users/index.rst | 4 +-- .../document-templates/editors/index.rst | 2 +- .../document-templates/list/import.rst | 4 +-- .../document-templates/list/index.rst | 2 +- .../knowledge-models/editors/create.rst | 2 +- .../knowledge-models/editors/index.rst | 6 ++-- .../knowledge-models/list/import.rst | 2 +- .../knowledge-models/list/index.rst | 2 +- docs/application/profile/index.rst | 2 +- .../application/profile/settings/api-keys.rst | 2 +- .../profile/settings/connected-accounts.rst | 2 +- .../application/profile/settings/language.rst | 2 +- docs/application/projects/documents.rst | 2 +- docs/application/projects/files.rst | 2 +- .../projects/list/detail/documents.rst | 4 +-- .../projects/list/detail/settings.rst | 6 ++-- .../projects/list/detail/sharing.rst | 8 ++--- docs/application/projects/list/index.rst | 12 +++---- docs/application/projects/list/templates.rst | 6 ++-- docs/conf.py | 16 +++------ docs/index.rst | 14 ++++---- docs/more/development/contributing.rst | 8 ++--- .../document-templates/dev-notes.rst | 3 +- .../document-worker-plugins.rst | 2 +- .../development/document-templates/index.rst | 2 +- .../document-templates/specification.rst | 12 +++---- .../document-templates/steps/excel.rst | 31 +++++++++--------- .../document-templates/steps/jinja.rst | 12 +++---- .../development/document-templates/tdk.rst | 12 +++---- docs/more/development/index.rst | 4 +-- .../integration-questions/index.rst | 4 +-- .../integration-questions/integration-api.rst | 12 +++---- docs/more/development/metamodel-schemas.rst | 12 +++---- docs/more/development/plugins.rst | 8 ++--- docs/more/development/submission-service.rst | 2 +- docs/more/development/vulnerabilities.rst | 2 +- docs/more/miscellaneous/dsw-registry.rst | 4 +-- docs/more/miscellaneous/help.rst | 2 +- docs/more/miscellaneous/index.rst | 2 +- docs/more/miscellaneous/jinja-cheatsheet.rst | 2 +- .../miscellaneous/markdown-cheatsheet.rst | 4 +-- .../configuration/configuration.rst | 19 +++++------ .../configuration/document-templates.rst | 2 +- .../configuration/email-templates.rst | 3 +- .../self-hosted-dsw/configuration/index.rst | 2 +- .../self-hosted-dsw/configuration/plugins.rst | 2 +- docs/more/self-hosted-dsw/deployment.rst | 12 +++---- docs/more/self-hosted-dsw/faq-notes.rst | 14 ++++---- docs/more/self-hosted-dsw/index.rst | 6 ++-- .../self-hosted-dsw/upgrade-guidelines.rst | 12 +++---- 71 files changed, 203 insertions(+), 220 deletions(-) delete mode 100644 docs/application/administration/settings/system/authentication/openid.png diff --git a/docs/about/introduction/knowledge-model.rst b/docs/about/introduction/knowledge-model.rst index c1eee85..865c8e1 100644 --- a/docs/about/introduction/knowledge-model.rst +++ b/docs/about/introduction/knowledge-model.rst @@ -82,7 +82,7 @@ The value question asks for a single value that users type in. There are many di The input field differs based on the value type (simple input for string, date picker for date, etc.). Some of these have a check whether the entered value is valid (such as valid email or URL) and displays a warning if not. -Value Question also can have validations. Validations differ based on the value type. For example, we can set a minimum and maximum value for a number, or a minimum and maximum length for a string. For text based types (text, email, URL), we can set also use a regular expression to create validations. +Value Question can also have validations. Validations differ based on the value type. For example, we can set a minimum and maximum value for a number, or a minimum and maximum length for a string. For text-based types (text, email, URL), we can also use a regular expression to create validations. .. _integration-question: @@ -241,7 +241,7 @@ Integrations define a connection to an external service or resource where we can API Integration ^^^^^^^^^^^^^^^ -API integration connects to an external service API to search for the answers. We need to provide some **request** and **response** configuration, so |project_name| can use the API. +API integration connects to an external service API to search for the answers. We need to provide some **request** and **response** configuration, so DSW can use the API. .. _annotations: diff --git a/docs/about/introduction/project.rst b/docs/about/introduction/project.rst index a30fbd4..fab239e 100644 --- a/docs/about/introduction/project.rst +++ b/docs/about/introduction/project.rst @@ -23,7 +23,7 @@ The questionnaire is part of the project where we fill in our answers. It is gen Documents ========= -The outcome of our endeavors in |project_name| should be the data management plan, the document. Once we have enough answers to the questionnaire, we can generate a document using a document template. These documents are saved within the project. We can create as many as we wish with different document templates and formats. We can also set up a default document template for the project and quickly see a preview of the document. +The outcome of our endeavors in DSW should be the data management plan, the document. Once we have enough answers to the questionnaire, we can generate a document using a document template. These documents are saved within the project. We can create as many as we wish with different document templates and formats. We can also set up a default document template for the project and quickly see a preview of the document. :ref:`Learn how to work with the documents →` diff --git a/docs/application/administration/index.rst b/docs/application/administration/index.rst index 6086039..afa0d16 100644 --- a/docs/application/administration/index.rst +++ b/docs/application/administration/index.rst @@ -3,7 +3,7 @@ Administration ************** -Administration section serves as the name suggests to users with permission to manage the |project_name| instance. By navigating via :guilabel:`Administration` item from the main menu, we can manage the things listed below. +Administration section serves as the name suggests to users with permission to manage the DSW instance. By navigating via :guilabel:`Administration` item from the main menu, we can manage the things listed below. ---- diff --git a/docs/application/administration/locales/create.rst b/docs/application/administration/locales/create.rst index cf52044..c2d1f8a 100644 --- a/docs/application/administration/locales/create.rst +++ b/docs/application/administration/locales/create.rst @@ -1,7 +1,7 @@ Create Locale ************* -We can create a new locale directly in |project_name| by pressing :guilabel:`Create` from :doc:`./index`. We need to fill the details about the new locale such as name, description, language code (`RFC5646 `__, e.g. ``en`` or ``en-GB``), locale ID, locale version, license, README (with Markdown syntax), and recommended app version. The recommended app version captures for which version of the |project_name| is this locale intended and compatible with (it can be used in other versions as well but may have some untranslated texts). +We can create a new locale directly in DSW by pressing :guilabel:`Create` from :doc:`./index`. We need to fill the details about the new locale such as name, description, language code (`RFC5646 `__, e.g. ``en`` or ``en-GB``), locale ID, locale version, license, README (with Markdown syntax), and recommended app version. The recommended app version captures for which version of the DSW is this locale intended and compatible with (it can be used in other versions as well but may have some untranslated texts). Finally, a PO file is requested from us. We can create such PO file in a standard (`gettext `__-based) way. @@ -9,9 +9,8 @@ Similarly we can create a PO file for the emails. The needed POT files are placed in the localization repository `wizard-locales `__ (select the desired release and there is ``default.pot`` asset). -Recommended tool for creating the localization is the `Poedit `__. +Recommended tool for creating the localization is the `Poedit `__. .. figure:: create/form.png Form for creating a new locale. - diff --git a/docs/application/administration/locales/detail.rst b/docs/application/administration/locales/detail.rst index 804badb..f97ede4 100644 --- a/docs/application/administration/locales/detail.rst +++ b/docs/application/administration/locales/detail.rst @@ -1,7 +1,7 @@ Locale Detail ************* -The detail of a locale provides us information about a locale after navigating to it from :doc:`./index`. The detail shows basic information about the locale such as its name, ID, language code (`RFC5646 `__, e.g. ``en`` or ``en-GB``), version, recommended compatible |project_name| version, license, and indication whether the locale is enabled or not. +The detail of a locale provides us information about a locale after navigating to it from :doc:`./index`. The detail shows basic information about the locale such as its name, ID, language code (`RFC5646 `__, e.g. ``en`` or ``en-GB``), version, recommended compatible DSW version, license, and indication whether the locale is enabled or not. The main part of the detail is the README of the locale that should contain basic information and changelog. In the right panel under the basic information, we can navigate to other versions of the locale. diff --git a/docs/application/administration/locales/import.rst b/docs/application/administration/locales/import.rst index 30afc86..c5f8aba 100644 --- a/docs/application/administration/locales/import.rst +++ b/docs/application/administration/locales/import.rst @@ -11,7 +11,7 @@ We can import an existing locale by navigating to :menuselection:`Settings → L From DSW Registry ================= -If the |project_name| instance is connected to the `DSW Registry `__, it is possible to import locales from it by entering the **locale ID** of desired template (e.g. ``dsw:cs:0.2.0``) and pressing the :guilabel:`Import` button. +If the DSW instance is connected to the `DSW Registry `__, it is possible to import locales from it by entering the **locale ID** of desired template (e.g. ``dsw:cs:0.2.0``) and pressing the :guilabel:`Import` button. .. NOTE:: @@ -28,7 +28,7 @@ If the |project_name| instance is connected to the `DSW Registry `__ and service for translating using web browser `localize.ds-wizard.org `__. + We support community of DSW translators by managing the repository `ds-wizard/wizard-locales `__ and service for translating using web browser `localize.ds-wizard.org `__. .. figure:: index/list.png @@ -39,4 +39,4 @@ If there is a locale with newer version available in the `DSW Registry Create - Detail \ No newline at end of file + Detail diff --git a/docs/application/administration/roles/index.rst b/docs/application/administration/roles/index.rst index d306579..6d4fc36 100644 --- a/docs/application/administration/roles/index.rst +++ b/docs/application/administration/roles/index.rst @@ -3,12 +3,12 @@ Roles ***** -Roles define what users can do across the |project_name| instance. Each user has one global role. The role contains a set of permissions, such as whether the user can manage users, configure settings, work with knowledge models, or access all projects. +Roles define what users can do across the DSW instance. Each user has one global role. The role contains a set of permissions, such as whether the user can manage users, configure settings, work with knowledge models, or access all projects. Default Roles ============= -New |project_name| instances include default roles for the usual workflows: +New DSW instances include default roles for the usual workflows: - **Researcher** for users who mainly create and work on their own projects. - **Data Steward** for users who prepare content such as knowledge models, document templates, and project templates. @@ -35,7 +35,7 @@ Custom roles are useful for cases such as: Role Permissions ================ -Permissions are grouped by the type of work they enable. The available groups depend on the |project_name| edition and enabled features. +Permissions are grouped by the type of work they enable. The available groups depend on the DSW edition and enabled features. Project-related permissions can allow a role to: diff --git a/docs/application/administration/settings/content/dsw-registry.rst b/docs/application/administration/settings/content/dsw-registry.rst index 6bcec65..db5fb4e 100644 --- a/docs/application/administration/settings/content/dsw-registry.rst +++ b/docs/application/administration/settings/content/dsw-registry.rst @@ -3,11 +3,11 @@ DSW Registry ************ -In this settings, we can configure a connection to DSW Registry that will allow import of various content (Knowledge Models, Document Templates, and Locales) to our |project_name| instance. +In these settings, we can configure a connection to DSW Registry that will allow importing various content (Knowledge Models, Document Templates, and Locales) to our DSW instance. -Upon enabling the DSW Registry option, we are prompted to enter a **Token**. It can be obtained either by direct registration in the `DSW Registry__` or through clicking :guilabel:`Sign up` button. After clicking the button, we will need to enter details about organization (it is prefilled from :doc:`../system/organization`) and email address to which the confirmation will be sent (prefilled by email of the current user). Then, after clicking a link in the confirmation email, the token will be prefilled automatically. After having the token filled in either way, we can :guilabel:`Save` the settings. +Upon enabling the DSW Registry option, we are prompted to enter a **Token**. It can be obtained either by direct registration in the `DSW Registry `__ or by clicking the :guilabel:`Sign up` button. After clicking the button, we will need to enter details about the organization (prefilled from :doc:`../system/organization`) and the email address to which the confirmation will be sent (prefilled with the email of the current user). Then, after clicking a link in the confirmation email, the token will be prefilled automatically. After the token has been filled in either way, we can :guilabel:`Save` the settings. -After successfully setting the DSW Registry, we will see option to import from it for :ref:`Knowledge Models`, :ref:`Document Templates`, and :ref:`Locales`. +After successfully setting the DSW Registry, we will see the option to import from it for :ref:`Knowledge Models`, :ref:`Document Templates`, and :ref:`Locales`. .. NOTE:: diff --git a/docs/application/administration/settings/content/projects.rst b/docs/application/administration/settings/content/projects.rst index 2a706ae..91fb4fc 100644 --- a/docs/application/administration/settings/content/projects.rst +++ b/docs/application/administration/settings/content/projects.rst @@ -4,7 +4,7 @@ Projects Project Visibility ================== -If we want to let users select visibility of their projects within the |project_name| instance, we can enable **Project Visibility** feature. If it is disabled, the new projects will have the **Default Project Visibility** which is used when creating a new project: +If we want to let users select visibility of their projects within the DSW instance, we can enable **Project Visibility** feature. If it is disabled, the new projects will have the **Default Project Visibility** which is used when creating a new project: * **Private** = the project is visible only to the users with explicit access to the project. * **Visible - View** = the project is visible in view-only mode to all logged-in users, i.e. all users will be able to see the project in their :ref:`projects list` and access it (but not edit or comment anything unless they are invited with different permissions). @@ -19,7 +19,7 @@ If we want to let users select visibility of their projects within the |project_ Project Sharing =============== -If we want to let users select sharing option of their projects within the |project_name| instance, we can enable **Project Sharing** feature. If it is disabled, the new projects will have the **Default Project Sharing** which is used when creating a new project: +If we want to let users select sharing options for their projects within the DSW instance, we can enable the **Project Sharing** feature. If it is disabled, the new projects will have the **Default Project Sharing** which is used when creating a new project: * **Restricted** = only logged-in users can access the project depending on the project visibility (no public access for anonymous users). * **View with the link** = anyone with the link to the project may open it in view mode and browse it. @@ -34,7 +34,7 @@ If we want to let users select sharing option of their projects within the |proj Anonymous Projects ================== -If we have set Knowledge Model as Public, we can also allow anonymous users to create projects where they will be able to fill questionnaires by enabling **Anonymous Projects**. These anonymous project then work as any other projects with public link set to edit permissions. However, if a logged-in user accesses such a project, then such a user may claim the ownership by clicking :guilabel:`Add to my projects` button. Anonymous users cannot create new documents, for that they must register and open the project as a logged-in user. +If we have set Knowledge Model as Public, we can also allow anonymous users to create projects where they will be able to fill questionnaires by enabling **Anonymous Projects**. These anonymous projects then work as any other projects with public link set to edit permissions. However, if a logged-in user accesses such a project, then they may claim the ownership by clicking the :guilabel:`Add to my projects` button. Anonymous users cannot create new documents; for that, they must register and open the project as a logged-in user. Project Creation @@ -42,7 +42,7 @@ Project Creation * **Templates & Custom** = users can create both projects from project templates and custom projects. * **Templates Only** = users can create projects only from project templates. -* **Custom Only** = users can create only custom projects, they have to select knowledge model and everything else by themselves. +* **Custom Only** = users can create only custom projects, they have to select a knowledge model and everything else by themselves. Summary Report @@ -56,4 +56,4 @@ The **Summary Report** shows how many questions are answered and unanswered in e Project Tagging =============== -If enabled, users will be able to tag their projects (using so-called **Project Tags**) and then use those tags to filter the :ref:`projects list`. The users will be always able to write their own tags but we can provide a list of pre-defined **Default Project Tags** (one per line). +If enabled, users will be able to tag their projects (using so-called **Project Tags**) and then use those tags to filter the :ref:`projects list`. The users will always be able to write their own tags, but we can provide a list of pre-defined **Default Project Tags** (one per line). diff --git a/docs/application/administration/settings/info/index.rst b/docs/application/administration/settings/info/index.rst index 7d484c0..7e8f29d 100644 --- a/docs/application/administration/settings/info/index.rst +++ b/docs/application/administration/settings/info/index.rst @@ -1,7 +1,7 @@ Info **** -The info section of settings simply serves to let us check various information and statistics about the |project_name| instance. +The info section of settings simply serves to let us check various information and statistics about the DSW instance. ---- diff --git a/docs/application/administration/settings/info/usage.rst b/docs/application/administration/settings/info/usage.rst index 31cff30..567257a 100644 --- a/docs/application/administration/settings/info/usage.rst +++ b/docs/application/administration/settings/info/usage.rst @@ -1,7 +1,7 @@ Usage ***** -Usage allows us quickly see numbers of entities in the |project_name| instance such as number of users, active users, knowledge models, KM editors, templates, projects, or documents. Moreover, we can see storage usage, i.e. how much capacity is being used by documents and templates (their files). We cannot perform any actions on this page. +Usage allows us quickly see numbers of entities in the DSW instance such as number of users, active users, knowledge models, KM editors, templates, projects, or documents. Moreover, we can see storage usage, i.e. how much capacity is being used by documents and templates (their files). We cannot perform any actions on this page. .. figure:: usage/usage.png diff --git a/docs/application/administration/settings/system/authentication.rst b/docs/application/administration/settings/system/authentication.rst index cf73af6..4dbf74d 100644 --- a/docs/application/administration/settings/system/authentication.rst +++ b/docs/application/administration/settings/system/authentication.rst @@ -8,7 +8,7 @@ The **Default Role** settings option allows us to define which :ref:`role .. WARNING:: - It is recommended to set this to the lowest-privilege role that fits new users. Otherwise, new users may be able to change content or settings for other users in the |project_name| instance. + It is recommended to set this to the lowest-privilege role that fits new users. Otherwise, new users may be able to change content or settings for other users in the DSW instance. .. NOTE:: @@ -21,7 +21,7 @@ Internal For internal authentication, we can set: - **Registration** - whether users can sign up on their own or not. -- **Non-Admin Login** - whether non-admin users can log in to the |project_name| instance or not. +- **Non-Admin Login** - whether non-admin users can log in to the DSW instance or not. - **Two-Factor Authentication** - whether users need to confirm their login with a one-time code sent to their email address or not. - **Session Expiration** - how long the user session is valid before the user needs to log in again in hours. - **User Email Link Expiration** - how long the email links (e.g., for password reset) are valid before they expire and cannot be used anymore in hours. diff --git a/docs/application/administration/settings/system/authentication/openid.png b/docs/application/administration/settings/system/authentication/openid.png deleted file mode 100644 index 13a0a5e20322a8f405baa42db4dcd7bc55caea8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206043 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 z 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

-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 diff --git a/docs/application/administration/settings/system/index.rst b/docs/application/administration/settings/system/index.rst index a20193e..1395fba 100644 --- a/docs/application/administration/settings/system/index.rst +++ b/docs/application/administration/settings/system/index.rst @@ -1,7 +1,7 @@ System ****** -System settings allow us to configure basics about the organization running the |project_name| instance, how can user register and login, and finally the privacy and support information for the users. +System settings allow us to configure basics about the organization running the DSW instance, how can user register and login, and finally the privacy and support information for the users. ---- diff --git a/docs/application/administration/settings/system/openid.rst b/docs/application/administration/settings/system/openid.rst index 5d17b51..bfdf200 100644 --- a/docs/application/administration/settings/system/openid.rst +++ b/docs/application/administration/settings/system/openid.rst @@ -3,9 +3,9 @@ OpenID ****** -Using these settings we can add `OpenID `__ configuration to allow logging into the DSW via external identity provider. +Using these settings, we can add `OpenID `__ configuration to allow logging into DSW via an external identity provider. -DSW supports Microsoft Azure, ORCID, as well as any other OpenID providers. Following are detailed description of the setups for these options. +DSW supports Microsoft Azure, ORCID, and other OpenID providers. The following sections describe the setup for these options. .. NOTE:: @@ -26,18 +26,18 @@ Microsoft Azure Setup 9. Click on ``Manage`` in the left menu → ``Certificates & Secrets``. 10. Click on ``New client secret``. 11. Fill description, set ``Expires`` and note it somewhere, then click on ``Add``. -12. Copy ``Value`` and store it somewhere. You will not able to view it again. +12. Copy ``Value`` and store it somewhere. You will not be able to view it again. 13. Go to OpenID in DSW: ``Settings`` → ``OpenID`` → ``Create``. 14. Fill in a ``Name`` of the service. This name will be used to identify the service in the list of login options, so it should be something descriptive. -15. Open the ``Microsoft`` tab and fill in : +15. Open the ``Microsoft`` tab and fill in: - ``Application (client) ID`` - ``Directory (tenant) ID`` - ``Client Secret`` → ```` -16. (optional) fill Icon (``fab fa-microsoft``, or some other from `Font Awesome `_), ``Background Color`` and ``Text Color``. +16. (optional) Fill in Icon (``fab fa-microsoft``, or another icon from `Font Awesome `_), ``Background Color`` and ``Text Color``. 17. Click on ``Save``. @@ -59,12 +59,7 @@ Microsoft Azure Setup 32. Select ``ID`` and check ``email``, ``family_name`` and ``given_name``. 33. Click on ``Add``. -34. Test your OpenID configuration in DSW (You might need to refresh the login page for the login button to appear). - -.. .. figure:: openid/openid.png -.. :width: 700 - -.. Example configuration of OpenID Microsoft Azure service. +34. Test your OpenID configuration in DSW. You might need to refresh the login page for the login button to appear. ORCID Setup @@ -80,7 +75,7 @@ ORCID requires a redirect URI before it allows us to save the application and ob - ``Client Secret`` → ``placeholder`` - ``URL`` → ``https://orcid.org`` 5. Leave ``Parameters`` empty. -6. (optional) fill Icon (``fab fa-orcid``), ``Background Color`` (``#A6CE39``), and ``Text Color``. +6. (optional) Fill in Icon (``fab fa-orcid``), ``Background Color`` (``#A6CE39``), and ``Text Color``. 7. Click on ``Save``. 8. Copy ``Callback URL`` from DSW. It will look similar to ``https:///wizard/open-id//callback``. @@ -101,7 +96,7 @@ ORCID requires a redirect URI before it allows us to save the application and ob - ``Client Secret`` → ORCID ``Client Secret`` - ``URL`` → keep ``https://orcid.org`` 17. Click on ``Save``. -18. Test your OpenID configuration in DSW (You might need to refresh the login page for the login button to appear). +18. Test your OpenID configuration in DSW. You might need to refresh the login page for the login button to appear. .. NOTE:: @@ -131,9 +126,9 @@ Custom Setup - Configure the client to provide the following details in ID tokens: ``email``, ``given_name``, ``family_name``. 8. Go back to DSW and fill in the real ``Client ID``, ``Client Secret``, and ``URL`` from the OpenID provider. 9. Leave ``Parameters`` empty unless the provider documentation requires an additional parameter. -10. (optional) fill Icon (some from `Font Awesome `_), ``Background Color`` and ``Text Color``. +10. (optional) Fill in Icon (an icon from `Font Awesome `_), ``Background Color`` and ``Text Color``. 11. Click on ``Save``. -12. Test your OpenID configuration in DSW (You might need to refresh the login page for the login button to appear). +12. Test your OpenID configuration in DSW. You might need to refresh the login page for the login button to appear. Advanced Configuration diff --git a/docs/application/administration/settings/system/organization.rst b/docs/application/administration/settings/system/organization.rst index 830638b..b163a3c 100644 --- a/docs/application/administration/settings/system/organization.rst +++ b/docs/application/administration/settings/system/organization.rst @@ -3,7 +3,7 @@ Organization ************ -On this page, we can configure **Name**, **Description**, **Organization ID** for our |project_name| instance and **Affiliations**. +On this page, we can configure **Name**, **Description**, **Organization ID** for our DSW instance and **Affiliations**. The organization ID is used as a part of knowledge models and document templates IDs. That ID is also used in the :ref:`dsw-registry` to identify the organization. diff --git a/docs/application/administration/settings/user-interface/dashboard-and-login-screen.rst b/docs/application/administration/settings/user-interface/dashboard-and-login-screen.rst index 2b31e01..811f7b7 100644 --- a/docs/application/administration/settings/user-interface/dashboard-and-login-screen.rst +++ b/docs/application/administration/settings/user-interface/dashboard-and-login-screen.rst @@ -30,7 +30,7 @@ We can select the **Dashboard Style** to decide whether the user should see a st * **Configure Organization Widget** quickly navigates to :doc:`../system/organization` if it is not yet done. - * **Configure Look and Feel Widget** quickly navigates to :doc:`../user-interface/look-and-feel` to adjust style of the |project_name| instance. + * **Configure Look and Feel Widget** quickly navigates to :doc:`../user-interface/look-and-feel` to adjust style of the DSW instance. * **Connect DSW Registry Widget** quickly navigates to :doc:`../content/dsw-registry` to configure the connection if it has not been configured yet. @@ -42,11 +42,11 @@ We can select the **Dashboard Style** to decide whether the user should see a st Login Info ========== -It is possible to write a message that users will see before logging in the |project_name| instance, using HTML or Markdown. The Login info is placed in the center of the login screen. We can use it to explain users in what cases they can/should use our |project_name| instance, how they should log in (e.g. if we have more authentication services configured), or if there is any news regarding our |project_name| instance. +It is possible to write a message that users will see before logging in the DSW instance, using HTML or Markdown. The Login info is placed in the center of the login screen. We can use it to explain users in what cases they can/should use our DSW instance, how they should log in (e.g. if we have more authentication services configured), or if there is any news regarding our DSW instance. .. WARNING:: - Defining HTML classes in the login info can overwrite |project_name| application classes. It is recommended to use prefixes for classes, if they are used, to avoid conflicts. + Defining HTML classes in the login info can overwrite DSW application classes. It is recommended to use prefixes for classes, if they are used, to avoid conflicts. .. _sidebar-login-info: diff --git a/docs/application/administration/settings/user-interface/index.rst b/docs/application/administration/settings/user-interface/index.rst index ca09eb7..8a6e5d4 100644 --- a/docs/application/administration/settings/user-interface/index.rst +++ b/docs/application/administration/settings/user-interface/index.rst @@ -1,7 +1,7 @@ User Interface Settings *********************** -User Interface (UI) settings allow us to manage how the |project_name| instance looks like: styling, titles, or the dashboard shown when user logs information. +User Interface (UI) settings allow us to manage how the DSW instance looks like: styling, titles, or the dashboard shown when user logs information. ---- diff --git a/docs/application/administration/settings/user-interface/look-and-feel.rst b/docs/application/administration/settings/user-interface/look-and-feel.rst index d8cfd63..b53d616 100644 --- a/docs/application/administration/settings/user-interface/look-and-feel.rst +++ b/docs/application/administration/settings/user-interface/look-and-feel.rst @@ -1,22 +1,21 @@ Look & Feel *********** -This part of settings allows us to adjust how the |project_name| instance looks like. +This part of settings allows us to adjust how the DSW instance looks like. Application Titles ================== -There are two titles that we can set. First, **Application Title** is the full title that should identify the |project_name| instance, for example, in browser's tab. Second is **Short Application Title** which is visible, for example, at the top of the main (left) menu next to the icon. We should keep **Short Application Title** really short (about 10 characters at maximum) so it fits well. +There are two titles that we can set. First, **Application Title** is the full title that should identify the DSW instance, for example, in browser's tab. Second is **Short Application Title** which is visible, for example, at the top of the main (left) menu next to the icon. We should keep **Short Application Title** really short (about 10 characters at maximum) so it fits well. Custom Menu Links ================= -We can easily add custom links to the main (left) menu by clicking :guilabel:`Add` under **Custom Menu Links**. For each link, we can set **Icon** (from `Font Awesome `_), **Title** and the target **URL**. We can also set whether the link should open in **New Window** (if not, it will navigate user directly in the same window/tab from |project_name| instance). Once the links are there, we can manage them or delete them at this place. +We can easily add custom links to the main (left) menu by clicking :guilabel:`Add` under **Custom Menu Links**. For each link, we can set **Icon** (from `Font Awesome `_), **Title** and the target **URL**. We can also set whether the link should open in **New Window** (if not, it will navigate user directly in the same window/tab from DSW instance). Once the links are there, we can manage them or delete them at this place. .. figure:: look-and-feel/custom-links.png - + Example configuration of a custom menu link. - \ No newline at end of file diff --git a/docs/application/administration/users/detail.rst b/docs/application/administration/users/detail.rst index 8c9f77a..797440a 100644 --- a/docs/application/administration/users/detail.rst +++ b/docs/application/administration/users/detail.rst @@ -10,7 +10,7 @@ Users with permission to manage users can edit existing users manually on the de Detail of a user profile. -The password can be also changed (after selecting :guilabel:`Password` from the left navigation of user settings). +The password can also be changed (after selecting :guilabel:`Password` from the left navigation of user settings). .. figure:: detail/password.png @@ -21,7 +21,7 @@ The password can be also changed (after selecting :guilabel:`Password` from the User Roles ========== -Each user has one global :ref:`role`. The role determines which parts of the |project_name| instance the user can access and what actions they can perform. +Each user has one global :ref:`role`. The role determines which parts of the DSW instance the user can access and what actions they can perform. Default roles cover the common researcher, data steward, and admin workflows. Users with permission to manage settings can also create custom roles when they need a different combination of permissions. diff --git a/docs/application/administration/users/index.rst b/docs/application/administration/users/index.rst index 8ee75bc..e4d85b4 100644 --- a/docs/application/administration/users/index.rst +++ b/docs/application/administration/users/index.rst @@ -3,9 +3,9 @@ Users ***** -Users list allows users with permission to manage users to see and manage all users in a |project_name| instance. The list can be filtered using :ref:`roles`, searched based using name or email fragment, and sorted via various properties of users. The list shows the role of a user next to its name and also indicates in case the user is inactive. Next to the email, we can quickly see what authentication services the user uses to log-in. +A users list allows users with permission to manage users to see and manage all users in a DSW instance. The list can be filtered using :ref:`roles`, searched by name or email fragment, and sorted via various user properties. The list shows the role of a user next to their name and also indicates when the user is inactive. Next to the email, we can quickly see what authentication services the user uses to log in. -A :ref:`user detail` can be opened by clicking the name of a user or by selecting :guilabel:`Edit` in the right dropdown menu for the desired row. There, a user can be also deleted via the :guilabel:`Delete` action. Finally, a new user can be :ref:`created` by clicking :guilabel:`Create`. +A :ref:`user detail` can be opened by clicking the name of a user or by selecting :guilabel:`Edit` in the right dropdown menu for the desired row. There, a user can also be deleted via the :guilabel:`Delete` action. Finally, a new user can be :ref:`created` by clicking :guilabel:`Create`. .. figure:: index/list.png diff --git a/docs/application/document-templates/editors/index.rst b/docs/application/document-templates/editors/index.rst index 5e19900..d2e6db1 100644 --- a/docs/application/document-templates/editors/index.rst +++ b/docs/application/document-templates/editors/index.rst @@ -14,7 +14,7 @@ We can use the search field to search for a specific document template editor. T We can :doc:`./create` by clicking the :guilabel:`Create` button. -By clicking the triple dots on each of the item in the list we can access some actions: +By clicking the triple dots on each item in the list, we can access some actions: - **Open Editor** - simply open the :doc:`./detail/index` (we can also click the name of the editor) - **Delete** - to delete the document template editor (cannot be undone) diff --git a/docs/application/document-templates/list/import.rst b/docs/application/document-templates/list/import.rst index ce1fbff..8a31820 100644 --- a/docs/application/document-templates/list/import.rst +++ b/docs/application/document-templates/list/import.rst @@ -10,7 +10,7 @@ We can import an existing document template by navigating to :doc:`./index` (:me From DSW Registry ================= -If the |project_name| instance is connected to the `DSW Registry `__, it is possible to import document templates from it by entering the **document template ID** of desired template (e.g. ``dsw:questionnaire-report:2.7.1``) and pressing the :guilabel:`Import` button. +If the DSW instance is connected to the `DSW Registry `__, it is possible to import document templates from it by entering the **document template ID** of desired template (e.g. ``dsw:questionnaire-report:2.7.1``) and pressing the :guilabel:`Import` button. .. NOTE:: @@ -26,7 +26,7 @@ If the |project_name| instance is connected to the `DSW Registry `__, :guilabel:`update available` badge will appear. +Each item may be marked with :guilabel:`unsupported metamodel` badge when the document template is not compatible with the version of DSW. :doc:`../../../more/development/metamodel-schemas` are used to define structures that developers can interact with. If the template originates from the `DSW Registry `__, :guilabel:`update available` badge will appear. To see how to configure the registry, read the :ref:`FAQ and Deployment Notes`. If your template is not from the registry, you will have to :doc:`../editors/detail/publish` a new version via template editor, which will increase the metamodel version automatically. diff --git a/docs/application/knowledge-models/editors/create.rst b/docs/application/knowledge-models/editors/create.rst index e9d3e08..b069cfe 100644 --- a/docs/application/knowledge-models/editors/create.rst +++ b/docs/application/knowledge-models/editors/create.rst @@ -17,6 +17,6 @@ Every knowledge model needs to have a **name**, a **knowledge model ID** and **v :: -We can create a new project either from scratch, i.e. the new knowledge model will be empty and we will build it all ourselves, or based on an existing knowledge models, which means that everything from the chosen knowledge model will be copied to ours. We can start from there and add, delete, or modify the existing entities in there. We just need to choose the original knowledge model in the **based on** field. Alternatively, we can open the :ref:`knowledge model detail` and click on :guilabel:`Fork KM` there. +We can create a new knowledge model editor either from scratch, i.e. the new knowledge model will be empty and we will build it all ourselves, or based on an existing knowledge model, which means that everything from the chosen knowledge model will be copied to ours. We can start from there and add, delete, or modify the existing entities in there. We just need to choose the original knowledge model in the **Based on** field. Alternatively, we can open the :ref:`knowledge model detail` and click on :guilabel:`Fork KM` there. We can only have one knowledge model editor with the same knowledge model ID. If we deleted the editor but want to continue working on that knowledge model, we can create a new editor with the same knowledge model ID. Or we can open the :ref:`knowledge model detail` and click on :guilabel:`Create KM editor` there to have the editor create form prefilled. diff --git a/docs/application/knowledge-models/editors/index.rst b/docs/application/knowledge-models/editors/index.rst index baed544..77958dc 100644 --- a/docs/application/knowledge-models/editors/index.rst +++ b/docs/application/knowledge-models/editors/index.rst @@ -10,14 +10,14 @@ Users with permission to use knowledge model editors can see a list of all knowl List of knowledge model editors. -We can use the search field to search for a specific KM editor. The editors are sorted by when they were last updated but we can change that. We can order the list by name, creation date, or last update date. The list shows the name, version, id, if editor contains unpublished changes, if it is a fork of different KM and last update. +We can use the search field to search for a specific KM editor. The editors are sorted by when they were last updated, but we can change that. We can order the list by name, creation date, or last update date. The list shows the name, version, id, whether the editor contains unpublished changes, whether it is a fork of a different KM, and last update. We can :ref:`create a new knowledge model editor` by clicking the :guilabel:`Create` button. -By clicking the triple dots on each of the item in the list we can access some actions: +By clicking the triple dots on each item in the list, we can access some actions: - **Open Editor** - simply open the :ref:`editor detail` -- **Update** - if there is a newer version of parent knowledge model, we can use update action to start a :ref:`knowledge model migration`, otherwise the action is not visible +- **Update** - if there is a newer version of the parent knowledge model, we can use the update action to start a :ref:`knowledge model migration`, otherwise the action is not visible - **Delete** - to delete the knowledge model editor (cannot be undone) If there is an ongoing :ref:`knowledge model migration`, there are different actions: diff --git a/docs/application/knowledge-models/list/import.rst b/docs/application/knowledge-models/list/import.rst index 1e95a3b..0166bf6 100644 --- a/docs/application/knowledge-models/list/import.rst +++ b/docs/application/knowledge-models/list/import.rst @@ -27,7 +27,7 @@ We can import a knowledge model from the `DSW Registry ` can be used to quickly submit the document directly from |project_name| to some external service. +:ref:`Submission services` can be used to quickly submit the document directly from DSW to some external service. .. figure:: documents/submission.png :width: 540 @@ -39,6 +39,6 @@ Document Submission Submission service selection for a document. -If there are any document submission services configured for our |project_name| instance, we should be able to see :guilabel:`Submit` option when we open document menu in the document list by clicking on the triple dots. Then we choose the desired from the list and click on :guilabel:`Submit`. +If there are any document submission services configured for our DSW instance, we should be able to see :guilabel:`Submit` option when we open document menu in the document list by clicking on the triple dots. Then we choose the desired from the list and click on :guilabel:`Submit`. We can see all the submissions for each document in the document list as well. \ No newline at end of file diff --git a/docs/application/projects/list/detail/settings.rst b/docs/application/projects/list/detail/settings.rst index 1b7d88e..2e8b3b3 100644 --- a/docs/application/projects/list/detail/settings.rst +++ b/docs/application/projects/list/detail/settings.rst @@ -5,11 +5,11 @@ Settings In the :guilabel:`Settings` tab, we can configure some details about the project. First we have a **name** and a **description** to identify the project. -Next, we have **Project Tags**. These can be used for providing some metadata or categorization of the project. In the project list, we can filter the projects by these tags. We can write any text we want as a project tag and |project_name| will suggest us the tags that are there already in use so we can keep them consistent. +Next, we have **Project Tags**. These can be used for providing some metadata or categorization of the project. In the project list, we can filter the projects by these tags. We can write any text we want as a project tag and DSW will suggest us the tags that are there already in use so we can keep them consistent. .. NOTE:: - Project tags might be disabled in some |project_name| instances. + Project tags might be disabled in some DSW instances. .. figure:: settings/settings.png @@ -35,7 +35,7 @@ We can use the project as a :ref:`project template`. If we en Project template options are visible only for users with permission to manage project templates. -:guilabel:`Unsupported metamodel` badge can appear, when the document template is not compatible with the version of |project_name|. Users should contact the person responsible for document templates or instance administration in this case. +:guilabel:`Unsupported metamodel` badge can appear, when the document template is not compatible with the version of DSW. Users should contact the person responsible for document templates or instance administration in this case. Knowledge Model =============== diff --git a/docs/application/projects/list/detail/sharing.rst b/docs/application/projects/list/detail/sharing.rst index 9b5a4c7..bcf8836 100644 --- a/docs/application/projects/list/detail/sharing.rst +++ b/docs/application/projects/list/detail/sharing.rst @@ -3,7 +3,7 @@ Sharing ******* -We can share a project with other |project_name| users or external collaborators. We can access all sharing options by clicking the :guilabel:`Share` button in the top right. +We can share a project with other DSW users or external collaborators. We can access all sharing options by clicking the :guilabel:`Share` button in the top right. .. figure:: sharing/share-modal.png :width: 540 @@ -141,7 +141,7 @@ There are different project sharing roles that grant access to different project .. NOTE:: - Some of the following options might be globally disabled in the application settings for the whole |project_name| instance, therefore not visible on the project level. + Some of the following options might be globally disabled in the application settings for the whole DSW instance, therefore not visible on the project level. The following video tutorial explains and showcases sharing options and tools that can be used while collaborating with others. Some features mentioned in the video are also explained in the :ref:`project questionnaire`. @@ -154,7 +154,7 @@ The following video tutorial explains and showcases sharing options and tools th Users ===== -We can choose specific users from the |project_name| instance and their project sharing role to grant them access to project features based on the table above. This is a good way to add other collaborators that work together with us on the project. Also, this is the only way to add other project owners. +We can choose specific users from the DSW instance and their project sharing role to grant them access to project features based on the table above. This is a good way to add other collaborators that work together with us on the project. Also, this is the only way to add other project owners. Visible by all other logged-in users @@ -168,4 +168,4 @@ This can be useful, when we want to have an example project accessible by everyb Public link =========== -We can enable the :guilabel:`Public link` toggle to grant access to the project to anyone who has the link. We can again choose what they can do -- **view**, **comment**, or **edit** the project. Also, the public link is visible there, so we can simply copy it and send to whoever we want to collaborate with. Then, they don't need a |project_name| account and still be able to access our project. +We can enable the :guilabel:`Public link` toggle to grant access to the project to anyone who has the link. We can again choose what they can do -- **view**, **comment**, or **edit** the project. Also, the public link is visible there, so we can simply copy it and send to whoever we want to collaborate with. Then, they don't need a DSW account and still be able to access our project. diff --git a/docs/application/projects/list/index.rst b/docs/application/projects/list/index.rst index 79427cc..77cec9d 100644 --- a/docs/application/projects/list/index.rst +++ b/docs/application/projects/list/index.rst @@ -3,11 +3,11 @@ Project List ************ -In the project list, we can see a list of all projects we have access to. Those are the projects where we were assigned with a project sharing role, projects that are visible to all logged-in users in the :ref:`project sharing settings`, or projects available through our global :ref:`role` permissions. The projects are filtered to those we are explicitly assigned to by default. +In the project list, we can see a list of all projects we have access to. Those are the projects where we were assigned a project sharing role, projects that are visible to all logged-in users in the :ref:`project sharing settings`, or projects available through our global :ref:`role` permissions. The projects are filtered to those we are explicitly assigned to by default. -We can see projects name, label :guilabel:`Template` if the project is a template, and icon indicating sharing settings: +We can see project names, a :guilabel:`Template` label if the project is a template, and an icon indicating sharing settings: -- **Lock icon** - the project can be only accessed by you +- **Lock icon** - the project can only be accessed by you - **People icon** - the project is shared with other users, hovering on the icon provides additional information - **Globe icon** - anyone with a link can access the project @@ -19,18 +19,18 @@ We can see projects name, label :guilabel:`Template` if the project is a templat We can search for specific projects using the search field or filter them using additional filters: - **Project Template** - if we want to see only :ref:`project templates` or regular projects -- **Project Tags** - show only the projects that has specific tags assigned +- **Project Tags** - show only the projects that have specific tags assigned - **Knowledge Models** - show only the projects created from a specific knowledge model - **Users** - filter only the projects with specific users assigned to them .. NOTE:: - Note that some of the filters can be disabled based on the |project_name| instance settings or user permissions. + Note that some of the filters can be disabled based on the DSW instance settings or user permissions. We can :ref:`create a new project` by clicking the :guilabel:`Create` button. -By clicking the triple dots on each of the item in the list we can access some actions: +By clicking the triple dots on each item in the list, we can access some actions: - **Open project** - will simply open the project - **Create project from this template** - will create a new project from the selected project template (this is only available if the project is also a project template) diff --git a/docs/application/projects/list/templates.rst b/docs/application/projects/list/templates.rst index 5622c27..5401d41 100644 --- a/docs/application/projects/list/templates.rst +++ b/docs/application/projects/list/templates.rst @@ -9,9 +9,9 @@ Project Templates When creating a new project, we need to choose a knowledge model and optionally select some question tags. After the project is created, we should also choose a :ref:`default document template` and format to enable :ref:`preview`. It can be overwhelming for new researchers to set up everything when they are new to all this. -Project templates are special type of projects where we can set up everything -- choose a knowledge model and question tags, set up default document template, pre-fill some answers, add TODOs, comments or editor notes. Users can then pick from these project templates when :ref:`creating a new project`. The new project will be the exact copy of the project template so they don't have to set those things themselves and they have an easier start to their data management planning. +Project templates are a special type of project where we can set up everything -- choose a knowledge model and question tags, set up a default document template, pre-fill some answers, add TODOs, comments or editor notes. Users can then pick from these project templates when :ref:`creating a new project`. The new project will be an exact copy of the project template, so they don't have to set those things themselves and they have an easier start to their data management planning. -When we want to turn a project into a project template we need to go to the :ref:`project settings` and check the :guilabel:`Project Template` checkbox. +When we want to turn a project into a project template, we need to go to the :ref:`project settings` and check the :guilabel:`Project Template` checkbox. Sharing the Project Templates ============================= @@ -20,7 +20,7 @@ Sharing the Project Templates Project templates follow the same rules for sharing as regular projects. Therefore, to make it available for other users, we need to set up proper :ref:`sharing settings`. -We can either share them with specific users only, or we can simply enable that the project template is **visible by all other logged-in users** and that they can only **view** it (as we do not want them to change it). +We can either share them with specific users only, or we can simply make the project template **visible by all other logged-in users** with **view** access only (as we do not want them to change it). External Resources diff --git a/docs/conf.py b/docs/conf.py index d067fa8..0f3dda2 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -21,20 +21,9 @@ copyright = '2018 - 2026, DSW Team' author = 'DSW Team' -project_name = 'DSW' -project_name_full = 'Data Stewardship Wizard' - # The full version, including alpha/beta/rc tags version = release = '4.32' -rst_prolog = f""" - -.. |compose_ver| replace:: {release} -.. |project_name| replace:: {project_name} -.. |project_name_full| replace:: {project_name_full} - -""" - # -- General configuration --------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be @@ -97,6 +86,11 @@ def setup(app): 'epub.unknown_project_files', ] +linkcheck_ignore = [ + r'http://localhost(:\d+)?(/.*)?$', + r'https://localhost(:\d+)?(/.*)?$', +] + redirects = { 'more/roadmap/index': 'https://changelog.ds-wizard.org', diff --git a/docs/index.rst b/docs/index.rst index 198c5dc..6aa604a 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,15 +1,15 @@ -|project_name| User Guide +DSW User Guide ************************* -The |project_name_full| is a tool that helps researchers and data stewards create data management plans (DMPs) easily, efficiently, and in a FAIR manner. +The Data Stewardship Wizard is a tool that helps researchers and data stewards create data management plans (DMPs) easily, efficiently, and in a FAIR manner. Data stewards can easily capture the knowledge, including required project data and decisions in knowledge models that are then turned into per-project questionnaires to be filled by researchers. The questionnaires guide researchers through the process using recommendations, FAIR metrics indications, and only showing relevant questions based on previous answers. -Once the questionnaire is completed, a DMP can be easily generated using a selected template and output format. The document is then stored in |project_name| for easy access and future reference. This is especially helpful because many funding agencies now require a DMP for their application process. +Once the questionnaire is completed, a DMP can be easily generated using a selected template and output format. The document is then stored in DSW for easy access and future reference. This is especially helpful because many funding agencies now require a DMP for their application process. -But the benefits of using |project_name| go beyond just creating a DMP. Researchers also learn how to handle data correctly, make it FAIR, maintain it throughout the project, and curate it long-term. This intelligent, guided, and efficient approach to composing DMPs is useful for ELIXIR nodes, research institutions, and individual researchers alike. +But the benefits of using DSW go beyond just creating a DMP. Researchers also learn how to handle data correctly, make it FAIR, maintain it throughout the project, and curate it long-term. This intelligent, guided, and efficient approach to composing DMPs is useful for ELIXIR nodes, research institutions, and individual researchers alike. -You are welcome to join the `Discord community `__ where you can ask questions, share your experience, and get help from other users and administrators of |project_name|. +You are welcome to join the `Discord community `__ where you can ask questions, share your experience, and get help from other users and administrators of DSW. .. youtube:: gcSPG_dyVUQ :width: 100% @@ -22,8 +22,8 @@ Structure of the Guide The guide sections are organized into three categories: - **About** contains an introduction to the Data Stewardship Wizard and its content to gain quick insight into how it works at a high level. -- **Application** is structured the same way as |project_name|'s main menu to quickly find the relevant sections about how to use a specific part of the application. -- **More** contains all additional information related to |project_name|, such as development roadmap, how to develop own content, or how to run own instance. +- **Application** is structured the same way as DSW's main menu to quickly find the relevant sections about how to use a specific part of the application. +- **More** contains all additional information related to DSW, such as development roadmap, how to develop own content, or how to run own instance. Here are some recommended sections where to start based on the role: diff --git a/docs/more/development/contributing.rst b/docs/more/development/contributing.rst index 9ef80c0..6351917 100644 --- a/docs/more/development/contributing.rst +++ b/docs/more/development/contributing.rst @@ -2,7 +2,7 @@ Contributing ************ -Interested in contributing to the |project_name| development? +Interested in contributing to the DSW development? ---- @@ -22,7 +22,7 @@ In case you find some bug, please `create an issue `__. However, never include sensitive information in the issue as it is publicly available. Such information (e.g. logs) send to us via e-mail `support@ds-wizard.org `__. +If you find an security issue within DSW, please `create appropriate issue `__. However, never include sensitive information in the issue as it is publicly available. Such information (e.g. logs) send to us via e-mail `support@ds-wizard.org `__. Development =========== @@ -42,9 +42,9 @@ Our projects are open source and you can contribute via GitHub (fork and pull re Test Policy =========== -Testing is essential to ensure the successful construction and implementation of |project_name|. It is necessary to keep tests updated together with new features and other changes in the code. +Testing is essential to ensure the successful construction and implementation of DSW. It is necessary to keep tests updated together with new features and other changes in the code. -Each component may use its own test suite (unit tests, acceptance tests, integration tests), which shall be described in the CONTRIBUTING file within the corresponding repository. To test all components together, we have the `E2E test suite `__ (Cypress) that tests according to various use cases, i.e., what can a user do within |project_name| using its web user interface. +Each component may use its own test suite (unit tests, acceptance tests, integration tests), which shall be described in the CONTRIBUTING file within the corresponding repository. To test all components together, we have the `E2E test suite `__ (Cypress) that tests according to various use cases, i.e., what can a user do within DSW using its web user interface. Whenever a new feature is developed, it must be covered by tests. For the E2E test suite, a specific sub-task is created in our JIRA when applicable. All components must pass all tests before releasing (including release candidate versions). diff --git a/docs/more/development/document-templates/dev-notes.rst b/docs/more/development/document-templates/dev-notes.rst index 62fcd3f..d39cd06 100644 --- a/docs/more/development/document-templates/dev-notes.rst +++ b/docs/more/development/document-templates/dev-notes.rst @@ -34,7 +34,7 @@ Misplaced Content in PDF **Issue**: It may happen that content is placed over header/footer or incorrectly split between pages. -**Recommendations**: First, avoid incorrect HTML structures such as empty list items, nested paragraphs, tables without ``tbody`` etc. Then also make sure that the page, footer and header sizes are correctly set via CSS. Similarly, you can prevent page break using CSS. In case of issues, also refer to the :ref:`WeasyPrint step ` or directly the `WeasyPrint documentation `_. +**Recommendations**: First, avoid incorrect HTML structures such as empty list items, nested paragraphs, tables without ``tbody`` etc. Then also make sure that the page, footer and header sizes are correctly set via CSS. Similarly, you can prevent page break using CSS. In case of issues, also refer to the :ref:`WeasyPrint step ` or directly the `WeasyPrint documentation `_. Issues with PDF Formatting @@ -73,4 +73,3 @@ Compressing Images in MS Word Documents **Issue**: Uncompressed images in MS Word documents can significantly increase the file size, often making it much larger than the original HTML or PDF version. **Recommendations**: In the ``reference.docx`` document, you can adjust the image compression level to reduce the file size. To do this, open the document ``reference.docx`` and click on an image. Then, navigate to ``Picture Format`` -> ``Compress Pictures`` in the ``Adjust`` group. In the dialog box, you can select the desired compression level. Alternatively, you can set the default compression level for all images in the document. This will ensure that images are compressed when the document is saved. - \ No newline at end of file diff --git a/docs/more/development/document-templates/document-worker-plugins.rst b/docs/more/development/document-templates/document-worker-plugins.rst index 8d891c2..ea264a6 100644 --- a/docs/more/development/document-templates/document-worker-plugins.rst +++ b/docs/more/development/document-templates/document-worker-plugins.rst @@ -3,7 +3,7 @@ Document Worker Plugins ======================= -It is possible to extend functionality of |project_name| by implementing own plugins according to the instructions and thus add new features to the application. This requires technical knowledge and experience with the relevant technologies used in |project_name| (such as Python or Docker). You should not consider developing plugins unless you are familiar with programming and also will be committed to maintaining the plugin in the future. +It is possible to extend functionality of DSW by implementing own plugins according to the instructions and thus add new features to the application. This requires technical knowledge and experience with the relevant technologies used in DSW (such as Python or Docker). You should not consider developing plugins unless you are familiar with programming and also will be committed to maintaining the plugin in the future. .. note:: diff --git a/docs/more/development/document-templates/index.rst b/docs/more/development/document-templates/index.rst index 55a8aa1..bfaa2a7 100644 --- a/docs/more/development/document-templates/index.rst +++ b/docs/more/development/document-templates/index.rst @@ -3,7 +3,7 @@ Document Template Development ***************************** -Document templates allows to specify how to export a questionnaire in form of a textual file. It is a highly flexible element of the tool; however, the development requires basic programming skills with Jinja2 templating language. We can develop the document templates either on our local computer (traditional development with text editor or IDE) with use of the :doc:`./tdk` (TDK) or directly in |project_name| using :doc:`../../../application/document-templates/editors/index`. +Document templates allow us to specify how to export a questionnaire in the form of a textual file. It is a highly flexible element of the tool; however, the development requires basic programming skills with Jinja2 templating language. We can develop the document templates either on our local computer (traditional development with text editor or IDE) with use of the :doc:`./tdk` (TDK) or directly in DSW using :doc:`../../../application/document-templates/editors/index`. Every document template is based on the :doc:`template specification` and typically uses the :doc:`document context` to query information from a project (questionnaire replies, knowledge model, metadata, etc.) to create a document. diff --git a/docs/more/development/document-templates/specification.rst b/docs/more/development/document-templates/specification.rst index 3766c3e..5808043 100644 --- a/docs/more/development/document-templates/specification.rst +++ b/docs/more/development/document-templates/specification.rst @@ -3,7 +3,7 @@ Document Template Specification ******************************* -Each document template in |project_name| has metadata stored. If developing locally with :doc:`./tdk`, you can find and manage them in ``template.json`` file. In case of using :doc:`../../../application/document-templates/editors/index`, you can manage them on **Settings** tab. +Each document template in DSW has metadata stored. If developing locally with :doc:`./tdk`, you can find and manage them in ``template.json`` file. In case of using :doc:`../../../application/document-templates/editors/index`, you can manage them on **Settings** tab. Specification Structure @@ -17,10 +17,10 @@ Specification Structure * ``description`` = short description of the template * ``license`` = name of the used license * ``readme`` = longer description usually containing changelog -* ``metamodelVersion`` = supported version of template metamodel, it affects with which |project_name| version is can be used +* ``metamodelVersion`` = supported version of template metamodel, it affects with which DSW version is can be used * ``allowedPackages`` = list of package filters (see :ref:`document-template-package-filter`) to specify supported packages * ``formats`` = list of available formats (see below :ref:`document-template-format`) with specified steps for generation -* ``_tdk`` = TDK configuration for local development (not stored in |project_name|, see :ref:`tdk-config`) +* ``_tdk`` = TDK configuration for local development (not stored in DSW, see :ref:`tdk-config`) .. NOTE:: @@ -79,7 +79,7 @@ Each step of template produces output based on its (optional) input and options. TDK Config ---------- -Those are local-only metadata used for development of the template. You can use them in versioned ``template.json`` but those are never stored directly in |project_name|. +Those are local-only metadata used for development of the template. You can use them in versioned ``template.json`` but those are never stored directly in DSW. * ``version``: metadata version for needs of migrations * ``readmeFile``: files used to get content for ``readme`` of the template, usually ``README.md`` @@ -93,7 +93,7 @@ Document Template Metamodel Versions Here are described the changes in metamodel for template specification as well as :doc:`document context` so developers can easily update their templates to a newer metamodel version when needed. It is also possible to check JSON schemas in higher detail, see :doc:`../metamodel-schemas`. -Version 18.2 (since 4.31.0) +Version 18.2 (since 4.33.0) --------------------------- * Added: @@ -222,4 +222,4 @@ Version 2 (since 2.6.0) Version 1 (since 2.5.0) ----------------------- -* Initial version of metamodel, introduced in |project_name| 2.5.0 as start of versioning. +* Initial version of metamodel, introduced in DSW 2.5.0 as start of versioning. diff --git a/docs/more/development/document-templates/steps/excel.rst b/docs/more/development/document-templates/steps/excel.rst index 32a3fe8..209d7eb 100644 --- a/docs/more/development/document-templates/steps/excel.rst +++ b/docs/more/development/document-templates/steps/excel.rst @@ -74,7 +74,7 @@ Notes: - ``active_sheet`` is an index of sheet to be active when document is opened. - ``size`` sets the default `window size `__. -- ``tab_ratio`` sets `ratio `__ between the worksheet tabs and the horizontal slider. +- ``tab_ratio`` sets `ratio `__ between the worksheet tabs and the horizontal slider. Definitions ----------- @@ -170,17 +170,17 @@ The possible ``options`` are: `protect `__, `zoom `__, `tab_color `__, - `page_view `__, + `page_view `__, `select `__, `hide `__ - Print: ``orientation`` - (`landspace `__ + (`landscape `__ or - `portrait `__), - `paper `__, - `margins `__, - `header `__, - `footer `__, + `portrait `__), + `paper `__, + `margins `__, + `header `__, + `footer `__, `center_horizontally `__, `center_vertically `__ @@ -207,17 +207,17 @@ The possible ``options`` are: `protect `__, `zoom `__, `tab_color `__, - `page_view `__, + `page_view `__, `select `__, `hide `__ - Print (common): ``orientation`` - (`landspace `__ + (`landscape `__ or - `portrait `__), - `paper `__, - `margins `__, - `header `__, - `footer `__, + `portrait `__), + `paper `__, + `margins `__, + `header `__, + `footer `__, `center_horizontally `__, `center_vertically `__ - Basic: @@ -433,4 +433,3 @@ Example .. |badge-status| image:: https://img.shields.io/badge/status-stable-green .. |badge-metamodel| image:: https://img.shields.io/badge/metamodel%20version-%E2%89%A5%2011-blue - diff --git a/docs/more/development/document-templates/steps/jinja.rst b/docs/more/development/document-templates/steps/jinja.rst index 57c139e..3d2056a 100644 --- a/docs/more/development/document-templates/steps/jinja.rst +++ b/docs/more/development/document-templates/steps/jinja.rst @@ -26,7 +26,7 @@ Options Optional: -- ``jinja-ext`` = comma-separated list of `Jinja2 extensions `__ to be enabled (supported values: ``debug``) +- ``jinja-ext`` = comma-separated list of `Jinja2 extensions `__ to be enabled (supported values: ``debug``) - ``i18n-dir`` = location (relative to template root) of translations - ``i18n-domain`` = domain string of translations - ``i18n-lang`` = language code used in the template @@ -113,12 +113,12 @@ Every ``Asset`` object returned by ``assets()`` function has the following attri Filters ------- -Within Jinja templates, you can use so-called `filters `__.Basically, those are functions applied to a first argument using pipe ``|`` symbol. +Within Jinja templates, you can use so-called `filters `__. Basically, those are functions applied to a first argument using pipe ``|`` symbol. Builtin Filters ~~~~~~~~~~~~~~~ -There are several widely used `builtin filters `__ directly in Jinja. +There are several widely used `builtin filters `__ directly in Jinja. Value Conversion ~~~~~~~~~~~~~~~~ @@ -240,7 +240,7 @@ These filters are more complex and add various support to template development. Tests ----- -Within Jinja templates, you can use so-called `tests `__. Basically, those are helpers usable in conditions after ``is`` keyword: +Within Jinja templates, you can use so-called `tests `__. Basically, those are helpers usable in conditions after ``is`` keyword: .. code:: jinja @@ -252,7 +252,7 @@ Within Jinja templates, you can use so-called `tests `__ directly in Jinja. +There are several widely used `builtin tests `__ directly in Jinja. Custom Tests ~~~~~~~~~~~~ @@ -312,7 +312,7 @@ Notes ===== - All paths (e.g. for ``import`` or ``extends`` in Jinja2 templates are relative from the template root, i.e. directory with ``template.json``). -- The ``do`` `Jinja2 extension `__ is enabled. +- The ``do`` `Jinja2 extension `__ is enabled. - Using file extension ``.j2`` or ``.jinja2`` for templates is just a convention. - The :doc:`document context <../document-context>` is provided in ``ctx`` variable, other variables, filters, and tests are documented in other documents. diff --git a/docs/more/development/document-templates/tdk.rst b/docs/more/development/document-templates/tdk.rst index 92154fd..2334d99 100644 --- a/docs/more/development/document-templates/tdk.rst +++ b/docs/more/development/document-templates/tdk.rst @@ -9,7 +9,7 @@ Template Development Kit * Your favorite text editor or IDE * Template Development Kit (see below) - * |project_name| instance (recommended to have local one) with your admin account + * DSW instance (recommended to have local one) with your admin account * Python 3.10+ (with pip) or Docker Our Template Development Kit (TDK) provides a simple way how to work with templates locally. It is a CLI tool written in Python. @@ -49,11 +49,11 @@ Commands There are these basic commands: * ``config`` = manage shared user configuration (~/.dsw-tdk). -* ``get`` = download a template project with specified template ID from |project_name| -* ``list`` = list all templates (latest versions) from configured |project_name| +* ``get`` = download a template project with specified template ID from DSW +* ``list`` = list all templates (latest versions) from configured DSW * ``new`` = create a new template project, it launches a simple interactive wizard for template metadata -* ``package`` = create a ZIP distribution package from the local template project (ZIP is importable to |project_name| via its web interface) -* ``put`` = upload the local template project to |project_name| (once or continually on-change when ``--watch`` flag is used) +* ``package`` = create a ZIP distribution package from the local template project (ZIP is importable to DSW via its web interface) +* ``put`` = upload the local template project to DSW (once or continually on-change when ``--watch`` flag is used) * ``unpackage`` = extract a ZIP distribution package into the local template project directory * ``verify`` = check the metadata of the local template project @@ -72,7 +72,7 @@ Environment variables and .env file You can use environment variables to authenticate: -* ``DSW_API_URL`` = URL of |project_name| API with which you want to communicate. Hover mouse over your profile name to find the :ref:`About` section where URL is specified. +* ``DSW_API_URL`` = URL of DSW API with which you want to communicate. Hover mouse over your profile name to find the :ref:`About` section where URL is specified. * ``DSW_API_KEY`` = your :ref:`API Key`. Hover mouse over your profile name, click on :guilabel:`User Settings` and then navigate to :guilabel:`API Keys` From there, you can generate a new API Key for the authentication. To make this even easier, you can store those in ``.env`` file in the project root and it will be loaded automatically. Or you can specify the path to a ``.env`` file: diff --git a/docs/more/development/index.rst b/docs/more/development/index.rst index ddc281a..8349c55 100644 --- a/docs/more/development/index.rst +++ b/docs/more/development/index.rst @@ -1,9 +1,9 @@ Development *********** -|project_name| can be extended in many ways and new components and ways of integrations can be developed to support our needs. Besides the API available for everything that can be done in |project_name|, :ref:`integration questions` and :ref:`plugins` can be implemented to get data from outside to |project_name|, or new :ref:`document templates` and :ref:`submission services` can be created to get the data outside of |project_name| in the desired form. +DSW can be extended in many ways and new components and ways of integrations can be developed to support our needs. Besides the API available for everything that can be done in DSW, :ref:`integration questions` and :ref:`plugins` can be implemented to get data from outside to DSW, or new :ref:`document templates` and :ref:`submission services` can be created to get the data outside of DSW in the desired form. -This section provides information on how to develop custom content for |project_name| to fully tailor the tool to our specific requirements. +This section provides information on how to develop custom content for DSW to fully tailor the tool to our specific requirements. ---- diff --git a/docs/more/development/integration-questions/index.rst b/docs/more/development/integration-questions/index.rst index 88eb26a..01ebaf5 100644 --- a/docs/more/development/integration-questions/index.rst +++ b/docs/more/development/integration-questions/index.rst @@ -3,11 +3,11 @@ Integration Questions ********************* -|project_name| can be integrated with other services using so called :ref:`integration question`. The answer to that type of question does not contain only the answer itself but also a link to that external resource (which can be done, for example, using a persistent identifier). Therefore, these answers help clearly understand what the researchers use and promotes interoperability. +DSW can be integrated with other services using so called :ref:`integration question`. The answer to that type of question does not contain only the answer itself but also a link to that external resource (which can be done, for example, using a persistent identifier). Therefore, these answers help clearly understand what the researchers use and promotes interoperability. Examples of such integrations that are used within `Common DSW Knowledge Model `_ is `FAIRsharing `_ or `ROR `_. -There are two ways of how we can connect |project_name| to these services: +There are two ways of how we can connect DSW to these services: - **API** - using an API provided by the external service to search for the results diff --git a/docs/more/development/integration-questions/integration-api.rst b/docs/more/development/integration-questions/integration-api.rst index 7183a88..c23848d 100644 --- a/docs/more/development/integration-questions/integration-api.rst +++ b/docs/more/development/integration-questions/integration-api.rst @@ -1,7 +1,7 @@ Integration Question - API ************************** -:ref:`Integration question` can be connected to an external resource using its API. We can then search for the results from the external service using the |project_name| questionnaire interface. When we select an answer it is not only the text (such as a name of the database), but also a link to the external service to the selected item. The whole flow is denoted in the following diagram. +:ref:`Integration question` can be connected to an external resource using its API. We can then search for the results from the external service using the DSW questionnaire interface. When we select an answer it is not only the text (such as a name of the database), but also a link to the external service to the selected item. The whole flow is denoted in the following diagram. We can use `Jinja2 templating language `_ to construct everything in integrations. We also have this :ref:`cheatsheet` available. @@ -13,7 +13,7 @@ We can use `Jinja2 templating language `__ | Language field added | 4.33.0 | +| 18.2 | *(not published in dsw-schemas)* | Language field added | 4.33.0 | +-------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------+--------+ -| 18.1 | `JSON Schema `__ | Python datetime and zoneinfo support | 4.31.0 | +| 18.1 | *(not published in dsw-schemas)* | Python datetime and zoneinfo support | 4.31.0 | +-------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------+--------+ | 18.0 | `JSON Schema `__ | Renaming project and KM package, PluginIntegration | 4.29.0 | +-------------------+--------------------------------------------------------------------------------------------------------------------------+---------------------------------------------------------+--------+ @@ -109,14 +109,14 @@ Document Context is provided to the document templates by document worker. It co Template (.json file) ===================== -Each template has its descriptor file ``template.json`` which contains all the information about the template, its format(s) and steps how to produce the document(s). It is also versioned by the Template metamodel version number. This file also contains the actual number of the supported version... With local :doc:`./document-templates/index`, we will need to manage the file according to the schema; however, when :doc:`../../application/document-templates/editors/index` are used, we will define it using forms directly in |project_name|. +Each template has its descriptor file ``template.json`` which contains all the information about the template, its format(s) and steps how to produce the document(s). It is also versioned by the Template metamodel version number. This file also contains the actual number of the supported version... With local :doc:`./document-templates/index`, we will need to manage the file according to the schema; however, when :doc:`../../application/document-templates/editors/index` are used, we will define it using forms directly in DSW. +-------------------+------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+--------+ | Metamodel Version | Schema file | Changes (brief) | Since | +===================+==============================================================================================================================+=============================================================+========+ | 18.2 | `JSON Schema `__ | Language field added | 4.33.0 | +-------------------+------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+--------+ -| 18.1 | `JSON Schema `__ | Python datetime and zoneinfo support | 4.31.0 | +| 18.1 | *(not published in dsw-schemas)* | Python datetime and zoneinfo support | 4.31.0 | +-------------------+------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+--------+ | 18.0 | `JSON Schema `__ | Renaming project and KM package, PluginIntegration | 4.29.0 | +-------------------+------------------------------------------------------------------------------------------------------------------------------+-------------------------------------------------------------+--------+ diff --git a/docs/more/development/plugins.rst b/docs/more/development/plugins.rst index 18604d1..d02497b 100644 --- a/docs/more/development/plugins.rst +++ b/docs/more/development/plugins.rst @@ -8,15 +8,15 @@ Plugins The plugins functionality is considered experimental. -This page provides information on how to develop plugins for |project_name|. Information on installing plugins can be found here: :ref:`plugins installation`. +This page provides information on how to develop plugins for DSW. Information on installing plugins can be found here: :ref:`plugins installation`. -If we want to extend |project_name| with new features, we can create plugins that will add the desired functionality. +If we want to extend DSW with new features, we can create plugins that will add the desired functionality. -To develop a plugin, we will need the DSW Plugin SDK, which is a library that will help us create, test, and deploy plugins for |project_name|. The SDK provides a framework for building plugins, as well as documentation and examples to get us started. The DSW Plugin SDK can be found here: https://github.com/ds-wizard/dsw-plugin-sdk. +To develop a plugin, we will need the DSW Plugin SDK, which is a library that will help us create, test, and deploy plugins for DSW. The SDK provides a framework for building plugins, as well as documentation and examples to get us started. The DSW Plugin SDK can be found here: https://github.com/ds-wizard/dsw-plugin-sdk. There are two templates we can use to create a new plugin: -- **DSW Plugin Template**: https://github.com/ds-wizard/dsw-plugin-template - to create plugins that extend |project_name| functionality using only the frontend part. +- **DSW Plugin Template**: https://github.com/ds-wizard/dsw-plugin-template - to create plugins that extend DSW functionality using only the frontend part. - **DSW Plugin Service Template**: https://github.com/ds-wizard/dsw-plugin-service-template - to create plugins that also have a backend service part. If we want to create a plugin using the backend service part, we can either use the Engine Gateway or create a new service from scratch using our preferred framework. The Engine Gateway has its own documentation here: https://github.com/ds-wizard/engine-gateway. diff --git a/docs/more/development/submission-service.rst b/docs/more/development/submission-service.rst index b6fb949..ce5e1cd 100644 --- a/docs/more/development/submission-service.rst +++ b/docs/more/development/submission-service.rst @@ -5,7 +5,7 @@ Submission Service Users with permission to manage settings can configure submission services using :doc:`../../application/administration/settings/content/document-submission`. The configured HTTP request is then used when a user clicks :guilabel:`Submit` for an allowed document for submission and selected the desired submission service. The document is sent as a body of the request (or as multipart, based on the configuration) to the external service that should process it and return HTTP response with status code, and possibly also the `Location` header and some textual message. -Usually, we will need a simple proxy service to be developed that will accommodate this to API of some information system, database, storage, or other service. For example, such a proxy service will be able to receive the JSON documents from |project_name|, retrieve additional information through |project_name| API as needed, transform it to some other resulting artifact and store it in some local database that is used by other systems. +Usually, we will need a simple proxy service to be developed that will accommodate this to API of some information system, database, storage, or other service. For example, such a proxy service will be able to receive the JSON documents from DSW, retrieve additional information through DSW API as needed, transform it to some other resulting artifact and store it in some local database that is used by other systems. Example Submission Services =========================== diff --git a/docs/more/development/vulnerabilities.rst b/docs/more/development/vulnerabilities.rst index 2da48ab..7c6b514 100644 --- a/docs/more/development/vulnerabilities.rst +++ b/docs/more/development/vulnerabilities.rst @@ -39,7 +39,7 @@ Basic Hints for Security * Change or remove default users * Adjust default role after registrations based on your needs -* Provide |project_name| through proxy with HTTPS (both client and server application) +* Provide DSW through proxy with HTTPS (both client and server application) * Backup data regularly (e.g. daily) * Use secured SMTP (SSL) * Use strong passwords, esp. for administrator accounts diff --git a/docs/more/miscellaneous/dsw-registry.rst b/docs/more/miscellaneous/dsw-registry.rst index d5317bd..b4acb35 100644 --- a/docs/more/miscellaneous/dsw-registry.rst +++ b/docs/more/miscellaneous/dsw-registry.rst @@ -3,14 +3,14 @@ DSW Registry ************ -`DSW Registry `_ is a place where we publish knowledge models, document templates and locales. It is very easy to get those into a |project_name| instance and use. +`DSW Registry `_ is a place where we publish knowledge models, document templates and locales. It is very easy to get those into a DSW instance and use. .. figure:: dsw-registry/dsw-registry.png DSW Registry with a list of knowledge models. -We first need to connect our |project_name| instance to the DSW Registry in :ref:`DSW Registry Settings`. Once we have that, we can: +We first need to connect our DSW instance to the DSW Registry in :ref:`DSW Registry Settings`. Once we have that, we can: - :ref:`Import knowledge models from DSW Registry` - :ref:`Import document templates from DSW Registry` diff --git a/docs/more/miscellaneous/help.rst b/docs/more/miscellaneous/help.rst index bf5d81a..2e63ffc 100644 --- a/docs/more/miscellaneous/help.rst +++ b/docs/more/miscellaneous/help.rst @@ -8,6 +8,6 @@ Still need help? Or you think that some topic is missing? Do not hesitate to con The best way to reach us is by sending an email to info@ds-wizard.org. -In case you found a bug, vulnerability, or have a generic question related directly to |project_name| tool - please `create a GitHub issue `__ and also visit :doc:`../development/contributing` section. +In case you found a bug, vulnerability, or have a generic question related directly to DSW tool - please `create a GitHub issue `__ and also visit :doc:`../development/contributing` section. For feature requests, we recommend using the `Ideas page `__. diff --git a/docs/more/miscellaneous/index.rst b/docs/more/miscellaneous/index.rst index 7c71bb8..15c09f3 100644 --- a/docs/more/miscellaneous/index.rst +++ b/docs/more/miscellaneous/index.rst @@ -1,7 +1,7 @@ Miscellaneous ************* -Additional information related to |project_name| that might be useful. +Additional information related to DSW that might be useful. ---- diff --git a/docs/more/miscellaneous/jinja-cheatsheet.rst b/docs/more/miscellaneous/jinja-cheatsheet.rst index 70588b3..ff739a3 100644 --- a/docs/more/miscellaneous/jinja-cheatsheet.rst +++ b/docs/more/miscellaneous/jinja-cheatsheet.rst @@ -3,7 +3,7 @@ Jinja Cheatsheet **************** -We can use Jinja templating language in :guilabel:`Response Item Template` and in :guilabel:`Response Item Template for Selection` (under :guilabel:`Advanced Response Configuration`) fields in |project_name|. Here you can get a basic overview of what can be achieved with Jinja. +We can use Jinja templating language in :guilabel:`Response Item Template` and in :guilabel:`Response Item Template for Selection` (under :guilabel:`Advanced Response Configuration`) fields in DSW. Here you can get a basic overview of what can be achieved with Jinja. For more information about Jinja templating language, visit the `official Jinja documentation `_. diff --git a/docs/more/miscellaneous/markdown-cheatsheet.rst b/docs/more/miscellaneous/markdown-cheatsheet.rst index b581d2d..a4bac2b 100644 --- a/docs/more/miscellaneous/markdown-cheatsheet.rst +++ b/docs/more/miscellaneous/markdown-cheatsheet.rst @@ -3,7 +3,7 @@ Markdown Cheatsheet ******************* -Various text fields in |project_name| can be formatted by using Markdown formatting language. Here you can get a basic overview of what can be achieved with Markdown. +Various text fields in DSW can be formatted by using Markdown formatting language. Here you can get a basic overview of what can be achieved with Markdown. Basic Syntax ============ @@ -163,7 +163,7 @@ These are the basic Markdown elements supported by all applications. Extended Syntax =============== -These elements extending the basic syntax are supported in |project_name|. +These elements extending the basic syntax are supported in DSW. .. raw:: html diff --git a/docs/more/self-hosted-dsw/configuration/configuration.rst b/docs/more/self-hosted-dsw/configuration/configuration.rst index 69b1762..b552154 100644 --- a/docs/more/self-hosted-dsw/configuration/configuration.rst +++ b/docs/more/self-hosted-dsw/configuration/configuration.rst @@ -55,7 +55,7 @@ This configuration section is used only by **Server** and covers basic configura If we need to change our ``secret``, we need also replace all values encrypted by the secret that is stored in the database as follows: 1. Note somewhere values from Settings: Client ID and Client Secret of OpenID configurations, Registry token, etc. Adjust the settings that the values are not there (recommended; e.g., remove OpenID configuration), and save it. -2. Change the ``secret`` in the configuration file and restart the |project_name| server (re-create the container if using Docker). +2. Change the ``secret`` in the configuration file and restart the DSW server (re-create the container if using Docker). 3. Adjust the settings back to our previous values. 4. If we also use some “user properties” (for the Document Submission feature), let our users know to change the values in their profiles. @@ -99,7 +99,7 @@ Information for connection to S3 storage (used for document and document templat :type: String :default: ``engine-wizard`` - Bucket name used by |project_name| + Bucket name used by DSW .. WARNING:: @@ -129,7 +129,7 @@ This configuration section is used only by **Mailer**. It must be filled with SM :type: String - Name of the |project_name| instance that will be used as “senders name” in email headers. + Name of the DSW instance that will be used as “senders name” in email headers. .. confval:: mail.email @@ -280,7 +280,7 @@ This configuration section is used only by **Document Worker**. It allows us to :type: String :default: ``Data Stewardship Wizard`` - Name of the service operating the |project_name| instance. + Name of the service operating the DSW instance. .. confval:: documentContext.serviceNameShort @@ -288,7 +288,7 @@ This configuration section is used only by **Document Worker**. It allows us to :type: String :default: ``DSW`` - Short name of the service operating the |project_name| instance. + Short name of the service operating the DSW instance. .. confval:: documentContext.serviceUrl @@ -296,7 +296,7 @@ This configuration section is used only by **Document Worker**. It allows us to :type: String :default: ``https://ds-wizard.org`` - URL of the service operating the |project_name| instance. + URL of the service operating the DSW instance. .. confval:: documentContext.serviceDomainName @@ -304,7 +304,7 @@ This configuration section is used only by **Document Worker**. It allows us to :type: String :default: ``ds-wizard.org`` - Domain name of the service operating the |project_name| instance. + Domain name of the service operating the DSW instance. .. confval:: documentContext.defaultPrimaryColor @@ -352,7 +352,7 @@ This configuration section is used only by **Document Worker**. It allows us to Integrations Configuration ========================== -Integrations in the |project_name| use external APIs. Sometimes, we might need some configured variables, such as API keys or endpoints. For example, integration with ID ``dbase`` might use the following configuration. +Integrations in the DSW use external APIs. Sometimes, we might need some configured variables, such as API keys or endpoints. For example, integration with ID ``dbase`` might use the following configuration. .. CODE-BLOCK:: yaml @@ -372,7 +372,7 @@ There can be multiple integrations configured in a single file. These can be use Client Configuration ==================== -If we are running the client app using “With Docker”, the all we need is to specify ``API_URL`` environment variable inside ``docker-compose.yml``. In case we want to run the client locally, we need to create a ``config.js`` file in the project root: +If we are running the client app using “With Docker”, all we need is to specify the ``API_URL`` environment variable inside ``docker-compose.yml``. In case we want to run the client locally, we need to create a ``config.js`` file in the project root: .. CODE-BLOCK:: javascript @@ -458,4 +458,3 @@ Once we have the file ready, we need to mount it into the container: dsw-client: volumes: - /path/to/head-extra.html:/src/head-extra.html - diff --git a/docs/more/self-hosted-dsw/configuration/document-templates.rst b/docs/more/self-hosted-dsw/configuration/document-templates.rst index 7e9308c..98d32c4 100644 --- a/docs/more/self-hosted-dsw/configuration/document-templates.rst +++ b/docs/more/self-hosted-dsw/configuration/document-templates.rst @@ -3,4 +3,4 @@ Document Templates ****************** -We can freely customize and style templates of documents (DMPs). HTML and CSS knowledge is required, and for doing more complex templates that use some conditions, loops, or macros, knowledge of `Jinja templating language `__ (pure Python implementation) is useful. For more information, please read :ref:`the following section`. +We can freely customize and style templates of documents (DMPs). HTML and CSS knowledge is required, and for doing more complex templates that use some conditions, loops, or macros, knowledge of `Jinja templating language `__ (pure Python implementation) is useful. For more information, please read :ref:`the following section`. diff --git a/docs/more/self-hosted-dsw/configuration/email-templates.rst b/docs/more/self-hosted-dsw/configuration/email-templates.rst index 57e32a1..50f2e9f 100644 --- a/docs/more/self-hosted-dsw/configuration/email-templates.rst +++ b/docs/more/self-hosted-dsw/configuration/email-templates.rst @@ -3,7 +3,7 @@ Email Templates *************** -Similarly to document templates, we can customize templates for emails sent by the Wizard located in ``templates`` folder. It also uses `Jinja templating language `__. And we can create HTML template, Plain Text template, add attachments, and add inline images (which can be used inside the HTML using `Content-ID `__ equal to the filename). We can learn more about the template structure and contents directly from `the mailer GitHub repository `__. +Similarly to document templates, we can customize templates for emails sent by the Wizard located in ``templates`` folder. It also uses `Jinja templating language `__. And we can create HTML template, Plain Text template, add attachments, and add inline images (which can be used inside the HTML using `Content-ID `__ equal to the filename). We can learn more about the template structure and contents directly from `the mailer GitHub repository `__. Including our own email templates while using dockerized Wizard is practically the same as for DMP templates. We can also bind whole ``templates`` folders. (or even ``templates`` if we want to change both): @@ -19,4 +19,3 @@ Including our own email templates while using dockerized Wizard is practically t - ./config/application.yml:/app/config/application.yml:ro - ./templates:/home/user/templates:ro # ... (continued) - diff --git a/docs/more/self-hosted-dsw/configuration/index.rst b/docs/more/self-hosted-dsw/configuration/index.rst index c7ab366..f9fdc15 100644 --- a/docs/more/self-hosted-dsw/configuration/index.rst +++ b/docs/more/self-hosted-dsw/configuration/index.rst @@ -1,7 +1,7 @@ Configuration ************* -This section explains how to configure |project_name| instance on your own. +This section explains how to configure DSW instance on your own. .. _config-settings: diff --git a/docs/more/self-hosted-dsw/configuration/plugins.rst b/docs/more/self-hosted-dsw/configuration/plugins.rst index c38fcae..ca44109 100644 --- a/docs/more/self-hosted-dsw/configuration/plugins.rst +++ b/docs/more/self-hosted-dsw/configuration/plugins.rst @@ -8,7 +8,7 @@ Plugins The plugins functionality is considered experimental. -This page provides information on how to install plugins for |project_name|. Information on developing plugins can be found here: :ref:`plugins development`. +This page provides information on how to install plugins for DSW. Information on developing plugins can be found here: :ref:`plugins development`. There are available plugins to extend the functionality of the base DSW. diff --git a/docs/more/self-hosted-dsw/deployment.rst b/docs/more/self-hosted-dsw/deployment.rst index d51f558..977ac17 100644 --- a/docs/more/self-hosted-dsw/deployment.rst +++ b/docs/more/self-hosted-dsw/deployment.rst @@ -4,7 +4,7 @@ Deployment ********** -Own |project_name| Instance +Own DSW Instance =========================== .. WARNING:: @@ -23,7 +23,7 @@ The simplest way is to use `Docker Compose `__ 1. Clone the `DSW Deployment Example `__ repository 2. Check config files (described in :doc:`./configuration/configuration`) -3. Run the |project_name| with Docker compose ``docker-compose up -d`` +3. Run the DSW with Docker compose ``docker-compose up -d`` 4. After starting up, we will be able to open the Wizard in our browser on http://localhost:8080 5. We can use ``docker-compose logs`` to see the logs and ``docker-compose down`` to stop all the services @@ -55,16 +55,16 @@ We can use those accounts for testing or initially make our own admin account an .. WARNING:: - Having a public instance with default accounts is a **security risk**. We should delete or change default accounts (mainly Albert Einstein) if our |project_name| instance is public as soon as possible. + Having a public instance with default accounts is a **security risk**. We should delete or change default accounts (mainly Albert Einstein) if our DSW instance is public as soon as possible. .. NOTE:: - Do not use UIDs below 10000 as that might introduce a `security risk `__. + Do not use UIDs below 10000 as that might introduce a `security risk `__. DSW Registry ------------ -When we have our own self-hosted instance, it is essential to register within the `DSW Registry `__. It is a source of shared knowledge models, document templates, and locales that can support our deployment. The registry is also integrated inside the |project_name|. Therefore, we can easily pull new versions from the |project_name|. The registration can be done either directly in our |project_name| instance in Settings or via the DSW Registry website. +When we have our own self-hosted instance, it is essential to register within the `DSW Registry `__. It is a source of shared knowledge models, document templates, and locales that can support our deployment. The registry is also integrated inside the DSW. Therefore, we can easily pull new versions from the DSW. The registration can be done either directly in our DSW instance in Settings or via the DSW Registry website. Initial Knowledge Model, Document Templates, and Locales @@ -82,7 +82,7 @@ If we want to regularly backup our database (and we should!), all we need to do Deployment Requirements ----------------------- -The following requirements were estimated using `limiting Docker resources `__ provided to containers. +The following requirements were estimated using `limiting Docker resources `__ provided to containers. +-----------------+----------------+----------------+ | Component | Minimal | Recommended | diff --git a/docs/more/self-hosted-dsw/faq-notes.rst b/docs/more/self-hosted-dsw/faq-notes.rst index bb610e2..d22ad14 100644 --- a/docs/more/self-hosted-dsw/faq-notes.rst +++ b/docs/more/self-hosted-dsw/faq-notes.rst @@ -19,7 +19,7 @@ Why I cannot upload locales/templates and document generation fails? You probably have some issue with S3 configuration or its deployment. Also, check whether you have S3 bucket present with correct name. -Why I cannot download files from |project_name| or generate document preview? +Why I cannot download files from DSW or generate document preview? ----------------------------------------------------------------------------- Your S3 is probably not accessible by users. The S3 URL configured in :ref:`config-server` should be reachable so users can download something from the storage. @@ -32,9 +32,9 @@ Please use the `PostgreSQL documentation `_ to There is some issue with the MinIO S3 storage; what should I do? ---------------------------------------------------------------- -Please use the `MinIO documentation `_ to check the cause, various things may have happened... especially if you tried to upgrade the storage version. +Please use the `MinIO documentation `_ to check the cause, various things may have happened... especially if you tried to upgrade the storage version. -I upgraded |project_name| and now it does not work properly, what should I do? +I upgraded DSW and now it does not work properly, what should I do? ------------------------------------------------------------------------------ You should always check :doc:`upgrade-guidelines` before upgrading, be sure that you followed all steps. In case you forgot and it is not possible to fix it now, you will have to rollback from you backup and do it again by following the guidelines this time. In case you encounter an issue even though you followed the guidelines, that might a bug and please `report it `_. @@ -49,9 +49,9 @@ There are two cases: - You are using a document template from DSW Registry. - You are using your own document template. -For the first case, you need to import newer version from DSW Registry. Templates in Registry are managed by the DSW Team which ensure that they are always up to date. If those are your own document templates, you need to update them according to :ref:`document-template-metamodel-versions`. +For the first case, you need to import a newer version from DSW Registry. Templates in Registry are managed by the DSW Team which ensures that they are always up to date. If those are your own document templates, you need to update them according to :ref:`document-template-metamodel-versions`. -To update from DSW Registry, you need to have in connected with your DSW instance. If you can see the :guilabel:`Update Available` badge, you can update the template. If you cannot see the badge, you should check if you are connected to the DSW Registry. +To update from DSW Registry, you need to have it connected with your DSW instance. If you can see the :guilabel:`Update Available` badge, you can update the template. If you cannot see the badge, you should check if you are connected to the DSW Registry. To connect to the DSW Registry and import new templates from there, you can follow this guide: @@ -79,6 +79,6 @@ Deployment Notes - You should be knowledgeable with at least basics of server management, service operations, work with Docker, and debugging issues (e.g. accessing Docker logs). - The deployment can vary significantly based on needs and available infrastructure, we cannot help with different kinds of deployments and technologies that we are not experts with. -- The deployment example serves for local testing purposes and should not be used as is for production. An expert should deploy |project_name| for production while considering local needs and capabilities. +- The deployment example serves for local testing purposes and should not be used as is for production. An expert should deploy DSW for production while considering local needs and capabilities. - Never update production instance without backups and preferably try the update procedure first on a testing environment. -- Running |project_name| locally is not "free", you need people, time, and infrastructure. With that in mind, consider what `option `_ is the most suitable for you. +- Running DSW locally is not "free", you need people, time, and infrastructure. With that in mind, consider what `option `_ is the most suitable for you. diff --git a/docs/more/self-hosted-dsw/index.rst b/docs/more/self-hosted-dsw/index.rst index 8e5ea2f..8dde7f3 100644 --- a/docs/more/self-hosted-dsw/index.rst +++ b/docs/more/self-hosted-dsw/index.rst @@ -1,11 +1,11 @@ -Self-Hosted |project_name| +Self-Hosted DSW ************************** -This section explains how to deploy, configure, and maintain |project_name| instance on your own. +This section explains how to deploy, configure, and maintain DSW instance on your own. .. NOTE:: - Before going for self-hosted options, it is a good idea to try out |project_name| using `existing providers `_. + Before going for self-hosted options, it is a good idea to try out DSW using `existing providers `_. .. raw:: html diff --git a/docs/more/self-hosted-dsw/upgrade-guidelines.rst b/docs/more/self-hosted-dsw/upgrade-guidelines.rst index 1f71aaf..34dd97a 100644 --- a/docs/more/self-hosted-dsw/upgrade-guidelines.rst +++ b/docs/more/self-hosted-dsw/upgrade-guidelines.rst @@ -3,7 +3,7 @@ Upgrade Guidelines ****************** -Upgrading |project_name| +Upgrading DSW ======================== .. Warning:: @@ -435,7 +435,7 @@ Before updating check following, otherwise the migration will fail: 2.5.X to 2.6.X -------------- -- The document templates including the default ``questionnaire-report`` must be updated from `https://registry.ds-wizard.org/templates `_. +- The document templates including the default ``questionnaire-report`` must be updated from the `DSW Registry `_. - Upgraded template metamodel version 2 requires manual migration of custom templates: - `questionnaireRepliesMap` (map path:Reply) is no longer present in the context @@ -465,8 +465,8 @@ Before updating check following, otherwise the migration will fail: 2.4.X to 2.5.X -------------- -- Document templates have been moved from FS to database. To simplify the transition for custom templates, we added to the Docker image a script that loads templates from FS to the database via |project_name| API. But there are several new information that we need to provide in ``template.json`` file: ``id`` (instead of ``uuid``), ``templateId``, ``organizationId``, ``version`` (semver), ``license``, ``readme`` (Markdown). The ``id`` should be in format ``organizationId:templateId:version``. Please note that this applies only for custom templates, default template can be removed from FS as it is added to the database automatically. The script must be enabled by setting envvar ``ENABLE_TEMPLATE_LOAD `` to ``1`` and ``SERVICE_TOKEN`` according to the configuration. -- Cron is no longer needed for the feedback synchronization (environment variables in ``docker-compose.yml``) as |project_name| schedules synchronization internally. +- Document templates have been moved from FS to database. To simplify the transition for custom templates, we added to the Docker image a script that loads templates from FS to the database via DSW API. But there are several new information that we need to provide in ``template.json`` file: ``id`` (instead of ``uuid``), ``templateId``, ``organizationId``, ``version`` (semver), ``license``, ``readme`` (Markdown). The ``id`` should be in format ``organizationId:templateId:version``. Please note that this applies only for custom templates, default template can be removed from FS as it is added to the database automatically. The script must be enabled by setting envvar ``ENABLE_TEMPLATE_LOAD `` to ``1`` and ``SERVICE_TOKEN`` according to the configuration. +- Cron is no longer needed for the feedback synchronization (environment variables in ``docker-compose.yml``) as DSW schedules synchronization internally. 2.3.X to 2.4.X -------------- @@ -482,7 +482,7 @@ Before updating check following, otherwise the migration will fail: 2.1.X to 2.2.X -------------- -- Configuration of client and several features is now moved from ``application.yml`` file to in-app settings. therefore, it must be reconfigured during upgrade process. Additional ``secret`` must be configured in ``application.yml`` for encryption and JWT tokens (*JWT.secret* section has been removed), see :ref:`config-server` configuration. It is recommended to first add *general.secret* (32 chars secret), start |project_name|, migrate options from ``application.yml`` in-app settings and then optionally clean up ``application.yml`` file. +- Configuration of client and several features is now moved from ``application.yml`` file to in-app settings. therefore, it must be reconfigured during upgrade process. Additional ``secret`` must be configured in ``application.yml`` for encryption and JWT tokens (*JWT.secret* section has been removed), see :ref:`config-server` configuration. It is recommended to first add *general.secret* (32 chars secret), start DSW, migrate options from ``application.yml`` in-app settings and then optionally clean up ``application.yml`` file. - User fields ``name`` and ``surname`` has been renamed to ``firstName`` and ``lastName`` - it needs be updated if used in **custom** mail or document templates. - Recommended version of MongoDB is updated to 4.2.3. @@ -495,7 +495,7 @@ Before updating check following, otherwise the migration will fail: --------------- - Changing the major version actually does not mean any problem in migration, it has been made due to significant internal changes (restructuring, new repositories, etc.) -- If we are using Docker for running |project_name|, we need to change it according to new documentation of :ref:`installation-docker` and :doc:`./configuration/configuration`. +- If we are using Docker for running DSW, we need to change it according to new documentation of :ref:`installation-docker` and :doc:`./configuration/configuration`. - Crontab image is no longer needed. - A DMP template configuration file must contain list of ``allowedKMs`` (see the default *root* template). From 19bf41bc9c8981c3cb3e31ef14546b1ef9c56c38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kry=C5=A1tof=20Komanec?= <54114006+krystofkomanec@users.noreply.github.com> Date: Thu, 6 Aug 2026 16:27:19 +0100 Subject: [PATCH 07/11] Audit facts (#275) --- docs/about/introduction/knowledge-model.rst | 6 ++++-- .../administration/locales/import.rst | 3 +-- .../administration/locales/index.rst | 2 ++ .../administration/roles/index.rst | 21 +++++++------------ .../settings/content/dsw-registry.rst | 4 ++-- .../administration/settings/content/index.rst | 2 +- .../settings/content/projects.rst | 10 +++++++-- docs/application/document-templates/index.rst | 2 +- .../knowledge-models/editors/create.rst | 4 ++-- .../editors/detail/publish.rst | 6 ++++-- .../editors/detail/settings.rst | 13 ++++++------ .../knowledge-models/editors/migration.rst | 2 +- .../knowledge-models/list/detail.rst | 18 ++++++++++++++-- .../knowledge-models/list/index.rst | 15 ++++++------- .../application/profile/settings/language.rst | 2 ++ docs/application/projects/list/create.rst | 2 ++ .../projects/list/detail/metrics.rst | 4 ++-- .../projects/list/detail/settings.rst | 9 +++++++- docs/more/development/metamodel-schemas.rst | 2 +- 19 files changed, 78 insertions(+), 49 deletions(-) diff --git a/docs/about/introduction/knowledge-model.rst b/docs/about/introduction/knowledge-model.rst index 865c8e1..bc89f75 100644 --- a/docs/about/introduction/knowledge-model.rst +++ b/docs/about/introduction/knowledge-model.rst @@ -9,6 +9,8 @@ While all the possibilities are defined in the knowledge model, when researchers Knowledge models are created by data stewards in the :ref:`knowledge model editor`. +Each knowledge model also has a source language. A published knowledge model version can have additional :ref:`locales` so the same questionnaire structure can be shown in different languages. These locales cover texts that are part of the knowledge model, such as question titles, descriptions, answer labels, advice, and resource pages. They do not translate answers typed by users. + Knowledge Model Structure ========================= @@ -154,14 +156,14 @@ Validation is used to define some rules for the answers in Value question type. Reference --------- -References are used to provide additional information for :ref:`questions`. There are three types of references. :ref:`Resource page reference`, :ref:`URL reference`, and :ref:`Cross reference`. resource page references are gathered in the resource collections. +References are used to provide additional information for :ref:`questions`. There are three types of references. :ref:`Resource page reference`, :ref:`URL reference`, and :ref:`Cross reference`. Resource page references are gathered in the resource collections. .. _resource-collection: Resource Collection ^^^^^^^^^^^^^^^^^^^ -Resource collections are used to group together :ref:`resource pages` that are related to each other. Each resource collection has a **title** and has a list of resource pages. Resource collection is created on a level of a Knowledge Model. +Resource collections are used to group together :ref:`resource pages` that are related to each other. Each resource collection has a **title** and has a list of resource pages. Resource collection is created on a level of a knowledge model. .. _resource-page: diff --git a/docs/application/administration/locales/import.rst b/docs/application/administration/locales/import.rst index c5f8aba..5427d1f 100644 --- a/docs/application/administration/locales/import.rst +++ b/docs/application/administration/locales/import.rst @@ -3,7 +3,7 @@ Import Locale ************* -We can import an existing locale by navigating to :menuselection:`Settings → Locales` in the main menu and then clicking on :guilabel:`Import` button on the list of locales. +We can import an existing locale by navigating to :menuselection:`Administration → Locales` in the main menu and then clicking on :guilabel:`Import` button on the list of locales. .. _locale-import-from-registry: @@ -34,4 +34,3 @@ We can import a locale as a ZIP package. Such a package can be created as an exp :width: 500 Input for importing a locale using a ZIP package. - diff --git a/docs/application/administration/locales/index.rst b/docs/application/administration/locales/index.rst index 0f02657..20ac892 100644 --- a/docs/application/administration/locales/index.rst +++ b/docs/application/administration/locales/index.rst @@ -5,6 +5,8 @@ After navigating to :guilabel:`Locales` (under :guilabel:`Administration`), we c The DSW UI and emails can be localized to different languages. The preferred language is determined by the user's browser settings or by the user's profile settings. +These locales are used for the DSW user interface and emails. They are separate from :ref:`knowledge model locales`, which translate questionnaire content provided by a knowledge model. + .. NOTE:: Locales can be used not only for translations but also for customizing the DSW to a specific domain. diff --git a/docs/application/administration/roles/index.rst b/docs/application/administration/roles/index.rst index 6d4fc36..18e7554 100644 --- a/docs/application/administration/roles/index.rst +++ b/docs/application/administration/roles/index.rst @@ -19,13 +19,12 @@ The **Admin** role cannot be changed or deleted. Other default roles can be adju Custom Roles ============ -Users with permission to manage settings can create custom roles when the default roles do not match the way an organization works. A role has a name, an optional description, and selected permissions. +Users with permission to manage settings can create custom roles when the default roles do not match the way an organization works. A role has a name and selected permissions. Custom roles are useful for cases such as: - a data support role that can view or comment on all projects - a user-management role that can manage users without managing settings -- an analytics role that can access reporting without broader administration access - a content-management role that can work with knowledge models or document templates .. TODO:: @@ -35,11 +34,11 @@ Custom roles are useful for cases such as: Role Permissions ================ -Permissions are grouped by the type of work they enable. The available groups depend on the DSW edition and enabled features. +Permissions are grouped by the type of work they enable. Project-related permissions can allow a role to: -- manage project templates +- manage project templates and create projects directly from knowledge models when project creation is restricted to templates - view all projects - comment on all projects - edit all projects @@ -47,21 +46,17 @@ Project-related permissions can allow a role to: Content-related permissions can allow a role to: -- create and use knowledge model editors -- manage knowledge models -- manage knowledge model secrets -- create and use document template editors +- create and use knowledge model editors, including migration and publishing +- manage knowledge models, including knowledge model secrets +- create and use document template editors, including publishing - manage document templates -- manage locales + +The editor permissions require the corresponding management permissions. When we enable **Use Knowledge Model Editor**, the role also needs **Manage Knowledge Models**. When we enable **Use Document Template Editor**, the role also needs **Manage Document Templates**. Administration permissions can allow a role to: - manage users - manage settings -- manage automations -- access audit log -- access integration hub -- access analytics .. TODO:: diff --git a/docs/application/administration/settings/content/dsw-registry.rst b/docs/application/administration/settings/content/dsw-registry.rst index db5fb4e..a6cb5d6 100644 --- a/docs/application/administration/settings/content/dsw-registry.rst +++ b/docs/application/administration/settings/content/dsw-registry.rst @@ -3,11 +3,11 @@ DSW Registry ************ -In these settings, we can configure a connection to DSW Registry that will allow importing various content (Knowledge Models, Document Templates, and Locales) to our DSW instance. +In these settings, we can configure a connection to DSW Registry that will allow importing various content (knowledge models, document templates, and locales) to our DSW instance. Upon enabling the DSW Registry option, we are prompted to enter a **Token**. It can be obtained either by direct registration in the `DSW Registry `__ or by clicking the :guilabel:`Sign up` button. After clicking the button, we will need to enter details about the organization (prefilled from :doc:`../system/organization`) and the email address to which the confirmation will be sent (prefilled with the email of the current user). Then, after clicking a link in the confirmation email, the token will be prefilled automatically. After the token has been filled in either way, we can :guilabel:`Save` the settings. -After successfully setting the DSW Registry, we will see the option to import from it for :ref:`Knowledge Models`, :ref:`Document Templates`, and :ref:`Locales`. +After successfully setting the DSW Registry, we will see the option to import from it for :ref:`knowledge models`, :ref:`document templates`, and :ref:`locales`. .. NOTE:: diff --git a/docs/application/administration/settings/content/index.rst b/docs/application/administration/settings/content/index.rst index 662be5a..25d1157 100644 --- a/docs/application/administration/settings/content/index.rst +++ b/docs/application/administration/settings/content/index.rst @@ -1,7 +1,7 @@ Content Settings **************** -This part of settings allows us to configure various content-related things such as the connection with DSW Registry for easy imports, Knowledge Models, Projects, and Document Submissions as listed below. +This part of settings allows us to configure various content-related things such as the connection with DSW Registry for easy imports, knowledge models, projects, and document submissions as listed below. ---- diff --git a/docs/application/administration/settings/content/projects.rst b/docs/application/administration/settings/content/projects.rst index 91fb4fc..10059db 100644 --- a/docs/application/administration/settings/content/projects.rst +++ b/docs/application/administration/settings/content/projects.rst @@ -34,7 +34,7 @@ If we want to let users select sharing options for their projects within the DSW Anonymous Projects ================== -If we have set Knowledge Model as Public, we can also allow anonymous users to create projects where they will be able to fill questionnaires by enabling **Anonymous Projects**. These anonymous projects then work as any other projects with public link set to edit permissions. However, if a logged-in user accesses such a project, then they may claim the ownership by clicking the :guilabel:`Add to my projects` button. Anonymous users cannot create new documents; for that, they must register and open the project as a logged-in user. +If we have set a knowledge model as public, we can also allow anonymous users to create projects where they will be able to fill questionnaires by enabling **Anonymous Projects**. These anonymous projects then work as any other projects with public link set to edit permissions. However, if a logged-in user accesses such a project, then they may claim the ownership by clicking the :guilabel:`Add to my projects` button. Anonymous users cannot create new documents; for that, they must register and open the project as a logged-in user. Project Creation @@ -50,7 +50,13 @@ Summary Report We can turn **Summary Report** on or off. It is a feature that allows users to generate and see a **Summary Report** in their projects. -The **Summary Report** shows how many questions are answered and unanswered in each chapter. It can either count all questions in the Knowledge Model or only the questions required for the project’s current phase. Questions from later phases are ignored in the phase-based view. If a parent question is unanswered, its child questions are not counted separately. Chapter results are combined into the total **Summary Report**. +The **Summary Report** shows how many questions are answered and unanswered in each chapter. It can either count all questions in the knowledge model or only the questions required for the project’s current phase. Questions from later phases are ignored in the phase-based view. If a parent question is unanswered, its child questions are not counted separately. Chapter results are combined into the total **Summary Report**. + + +Feedback +======== + +If enabled, users can submit feedback for questions to a configured GitHub repository. The configuration includes the **GitHub Repository Owner**, **GitHub Repository Name**, and **Access Token**. Project Tagging diff --git a/docs/application/document-templates/index.rst b/docs/application/document-templates/index.rst index 6a3c130..3468ca7 100644 --- a/docs/application/document-templates/index.rst +++ b/docs/application/document-templates/index.rst @@ -3,7 +3,7 @@ Document Templates ****************** -This section is about managing the document templates and document template editors. Similarly to Knowledge Models, we can manage :doc:`./list/index` or work on new or customize existing templates using :doc:`./editors/index`. +This section is about managing the document templates and document template editors. Similarly to knowledge models, we can manage :doc:`./list/index` or work on new or customize existing templates using :doc:`./editors/index`. ---- diff --git a/docs/application/knowledge-models/editors/create.rst b/docs/application/knowledge-models/editors/create.rst index b069cfe..75fb967 100644 --- a/docs/application/knowledge-models/editors/create.rst +++ b/docs/application/knowledge-models/editors/create.rst @@ -11,12 +11,12 @@ We can create a new knowledge model editor by navigating to :menuselection:`Know Form for creating a new knowledge model. -Every knowledge model needs to have a **name**, a **knowledge model ID** and **version**. The name should be something descriptive to help users understand what the knowledge model is about. The knowledge model ID is used for the identification together with the :ref:`organization ID` and knowledge model version after it is published. So the identifier of the knowledge model is: +Every knowledge model needs to have a **name**, a **knowledge model ID**, **version**, and **language**. The name should be something descriptive to help users understand what the knowledge model is about. The language is the source language of the knowledge model content. The knowledge model ID is used for the identification together with the :ref:`organization ID` and knowledge model version after it is published. So the identifier of the knowledge model is: .. code:: :: -We can create a new knowledge model editor either from scratch, i.e. the new knowledge model will be empty and we will build it all ourselves, or based on an existing knowledge model, which means that everything from the chosen knowledge model will be copied to ours. We can start from there and add, delete, or modify the existing entities in there. We just need to choose the original knowledge model in the **Based on** field. Alternatively, we can open the :ref:`knowledge model detail` and click on :guilabel:`Fork KM` there. +We can create a new knowledge model editor either from scratch, i.e. the new knowledge model will be empty and we will build it all ourselves, or based on an existing knowledge model, which means that everything from the chosen knowledge model will be copied to ours. We can start from there and add, delete, or modify the existing entities in there. We just need to choose the original knowledge model in the **Based on** field. Alternatively, we can open the :ref:`knowledge model detail` and click on :guilabel:`Fork KM` there. When the editor is based on an existing knowledge model, its language is used by default. We can only have one knowledge model editor with the same knowledge model ID. If we deleted the editor but want to continue working on that knowledge model, we can create a new editor with the same knowledge model ID. Or we can open the :ref:`knowledge model detail` and click on :guilabel:`Create KM editor` there to have the editor create form prefilled. diff --git a/docs/application/knowledge-models/editors/detail/publish.rst b/docs/application/knowledge-models/editors/detail/publish.rst index 39dfef4..7da7604 100644 --- a/docs/application/knowledge-models/editors/detail/publish.rst +++ b/docs/application/knowledge-models/editors/detail/publish.rst @@ -7,11 +7,13 @@ Before the knowledge model can be used by researchers in their projects, we need If we click the button, we are prompted with the metadata details to check them before publishing. We cannot change anything here, so if we want to change it, we have to click the link to :guilabel:`Settings` or press :guilabel:`Cancel` and edit the details on the :guilabel:`Settings` tab of the :ref:`Knowledge Model Editor`. +If there are :ref:`locales` available for the previous version or parent knowledge model, the publish dialog can offer to copy them to the new version. We should copy only locales that still match the updated knowledge model content. If the questionnaire text changed significantly, it is safer to update the locales after publishing. + .. figure:: publish/publish-modal.png :width: 528 - Publish dialog where we can confirm or cancel publishing of the Knowledge Model. + Publish dialog where we can confirm or cancel publishing of the knowledge model. -If we confirm the publishing of the Knowledge Model by clicking :guilabel:`Publish` in the modal window, the Knowledge Model becomes available to all users and is accessible in :ref:`Knowledge Model List`. +If we confirm the publishing of the knowledge model by clicking :guilabel:`Publish` in the modal window, the knowledge model becomes available to all users and is accessible in :ref:`Knowledge Model List`. The Knowledge Model Editor will remain in the :ref:`Knowledge Model Editors` list and will be available for any future changes. diff --git a/docs/application/knowledge-models/editors/detail/settings.rst b/docs/application/knowledge-models/editors/detail/settings.rst index af24b52..71b20e4 100644 --- a/docs/application/knowledge-models/editors/detail/settings.rst +++ b/docs/application/knowledge-models/editors/detail/settings.rst @@ -1,18 +1,19 @@ Settings ******** -The :guilabel:`Settings` tab, allows us to adjust attributes of the the knowledge model: +The :guilabel:`Settings` tab allows us to adjust attributes of the knowledge model: -- **Name** - should be short name of the Knowledge Model. +- **Name** - should be short name of the knowledge model. - **Description** - this should be really short and descriptive. -- **Knowledge Model ID** - is an unique Knowledge Model identifier. -- **Version** - this is a number indicating which is the latest version of the Knowledge Model, because it can change over time. +- **Knowledge Model ID** - is a unique knowledge model identifier. +- **Version** - this is a number indicating which is the latest version of the knowledge model, because it can change over time. +- **Language** - is the source language of the knowledge model content. It is used as the default questionnaire language and as the source language for knowledge model locales. - **License** - this is used when we want to share the knowledge model with other people so they know how they can do that. We recommend using a license identifier from `SPDX License List `_. - **Readme** - this is where we can describe everything we need about the knowledge model. We can, for example, include a changelog of what changed in which version, etc. We can use :ref:`Markdown` in this field to provide some nice formatting. .. NOTE:: - **Name**, **Description** and **Version** are all visible to the researcher, when they select a Knowledge Model for their project. So the **Name** and **Description** should provide them with enough information to select a correct one. + **Name**, **Description** and **Version** are all visible to the researcher, when they select a knowledge model for their project. So the **Name** and **Description** should provide them with enough information to select a correct one. **Knowledge Model ID** together with the :ref:`organization ID` and knowledge model version after it is published are used for the identification. So the identifier of the knowledge model is: @@ -29,4 +30,4 @@ In the **Danger Zone** we can delete the knowledge model. Once it is deleted it .. figure:: settings/settings-form.png - Knowledge Model settings. + Knowledge model settings. diff --git a/docs/application/knowledge-models/editors/migration.rst b/docs/application/knowledge-models/editors/migration.rst index cb68325..44aa43d 100644 --- a/docs/application/knowledge-models/editors/migration.rst +++ b/docs/application/knowledge-models/editors/migration.rst @@ -58,7 +58,7 @@ We can cancel the knowledge model migration at any point before we publish the n Finishing a Knowledge Model Migration ===================================== -After we resolve all the changes, we are ready to publish the new version of the Child KM. To do that, we need to click on the :guilabel:`Publish →` button. This will open the Publish new version screen where we need to provide additional information for the new version of the Knowledge Model. +After we resolve all the changes, we are ready to publish the new version of the Child KM. To do that, we need to click on the :guilabel:`Publish →` button. This will open the Publish new version screen where we need to provide additional information for the new version of the knowledge model. The publish screen shows us some information about the knowledge model, such as it's **Knowledge Model Name** and **Knowledge Model ID**. We need to choose the new **version number**. diff --git a/docs/application/knowledge-models/list/detail.rst b/docs/application/knowledge-models/list/detail.rst index 78c8ee6..dc0f0de 100644 --- a/docs/application/knowledge-models/list/detail.rst +++ b/docs/application/knowledge-models/list/detail.rst @@ -9,13 +9,27 @@ The main part of the detail is the README of the KM that should contain basic in In the top bar, we can :guilabel:`Export` the knowledge model as a KM file or :guilabel:`Delete` this version of the knowledge model (only if it is not already used for some projects or other KMs and editors). +.. _knowledge-model-locales: + +Locales +======== + +A knowledge model has a source language and a published version can have locales for additional languages. These locales are used in projects to show the questionnaire content in the selected language. + +Locales are managed for a specific knowledge model version. From the knowledge model detail, users with permission to manage knowledge models can export a POT file, import a locale, download an existing locale, or delete a locale. + +The exported POT file contains translatable strings from the knowledge model content, such as names, descriptions, answer labels, advice, and resource pages. Translators use this file to prepare a PO file for the target language. + +When a new knowledge model version is published, locales from the previous version or parent knowledge model can be copied during publishing if they are still valid. If knowledge model texts changed, the locale should be reviewed and updated for the new version. + In the top pane, we can see the options based on our permissions: - :guilabel:`Preview` can be used to check the content of the KM via the :doc:`./preview` feature. -- :guilabel:`Export` for exporting the latest version of the KM as a file. +- :guilabel:`Export` for exporting the current version of the KM as a file. +- :guilabel:`Export .pot file` for exporting the translation template for the current version of the KM. - :guilabel:`Compare` for comparing the current version of the KM with another version (see :doc:`./compare`). - :guilabel:`Create KM editor` is a shortcut for :doc:`../editors/create` for creating a new version. -- :guilabel:`Fork KM` is again a shortcut for :doc:`../editors/create` for to create a fork (some more specific KM based on this one). +- :guilabel:`Fork KM` is again a shortcut for :doc:`../editors/create` to create a fork (some more specific KM based on this one). - :guilabel:`Create project` is a shortcut to :doc:`../../projects/list/create` with this KM. - :guilabel:`Set deprecated` or :guilabel:`Restore` for setting a KM deprecated when we no longer want users to use it for new projects. - :guilabel:`Set public` or :guilabel:`Set private` for changing the visibility of the KM. Public KM can be viewed by non-logged in users. diff --git a/docs/application/knowledge-models/list/index.rst b/docs/application/knowledge-models/list/index.rst index 448e38b..bf1ec53 100644 --- a/docs/application/knowledge-models/list/index.rst +++ b/docs/application/knowledge-models/list/index.rst @@ -3,16 +3,17 @@ Knowledge Model List ******************** -Users with permission to manage knowledge models can manage the knowledge models that are in our DSW. We can access the list of knowledge model from the main menu via :guilabel:`Knowledge Model`. The list can be filtered and sorted by name or creation date. We can also search for a specific knowledge model by its id, name or version. The list shows the name, version, id, author, description and last update. +Users with permission to manage knowledge models can manage the knowledge models that are in our DSW. We can access the list of knowledge models from the main menu via :guilabel:`Knowledge Models`. The list can be filtered and sorted by name or creation date. We can also search for a specific knowledge model by its id, name or version. The list shows the name, version, id, author, description and last update. For each knowledge model (KM), we can see the latest version in the list. If we want to read more about a specific KM or see the older versions, we need to access the :doc:`./detail` by clicking the name of KM or clicking :guilabel:`Open` from the right item menu (three dots). There are also other options for each item: - :guilabel:`Open` for opening the KM detail (same as clicking the name of the KM). - :guilabel:`Preview` to see how :doc:`../../projects/index` generated using this KM would look like. -- :guilabel:`Export` for exporting the latest version of the KM as a file. +- :guilabel:`Export` for exporting the listed version of the KM as a file. +- :guilabel:`Export .pot file` for exporting the translation template for the listed version of the KM. - :guilabel:`Compare` for comparing the current version of the KM with another version (see :doc:`./compare`). - :guilabel:`Create KM editor` is a shortcut for :doc:`../editors/create` for creating a new version. -- :guilabel:`Fork KM` is again a shortcut for :doc:`../editors/create` for to create a fork (some more specific KM based on this one). +- :guilabel:`Fork KM` is again a shortcut for :doc:`../editors/create` to create a fork (some more specific KM based on this one). - :guilabel:`Create project` is a shortcut to :doc:`../../projects/list/create` with this KM. - :guilabel:`Set deprecated` or :guilabel:`Restore` for setting a KM deprecated when we no longer want users to use it for new projects. - :guilabel:`Set public` or :guilabel:`Set private` for changing the visibility of the KM. Public KM can be viewed by non-logged in users. @@ -25,7 +26,7 @@ For each knowledge model (KM), we can see the latest version in the list. If we This action is irreversible, so be careful when using it. -If a newer version of the knowledge model is available in the `DSW Registry `__, a yellow :guilabel:`update available` badge, which we can use for quick update of the template to the latest version, will appear. +If a newer version of the knowledge model is available in the `DSW Registry `__, a yellow :guilabel:`update available` badge, which we can use for a quick update to the latest version, will appear. Finally, there is an option to :doc:`./import` by clicking the :guilabel:`Import` button in the top right part of the screen. @@ -34,10 +35,6 @@ Finally, there is an option to :doc:`./import` by clicking the :guilabel:`Import You can import multiple knowledge models from file at once. -For users with permission to manage knowledge models, :guilabel:`update available` badge may appear if there is a newer version of the knowledge model in the `DSW Registry `__ (and if configured). - -Finally, there is an option to :doc:`./import` by click the :guilabel:`Import` button in the top right part of the screen. - .. figure:: index/list.png List of all knowledge models with actions. @@ -45,7 +42,7 @@ Finally, there is an option to :doc:`./import` by click the :guilabel:`Import` b .. NOTE:: - Set deprecated option will apply only for the latest version of Knowledge Model. If there is an older version, that will still be available. + Set deprecated option will apply only for the latest version of the knowledge model. If there is an older version, that will still be available. .. raw:: html diff --git a/docs/application/profile/settings/language.rst b/docs/application/profile/settings/language.rst index 8bab1f5..3739e3d 100644 --- a/docs/application/profile/settings/language.rst +++ b/docs/application/profile/settings/language.rst @@ -6,3 +6,5 @@ Language After navigating to :guilabel:`Language` from the :doc:`../index` menu, we can change the language of the DSW UI and emails. The preferred language is determined in the following order: the user's profile settings, then browser settings, and finally the default system language if the previous options are not set. We can select one of the available languages and click :guilabel:`Save` button to apply the changes. + +This setting does not automatically translate questionnaire content from a knowledge model. If the project uses a knowledge model with :ref:`locales`, the questionnaire language is selected when creating the project or in the project settings. diff --git a/docs/application/projects/list/create.rst b/docs/application/projects/list/create.rst index 8bdb9b1..b00d8a0 100644 --- a/docs/application/projects/list/create.rst +++ b/docs/application/projects/list/create.rst @@ -38,6 +38,8 @@ If there are no project templates available or we don't want to use them, we can If the knowledge model has :ref:`question tags`, we can either choose to create questionnaire with all available questions or filter them by the question tags. +If the knowledge model has :ref:`locales`, we can choose the **Project Language**. The source language of the knowledge model is selected by default. The language selection is shown only when there is at least one locale available for the selected knowledge model. + .. figure:: create/project-create-custom.png :width: 528 diff --git a/docs/application/projects/list/detail/metrics.rst b/docs/application/projects/list/detail/metrics.rst index 6c038a5..1df9b58 100644 --- a/docs/application/projects/list/detail/metrics.rst +++ b/docs/application/projects/list/detail/metrics.rst @@ -8,8 +8,8 @@ In the :guilabel:`Metrics` tab in the project detail we can see a **Summary Repo Summary report of project metrics. -The **Summary Report** shows how many questions are answered and unanswered in each chapter. It can either count all questions in the Knowledge Model or only the questions required for the project’s current phase. Questions from later phases are ignored in the phase-based view. If a parent question is unanswered, its child questions are not counted separately. Chapter results are combined into the total **Summary Report**. +The **Summary Report** shows how many questions are answered and unanswered in each chapter. It can either count all questions in the knowledge model or only the questions required for the project’s current phase. Questions from later phases are ignored in the phase-based view. If a parent question is unanswered, its child questions are not counted separately. Chapter results are combined into the total **Summary Report**. If there are any metrics in the knowledge model, the report also shows the score for each metric. The score is calculated as a weighted average of all the answers affecting that metric and is always between 0 and 1. If there are at least 3 metrics present, a spider chart is also displayed. -There is also a metrics description at the bottom of the page to better understand what exactly each metric means. \ No newline at end of file +There is also a metrics description at the bottom of the page to better understand what exactly each metric means. diff --git a/docs/application/projects/list/detail/settings.rst b/docs/application/projects/list/detail/settings.rst index 2e8b3b3..9faaf40 100644 --- a/docs/application/projects/list/detail/settings.rst +++ b/docs/application/projects/list/detail/settings.rst @@ -28,7 +28,7 @@ We can set a **default document template** and a **default document format**. Th Project Template ================ -We can use the project as a :ref:`project template`. If we enable this option, users can use it when creating a new project :ref:`from project template`. Note that we also need to make it visible for other logged-in users in :ref:`sharing` settings. +We can use the project as a :ref:`project template`. If we enable this option, users with access to the project can use it when creating a new project :ref:`from project template`. Project templates follow the same :ref:`sharing` policy as projects, so we should share the template with users who should be able to use it. .. NOTE:: @@ -37,6 +37,13 @@ We can use the project as a :ref:`project template`. If we en :guilabel:`Unsupported metamodel` badge can appear, when the document template is not compatible with the version of DSW. Users should contact the person responsible for document templates or instance administration in this case. +Questionnaire Language +====================== + +If the project's knowledge model has :ref:`locales`, we can choose the questionnaire language in project settings. The available options are the source language of the knowledge model and any locales added for that knowledge model version. + +Changing the questionnaire language changes the knowledge model texts shown in the questionnaire, such as questions, answer labels, descriptions, advice, and resource pages. It does not translate answers that users have typed into the project. + Knowledge Model =============== diff --git a/docs/more/development/metamodel-schemas.rst b/docs/more/development/metamodel-schemas.rst index db58389..ed79e63 100644 --- a/docs/more/development/metamodel-schemas.rst +++ b/docs/more/development/metamodel-schemas.rst @@ -9,7 +9,7 @@ As Data Stewardship Wizard evolves, the internal structures may change during th KM Package (.km file) ===================== -File for import and export of Knowledge Models is a JSON file that contains all KM packages (lists of change events with additional metadata). The structure of events is versioned using the KM metamodel version number and migrations in DSW automatically update the KMs when needed. As said, files according to this schema can be exported from :doc:`../../application/knowledge-models/list/index` or :doc:`../../application/knowledge-models/list/detail` and then used for :doc:`../../application/knowledge-models/list/import`. +File for import and export of knowledge models is a JSON file that contains all KM packages (lists of change events with additional metadata). The structure of events is versioned using the KM metamodel version number and migrations in DSW automatically update the KMs when needed. As said, files according to this schema can be exported from :doc:`../../application/knowledge-models/list/index` or :doc:`../../application/knowledge-models/list/detail` and then used for :doc:`../../application/knowledge-models/list/import`. +-------------------+---------------------------------------------------------------------------------------------------------------+------------------------------------------------------+-----------+ | Metamodel Version | Schema file | Changes (brief) | Since | From 6d6c002417cdcdf8662c31867385299840356d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kry=C5=A1tof=20Komanec?= <54114006+krystofkomanec@users.noreply.github.com> Date: Fri, 7 Aug 2026 06:58:44 +0100 Subject: [PATCH 08/11] Document role permission reference (#276) --- .../administration/roles/index.rst | 62 ++++++++++++------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/docs/application/administration/roles/index.rst b/docs/application/administration/roles/index.rst index 18e7554..f53395b 100644 --- a/docs/application/administration/roles/index.rst +++ b/docs/application/administration/roles/index.rst @@ -36,27 +36,47 @@ Role Permissions Permissions are grouped by the type of work they enable. -Project-related permissions can allow a role to: - -- manage project templates and create projects directly from knowledge models when project creation is restricted to templates -- view all projects -- comment on all projects -- edit all projects -- manage all projects - -Content-related permissions can allow a role to: - -- create and use knowledge model editors, including migration and publishing -- manage knowledge models, including knowledge model secrets -- create and use document template editors, including publishing -- manage document templates - -The editor permissions require the corresponding management permissions. When we enable **Use Knowledge Model Editor**, the role also needs **Manage Knowledge Models**. When we enable **Use Document Template Editor**, the role also needs **Manage Document Templates**. - -Administration permissions can allow a role to: - -- manage users -- manage settings +The role create/edit form includes these permissions: + +.. list-table:: + :header-rows: 1 + + * - Permission + - What it enables + - Implied permissions + * - **Manage Project Templates** + - Set projects as project templates. Users with this permission can also create new projects directly from knowledge models, even when project creation is restricted to templates. + - None. + * - **View ALL Projects** + - View all projects, regardless of project sharing and visibility settings. + - None. + * - **Comment on ALL Projects** + - Comment on all projects, regardless of project sharing and visibility settings. + - **View ALL Projects** + * - **Edit ALL Projects** + - Edit all projects, regardless of project sharing and visibility settings. + - **View ALL Projects**, **Comment on ALL Projects** + * - **Manage ALL Projects** + - Manage all projects as if the user were an owner, regardless of project sharing and visibility settings. + - **View ALL Projects**, **Comment on ALL Projects**, **Edit ALL Projects** + * - **Use Knowledge Model Editor** + - View, create, edit, and delete knowledge model editors, migrate them, and publish knowledge models from them. + - **Manage Knowledge Models** + * - **Manage Knowledge Models** + - Import, export, and delete knowledge models, set them as deprecated, restore them, or set them as public. This permission also allows users to manage knowledge model secrets. + - None. + * - **Use Document Template Editor** + - View, create, edit, and delete document template editors, and publish document templates from them. + - **Manage Document Templates** + * - **Manage Document Templates** + - Import, export, and delete document templates, and set them as deprecated or restore them. + - None. + * - **Manage Users** + - View, create, edit, and delete user accounts. + - None. + * - **Manage Settings** + - View and manage application settings. + - None. .. TODO:: From 06d419c97e6c68270f4dddda97ac0321f4b1ffe0 Mon Sep 17 00:00:00 2001 From: krystofkomanec Date: Fri, 7 Aug 2026 08:07:19 +0200 Subject: [PATCH 09/11] Clarify KM locale PO metadata --- docs/application/knowledge-models/list/detail.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/application/knowledge-models/list/detail.rst b/docs/application/knowledge-models/list/detail.rst index dc0f0de..0a0d69a 100644 --- a/docs/application/knowledge-models/list/detail.rst +++ b/docs/application/knowledge-models/list/detail.rst @@ -18,7 +18,7 @@ A knowledge model has a source language and a published version can have locales Locales are managed for a specific knowledge model version. From the knowledge model detail, users with permission to manage knowledge models can export a POT file, import a locale, download an existing locale, or delete a locale. -The exported POT file contains translatable strings from the knowledge model content, such as names, descriptions, answer labels, advice, and resource pages. Translators use this file to prepare a PO file for the target language. +The exported POT file contains translatable strings from the knowledge model content, such as names, descriptions, answer labels, advice, and resource pages. Translators use this file to prepare a PO file for the target language. The PO file should specify the target language using the standard gettext metadata. When a new knowledge model version is published, locales from the previous version or parent knowledge model can be copied during publishing if they are still valid. If knowledge model texts changed, the locale should be reviewed and updated for the new version. From f83aaa3920c5ba8ad7ab1a7e3044acf45c8bd248 Mon Sep 17 00:00:00 2001 From: krystofkomanec Date: Fri, 7 Aug 2026 08:09:43 +0200 Subject: [PATCH 10/11] 4.33.0 --- docs/conf.py | 2 +- docs/more/self-hosted-dsw/upgrade-guidelines.rst | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 0f3dda2..2cb4ded 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -22,7 +22,7 @@ author = 'DSW Team' # The full version, including alpha/beta/rc tags -version = release = '4.32' +version = release = '4.33' # -- General configuration --------------------------------------------------- diff --git a/docs/more/self-hosted-dsw/upgrade-guidelines.rst b/docs/more/self-hosted-dsw/upgrade-guidelines.rst index 34dd97a..f21d8be 100644 --- a/docs/more/self-hosted-dsw/upgrade-guidelines.rst +++ b/docs/more/self-hosted-dsw/upgrade-guidelines.rst @@ -45,6 +45,11 @@ Usually, nothing special is required for the upgrade. Internal structure changes Make sure to stop ``document-worker`` and ``mailer`` before upgrading to the next version. Run ``wizard-server`` first, then run the workers. Otherwise the database migrations might not work correctly. +4.32.X to 4.33.X +---------------- + +*(nothing)* + 4.31.X to 4.32.X ---------------- From 4e983d980e670e39a763f47505968d4100c57ea2 Mon Sep 17 00:00:00 2001 From: krystofkomanec Date: Fri, 7 Aug 2026 08:16:31 +0200 Subject: [PATCH 11/11] Fix wrong text position --- .../knowledge-models/list/detail.rst | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/application/knowledge-models/list/detail.rst b/docs/application/knowledge-models/list/detail.rst index 0a0d69a..e4d7a76 100644 --- a/docs/application/knowledge-models/list/detail.rst +++ b/docs/application/knowledge-models/list/detail.rst @@ -9,19 +9,6 @@ The main part of the detail is the README of the KM that should contain basic in In the top bar, we can :guilabel:`Export` the knowledge model as a KM file or :guilabel:`Delete` this version of the knowledge model (only if it is not already used for some projects or other KMs and editors). -.. _knowledge-model-locales: - -Locales -======== - -A knowledge model has a source language and a published version can have locales for additional languages. These locales are used in projects to show the questionnaire content in the selected language. - -Locales are managed for a specific knowledge model version. From the knowledge model detail, users with permission to manage knowledge models can export a POT file, import a locale, download an existing locale, or delete a locale. - -The exported POT file contains translatable strings from the knowledge model content, such as names, descriptions, answer labels, advice, and resource pages. Translators use this file to prepare a PO file for the target language. The PO file should specify the target language using the standard gettext metadata. - -When a new knowledge model version is published, locales from the previous version or parent knowledge model can be copied during publishing if they are still valid. If knowledge model texts changed, the locale should be reviewed and updated for the new version. - In the top pane, we can see the options based on our permissions: - :guilabel:`Preview` can be used to check the content of the KM via the :doc:`./preview` feature. @@ -37,6 +24,19 @@ In the top pane, we can see the options based on our permissions: If we are not seeing the latest version of the KM, a warning message is shown in the top. Similarly, we will see a notification that update is available if there is a newer version in the `DSW Registry `__ (if configured). +.. _knowledge-model-locales: + +Locales +======== + +A knowledge model has a source language and a published version can have locales for additional languages. These locales are used in projects to show the questionnaire content in the selected language. + +Locales are managed for a specific knowledge model version. From the knowledge model detail, users with permission to manage knowledge models can export a POT file, import a locale, download an existing locale, or delete a locale. + +The exported POT file contains translatable strings from the knowledge model content, such as names, descriptions, answer labels, advice, and resource pages. Translators use this file to prepare a PO file for the target language. The PO file should specify the target language using the standard gettext metadata. + +When a new knowledge model version is published, locales from the previous version or parent knowledge model can be copied during publishing if they are still valid. If knowledge model texts changed, the locale should be reviewed and updated for the new version. + .. figure:: detail/detail.png