\\nassistant: \"Let me use the Task tool to launch the backend-refactoring-assistant agent to review this implementation and suggest improvements.\"\\n\\nSince new repository code was written, proactively use the backend-refactoring-assistant agent to review it for DDD compliance, code quality, and alignment with project patterns.\\n \\n\\n\\nassistant: \"Let me use the neo4j-performance-analyzer agent to analyze the query patterns and identify any potential bottlenecks.\"\\n\\n\\nComplex queries that join multiple entities are prime candidates for performance issues. Use the neo4j-performance-analyzer agent to catch problems early.\\n \\nThe beginning is the most important part of the work
", name_plain="The beginning is the most important part of the work", - start_date=datetime.datetime(2023, 9, 26, 21, 42, 25, 947953), - end_date=None, status="Final", version="1.0", - change_description="Approved version", - author_username=AUTHOR_USERNAME, - possible_actions=["inactivate"], - footnote_template=FootnoteTemplateWithType( - name="The beginning is the most important part of the work
", - name_plain="The beginning is the most important part of the work", - uid="FootnoteTemplate_000012", - sequence_id="FSA12", - library_name="User Defined", - type=None, - ), - parameter_terms=[], - library=Library(name="User Defined", is_editable=True), - study_count=0, ), - footnote_template=None, ), StudySoAFootnote( uid="StudySoAFootnote_000012", @@ -2524,30 +1562,13 @@ item_type=SoAItemType.STUDY_ACTIVITY_SCHEDULE, ), ], - footnote=Footnote( + footnote=CompactFootnote( uid="Footnote_000012", name="For a man to conquer himself is the first and nobles of all victories
", name_plain="For a man to conquer himself is the first and nobles of all victories", - start_date=datetime.datetime(2023, 9, 26, 21, 43, 13, 45570), - end_date=None, status="Final", version="1.0", - change_description="Approved version", - author_username=AUTHOR_USERNAME, - possible_actions=["inactivate"], - footnote_template=FootnoteTemplateWithType( - name="For a man to conquer himself is the first and nobles of all victories
", - name_plain="For a man to conquer himself is the first and nobles of all victories", - uid="FootnoteTemplate_000013", - sequence_id="FSA13", - library_name="User Defined", - type=None, - ), - parameter_terms=[], - library=Library(name="User Defined", is_editable=True), - study_count=0, ), - footnote_template=None, ), StudySoAFootnote( uid="StudySoAFootnote_000013", @@ -2601,30 +1622,13 @@ item_type=SoAItemType.STUDY_ACTIVITY_SCHEDULE, ), ], - footnote=Footnote( + footnote=CompactFootnote( uid="Footnote_000013", name="Friendship is a single soul dwelling in two bodies
", name_plain="Friendship is a single soul dwelling in two bodies", - start_date=datetime.datetime(2023, 9, 26, 21, 43, 48, 36499), - end_date=None, status="Final", version="1.0", - change_description="Approved version", - author_username=AUTHOR_USERNAME, - possible_actions=["inactivate"], - footnote_template=FootnoteTemplateWithType( - name="Friendship is a single soul dwelling in two bodies
", - name_plain="Friendship is a single soul dwelling in two bodies", - uid="FootnoteTemplate_000014", - sequence_id="FSA14", - library_name="User Defined", - type=None, - ), - parameter_terms=[], - library=Library(name="User Defined", is_editable=True), - study_count=0, ), - footnote_template=None, ), StudySoAFootnote( uid="StudySoAFootnote_000014", @@ -2688,32 +1692,16 @@ item_type=SoAItemType.STUDY_ACTIVITY_SCHEDULE, ), ], - footnote=Footnote( + footnote=CompactFootnote( uid="Footnote_000008", name='The best way to predict the future is to create it"
', name_plain='The best way to predict the future is to create it"', - start_date=datetime.datetime(2023, 9, 26, 10, 50, 43, 523495), - end_date=None, status="Final", version="1.0", - change_description="Approved version", - author_username=AUTHOR_USERNAME, - possible_actions=["inactivate"], - footnote_template=FootnoteTemplateWithType( - name='The best way to predict the future is to create it"
', - name_plain='The best way to predict the future is to create it"', - uid="FootnoteTemplate_000009", - sequence_id="FSA9", - library_name="User Defined", - type=None, - ), - parameter_terms=[], - library=Library(name="User Defined", is_editable=True), - study_count=0, ), - footnote_template=None, ), ] + DETAILED_SOA_TABLE = TableWithFootnotes( rows=[ TableRow( @@ -3817,6 +2805,7 @@ title="Protocol Flowchart", id=None, ) + PROTOCOL_SOA_TABLE = TableWithFootnotes( rows=[ TableRow( @@ -4966,6 +3955,7 @@ title="Protocol Flowchart", id=None, ) + PROTOCOL_SOA_TABLE_WITH_REF_PROPAGATION = TableWithFootnotes( rows=[ TableRow( @@ -6297,6 +5287,7 @@ title="Protocol Flowchart", id=None, ) + ADD_PROTOCOL_SECTION_COLUMN_CASE1 = ( TableWithFootnotes( rows=[ @@ -6391,6 +5382,7 @@ num_header_cols=2, ), ) + ADD_PROTOCOL_SECTION_COLUMN_CASE2 = ( TableWithFootnotes( rows=[ @@ -6422,6 +5414,7 @@ num_header_cols=0, ), ) + ADD_PROTOCOL_SECTION_COLUMN_CASE3 = ( TableWithFootnotes( rows=[ diff --git a/clinical-mdr-api/clinical_mdr_api/tests/unit/services/test_study_design_figure.py b/clinical-mdr-api/clinical_mdr_api/tests/unit/services/test_study_design_figure.py index 300b1298..e5b2966a 100644 --- a/clinical-mdr-api/clinical_mdr_api/tests/unit/services/test_study_design_figure.py +++ b/clinical-mdr-api/clinical_mdr_api/tests/unit/services/test_study_design_figure.py @@ -694,8 +694,6 @@ STUDY_VISITS = ( StudyVisit( study_epoch_uid="StudyEpoch_000001", - visit_type_uid="CTTerm_000171", - time_reference_uid="CTTerm_000117", time_value=-2, time_unit_uid="UnitDefinition_000171", visit_sublabel_reference=None, @@ -707,8 +705,6 @@ description=None, start_rule=None, end_rule=None, - visit_contact_mode_uid="CTTerm_000080", - epoch_allocation_uid=None, visit_class="SINGLE_VISIT", visit_subclass="SINGLE_VISIT", is_global_anchor_visit=False, @@ -721,15 +717,12 @@ "sponsor_preferred_name": "Screening", "sponsor_preferred_name_sentence_case": "screening", }, - epoch_uid="C48262_SCREENING", order=1, - visit_type_name="Screening", visit_type={ "term_uid": "CTTerm_000171", "sponsor_preferred_name": "Screening", "sponsor_preferred_name_sentence_case": "screening", }, - time_reference_name="Global Anchor Visit", time_unit_name="weeks", visit_contact_mode_name="On Site Visit", visit_contact_mode={ @@ -761,8 +754,6 @@ ), StudyVisit( study_epoch_uid="StudyEpoch_000002", - visit_type_uid="CTTerm_000176", - time_reference_uid="CTTerm_000117", time_value=0, time_unit_uid="UnitDefinition_000151", visit_sublabel_reference=None, @@ -774,8 +765,6 @@ description=None, start_rule=None, end_rule=None, - visit_contact_mode_uid="CTTerm_000080", - epoch_allocation_uid=None, visit_class="SINGLE_VISIT", visit_subclass="SINGLE_VISIT", is_global_anchor_visit=True, @@ -788,15 +777,12 @@ "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - epoch_uid="C101526_TREATMENT", order=2, - visit_type_name="Treatment", visit_type={ "term_uid": "CTTerm_000176", "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - time_reference_name="Global Anchor Visit", time_unit_name="days", visit_contact_mode_name="On Site Visit", visit_contact_mode={ @@ -828,8 +814,6 @@ ), StudyVisit( study_epoch_uid="StudyEpoch_000002", - visit_type_uid="CTTerm_000176", - time_reference_uid="CTTerm_000117", time_value=7, time_unit_uid="UnitDefinition_000151", visit_sublabel_reference=None, @@ -841,8 +825,6 @@ description=None, start_rule=None, end_rule=None, - visit_contact_mode_uid="CTTerm_000080", - epoch_allocation_uid=None, visit_class="SINGLE_VISIT", visit_subclass="SINGLE_VISIT", is_global_anchor_visit=False, @@ -855,15 +837,12 @@ "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - epoch_uid="C101526_TREATMENT", order=3, - visit_type_name="Treatment", visit_type={ "term_uid": "CTTerm_000176", "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - time_reference_name="Global Anchor Visit", time_unit_name="days", visit_contact_mode_name="On Site Visit", visit_contact_mode={ @@ -895,8 +874,6 @@ ), StudyVisit( study_epoch_uid="StudyEpoch_000002", - visit_type_uid="CTTerm_000176", - time_reference_uid="CTTerm_000117", time_value=14, time_unit_uid="UnitDefinition_000151", visit_sublabel_reference=None, @@ -908,8 +885,6 @@ description=None, start_rule=None, end_rule=None, - visit_contact_mode_uid="CTTerm_000080", - epoch_allocation_uid=None, visit_class="SINGLE_VISIT", visit_subclass="SINGLE_VISIT", is_global_anchor_visit=False, @@ -922,15 +897,12 @@ "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - epoch_uid="C101526_TREATMENT", order=4, - visit_type_name="Treatment", visit_type={ "term_uid": "CTTerm_000176", "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - time_reference_name="Global Anchor Visit", time_unit_name="days", visit_contact_mode_name="On Site Visit", visit_contact_mode={ @@ -962,8 +934,6 @@ ), StudyVisit( study_epoch_uid="StudyEpoch_000002", - visit_type_uid="CTTerm_000176", - time_reference_uid="CTTerm_000117", time_value=21, time_unit_uid="UnitDefinition_000151", visit_sublabel_reference=None, @@ -975,8 +945,6 @@ description=None, start_rule=None, end_rule=None, - visit_contact_mode_uid="CTTerm_000080", - epoch_allocation_uid=None, visit_class="SINGLE_VISIT", visit_subclass="SINGLE_VISIT", is_global_anchor_visit=False, @@ -989,15 +957,12 @@ "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - epoch_uid="C101526_TREATMENT", order=5, - visit_type_name="Treatment", visit_type={ "term_uid": "CTTerm_000176", "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - time_reference_name="Global Anchor Visit", time_unit_name="days", visit_contact_mode_name="On Site Visit", visit_contact_mode={ @@ -1029,8 +994,6 @@ ), StudyVisit( study_epoch_uid="StudyEpoch_000002", - visit_type_uid="CTTerm_000176", - time_reference_uid="CTTerm_000117", time_value=28, time_unit_uid="UnitDefinition_000151", visit_sublabel_reference=None, @@ -1042,8 +1005,6 @@ description=None, start_rule=None, end_rule=None, - visit_contact_mode_uid="CTTerm_000080", - epoch_allocation_uid=None, visit_class="SINGLE_VISIT", visit_subclass="SINGLE_VISIT", is_global_anchor_visit=False, @@ -1056,15 +1017,12 @@ "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - epoch_uid="C101526_TREATMENT", order=6, - visit_type_name="Treatment", visit_type={ "term_uid": "CTTerm_000176", "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - time_reference_name="Global Anchor Visit", time_unit_name="days", visit_contact_mode_name="On Site Visit", visit_contact_mode={ @@ -1096,8 +1054,6 @@ ), StudyVisit( study_epoch_uid="StudyEpoch_000002", - visit_type_uid="CTTerm_000176", - time_reference_uid="CTTerm_000117", time_value=35, time_unit_uid="UnitDefinition_000151", visit_sublabel_reference=None, @@ -1109,8 +1065,6 @@ description=None, start_rule=None, end_rule=None, - visit_contact_mode_uid="CTTerm_000080", - epoch_allocation_uid=None, visit_class="SINGLE_VISIT", visit_subclass="SINGLE_VISIT", is_global_anchor_visit=False, @@ -1123,15 +1077,12 @@ "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - epoch_uid="C101526_TREATMENT", order=7, - visit_type_name="Treatment", visit_type={ "term_uid": "CTTerm_000176", "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - time_reference_name="Global Anchor Visit", time_unit_name="days", visit_contact_mode_name="On Site Visit", visit_contact_mode={ @@ -1163,8 +1114,6 @@ ), StudyVisit( study_epoch_uid="StudyEpoch_000002", - visit_type_uid="CTTerm_000176", - time_reference_uid="CTTerm_000117", time_value=42, time_unit_uid="UnitDefinition_000151", visit_sublabel_reference=None, @@ -1176,8 +1125,6 @@ description=None, start_rule=None, end_rule=None, - visit_contact_mode_uid="CTTerm_000080", - epoch_allocation_uid=None, visit_class="SINGLE_VISIT", visit_subclass="SINGLE_VISIT", is_global_anchor_visit=False, @@ -1190,15 +1137,12 @@ "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - epoch_uid="C101526_TREATMENT", order=8, - visit_type_name="Treatment", visit_type={ "term_uid": "CTTerm_000176", "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - time_reference_name="Global Anchor Visit", time_unit_name="days", visit_contact_mode_name="On Site Visit", visit_contact_mode={ @@ -1230,8 +1174,6 @@ ), StudyVisit( study_epoch_uid="StudyEpoch_000002", - visit_type_uid="CTTerm_000176", - time_reference_uid="CTTerm_000117", time_value=49, time_unit_uid="UnitDefinition_000151", visit_sublabel_reference=None, @@ -1243,8 +1185,6 @@ description=None, start_rule=None, end_rule=None, - visit_contact_mode_uid="CTTerm_000080", - epoch_allocation_uid=None, visit_class="SINGLE_VISIT", visit_subclass="SINGLE_VISIT", is_global_anchor_visit=False, @@ -1257,15 +1197,12 @@ "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - epoch_uid="C101526_TREATMENT", order=9, - visit_type_name="Treatment", visit_type={ "term_uid": "CTTerm_000176", "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - time_reference_name="Global Anchor Visit", time_unit_name="days", visit_contact_mode_name="On Site Visit", visit_contact_mode={ @@ -1297,8 +1234,6 @@ ), StudyVisit( study_epoch_uid="StudyEpoch_000002", - visit_type_uid="CTTerm_000176", - time_reference_uid="CTTerm_000117", time_value=56, time_unit_uid="UnitDefinition_000151", visit_sublabel_reference=None, @@ -1310,8 +1245,6 @@ description=None, start_rule=None, end_rule=None, - visit_contact_mode_uid="CTTerm_000080", - epoch_allocation_uid=None, visit_class="SINGLE_VISIT", visit_subclass="SINGLE_VISIT", is_global_anchor_visit=False, @@ -1324,15 +1257,12 @@ "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - epoch_uid="C101526_TREATMENT", order=10, - visit_type_name="Treatment", visit_type={ "term_uid": "CTTerm_000176", "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - time_reference_name="Global Anchor Visit", time_unit_name="days", visit_contact_mode_name="On Site Visit", visit_contact_mode={ @@ -1364,8 +1294,6 @@ ), StudyVisit( study_epoch_uid="StudyEpoch_000042", - visit_type_uid="CTTerm_000176", - time_reference_uid="CTTerm_000113", time_value=1, time_unit_uid="UnitDefinition_000166", visit_sublabel_reference=None, @@ -1377,8 +1305,6 @@ description=None, start_rule=None, end_rule=None, - visit_contact_mode_uid="CTTerm_000080", - epoch_allocation_uid=None, visit_class="SINGLE_VISIT", visit_subclass="SINGLE_VISIT", is_global_anchor_visit=False, @@ -1391,15 +1317,12 @@ "sponsor_preferred_name": "Extension", "sponsor_preferred_name_sentence_case": "screening", }, - epoch_uid="CTTerm_000007", order=11, - visit_type_name="Treatment", visit_type={ "term_uid": "CTTerm_000176", "sponsor_preferred_name": "Treatment", "sponsor_preferred_name_sentence_case": "screening", }, - time_reference_name="Previous Visit", time_unit_name="week", visit_contact_mode_name="On Site Visit", visit_contact_mode={ @@ -1431,8 +1354,6 @@ ), StudyVisit( study_epoch_uid="StudyEpoch_000003", - visit_type_uid="CTTerm_000161", - time_reference_uid="CTTerm_000117", time_value=182, time_unit_uid="UnitDefinition_000151", visit_sublabel_reference=None, @@ -1444,8 +1365,6 @@ description=None, start_rule=None, end_rule=None, - visit_contact_mode_uid="CTTerm_000080", - epoch_allocation_uid=None, visit_class="SINGLE_VISIT", visit_subclass="SINGLE_VISIT", is_global_anchor_visit=False, @@ -1458,15 +1377,12 @@ "sponsor_preferred_name": "Follow-up", "sponsor_preferred_name_sentence_case": "screening", }, - epoch_uid="C99158_FOLLOW-UP", order=12, - visit_type_name="Follow-up", visit_type={ "term_uid": "CTTerm_000161", "sponsor_preferred_name": "Follow-up", "sponsor_preferred_name_sentence_case": "screening", }, - time_reference_name="Global Anchor Visit", time_unit_name="days", visit_contact_mode_name="On Site Visit", visit_contact_mode={ @@ -1498,8 +1414,6 @@ ), StudyVisit( study_epoch_uid="StudyEpoch_000034", - visit_type_uid="CTTerm_000164", - time_reference_uid="CTTerm_000113", time_value=183, time_unit_uid="UnitDefinition_000151", visit_sublabel_reference=None, @@ -1511,8 +1425,6 @@ description=None, start_rule=None, end_rule=None, - visit_contact_mode_uid="CTTerm_000079", - epoch_allocation_uid=None, visit_class="SINGLE_VISIT", visit_subclass="SINGLE_VISIT", is_global_anchor_visit=False, @@ -1525,15 +1437,12 @@ "sponsor_preferred_name": "Elimination", "sponsor_preferred_name_sentence_case": "screening", }, - epoch_uid="CTTerm_000008", order=13, - visit_type_name="Post treatment activity", visit_type={ "term_uid": "CTTerm_000164", "sponsor_preferred_name": "Post treatment activity", "sponsor_preferred_name_sentence_case": "screening", }, - time_reference_name="Previous Visit", time_unit_name="days", visit_contact_mode_name="Phone Contact", visit_contact_mode={ diff --git a/clinical-mdr-api/clinical_mdr_api/tests/unit/services/test_study_flowchart.py b/clinical-mdr-api/clinical_mdr_api/tests/unit/services/test_study_flowchart.py index 46c3548f..bf2fa7bf 100644 --- a/clinical-mdr-api/clinical_mdr_api/tests/unit/services/test_study_flowchart.py +++ b/clinical-mdr-api/clinical_mdr_api/tests/unit/services/test_study_flowchart.py @@ -16,7 +16,10 @@ from clinical_mdr_api.models.study_selections.study import StudySoaPreferencesInput from clinical_mdr_api.models.study_selections.study_epoch import StudyEpoch from clinical_mdr_api.models.study_selections.study_soa_footnote import StudySoAFootnote -from clinical_mdr_api.models.study_selections.study_visit import StudyVisit +from clinical_mdr_api.models.study_selections.study_visit import ( + StudyVisit, + StudyVisitLite, +) from clinical_mdr_api.services.studies.study_flowchart import _T as _gettext from clinical_mdr_api.services.studies.study_flowchart import StudyFlowchartService from clinical_mdr_api.services.utils.table_f import TableRow, TableWithFootnotes @@ -66,7 +69,9 @@ def _validate_parameters(self, *_args, **_kwargs): pass def _get_soa_preferences(self, *_args, **_kwargs) -> StudySoaPreferencesInput: - return StudySoaPreferencesInput() + return StudySoaPreferencesInput( + show_epochs=True, show_milestones=False, baseline_as_time_zero=False + ) def get_preferred_time_unit(self, *_args, **_kwargs) -> str: return "week" @@ -174,7 +179,7 @@ def check_flowchart_table_first_rows( first_visit_of_each_group.setdefault( collapse_visit_groups and visit.consecutive_visit_group - or visit.visit_name, + or visit.visit_short_name, visit, ) @@ -189,7 +194,7 @@ def check_flowchart_table_first_rows( i += 1 if visit.is_soa_milestone: - if prev_visit_type_uid == visit.visit_type_uid: + if prev_visit_type_uid == visit.visit_type.term_uid: # Same visit_type, then merged with the previous cell assert row.cells[i].text == "" assert row.cells[i].span == 0 @@ -197,7 +202,7 @@ def check_flowchart_table_first_rows( else: # Different visit_type, new label - prev_visit_type_uid = visit.visit_type_uid + prev_visit_type_uid = visit.visit_type.term_uid assert row.cells[i].text == visit.visit_type.sponsor_preferred_name assert row.cells[i].style == "header1" assert row.cells[i].span > 0 @@ -334,7 +339,7 @@ def check_flowchart_table_visit_rows( for visit in study_visits: group_name = ( not operational and visit.consecutive_visit_group - ) or visit.visit_name + ) or visit.visit_short_name visit_groups.setdefault(group_name, []).append(visit) visit_idx_by_uid[visit.uid] = len(visit_groups) + (2 if operational else 0) @@ -347,7 +352,7 @@ def check_flowchart_table_visit_rows( assert ( table.rows[row_idx].cells[i].text == (not operational and visit.consecutive_visit_group) - or visit.visit_name + or visit.visit_short_name ) # THEN visits ref in second row @@ -570,7 +575,7 @@ def test_group_visits( for visit in visit_group: count_visits += 1 - assert isinstance(visit, StudyVisit) + assert isinstance(visit, (StudyVisit, StudyVisitLite)) assert study_epoch_uid == visit.study_epoch_uid if len(visit_group) == 1: diff --git a/clinical-mdr-api/clinical_mdr_api/tests/unit/utils/test_api_version.py b/clinical-mdr-api/clinical_mdr_api/tests/unit/utils/test_api_version.py index 397ff4fc..cc993390 100644 --- a/clinical-mdr-api/clinical_mdr_api/tests/unit/utils/test_api_version.py +++ b/clinical-mdr-api/clinical_mdr_api/tests/unit/utils/test_api_version.py @@ -30,12 +30,12 @@ def test_increment_api_version_if_needed(): api_spec_new = { "openapi": "3.0.2", "info": {"title": "OpenStudyBuilder API", "version": "2.0.0"}, - "paths": {"/concepts/odms/study-events": {}}, + "paths": {"/odms/study-events": {}}, } api_spec_old = { "openapi": "3.0.2", "info": {"title": "OpenStudyBuilder API", "version": "2.0.0"}, - "paths": {"/concepts/odms/study-events-old": {}}, + "paths": {"/odms/study-events-old": {}}, } api_spec_final = utils.increment_api_version_if_needed(api_spec_new, api_spec_old) @@ -52,12 +52,12 @@ def test_increment_api_version_if_needed(): api_spec_new = { "openapi": "3.0.2", "info": {"title": "OpenStudyBuilder API", "version": "2.0.2"}, - "paths": {"/concepts/odms/study-events": {}}, + "paths": {"/odms/study-events": {}}, } api_spec_old = { "openapi": "3.0.2", "info": {"title": "OpenStudyBuilder API", "version": "2.0.0"}, - "paths": {"/concepts/odms/study-events-old": {}}, + "paths": {"/odms/study-events-old": {}}, } api_spec_final = utils.increment_api_version_if_needed(api_spec_new, api_spec_old) @@ -68,12 +68,12 @@ def test_increment_api_version_if_needed(): api_spec_new = { "openapi": "3.0.2", "info": {"title": "OpenStudyBuilder API", "version": "2.0.0"}, - "paths": {"/concepts/odms/study-events": {}}, + "paths": {"/odms/study-events": {}}, } api_spec_old = { "openapi": "3.0.2", "info": {"title": "OpenStudyBuilder API", "version": "2.0.0"}, - "paths": {"/concepts/odms/study-events": {}}, + "paths": {"/odms/study-events": {}}, } api_spec_final = utils.increment_api_version_if_needed(api_spec_new, api_spec_old) diff --git a/clinical-mdr-api/clinical_mdr_api/utils/db_integrity_checks.py b/clinical-mdr-api/clinical_mdr_api/utils/db_integrity_checks.py index 7a0a2672..0726c0ee 100644 --- a/clinical-mdr-api/clinical_mdr_api/utils/db_integrity_checks.py +++ b/clinical-mdr-api/clinical_mdr_api/utils/db_integrity_checks.py @@ -113,8 +113,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): WITH root, collect(v) as versions WITH root, [v IN tail(versions) WHERE v.end_date IS NULL] as bad WITH root WHERE size(bad) > 0 - """ - + build_root_summary_return_statement("root"), + """ + build_root_summary_return_statement("root"), ), ( "only_one_latest_for_study_root", @@ -123,8 +122,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): MATCH (root:StudyRoot {uid: $study_uid})-[v:LATEST|LATEST_DRAFT|LATEST_FINAL|LATEST_RETIRED]->() WITH root, collect(type(v)) as types WHERE size(apoc.coll.duplicates(types)) > 0 - """ - + build_root_summary_return_statement("root"), + """ + build_root_summary_return_statement("root"), ), ( "test_no_duplicated_study_version_by_status_and_dates", @@ -134,8 +132,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): WITH root, collect(v.status) as statuses, v WITH root, statuses, collect(v.start_date) as starts, collect(v.end_date) as ends WHERE (size(apoc.coll.duplicates(starts)) > 0 OR size(apoc.coll.duplicates(ends)) > 0) - """ - + build_root_summary_return_statement("root"), + """ + build_root_summary_return_statement("root"), ), ( "no_study_version_has_negative_duration", @@ -143,8 +140,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): """ MATCH (root:StudyRoot {uid: $study_uid})-[v:HAS_VERSION|LATEST_DRAFT|LATEST_FINAL|LATEST_LOCKED|LATEST_RETIRED|LATEST_RELEASED]->() WHERE v.end_date IS NOT NULL AND v.end_date < v.start_date - """ - + build_root_summary_return_statement("root"), + """ + build_root_summary_return_statement("root"), ), ( "no_study_version_lacks_start_date", @@ -152,8 +148,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): """ MATCH (root:StudyRoot {uid: $study_uid})-[v:HAS_VERSION|LATEST_DRAFT|LATEST_FINAL|LATEST_LOCKED|LATEST_RETIRED|LATEST_RELEASED]->() WHERE v.start_date IS NULL - """ - + build_root_summary_return_statement("root"), + """ + build_root_summary_return_statement("root"), ), ( "no_study_version_lacks_end_date", @@ -161,8 +156,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): """ MATCH (root:StudyRoot {uid: $study_uid})-[v:HAS_VERSION]->(sv) WHERE v.end_date IS NULL AND NOT (root)-[:LATEST]->(sv) - """ - + build_root_summary_return_statement("root"), + """ + build_root_summary_return_statement("root"), ), ( "study_versions_in_chronologic_order", @@ -199,8 +193,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): WITH root, latest, collect(value) as values WITH root, latest, last(values) as latest_by_date WITH root WHERE latest <> latest_by_date - """ - + build_root_summary_return_statement("root"), + """ + build_root_summary_return_statement("root"), ), ( "no_latest_without_has_version", @@ -209,8 +202,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): MATCH (root:StudyRoot {uid: $study_uid})-[lat:LATEST_DRAFT|LATEST_FINAL|LATEST_LOCKED|LATEST_RETIRED|LATEST_RELEASED]->(value) WHERE lat.version IS NOT NULL AND lat.status IS NOT NULL AND NOT (root)-[:HAS_VERSION {version: lat.version, status: lat.status}]->(value) - """ - + build_root_summary_return_statement("root"), + """ + build_root_summary_return_statement("root"), ), ( "no_released_without_locked", @@ -218,8 +210,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): """ MATCH (root:StudyRoot {uid: $study_uid})-[hvl:HAS_VERSION {status: "LOCKED"}]->(value) WHERE NOT (root)-[:HAS_VERSION {change_description: hvl.change_description, status: "RELEASED"}]->(value) - """ - + build_root_summary_return_statement("root"), + """ + build_root_summary_return_statement("root"), ), ( "unique_study_selection_on_each_study_value", @@ -232,8 +223,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): WHERE ss_uid_count>=2 MATCH (sv)--(n) WHERE n.uid = ss_uid - """ - + build_root_summary_return_statement("n"), + """ + build_root_summary_return_statement("n"), ), # test_study_selection_audit_trail.py ( @@ -242,8 +232,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): """ MATCH (sr:StudyRoot {uid: $study_uid})-[:AUDIT_TRAIL]->(all_sa:StudyAction)-->(ss:StudySelection) WHERE NOT (:StudyAction)-[:AFTER]->(ss) AND NOT (:UpdateSoASnapshot)-[:AFTER]->(ss) - """ - + build_root_summary_return_statement("ss"), + """ + build_root_summary_return_statement("ss"), ), ( "study_action_after_relation", @@ -254,8 +243,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): NOT (sa)-[:AFTER]->() AND NOT sa:UpdateSoASnapshot //TODO: will change to StudyActionLog AND NOT (sa)-[:BEFORE]->(:StudyValue) - """ - + build_root_summary_return_statement("sa"), + """ + build_root_summary_return_statement("sa"), ), ( "study_selection_labels", @@ -265,8 +253,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): WHERE NOT ss:StudySelection AND NOT ss.uid is NULL WITH ss - """ - + build_root_summary_return_statement("ss"), + """ + build_root_summary_return_statement("ss"), ), ( "time_coherence_on_each_study_selection_required_relationship", @@ -311,8 +298,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): AND ss3.uid<>ss1.uid WITH ss1, ss1_ss2, ss2, ss2_saction, ss2_old_version WHERE ss3 IS NULL - """ - + build_root_summary_return_statement("ss1"), + """ + build_root_summary_return_statement("ss1"), ), ( "study_actions_are_in_chronological_order", @@ -327,8 +313,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): RETURN ALL(i IN RANGE(1, SIZE(dates)-1) WHERE dates[i-1] <= dates[i]) AS inOrder } WITH sr, ss WHERE NOT inOrder - """ - + build_root_summary_return_statement("ss"), + """ + build_root_summary_return_statement("ss"), ), # test_study_selection.py ( @@ -339,8 +324,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): OPTIONAL MATCH (av)<-[ahv:HAS_VERSION]-(ar:ActivityRoot) WHERE ahv.start_date < sa.date AND (ahv.end_date IS NULL OR ahv.end_date > sa.date) AND ahv.status = "Final" WITH sa, sact, av WHERE ar IS NULL - """ - + build_root_summary_return_statement("sact"), + """ + build_root_summary_return_statement("sact"), ), # testing study versions and study definition documents ( @@ -352,8 +336,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): OPTIONAL MATCH (study_value)-[:HAS_STUDY_VERSION]->(study_version:StudyVersion) WITH study_version, collect(DISTINCT study_definition_document) as study_definition_documents WHERE size(study_definition_documents) > 1 - """ - + build_root_summary_return_statement("study_version"), + """ + build_root_summary_return_statement("study_version"), ), ( "study_version_exists_if_has_protocol_soa_cell_and_study_definition_document_exists", @@ -363,8 +346,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): MATCH (study_value)-[:HAS_STUDY_DEFINITION_DOCUMENT]->(study_definition_document:StudyDefinitionDocument) OPTIONAL MATCH (study_value)-[:HAS_STUDY_VERSION]->(study_version:StudyVersion) WHERE soa_cell IS NOT NULL AND study_definition_document IS NOT NULL AND study_version IS NULL - """ - + build_root_summary_return_statement("study_definition_document"), + """ + build_root_summary_return_statement("study_definition_document"), ), ( "study_version_exists_if_study_definition_document_exists", @@ -372,8 +354,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): """ MATCH (study_root:StudyRoot {uid: $study_uid})-[:HAS_VERSION]->(study_value:StudyValue)-[:HAS_STUDY_DEFINITION_DOCUMENT]->(study_definition_document:StudyDefinitionDocument) WHERE study_definition_document IS NOT NULL AND NOT (study_value)-[:HAS_STUDY_VERSION]->(:StudyVersion) - """ - + build_root_summary_return_statement("study_definition_document"), + """ + build_root_summary_return_statement("study_definition_document"), ), ( "FINAL_or_RELEASED_study_version_exisits_if_study_version_node_exists", @@ -383,8 +364,7 @@ def build_root_summary_return_statement(root_alias, extra_return=None): WHERE has_version.status IN ["FINAL", "RELEASED"] WITH study_version, collect(has_version) as final_or_released_versions WHERE size(final_or_released_versions) = 0 - """ - + build_root_summary_return_statement("study_version"), + """ + build_root_summary_return_statement("study_version"), ), ] diff --git a/clinical-mdr-api/common/auth/user.py b/clinical-mdr-api/common/auth/user.py index 2b1b3811..c067f12a 100644 --- a/clinical-mdr-api/common/auth/user.py +++ b/clinical-mdr-api/common/auth/user.py @@ -2,7 +2,7 @@ from cachetools import TTLCache, cached from neo4j.exceptions import Forbidden -from neomodel.sync_.core import db +from neomodel import db from starlette_context import context from common.auth.models import Auth, User diff --git a/clinical-mdr-api/common/config.py b/clinical-mdr-api/common/config.py index 034d9ce9..d0bb8a12 100644 --- a/clinical-mdr-api/common/config.py +++ b/clinical-mdr-api/common/config.py @@ -67,6 +67,9 @@ def cast_to_bool(cls, value: str | bool) -> bool: neo4j_dsn: str neo4j_connection_lifetime: float = 29 * 60 neo4j_liveness_check_timeout: float = 5 * 60 + soft_cardinality_check: bool = ( + True # This will prevent cardinality violations from being raised as errors. + ) # Cache Configuration cache_max_size: int = 1000 diff --git a/clinical-mdr-api/common/database.py b/clinical-mdr-api/common/database.py index a626dbdd..d65d227d 100644 --- a/clinical-mdr-api/common/database.py +++ b/clinical-mdr-api/common/database.py @@ -12,7 +12,9 @@ urllib.parse.uses_netloc.append(scheme) -def configure_database(neo4j_dsn: str, /, **driver_options) -> Driver: +def configure_database( + neo4j_dsn: str, /, soft_cardinality_check: bool = True, **driver_options +) -> Driver: parsed = urllib.parse.urlparse(neo4j_dsn) if parsed.scheme not in ( @@ -39,6 +41,7 @@ def configure_database(neo4j_dsn: str, /, **driver_options) -> Driver: neomodel_config.DRIVER = driver neomodel_config.DATABASE_NAME = database_name neomodel_config.DATABASE_URL = None + neomodel_config.SOFT_CARDINALITY_CHECK = soft_cardinality_check return driver diff --git a/clinical-mdr-api/common/neomodel.py b/clinical-mdr-api/common/neomodel.py new file mode 100644 index 00000000..34781c90 --- /dev/null +++ b/clinical-mdr-api/common/neomodel.py @@ -0,0 +1,42 @@ +"""Proxy types to make mypy happy...""" + +import datetime +from typing import TYPE_CHECKING + +import neomodel + +if TYPE_CHECKING: + from typing import Any, Generic, TypeVar, overload + + T = TypeVar("T") + + class _Property(Generic[T]): + @overload + def __get__(self, obj: None, objtype: type) -> "_Property[T]": ... + @overload + def __get__(self, obj: Any, objtype: type) -> T: ... + def __get__(self, obj: Any, objtype: type) -> Any: ... + def __set__(self, obj: Any, value: T) -> None: ... + def __init__( + self, *args: Any, **kwargs: Any # pylint: disable=unused-argument + ) -> None: ... + + class StringProperty(_Property[str]): ... + + class IntegerProperty(_Property[int]): ... + + class BooleanProperty(_Property[bool]): ... + + class FloatProperty(_Property[float]): ... + + class DateProperty(_Property[datetime.date]): ... + + class ArrayProperty(_Property[list[Any]]): ... + +else: + StringProperty = neomodel.StringProperty + IntegerProperty = neomodel.IntegerProperty + BooleanProperty = neomodel.BooleanProperty + FloatProperty = neomodel.FloatProperty + DateProperty = neomodel.DateProperty + ArrayProperty = neomodel.ArrayProperty diff --git a/clinical-mdr-api/common/queries.py b/clinical-mdr-api/common/queries.py index 57f65e24..26397e71 100644 --- a/clinical-mdr-api/common/queries.py +++ b/clinical-mdr-api/common/queries.py @@ -1,22 +1,21 @@ """Common query patterns""" +# pylint: disable=invalid-name + from textwrap import dedent # Gives ct_terms_datetime for effective study_standard_version of a StudyValue -study_standard_version_ct_terms_datetime = dedent( - """ +study_standard_version_ct_terms_datetime = dedent(""" CALL { WITH study_value OPTIONAL MATCH (study_value)-[:HAS_STUDY_STANDARD_VERSION]->(study_standard_version:StudyStandardVersion)-[:HAS_CT_PACKAGE]->(ct_package:CTPackage) WHERE ct_package.uid CONTAINS "SDTM CT" RETURN datetime(toString(date(ct_package.effective_date)) + 'T23:59:59.999999000Z') AS ct_terms_datetime } -""" -) +""") # Gives CTTermNameValue as {value} for a CTTermRoot {root} at given ct_terms_datetime (f-string) -ct_term_name_at_datetime = dedent( - """ +ct_term_name_at_datetime = dedent(""" CALL {{ WITH {root}, ct_terms_datetime OPTIONAL MATCH ({root})-[:HAS_NAME_ROOT]->(:CTTermNameRoot)-[version:HAS_VERSION]->(value:CTTermNameValue) @@ -34,5 +33,4 @@ date_conflict: NOT dates_match }} AS {value} }} -""" -).rstrip() +""").rstrip() diff --git a/clinical-mdr-api/common/telemetry/request_metrics.py b/clinical-mdr-api/common/telemetry/request_metrics.py index 3f694d95..926cdc45 100644 --- a/clinical-mdr-api/common/telemetry/request_metrics.py +++ b/clinical-mdr-api/common/telemetry/request_metrics.py @@ -5,8 +5,8 @@ from functools import wraps from typing import Mapping -import neomodel import opencensus.trace +from neomodel.sync_.database import Database as NeomodelDatabase from pydantic import BaseModel, Field from starlette.datastructures import MutableHeaders from starlette.responses import Response @@ -130,7 +130,7 @@ def cypher_tracing(query: str, params: Mapping): def patch_neomodel_database(): - """Monkey-patch neomodel.core.db singleton to trace Cypher queries""" + """Monkey-patch neomodel db singleton to trace Cypher queries""" def wrap(func): @wraps(func) @@ -158,8 +158,6 @@ def _run_cypher_query( return _run_cypher_query - log.info("Patching neomodel.util.Database") + log.info("Patching neomodel.sync_.database.Database") - neomodel.sync_.core.Database._run_cypher_query = wrap( - neomodel.sync_.core.Database._run_cypher_query - ) + NeomodelDatabase._run_cypher_query = wrap(NeomodelDatabase._run_cypher_query) # type: ignore[method-assign] diff --git a/clinical-mdr-api/consumer_api/apiVersion b/clinical-mdr-api/consumer_api/apiVersion index 841597f0..27f3bc3e 100644 --- a/clinical-mdr-api/consumer_api/apiVersion +++ b/clinical-mdr-api/consumer_api/apiVersion @@ -1 +1 @@ -0.1.119 +0.1.120 diff --git a/clinical-mdr-api/consumer_api/openapi.json b/clinical-mdr-api/consumer_api/openapi.json index c9d9d7f8..7cd05cd7 100644 --- a/clinical-mdr-api/consumer_api/openapi.json +++ b/clinical-mdr-api/consumer_api/openapi.json @@ -3,7 +3,7 @@ "info": { "title": "OpenStudyBuilder Consumer API", "description": "\n## NOTICE\n\nThis license information is applicable to the swagger documentation of the clinical-mdr-api, that is the openapi.json.\n\n## License Terms (MIT)\n\nCopyright (C) 2025 Novo Nordisk A/S, Danish company registration no. 24256790\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n## Licenses and Acknowledgements for Incorporated Software\n\nThis component contains software licensed under different licenses when compiled, please refer to the third-party-licenses.md file for further information and full license texts.\n\n## Authentication\n\nSupports OAuth2 [Authorization Code Flow](https://datatracker.ietf.org/doc/html/rfc6749#section-4.1),\nat paths described in the OpenID Connect Discovery metadata document (whose URL is defined by the `OAUTH_METADATA_URL` environment variable).\n\nMicrosoft Identity Platform documentation can be read \n([here](https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow)).\n", - "version": "0.1.119" + "version": "0.1.120" }, "paths": { "/": { @@ -3255,6 +3255,14 @@ "type": "array", "title": "Versions", "description": "Study versions" + }, + "data_completeness_tags": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Data Completeness Tags", + "description": "List of data completeness tag names assigned to the study." } }, "type": "object", @@ -3281,6 +3289,7 @@ "study_activity_subgroup": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -3294,6 +3303,7 @@ "study_activity_group": { "anyOf": [ { + "additionalProperties": true, "type": "object" }, { @@ -3305,6 +3315,7 @@ "nullable": true }, "soa_group": { + "additionalProperties": true, "type": "object", "title": "Soa Group", "description": "SoA Group" diff --git a/clinical-mdr-api/consumer_api/requirements/fs/fs-studies.md b/clinical-mdr-api/consumer_api/requirements/fs/fs-studies.md index f9b1b558..26332488 100644 --- a/clinical-mdr-api/consumer_api/requirements/fs/fs-studies.md +++ b/clinical-mdr-api/consumer_api/requirements/fs/fs-studies.md @@ -204,7 +204,7 @@ The endpoint must return audit trail entries in CSV format with the following co - `action`: Action performed (Create, Edit, Delete) - `entity_uid`: UID of the entity affected by the action - `entity_type`: Type (node labels) of the entity affected by the action. Multiple labels are separated by '|' character. -- `changed_properties`: List of properties that were changed during the Edit action +- `changed_properties`: List of properties that were changed during the Edit action separated by '|' character. - `author`: Hashed (MD5) value of the ID of a user that performed the action The response must have a media type of `text/csv`. diff --git a/clinical-mdr-api/consumer_api/shared/common.py b/clinical-mdr-api/consumer_api/shared/common.py index 9e26d88b..ce5bebe5 100644 --- a/clinical-mdr-api/consumer_api/shared/common.py +++ b/clinical-mdr-api/consumer_api/shared/common.py @@ -5,7 +5,7 @@ from typing import Any from fastapi import Query -from neomodel.sync_.core import db +from neomodel import db from common.config import settings from common.exceptions import ValidationException diff --git a/clinical-mdr-api/consumer_api/system/service.py b/clinical-mdr-api/consumer_api/system/service.py index 3e1e9e93..ec32ede5 100644 --- a/clinical-mdr-api/consumer_api/system/service.py +++ b/clinical-mdr-api/consumer_api/system/service.py @@ -2,7 +2,7 @@ import urllib.parse from typing import Annotated -from neomodel.sync_.core import db +from neomodel import db from pydantic import BaseModel, Field diff --git a/clinical-mdr-api/consumer_api/tests/utils.py b/clinical-mdr-api/consumer_api/tests/utils.py index 83625b17..40a287b2 100644 --- a/clinical-mdr-api/consumer_api/tests/utils.py +++ b/clinical-mdr-api/consumer_api/tests/utils.py @@ -13,7 +13,7 @@ import neo4j.exceptions import openpyxl from fastapi.testclient import TestClient -from neomodel.sync_.core import db +from neomodel import db from common.config import settings from common.database import configure_database @@ -87,6 +87,25 @@ def assert_response_status_code(response: httpx.Response, status: int | Iterable ) +def assert_csv_format(csv_content: str, delimiter: str = ",") -> None: + """Assert that the CSV content is well-formed: + - Delimiter is the expected delimiter + - Each row has the same number of fields as the header + - No unexpected unescaped delimiters (field count mismatch would reveal this) + """ + lines = csv_content.splitlines() + assert len(lines) >= 2, "CSV must have at least a header and one data row" + reader = csv.reader(lines, delimiter=delimiter) + header = next(reader) + expected_fields = len(header) + assert expected_fields > 0, "CSV header must have at least one field" + for line_num, row in enumerate(reader, start=2): + assert len(row) == expected_fields, ( + f"Row {line_num} has {len(row)} fields, expected {expected_fields}. " + f"Row content: {row}" + ) + + class TestUtils: """Test utility functions for API tests.""" diff --git a/clinical-mdr-api/consumer_api/tests/v1/test_api_audit_trail.py b/clinical-mdr-api/consumer_api/tests/v1/test_api_audit_trail.py index 65304120..924a2fca 100644 --- a/clinical-mdr-api/consumer_api/tests/v1/test_api_audit_trail.py +++ b/clinical-mdr-api/consumer_api/tests/v1/test_api_audit_trail.py @@ -9,7 +9,7 @@ import pytest from fastapi.testclient import TestClient -from neomodel.sync_.core import Database +from neomodel.sync_.database import Database from clinical_mdr_api.services.studies.study import StudyService from clinical_mdr_api.services.studies.study_flowchart import StudyFlowchartService @@ -25,7 +25,11 @@ ) from clinical_mdr_api.tests.integration.utils.utils import TestUtils from consumer_api.consumer_api import app -from consumer_api.tests.utils import assert_response_status_code, set_db +from consumer_api.tests.utils import ( + assert_csv_format, + assert_response_status_code, + set_db, +) from consumer_api.v1 import models BASE_URL = "/v1" @@ -273,6 +277,7 @@ def test_get_study_audit_trail(api_client): assert_response_status_code(response, 200) csv_content = response.content.decode("utf-8") + assert_csv_format(csv_content) csv_reader = csv.DictReader(csv_content.splitlines()) rows = list(csv_reader) assert len(rows) > 0 @@ -283,6 +288,7 @@ def test_get_study_audit_trail(api_client): assert_response_status_code(response, 200) csv_content = response.content.decode("utf-8") + assert_csv_format(csv_content) csv_reader = csv.DictReader(csv_content.splitlines()) rows = list(csv_reader) assert len(rows) > 0 @@ -330,6 +336,7 @@ def test_count_create_and_edit_actions_per_entity_type(api_client): assert_response_status_code(response, 200) csv_content = response.content.decode("utf-8") + assert_csv_format(csv_content) csv_reader = csv.DictReader(csv_content.splitlines()) rows = list(csv_reader) assert len(rows) > 0 diff --git a/clinical-mdr-api/consumer_api/tests/v1/test_api_studies.py b/clinical-mdr-api/consumer_api/tests/v1/test_api_studies.py index 73299e4b..4ce0319a 100644 --- a/clinical-mdr-api/consumer_api/tests/v1/test_api_studies.py +++ b/clinical-mdr-api/consumer_api/tests/v1/test_api_studies.py @@ -6,6 +6,7 @@ import pytest from fastapi.testclient import TestClient +from clinical_mdr_api.services.data_completeness_tags import DataCompletenessTagService from clinical_mdr_api.services.studies.study import StudyService from clinical_mdr_api.services.studies.study_flowchart import StudyFlowchartService from clinical_mdr_api.tests.integration.utils.api import inject_base_data @@ -33,6 +34,7 @@ "number", "acronym", "versions", + "data_completeness_tags", ] STUDY_FIELDS_NOT_NULL = [ @@ -475,6 +477,40 @@ def test_get_studies(api_client): ), f"Study {study.uid} not found in response" +def test_get_studies_returns_data_completeness_tags(api_client): + """Verify that data_completeness_tags are properly returned for studies.""" + # Create tags and assign them to a study + tag1 = TestUtils.create_data_completeness_tag(name="Consumer API Tag A") + tag2 = TestUtils.create_data_completeness_tag(name="Consumer API Tag B") + + service = DataCompletenessTagService() + service.assign_tag_to_study(study_uid=studies[0].uid, tag_uid=tag1.uid) + service.assign_tag_to_study(study_uid=studies[0].uid, tag_uid=tag2.uid) + + response = api_client.get(f"{BASE_URL}/studies?page_size=100") + assert_response_status_code(response, 200) + res = response.json() + + # Find the study we assigned tags to + study_item = next((s for s in res["items"] if s["uid"] == studies[0].uid), None) + assert study_item is not None + assert "data_completeness_tags" in study_item + assert isinstance(study_item["data_completeness_tags"], list) + assert tag1.name in study_item["data_completeness_tags"] + assert tag2.name in study_item["data_completeness_tags"] + + # Verify a study without tags returns an empty list + study_without_tags = next( + (s for s in res["items"] if s["uid"] == studies[1].uid), None + ) + assert study_without_tags is not None + assert study_without_tags["data_completeness_tags"] == [] + + # Cleanup + service.remove_tag_from_study(study_uid=studies[0].uid, tag_uid=tag1.uid) + service.remove_tag_from_study(study_uid=studies[0].uid, tag_uid=tag2.uid) + + def test_get_studies_pagination_sorting(api_client): page_size_default = 10 diff --git a/clinical-mdr-api/consumer_api/tests/v2/test_api.py b/clinical-mdr-api/consumer_api/tests/v2/test_api.py index 48dce8a9..0647e160 100644 --- a/clinical-mdr-api/consumer_api/tests/v2/test_api.py +++ b/clinical-mdr-api/consumer_api/tests/v2/test_api.py @@ -21,6 +21,7 @@ "acronym", "id_prefix", "number", + "data_completeness_tags", ] STUDY_FIELDS_NOT_NULL = [ diff --git a/clinical-mdr-api/consumer_api/v1/db.py b/clinical-mdr-api/consumer_api/v1/db.py index 8df4552b..c7a6b3f3 100644 --- a/clinical-mdr-api/consumer_api/v1/db.py +++ b/clinical-mdr-api/consumer_api/v1/db.py @@ -105,6 +105,7 @@ def get_studies( }}) AS authors ORDER BY hv.start_date DESC WITH + study_root, study_root.uid as uid, study_value.study_acronym as acronym, study_value.study_id_prefix as id_prefix, @@ -136,7 +137,8 @@ def get_studies( id_prefix, number, id, - versions + versions, + [(study_root)-[:HAS_COMPLETENESS_TAG]->(t:DataCompletenessTag) | t.name] as data_completeness_tags """ full_query = " ".join( diff --git a/clinical-mdr-api/consumer_api/v1/main.py b/clinical-mdr-api/consumer_api/v1/main.py index de26c734..09eb1cb9 100644 --- a/clinical-mdr-api/consumer_api/v1/main.py +++ b/clinical-mdr-api/consumer_api/v1/main.py @@ -661,6 +661,14 @@ def get_studies_audit_trail( ] csv_output = ",".join(keys) + "\n" for entry in audit_trail: + # None values are returned as empty string + # lists are returned as val1|val2 + for key in keys: + if entry[key] is None: + entry[key] = "" + elif isinstance(entry[key], list): + entry[key] = "|".join(entry[key]) + csv_output += ",".join(str(entry[key]) for key in keys) csv_output += "\n" diff --git a/clinical-mdr-api/consumer_api/v1/models.py b/clinical-mdr-api/consumer_api/v1/models.py index 1c015f2d..18a47ef0 100644 --- a/clinical-mdr-api/consumer_api/v1/models.py +++ b/clinical-mdr-api/consumer_api/v1/models.py @@ -124,6 +124,10 @@ def from_input(cls, val: dict[str, Any]): Field(description="Study acronym", json_schema_extra={"nullable": True}), ] = None versions: Annotated[list[StudyVersion], Field(description="Study versions")] + data_completeness_tags: list[str] = Field( + description="List of data completeness tag names assigned to the study.", + default_factory=list, + ) @classmethod def from_input(cls, val: dict[str, Any]): @@ -138,6 +142,7 @@ def from_input(cls, val: dict[str, Any]): Study.StudyVersion.from_input(version) for version in val.get("versions", []) ], + data_completeness_tags=val.get("data_completeness_tags", []), ) diff --git a/clinical-mdr-api/consumer_api/v2/models.py b/clinical-mdr-api/consumer_api/v2/models.py index e12a4a60..9662dc51 100644 --- a/clinical-mdr-api/consumer_api/v2/models.py +++ b/clinical-mdr-api/consumer_api/v2/models.py @@ -29,6 +29,10 @@ class Study(BaseModel): str | None, Field(description="Study number", json_schema_extra={"nullable": True}), ] = None + data_completeness_tags: list[str] = Field( + description="List of data completeness tag names assigned to the study.", + default_factory=list, + ) @classmethod def from_input(cls, val: dict[str, Any]): @@ -38,4 +42,5 @@ def from_input(cls, val: dict[str, Any]): acronym=val["acronym"], id_prefix=val["id_prefix"], number=val["number"], + data_completeness_tags=val.get("data_completeness_tags", []), ) diff --git a/clinical-mdr-api/doc/licenses/fhir_core-1.1.4.txt b/clinical-mdr-api/doc/licenses/fhir.resources-8.2.0.txt similarity index 100% rename from clinical-mdr-api/doc/licenses/fhir_core-1.1.4.txt rename to clinical-mdr-api/doc/licenses/fhir.resources-8.2.0.txt diff --git a/clinical-mdr-api/doc/licenses/fhir_core-1.1.5.txt b/clinical-mdr-api/doc/licenses/fhir_core-1.1.5.txt new file mode 100644 index 00000000..f7d404a1 --- /dev/null +++ b/clinical-mdr-api/doc/licenses/fhir_core-1.1.5.txt @@ -0,0 +1,29 @@ +BSD License + +Copyright (c) 2019, Md Nazrul Islam +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/clinical-mdr-api/extensions/README.md b/clinical-mdr-api/extensions/README.md index 9d0ef315..8cc417e8 100644 --- a/clinical-mdr-api/extensions/README.md +++ b/clinical-mdr-api/extensions/README.md @@ -65,7 +65,7 @@ extensions/ ## How to run extensions locally ### Prerequisites -- Python 3.13+ installed +- Python 3.14 installed - Pipenv installed - Neo4j database running (configure `NEO4J_DSN` environment variable) - Dependencies installed: `pipenv install` diff --git a/clinical-mdr-api/extensions/common.py b/clinical-mdr-api/extensions/common.py index 00d4be32..d4bbddf9 100644 --- a/clinical-mdr-api/extensions/common.py +++ b/clinical-mdr-api/extensions/common.py @@ -6,7 +6,7 @@ from typing import Annotated, Any, Generic, Self, TypeVar from fastapi import Query, Request -from neomodel.sync_.core import db +from neomodel import db from pydantic import BaseModel, Field from requests.utils import requote_uri diff --git a/clinical-mdr-api/extensions/hello/db.py b/clinical-mdr-api/extensions/hello/db.py index cf967bfd..8eeaa664 100644 --- a/clinical-mdr-api/extensions/hello/db.py +++ b/clinical-mdr-api/extensions/hello/db.py @@ -5,10 +5,8 @@ def get_node_count() -> int: - result = query( - """ + result = query(""" MATCH (n) RETURN count(n) AS node_count - """ - ) + """) return result[0]["node_count"] if result else 0 diff --git a/clinical-mdr-api/openapi.json b/clinical-mdr-api/openapi.json index f8eb9cbf..c054dbe4 100644 --- a/clinical-mdr-api/openapi.json +++ b/clinical-mdr-api/openapi.json @@ -3,7 +3,7 @@ "info": { "title": "OpenStudyBuilder API", "description": "\n## NOTICE\n\nThis license information is applicable to the swagger documentation of the clinical-mdr-api, that is the openapi.json.\n\n## License Terms (MIT)\n\nCopyright (C) 2025 Novo Nordisk A/S, Danish company registration no. 24256790\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n## Licenses and Acknowledgements for Incorporated Software\n\nThis component contains software licensed under different licenses when compiled, please refer to the third-party-licenses.md file for further information and full license texts.\n\n## Authentication\n\nSupports OAuth2 [Authorization Code Flow](https://datatracker.ietf.org/doc/html/rfc6749#section-4.1),\nat paths described in the OpenID Connect Discovery metadata document (whose URL is defined by the `OAUTH_METADATA_URL` environment variable).\n\nMicrosoft Identity Platform documentation can be read \n([here](https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow)).\n\nAuthentication can be turned off with `OAUTH_ENABLED=false` environment variable. \n\nWhen authentication is turned on, all requests to protected API endpoints must provide a valid bearer (JWT) token inside the `Authorization` http header. \n", - "version": "3.0.610" + "version": "3.0.628" }, "paths": { "/": { @@ -178,6 +178,174 @@ } } }, + "/user-preferences": { + "get": { + "tags": [ + "User Preferences" + ], + "summary": "Returns user preferences", + "operationId": "get_user_preferences_user_preferences_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserPreferencesResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + }, + { + "BearerJwtAuth": [] + } + ] + }, + "patch": { + "tags": [ + "User Preferences" + ], + "summary": "Update user preferences", + "description": "Update one or more user preference settings", + "operationId": "patch_user_preferences_user_preferences_patch", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserPreferencesPatchInput" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserPreferencesResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + }, + { + "BearerJwtAuth": [] + } + ] + } + }, + "/user-preferences/{preference_key}": { + "delete": { + "tags": [ + "User Preferences" + ], + "summary": "Delete user preference", + "description": "Reset a user preference to global default by deleting the user override", + "operationId": "delete_user_preference_user_preferences__preference_key__delete", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + }, + { + "BearerJwtAuth": [] + } + ], + "parameters": [ + { + "name": "preference_key", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "Preference Key" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserPreferencesResponse" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, "/feature-flags": { "get": { "tags": [ @@ -519,13 +687,13 @@ } } }, - "/notifications": { + "/data-completeness-tags": { "get": { "tags": [ - "Notifications" + "Data Completeness Tags" ], - "summary": "Returns all notifications.", - "operationId": "get_all_notifications_notifications_get", + "summary": "Returns all data completeness tags.", + "operationId": "get_all_data_completeness_tags_data_completeness_tags_get", "responses": { "200": { "description": "Successful Response", @@ -533,10 +701,10 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/Notification" + "$ref": "#/components/schemas/DataCompletenessTag" }, "type": "array", - "title": "Response Get All Notifications Notifications Get" + "title": "Response Get All Data Completeness Tags Data Completeness Tags Get" } } } @@ -583,15 +751,15 @@ }, "post": { "tags": [ - "Notifications" + "Data Completeness Tags" ], - "summary": "Creates a notification.", - "operationId": "create_notification_notifications_post", + "summary": "Creates a data completeness tag.", + "operationId": "create_data_completeness_tag_data_completeness_tags_post", "requestBody": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/NotificationPostInput" + "$ref": "#/components/schemas/DataCompletenessTagInput" } } }, @@ -603,7 +771,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Notification" + "$ref": "#/components/schemas/DataCompletenessTag" } } } @@ -628,6 +796,16 @@ } } }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource. This typically occurs when attempting to create or modify a resource that already exists or violates a uniqueness constraint.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "400": { "description": "Bad Request", "content": { @@ -649,58 +827,13 @@ ] } }, - "/notifications/actives": { - "get": { - "tags": [ - "Notifications" - ], - "summary": "Returns all notifications that are currently published and active.", - "operationId": "get_all_active_notifications_notifications_actives_get", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/Notification" - }, - "type": "array", - "title": "Response Get All Active Notifications Notifications Actives Get" - } - } - } - }, - "404": { - "description": "Entity not found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - }, - "400": { - "description": "Bad Request", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ErrorResponse" - } - } - } - } - } - } - }, - "/notifications/{serial_number}": { - "get": { + "/data-completeness-tags/{uid}": { + "put": { "tags": [ - "Notifications" + "Data Completeness Tags" ], - "summary": "Returns the notification identified by the provided Serial Number.", - "operationId": "get_notification_notifications__serial_number__get", + "summary": "Updates the data completeness tag identified by the provided UID.", + "operationId": "update_data_completeness_tag_data_completeness_tags__uid__put", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -711,22 +844,32 @@ ], "parameters": [ { - "name": "serial_number", + "name": "uid", "in": "path", "required": true, "schema": { - "type": "integer", - "title": "Serial Number of the notification" + "type": "string", + "title": "UID of the data completeness tag" } } ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataCompletenessTagInput" + } + } + } + }, "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/Notification" + "$ref": "#/components/schemas/DataCompletenessTag" } } } @@ -751,6 +894,16 @@ } } }, + "409": { + "description": "The request could not be completed due to a conflict with the current state of the target resource. This typically occurs when attempting to create or modify a resource that already exists or violates a uniqueness constraint.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, "400": { "description": "Bad Request", "content": { @@ -763,12 +916,12 @@ } } }, - "patch": { + "delete": { "tags": [ - "Notifications" + "Data Completeness Tags" ], - "summary": "Updates the notification identified by the provided Serial Number.", - "operationId": "update_notification_notifications__serial_number__patch", + "summary": "Deletes the data completeness tag identified by the provided UID.", + "operationId": "delete_data_completeness_tag_data_completeness_tags__uid__delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -779,35 +932,341 @@ ], "parameters": [ { - "name": "serial_number", + "name": "uid", "in": "path", "required": true, "schema": { - "type": "integer", - "title": "Serial Number of the notification" + "type": "string", + "title": "UID of the data completeness tag" } } ], - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/NotificationPatchInput" - } - } - } - }, "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Notification" - } - } - } + "204": { + "description": "Successful Response" + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Entity not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/notifications": { + "get": { + "tags": [ + "Notifications" + ], + "summary": "Returns all notifications.", + "operationId": "get_all_notifications_notifications_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/Notification" + }, + "type": "array", + "title": "Response Get All Notifications Notifications Get" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Entity not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + }, + { + "BearerJwtAuth": [] + } + ] + }, + "post": { + "tags": [ + "Notifications" + ], + "summary": "Creates a notification.", + "operationId": "create_notification_notifications_post", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationPostInput" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Notification" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Entity not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + }, + { + "BearerJwtAuth": [] + } + ] + } + }, + "/notifications/actives": { + "get": { + "tags": [ + "Notifications" + ], + "summary": "Returns all notifications that are currently published and active.", + "operationId": "get_all_active_notifications_notifications_actives_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/Notification" + }, + "type": "array", + "title": "Response Get All Active Notifications Notifications Actives Get" + } + } + } + }, + "404": { + "description": "Entity not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/notifications/{serial_number}": { + "get": { + "tags": [ + "Notifications" + ], + "summary": "Returns the notification identified by the provided Serial Number.", + "operationId": "get_notification_notifications__serial_number__get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + }, + { + "BearerJwtAuth": [] + } + ], + "parameters": [ + { + "name": "serial_number", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Serial Number of the notification" + } + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Notification" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Entity not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "patch": { + "tags": [ + "Notifications" + ], + "summary": "Updates the notification identified by the provided Serial Number.", + "operationId": "update_notification_notifications__serial_number__patch", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + }, + { + "BearerJwtAuth": [] + } + ], + "parameters": [ + { + "name": "serial_number", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "title": "Serial Number of the notification" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotificationPatchInput" + } + } + } + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Notification" + } + } + } }, "403": { "description": "Forbidden", @@ -947,14 +1406,14 @@ ] } }, - "/concepts/odms/study-events": { + "/odms/study-events": { "get": { "tags": [ "ODM Study Events" ], "summary": "Return every variable related to the selected status and version of the ODM Study Events", "description": "Response format:\n\n- In addition to retrieving data in JSON format (default behaviour), \nit is possible to request data to be returned in CSV, XML or Excel formats \nby sending the `Accept` http request header with one of the following values:\n - `text/csv`\n\n - `text/xml`\n\n - `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`", - "operationId": "get_all_odm_study_events_concepts_odms_study_events_get", + "operationId": "get_all_odm_study_events_odms_study_events_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -1151,7 +1610,7 @@ "ODM Study Events" ], "summary": "Creates a new Study Event in 'Draft' status with version 0.1", - "operationId": "create_odm_study_event_concepts_odms_study_events_post", + "operationId": "create_odm_study_event_odms_study_events_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -1214,14 +1673,14 @@ } } }, - "/concepts/odms/study-events/headers": { + "/odms/study-events/headers": { "get": { "tags": [ "ODM Study Events" ], "summary": "Returns possible values from the database for a given header", "description": "Allowed parameters include : field name for which to get possible\n values, search string to provide filtering for the field name, additional filters to apply on other fields", - "operationId": "get_distinct_values_for_header_concepts_odms_study_events_headers_get", + "operationId": "get_distinct_values_for_header_odms_study_events_headers_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -1345,7 +1804,7 @@ "schema": { "type": "array", "items": {}, - "title": "Response Get Distinct Values For Header Concepts Odms Study Events Headers Get" + "title": "Response Get Distinct Values For Header Odms Study Events Headers Get" } } } @@ -1383,13 +1842,13 @@ } } }, - "/concepts/odms/study-events/{odm_study_event_uid}": { + "/odms/study-events/{odm_study_event_uid}": { "get": { "tags": [ "ODM Study Events" ], "summary": "Get details on a specific ODM Study Event (in a specific version)", - "operationId": "get_odm_study_event_concepts_odms_study_events__odm_study_event_uid__get", + "operationId": "get_odm_study_event_odms_study_events__odm_study_event_uid__get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -1477,7 +1936,7 @@ "ODM Study Events" ], "summary": "Update ODM Study Event", - "operationId": "edit_odm_study_event_concepts_odms_study_events__odm_study_event_uid__patch", + "operationId": "edit_odm_study_event_odms_study_events__odm_study_event_uid__patch", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -1557,7 +2016,7 @@ "ODM Study Events" ], "summary": "Delete draft version of ODM Study Event", - "operationId": "delete_odm_study_event_concepts_odms_study_events__odm_study_event_uid__delete", + "operationId": "delete_odm_study_event_odms_study_events__odm_study_event_uid__delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -1616,13 +2075,13 @@ } } }, - "/concepts/odms/study-events/{odm_study_event_uid}/relationships": { + "/odms/study-events/{odm_study_event_uid}/relationships": { "get": { "tags": [ "ODM Study Events" ], "summary": "Get UIDs of a specific ODM Study Event's relationships", - "operationId": "get_active_relationships_concepts_odms_study_events__odm_study_event_uid__relationships_get", + "operationId": "get_active_relationships_odms_study_events__odm_study_event_uid__relationships_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -1657,7 +2116,7 @@ "type": "string" } }, - "title": "Response Get Active Relationships Concepts Odms Study Events Odm Study Event Uid Relationships Get" + "title": "Response Get Active Relationships Odms Study Events Odm Study Event Uid Relationships Get" } } } @@ -1695,14 +2154,14 @@ } } }, - "/concepts/odms/study-events/{odm_study_event_uid}/versions": { + "/odms/study-events/{odm_study_event_uid}/versions": { "get": { "tags": [ "ODM Study Events" ], "summary": "List version history for ODM Study Event", "description": "State before:\n - uid must exist.\n\nBusiness logic:\n - List version history for ODM Study Events.\n - The returned versions are ordered by start_date descending (newest entries first).\n\nState after:\n - No change\n\nPossible errors:\n - Invalid uid.", - "operationId": "get_odm_study_event_versions_concepts_odms_study_events__odm_study_event_uid__versions_get", + "operationId": "get_odm_study_event_versions_odms_study_events__odm_study_event_uid__versions_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -1734,7 +2193,7 @@ "items": { "$ref": "#/components/schemas/OdmStudyEvent" }, - "title": "Response Get Odm Study Event Versions Concepts Odms Study Events Odm Study Event Uid Versions Get" + "title": "Response Get Odm Study Event Versions Odms Study Events Odm Study Event Uid Versions Get" } } } @@ -1777,7 +2236,7 @@ ], "summary": " Create a new version of ODM Study Event", "description": "State before:\n - uid must exist and the ODM Study Event must be in status Final.\n\nBusiness logic:\n- The ODM Study Event is changed to a draft state.\n\nState after:\n - ODM Study Event changed status to Draft and assigned a new minor version number.\n - Audit trail entry must be made with action of creating a new draft version.\n\nPossible errors:\n - Invalid uid or status not Final.", - "operationId": "create_odm_study_event_version_concepts_odms_study_events__odm_study_event_uid__versions_post", + "operationId": "create_odm_study_event_version_odms_study_events__odm_study_event_uid__versions_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -1855,13 +2314,13 @@ } } }, - "/concepts/odms/study-events/{odm_study_event_uid}/approvals": { + "/odms/study-events/{odm_study_event_uid}/approvals": { "post": { "tags": [ "ODM Study Events" ], "summary": "Approve draft version of ODM Study Event", - "operationId": "approve_odm_study_event_concepts_odms_study_events__odm_study_event_uid__approvals_post", + "operationId": "approve_odm_study_event_odms_study_events__odm_study_event_uid__approvals_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -1927,13 +2386,13 @@ } } }, - "/concepts/odms/study-events/{odm_study_event_uid}/activations": { + "/odms/study-events/{odm_study_event_uid}/activations": { "delete": { "tags": [ "ODM Study Events" ], "summary": " Inactivate final version of ODM Study Event", - "operationId": "inactivate_odm_study_event_concepts_odms_study_events__odm_study_event_uid__activations_delete", + "operationId": "inactivate_odm_study_event_odms_study_events__odm_study_event_uid__activations_delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -2003,7 +2462,7 @@ "ODM Study Events" ], "summary": "Reactivate retired version of a ODM Study Event", - "operationId": "reactivate_odm_study_event_concepts_odms_study_events__odm_study_event_uid__activations_post", + "operationId": "reactivate_odm_study_event_odms_study_events__odm_study_event_uid__activations_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -2069,13 +2528,13 @@ } } }, - "/concepts/odms/study-events/{odm_study_event_uid}/forms": { + "/odms/study-events/{odm_study_event_uid}/forms": { "post": { "tags": [ "ODM Study Events" ], "summary": "Adds forms to the ODM Study Event.", - "operationId": "add_forms_to_odm_study_event_concepts_odms_study_events__odm_study_event_uid__forms_post", + "operationId": "add_forms_to_odm_study_event_odms_study_events__odm_study_event_uid__forms_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -2167,14 +2626,14 @@ } } }, - "/concepts/odms/forms": { + "/odms/forms": { "get": { "tags": [ "ODM Forms" ], "summary": "Return every variable related to the selected status and version of the ODM Forms", "description": "Response format:\n\n- In addition to retrieving data in JSON format (default behaviour), \nit is possible to request data to be returned in CSV, XML or Excel formats \nby sending the `Accept` http request header with one of the following values:\n - `text/csv`\n\n - `text/xml`\n\n - `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`", - "operationId": "get_all_odm_forms_concepts_odms_forms_get", + "operationId": "get_all_odm_forms_odms_forms_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -2371,7 +2830,7 @@ "ODM Forms" ], "summary": "Creates a new Form in 'Draft' status with version 0.1", - "operationId": "create_odm_form_concepts_odms_forms_post", + "operationId": "create_odm_form_odms_forms_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -2434,14 +2893,14 @@ } } }, - "/concepts/odms/forms/headers": { + "/odms/forms/headers": { "get": { "tags": [ "ODM Forms" ], "summary": "Returns possible values from the database for a given header", "description": "Allowed parameters include : field name for which to get possible\n values, search string to provide filtering for the field name, additional filters to apply on other fields", - "operationId": "get_distinct_values_for_header_concepts_odms_forms_headers_get", + "operationId": "get_distinct_values_for_header_odms_forms_headers_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -2565,7 +3024,7 @@ "schema": { "type": "array", "items": {}, - "title": "Response Get Distinct Values For Header Concepts Odms Forms Headers Get" + "title": "Response Get Distinct Values For Header Odms Forms Headers Get" } } } @@ -2603,14 +3062,14 @@ } } }, - "/concepts/odms/forms/study-events": { + "/odms/forms/study-events": { "get": { "tags": [ "ODM Forms" ], "summary": "Get all ODM Forms that belongs to an ODM Study Event", "description": "Response format:\n\n- In addition to retrieving data in JSON format (default behaviour), \nit is possible to request data to be returned in CSV, XML or Excel formats \nby sending the `Accept` http request header with one of the following values:\n - `text/csv`\n\n - `text/xml`\n\n - `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`", - "operationId": "get_odm_form_that_belongs_to_study_event_concepts_odms_forms_study_events_get", + "operationId": "get_odm_form_that_belongs_to_study_event_odms_forms_study_events_get", "responses": { "200": { "description": "Successful Response", @@ -2621,7 +3080,7 @@ "$ref": "#/components/schemas/OdmElementWithParentUid" }, "type": "array", - "title": "Response Get Odm Form That Belongs To Study Event Concepts Odms Forms Study Events Get" + "title": "Response Get Odm Form That Belongs To Study Event Odms Forms Study Events Get" } } } @@ -2667,13 +3126,13 @@ ] } }, - "/concepts/odms/forms/{odm_form_uid}": { + "/odms/forms/{odm_form_uid}": { "get": { "tags": [ "ODM Forms" ], "summary": "Get details on a specific ODM Form (in a specific version)", - "operationId": "get_odm_form_concepts_odms_forms__odm_form_uid__get", + "operationId": "get_odm_form_odms_forms__odm_form_uid__get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -2761,7 +3220,7 @@ "ODM Forms" ], "summary": "Update ODM Form", - "operationId": "edit_odm_form_concepts_odms_forms__odm_form_uid__patch", + "operationId": "edit_odm_form_odms_forms__odm_form_uid__patch", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -2841,7 +3300,7 @@ "ODM Forms" ], "summary": "Delete draft version of ODM Form", - "operationId": "delete_odm_form_concepts_odms_forms__odm_form_uid__delete", + "operationId": "delete_odm_form_odms_forms__odm_form_uid__delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -2900,13 +3359,13 @@ } } }, - "/concepts/odms/forms/{odm_form_uid}/relationships": { + "/odms/forms/{odm_form_uid}/relationships": { "get": { "tags": [ "ODM Forms" ], "summary": "Get UIDs of a specific ODM Form's relationships", - "operationId": "get_active_relationships_concepts_odms_forms__odm_form_uid__relationships_get", + "operationId": "get_active_relationships_odms_forms__odm_form_uid__relationships_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -2941,7 +3400,7 @@ "type": "string" } }, - "title": "Response Get Active Relationships Concepts Odms Forms Odm Form Uid Relationships Get" + "title": "Response Get Active Relationships Odms Forms Odm Form Uid Relationships Get" } } } @@ -2979,14 +3438,14 @@ } } }, - "/concepts/odms/forms/{odm_form_uid}/versions": { + "/odms/forms/{odm_form_uid}/versions": { "get": { "tags": [ "ODM Forms" ], "summary": "List version history for ODM Form", "description": "State before:\n - uid must exist.\n\nBusiness logic:\n - List version history for ODM Forms.\n - The returned versions are ordered by start_date descending (newest entries first).\n\nState after:\n - No change\n\nPossible errors:\n - Invalid uid.", - "operationId": "get_odm_form_versions_concepts_odms_forms__odm_form_uid__versions_get", + "operationId": "get_odm_form_versions_odms_forms__odm_form_uid__versions_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -3018,7 +3477,7 @@ "items": { "$ref": "#/components/schemas/OdmForm" }, - "title": "Response Get Odm Form Versions Concepts Odms Forms Odm Form Uid Versions Get" + "title": "Response Get Odm Form Versions Odms Forms Odm Form Uid Versions Get" } } } @@ -3061,7 +3520,7 @@ ], "summary": " Create a new version of ODM Form", "description": "State before:\n - uid must exist and the ODM Form must be in status Final.\n\nBusiness logic:\n- The ODM Form is changed to a draft state.\n\nState after:\n - ODM Form changed status to Draft and assigned a new minor version number.\n - Audit trail entry must be made with action of creating a new draft version.\n\nPossible errors:\n - Invalid uid or status not Final.", - "operationId": "create_odm_form_version_concepts_odms_forms__odm_form_uid__versions_post", + "operationId": "create_odm_form_version_odms_forms__odm_form_uid__versions_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -3139,13 +3598,13 @@ } } }, - "/concepts/odms/forms/{odm_form_uid}/approvals": { + "/odms/forms/{odm_form_uid}/approvals": { "post": { "tags": [ "ODM Forms" ], "summary": "Approve draft version of ODM Form", - "operationId": "approve_odm_form_concepts_odms_forms__odm_form_uid__approvals_post", + "operationId": "approve_odm_form_odms_forms__odm_form_uid__approvals_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -3211,13 +3670,13 @@ } } }, - "/concepts/odms/forms/{odm_form_uid}/activations": { + "/odms/forms/{odm_form_uid}/activations": { "delete": { "tags": [ "ODM Forms" ], "summary": " Inactivate final version of ODM Form", - "operationId": "inactivate_odm_form_concepts_odms_forms__odm_form_uid__activations_delete", + "operationId": "inactivate_odm_form_odms_forms__odm_form_uid__activations_delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -3287,7 +3746,7 @@ "ODM Forms" ], "summary": "Reactivate retired version of a ODM Form", - "operationId": "reactivate_odm_form_concepts_odms_forms__odm_form_uid__activations_post", + "operationId": "reactivate_odm_form_odms_forms__odm_form_uid__activations_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -3353,13 +3812,13 @@ } } }, - "/concepts/odms/forms/{odm_form_uid}/item-groups": { + "/odms/forms/{odm_form_uid}/item-groups": { "post": { "tags": [ "ODM Forms" ], "summary": "Adds item groups to the ODM Form.", - "operationId": "add_item_groups_to_odm_form_concepts_odms_forms__odm_form_uid__item_groups_post", + "operationId": "add_item_groups_to_odm_form_odms_forms__odm_form_uid__item_groups_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -3451,14 +3910,14 @@ } } }, - "/concepts/odms/item-groups": { + "/odms/item-groups": { "get": { "tags": [ "ODM Item Groups" ], "summary": "Return every variable related to the selected status and version of the ODM Item Groups", "description": "Response format:\n\n- In addition to retrieving data in JSON format (default behaviour), \nit is possible to request data to be returned in CSV, XML or Excel formats \nby sending the `Accept` http request header with one of the following values:\n - `text/csv`\n\n - `text/xml`\n\n - `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`", - "operationId": "get_all_odm_item_groups_concepts_odms_item_groups_get", + "operationId": "get_all_odm_item_groups_odms_item_groups_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -3655,7 +4114,7 @@ "ODM Item Groups" ], "summary": "Creates a new Item Group in 'Draft' status with version 0.1", - "operationId": "create_odm_item_group_concepts_odms_item_groups_post", + "operationId": "create_odm_item_group_odms_item_groups_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -3718,14 +4177,14 @@ } } }, - "/concepts/odms/item-groups/headers": { + "/odms/item-groups/headers": { "get": { "tags": [ "ODM Item Groups" ], "summary": "Returns possible values from the database for a given header", "description": "Allowed parameters include : field name for which to get possible\n values, search string to provide filtering for the field name, additional filters to apply on other fields", - "operationId": "get_distinct_values_for_header_concepts_odms_item_groups_headers_get", + "operationId": "get_distinct_values_for_header_odms_item_groups_headers_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -3849,7 +4308,7 @@ "schema": { "type": "array", "items": {}, - "title": "Response Get Distinct Values For Header Concepts Odms Item Groups Headers Get" + "title": "Response Get Distinct Values For Header Odms Item Groups Headers Get" } } } @@ -3887,14 +4346,14 @@ } } }, - "/concepts/odms/item-groups/forms": { + "/odms/item-groups/forms": { "get": { "tags": [ "ODM Item Groups" ], "summary": "Get all ODM Item Groups that belongs to an ODM Form", "description": "Response format:\n\n- In addition to retrieving data in JSON format (default behaviour), \nit is possible to request data to be returned in CSV, XML or Excel formats \nby sending the `Accept` http request header with one of the following values:\n - `text/csv`\n\n - `text/xml`\n\n - `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`", - "operationId": "get_odm_item_group_that_belongs_to_form_concepts_odms_item_groups_forms_get", + "operationId": "get_odm_item_group_that_belongs_to_form_odms_item_groups_forms_get", "responses": { "200": { "description": "Successful Response", @@ -3905,7 +4364,7 @@ "$ref": "#/components/schemas/OdmElementWithParentUid" }, "type": "array", - "title": "Response Get Odm Item Group That Belongs To Form Concepts Odms Item Groups Forms Get" + "title": "Response Get Odm Item Group That Belongs To Form Odms Item Groups Forms Get" } } } @@ -3951,13 +4410,13 @@ ] } }, - "/concepts/odms/item-groups/{odm_item_group_uid}": { + "/odms/item-groups/{odm_item_group_uid}": { "get": { "tags": [ "ODM Item Groups" ], "summary": "Get details on a specific ODM Item Group (in a specific version)", - "operationId": "get_odm_item_group_concepts_odms_item_groups__odm_item_group_uid__get", + "operationId": "get_odm_item_group_odms_item_groups__odm_item_group_uid__get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -4045,7 +4504,7 @@ "ODM Item Groups" ], "summary": "Update ODM Item Group", - "operationId": "edit_odm_item_group_concepts_odms_item_groups__odm_item_group_uid__patch", + "operationId": "edit_odm_item_group_odms_item_groups__odm_item_group_uid__patch", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -4125,7 +4584,7 @@ "ODM Item Groups" ], "summary": "Delete draft version of ODM Item Group", - "operationId": "delete_odm_item_group_concepts_odms_item_groups__odm_item_group_uid__delete", + "operationId": "delete_odm_item_group_odms_item_groups__odm_item_group_uid__delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -4184,13 +4643,13 @@ } } }, - "/concepts/odms/item-groups/{odm_item_group_uid}/relationships": { + "/odms/item-groups/{odm_item_group_uid}/relationships": { "get": { "tags": [ "ODM Item Groups" ], "summary": "Get UIDs of a specific ODM Item Group's relationships", - "operationId": "get_active_relationships_concepts_odms_item_groups__odm_item_group_uid__relationships_get", + "operationId": "get_active_relationships_odms_item_groups__odm_item_group_uid__relationships_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -4225,7 +4684,7 @@ "type": "string" } }, - "title": "Response Get Active Relationships Concepts Odms Item Groups Odm Item Group Uid Relationships Get" + "title": "Response Get Active Relationships Odms Item Groups Odm Item Group Uid Relationships Get" } } } @@ -4263,14 +4722,14 @@ } } }, - "/concepts/odms/item-groups/{odm_item_group_uid}/versions": { + "/odms/item-groups/{odm_item_group_uid}/versions": { "get": { "tags": [ "ODM Item Groups" ], "summary": "List version history for ODM Item Group", "description": "State before:\n - uid must exist.\n\nBusiness logic:\n - List version history for ODM Item Groups.\n - The returned versions are ordered by start_date descending (newest entries first).\n\nState after:\n - No change\n\nPossible errors:\n - Invalid uid.", - "operationId": "get_odm_item_group_versions_concepts_odms_item_groups__odm_item_group_uid__versions_get", + "operationId": "get_odm_item_group_versions_odms_item_groups__odm_item_group_uid__versions_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -4302,7 +4761,7 @@ "items": { "$ref": "#/components/schemas/OdmItemGroup" }, - "title": "Response Get Odm Item Group Versions Concepts Odms Item Groups Odm Item Group Uid Versions Get" + "title": "Response Get Odm Item Group Versions Odms Item Groups Odm Item Group Uid Versions Get" } } } @@ -4345,7 +4804,7 @@ ], "summary": " Create a new version of ODM Item Group", "description": "State before:\n - uid must exist and the ODM Item Group must be in status Final.\n\nBusiness logic:\n- The ODM Item Group is changed to a draft state.\n\nState after:\n - ODM Item Group changed status to Draft and assigned a new minor version number.\n - Audit trail entry must be made with action of creating a new draft version.\n\nPossible errors:\n - Invalid uid or status not Final.", - "operationId": "create_odm_item_group_version_concepts_odms_item_groups__odm_item_group_uid__versions_post", + "operationId": "create_odm_item_group_version_odms_item_groups__odm_item_group_uid__versions_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -4423,13 +4882,13 @@ } } }, - "/concepts/odms/item-groups/{odm_item_group_uid}/approvals": { + "/odms/item-groups/{odm_item_group_uid}/approvals": { "post": { "tags": [ "ODM Item Groups" ], "summary": "Approve draft version of ODM Item Group", - "operationId": "approve_odm_item_group_concepts_odms_item_groups__odm_item_group_uid__approvals_post", + "operationId": "approve_odm_item_group_odms_item_groups__odm_item_group_uid__approvals_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -4495,13 +4954,13 @@ } } }, - "/concepts/odms/item-groups/{odm_item_group_uid}/activations": { + "/odms/item-groups/{odm_item_group_uid}/activations": { "delete": { "tags": [ "ODM Item Groups" ], "summary": " Inactivate final version of ODM Item Group", - "operationId": "inactivate_odm_item_group_concepts_odms_item_groups__odm_item_group_uid__activations_delete", + "operationId": "inactivate_odm_item_group_odms_item_groups__odm_item_group_uid__activations_delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -4571,7 +5030,7 @@ "ODM Item Groups" ], "summary": "Reactivate retired version of a ODM Item Group", - "operationId": "reactivate_odm_item_group_concepts_odms_item_groups__odm_item_group_uid__activations_post", + "operationId": "reactivate_odm_item_group_odms_item_groups__odm_item_group_uid__activations_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -4637,13 +5096,13 @@ } } }, - "/concepts/odms/item-groups/{odm_item_group_uid}/items": { + "/odms/item-groups/{odm_item_group_uid}/items": { "post": { "tags": [ "ODM Item Groups" ], "summary": "Adds items to the ODM Item Group.", - "operationId": "add_item_to_odm_item_group_concepts_odms_item_groups__odm_item_group_uid__items_post", + "operationId": "add_item_to_odm_item_group_odms_item_groups__odm_item_group_uid__items_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -4735,14 +5194,14 @@ } } }, - "/concepts/odms/items": { + "/odms/items": { "get": { "tags": [ "ODM Items" ], "summary": "Return every variable related to the selected status and version of the ODM Items", "description": "Response format:\n\n- In addition to retrieving data in JSON format (default behaviour), \nit is possible to request data to be returned in CSV, XML or Excel formats \nby sending the `Accept` http request header with one of the following values:\n - `text/csv`\n\n - `text/xml`\n\n - `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`", - "operationId": "get_all_odm_items_concepts_odms_items_get", + "operationId": "get_all_odm_items_odms_items_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -4939,7 +5398,7 @@ "ODM Items" ], "summary": "Creates a new Item in 'Draft' status with version 0.1", - "operationId": "create_odm_item_concepts_odms_items_post", + "operationId": "create_odm_item_odms_items_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -5002,14 +5461,14 @@ } } }, - "/concepts/odms/items/headers": { + "/odms/items/headers": { "get": { "tags": [ "ODM Items" ], "summary": "Returns possible values from the database for a given header", "description": "Allowed parameters include : field name for which to get possible\n values, search string to provide filtering for the field name, additional filters to apply on other fields", - "operationId": "get_distinct_values_for_header_concepts_odms_items_headers_get", + "operationId": "get_distinct_values_for_header_odms_items_headers_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -5133,7 +5592,7 @@ "schema": { "type": "array", "items": {}, - "title": "Response Get Distinct Values For Header Concepts Odms Items Headers Get" + "title": "Response Get Distinct Values For Header Odms Items Headers Get" } } } @@ -5171,13 +5630,13 @@ } } }, - "/concepts/odms/items/item-groups": { + "/odms/items/item-groups": { "get": { "tags": [ "ODM Items" ], "summary": "Get all ODM Items that belongs to an ODM Item Group", - "operationId": "get_odm_items_that_belongs_to_item_group_concepts_odms_items_item_groups_get", + "operationId": "get_odm_items_that_belongs_to_item_group_odms_items_item_groups_get", "responses": { "200": { "description": "Successful Response", @@ -5188,7 +5647,7 @@ "$ref": "#/components/schemas/OdmElementWithParentUid" }, "type": "array", - "title": "Response Get Odm Items That Belongs To Item Group Concepts Odms Items Item Groups Get" + "title": "Response Get Odm Items That Belongs To Item Group Odms Items Item Groups Get" } } } @@ -5234,13 +5693,13 @@ ] } }, - "/concepts/odms/items/{odm_item_uid}": { + "/odms/items/{odm_item_uid}": { "get": { "tags": [ "ODM Items" ], "summary": "Get details on a specific ODM Item (in a specific version)", - "operationId": "get_odm_item_concepts_odms_items__odm_item_uid__get", + "operationId": "get_odm_item_odms_items__odm_item_uid__get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -5328,7 +5787,7 @@ "ODM Items" ], "summary": "Update ODM Item", - "operationId": "edit_odm_item_concepts_odms_items__odm_item_uid__patch", + "operationId": "edit_odm_item_odms_items__odm_item_uid__patch", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -5408,7 +5867,7 @@ "ODM Items" ], "summary": "Delete draft version of ODM Item", - "operationId": "delete_odm_item_concepts_odms_items__odm_item_uid__delete", + "operationId": "delete_odm_item_odms_items__odm_item_uid__delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -5467,13 +5926,13 @@ } } }, - "/concepts/odms/items/{odm_item_uid}/relationships": { + "/odms/items/{odm_item_uid}/relationships": { "get": { "tags": [ "ODM Items" ], "summary": "Get UIDs of a specific ODM Item's relationships", - "operationId": "get_active_relationships_concepts_odms_items__odm_item_uid__relationships_get", + "operationId": "get_active_relationships_odms_items__odm_item_uid__relationships_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -5508,7 +5967,7 @@ "type": "string" } }, - "title": "Response Get Active Relationships Concepts Odms Items Odm Item Uid Relationships Get" + "title": "Response Get Active Relationships Odms Items Odm Item Uid Relationships Get" } } } @@ -5546,14 +6005,14 @@ } } }, - "/concepts/odms/items/{odm_item_uid}/versions": { + "/odms/items/{odm_item_uid}/versions": { "get": { "tags": [ "ODM Items" ], "summary": "List version history for ODM Item", "description": "State before:\n - uid must exist.\n\nBusiness logic:\n - List version history for ODM Items.\n - The returned versions are ordered by start_date descending (newest entries first).\n\nState after:\n - No change\n\nPossible errors:\n - Invalid uid.", - "operationId": "get_odm_item_versions_concepts_odms_items__odm_item_uid__versions_get", + "operationId": "get_odm_item_versions_odms_items__odm_item_uid__versions_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -5585,7 +6044,7 @@ "items": { "$ref": "#/components/schemas/OdmItem" }, - "title": "Response Get Odm Item Versions Concepts Odms Items Odm Item Uid Versions Get" + "title": "Response Get Odm Item Versions Odms Items Odm Item Uid Versions Get" } } } @@ -5628,7 +6087,7 @@ ], "summary": " Create a new version of ODM Item", "description": "State before:\n - uid must exist and the ODM Item must be in status Final.\n\nBusiness logic:\n- The ODM Item is changed to a draft state.\n\nState after:\n - ODM Item changed status to Draft and assigned a new minor version number.\n - Audit trail entry must be made with action of creating a new draft version.\n\nPossible errors:\n - Invalid uid or status not Final.", - "operationId": "create_odm_item_version_concepts_odms_items__odm_item_uid__versions_post", + "operationId": "create_odm_item_version_odms_items__odm_item_uid__versions_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -5694,13 +6153,13 @@ } } }, - "/concepts/odms/items/{odm_item_uid}/approvals": { + "/odms/items/{odm_item_uid}/approvals": { "post": { "tags": [ "ODM Items" ], "summary": "Approve draft version of ODM Item", - "operationId": "approve_odm_item_concepts_odms_items__odm_item_uid__approvals_post", + "operationId": "approve_odm_item_odms_items__odm_item_uid__approvals_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -5766,13 +6225,13 @@ } } }, - "/concepts/odms/items/{odm_item_uid}/activations": { + "/odms/items/{odm_item_uid}/activations": { "delete": { "tags": [ "ODM Items" ], "summary": " Inactivate final version of ODM Item", - "operationId": "inactivate_odm_item_concepts_odms_items__odm_item_uid__activations_delete", + "operationId": "inactivate_odm_item_odms_items__odm_item_uid__activations_delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -5842,7 +6301,7 @@ "ODM Items" ], "summary": "Reactivate retired version of a ODM Item", - "operationId": "reactivate_odm_item_concepts_odms_items__odm_item_uid__activations_post", + "operationId": "reactivate_odm_item_odms_items__odm_item_uid__activations_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -5908,13 +6367,13 @@ } } }, - "/concepts/odms/conditions": { + "/odms/conditions": { "get": { "tags": [ "ODM Conditions" ], "summary": "Return every variable related to the selected status and version of the ODM Conditions", - "operationId": "get_all_odm_conditions_concepts_odms_conditions_get", + "operationId": "get_all_odm_conditions_odms_conditions_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -6111,7 +6570,7 @@ "ODM Conditions" ], "summary": "Creates a new Condition in 'Draft' status with version 0.1", - "operationId": "create_odm_condition_concepts_odms_conditions_post", + "operationId": "create_odm_condition_odms_conditions_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -6174,14 +6633,14 @@ } } }, - "/concepts/odms/conditions/headers": { + "/odms/conditions/headers": { "get": { "tags": [ "ODM Conditions" ], "summary": "Returns possible values from the database for a given header", "description": "Allowed parameters include : field name for which to get possible\n values, search string to provide filtering for the field name, additional filters to apply on other fields", - "operationId": "get_distinct_values_for_header_concepts_odms_conditions_headers_get", + "operationId": "get_distinct_values_for_header_odms_conditions_headers_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -6305,7 +6764,7 @@ "schema": { "type": "array", "items": {}, - "title": "Response Get Distinct Values For Header Concepts Odms Conditions Headers Get" + "title": "Response Get Distinct Values For Header Odms Conditions Headers Get" } } } @@ -6343,13 +6802,13 @@ } } }, - "/concepts/odms/conditions/{odm_condition_uid}": { + "/odms/conditions/{odm_condition_uid}": { "get": { "tags": [ "ODM Conditions" ], "summary": "Get details on a specific ODM Condition (in a specific version)", - "operationId": "get_odm_condition_concepts_odms_conditions__odm_condition_uid__get", + "operationId": "get_odm_condition_odms_conditions__odm_condition_uid__get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -6437,7 +6896,7 @@ "ODM Conditions" ], "summary": "Update ODM Condition", - "operationId": "edit_odm_condition_concepts_odms_conditions__odm_condition_uid__patch", + "operationId": "edit_odm_condition_odms_conditions__odm_condition_uid__patch", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -6527,7 +6986,7 @@ "ODM Conditions" ], "summary": "Delete draft version of ODM Condition", - "operationId": "delete_odm_condition_concepts_odms_conditions__odm_condition_uid__delete", + "operationId": "delete_odm_condition_odms_conditions__odm_condition_uid__delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -6586,13 +7045,13 @@ } } }, - "/concepts/odms/conditions/{odm_condition_uid}/relationships": { + "/odms/conditions/{odm_condition_uid}/relationships": { "get": { "tags": [ "ODM Conditions" ], "summary": "Get UIDs of a specific ODM Condition's relationships", - "operationId": "get_active_relationships_concepts_odms_conditions__odm_condition_uid__relationships_get", + "operationId": "get_active_relationships_odms_conditions__odm_condition_uid__relationships_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -6627,7 +7086,7 @@ "type": "string" } }, - "title": "Response Get Active Relationships Concepts Odms Conditions Odm Condition Uid Relationships Get" + "title": "Response Get Active Relationships Odms Conditions Odm Condition Uid Relationships Get" } } } @@ -6665,14 +7124,14 @@ } } }, - "/concepts/odms/conditions/{odm_condition_uid}/versions": { + "/odms/conditions/{odm_condition_uid}/versions": { "get": { "tags": [ "ODM Conditions" ], "summary": "List version history for ODM Condition", "description": "State before:\n - uid must exist.\n\nBusiness logic:\n - List version history for ODM Conditions.\n - The returned versions are ordered by start_date descending (newest entries first).\n\nState after:\n - No change\n\nPossible errors:\n - Invalid uid.", - "operationId": "get_odm_condition_versions_concepts_odms_conditions__odm_condition_uid__versions_get", + "operationId": "get_odm_condition_versions_odms_conditions__odm_condition_uid__versions_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -6704,7 +7163,7 @@ "items": { "$ref": "#/components/schemas/OdmCondition" }, - "title": "Response Get Odm Condition Versions Concepts Odms Conditions Odm Condition Uid Versions Get" + "title": "Response Get Odm Condition Versions Odms Conditions Odm Condition Uid Versions Get" } } } @@ -6747,7 +7206,7 @@ ], "summary": " Create a new version of ODM Condition", "description": "State before:\n - uid must exist and the ODM Condition must be in status Final.\n\nBusiness logic:\n- The ODM Condition is changed to a draft state.\n\nState after:\n - ODM Condition changed status to Draft and assigned a new minor version number.\n - Audit trail entry must be made with action of creating a new draft version.\n\nPossible errors:\n - Invalid uid or status not Final.", - "operationId": "create_odm_condition_version_concepts_odms_conditions__odm_condition_uid__versions_post", + "operationId": "create_odm_condition_version_odms_conditions__odm_condition_uid__versions_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -6813,13 +7272,13 @@ } } }, - "/concepts/odms/conditions/{odm_condition_uid}/approvals": { + "/odms/conditions/{odm_condition_uid}/approvals": { "post": { "tags": [ "ODM Conditions" ], "summary": "Approve draft version of ODM Condition", - "operationId": "approve_odm_condition_concepts_odms_conditions__odm_condition_uid__approvals_post", + "operationId": "approve_odm_condition_odms_conditions__odm_condition_uid__approvals_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -6885,13 +7344,13 @@ } } }, - "/concepts/odms/conditions/{odm_condition_uid}/activations": { + "/odms/conditions/{odm_condition_uid}/activations": { "delete": { "tags": [ "ODM Conditions" ], "summary": " Inactivate final version of ODM Condition", - "operationId": "inactivate_odm_condition_concepts_odms_conditions__odm_condition_uid__activations_delete", + "operationId": "inactivate_odm_condition_odms_conditions__odm_condition_uid__activations_delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -6961,7 +7420,7 @@ "ODM Conditions" ], "summary": "Reactivate retired version of a ODM Condition", - "operationId": "reactivate_odm_condition_concepts_odms_conditions__odm_condition_uid__activations_post", + "operationId": "reactivate_odm_condition_odms_conditions__odm_condition_uid__activations_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -7027,13 +7486,13 @@ } } }, - "/concepts/odms/methods": { + "/odms/methods": { "get": { "tags": [ "ODM Methods" ], "summary": "Return every variable related to the selected status and version of the ODM Methods", - "operationId": "get_all_odm_methods_concepts_odms_methods_get", + "operationId": "get_all_odm_methods_odms_methods_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -7230,7 +7689,7 @@ "ODM Methods" ], "summary": "Creates a new Method in 'Draft' status with version 0.1", - "operationId": "create_odm_method_concepts_odms_methods_post", + "operationId": "create_odm_method_odms_methods_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -7293,14 +7752,14 @@ } } }, - "/concepts/odms/methods/headers": { + "/odms/methods/headers": { "get": { "tags": [ "ODM Methods" ], "summary": "Returns possible values from the database for a given header", "description": "Allowed parameters include : field name for which to get possible\n values, search string to provide filtering for the field name, additional filters to apply on other fields", - "operationId": "get_distinct_values_for_header_concepts_odms_methods_headers_get", + "operationId": "get_distinct_values_for_header_odms_methods_headers_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -7424,7 +7883,7 @@ "schema": { "type": "array", "items": {}, - "title": "Response Get Distinct Values For Header Concepts Odms Methods Headers Get" + "title": "Response Get Distinct Values For Header Odms Methods Headers Get" } } } @@ -7462,13 +7921,13 @@ } } }, - "/concepts/odms/methods/{odm_method_uid}": { + "/odms/methods/{odm_method_uid}": { "get": { "tags": [ "ODM Methods" ], "summary": "Get details on a specific ODM Method (in a specific version)", - "operationId": "get_odm_method_concepts_odms_methods__odm_method_uid__get", + "operationId": "get_odm_method_odms_methods__odm_method_uid__get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -7556,7 +8015,7 @@ "ODM Methods" ], "summary": "Update ODM Method", - "operationId": "edit_odm_method_concepts_odms_methods__odm_method_uid__patch", + "operationId": "edit_odm_method_odms_methods__odm_method_uid__patch", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -7646,7 +8105,7 @@ "ODM Methods" ], "summary": "Delete draft version of ODM Method", - "operationId": "delete_odm_method_concepts_odms_methods__odm_method_uid__delete", + "operationId": "delete_odm_method_odms_methods__odm_method_uid__delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -7705,13 +8164,13 @@ } } }, - "/concepts/odms/methods/{odm_method_uid}/relationships": { + "/odms/methods/{odm_method_uid}/relationships": { "get": { "tags": [ "ODM Methods" ], "summary": "Get UIDs of a specific ODM Method's relationships", - "operationId": "get_active_relationships_concepts_odms_methods__odm_method_uid__relationships_get", + "operationId": "get_active_relationships_odms_methods__odm_method_uid__relationships_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -7746,7 +8205,7 @@ "type": "string" } }, - "title": "Response Get Active Relationships Concepts Odms Methods Odm Method Uid Relationships Get" + "title": "Response Get Active Relationships Odms Methods Odm Method Uid Relationships Get" } } } @@ -7784,14 +8243,14 @@ } } }, - "/concepts/odms/methods/{odm_method_uid}/versions": { + "/odms/methods/{odm_method_uid}/versions": { "get": { "tags": [ "ODM Methods" ], "summary": "List version history for ODM Method", "description": "State before:\n - uid must exist.\n\nBusiness logic:\n - List version history for ODM Methods.\n - The returned versions are ordered by start_date descending (newest entries first).\n\nState after:\n - No change\n\nPossible errors:\n - Invalid uid.", - "operationId": "get_odm_method_versions_concepts_odms_methods__odm_method_uid__versions_get", + "operationId": "get_odm_method_versions_odms_methods__odm_method_uid__versions_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -7823,7 +8282,7 @@ "items": { "$ref": "#/components/schemas/OdmMethod" }, - "title": "Response Get Odm Method Versions Concepts Odms Methods Odm Method Uid Versions Get" + "title": "Response Get Odm Method Versions Odms Methods Odm Method Uid Versions Get" } } } @@ -7866,7 +8325,7 @@ ], "summary": " Create a new version of ODM Method", "description": "State before:\n - uid must exist and the ODM Method must be in status Final.\n\nBusiness logic:\n- The ODM Method is changed to a draft state.\n\nState after:\n - ODM Method changed status to Draft and assigned a new minor version number.\n - Audit trail entry must be made with action of creating a new draft version.\n\nPossible errors:\n - Invalid uid or status not Final.", - "operationId": "create_odm_method_version_concepts_odms_methods__odm_method_uid__versions_post", + "operationId": "create_odm_method_version_odms_methods__odm_method_uid__versions_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -7932,13 +8391,13 @@ } } }, - "/concepts/odms/methods/{odm_method_uid}/approvals": { + "/odms/methods/{odm_method_uid}/approvals": { "post": { "tags": [ "ODM Methods" ], "summary": "Approve draft version of ODM Method", - "operationId": "approve_odm_method_concepts_odms_methods__odm_method_uid__approvals_post", + "operationId": "approve_odm_method_odms_methods__odm_method_uid__approvals_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -8004,13 +8463,13 @@ } } }, - "/concepts/odms/methods/{odm_method_uid}/activations": { + "/odms/methods/{odm_method_uid}/activations": { "delete": { "tags": [ "ODM Methods" ], "summary": " Inactivate final version of ODM Method", - "operationId": "inactivate_odm_method_concepts_odms_methods__odm_method_uid__activations_delete", + "operationId": "inactivate_odm_method_odms_methods__odm_method_uid__activations_delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -8080,7 +8539,7 @@ "ODM Methods" ], "summary": "Reactivate retired version of a ODM Method", - "operationId": "reactivate_odm_method_concepts_odms_methods__odm_method_uid__activations_post", + "operationId": "reactivate_odm_method_odms_methods__odm_method_uid__activations_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -8146,13 +8605,13 @@ } } }, - "/concepts/odms/vendor-namespaces": { + "/odms/vendor-namespaces": { "get": { "tags": [ "ODM Vendor Namespaces" ], "summary": "Return every variable related to the selected status and version of the ODM Vendor Namespaces", - "operationId": "get_all_odm_vendor_namespaces_concepts_odms_vendor_namespaces_get", + "operationId": "get_all_odm_vendor_namespaces_odms_vendor_namespaces_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -8349,7 +8808,7 @@ "ODM Vendor Namespaces" ], "summary": "Creates a new Vendor Namespace in 'Draft' status with version 0.1", - "operationId": "create_odm_vendor_namespace_concepts_odms_vendor_namespaces_post", + "operationId": "create_odm_vendor_namespace_odms_vendor_namespaces_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -8412,14 +8871,14 @@ } } }, - "/concepts/odms/vendor-namespaces/headers": { + "/odms/vendor-namespaces/headers": { "get": { "tags": [ "ODM Vendor Namespaces" ], "summary": "Returns possible values from the database for a given header", "description": "Allowed parameters include : field name for which to get possible\n values, search string to provide filtering for the field name, additional filters to apply on other fields", - "operationId": "get_distinct_values_for_header_concepts_odms_vendor_namespaces_headers_get", + "operationId": "get_distinct_values_for_header_odms_vendor_namespaces_headers_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -8543,7 +9002,7 @@ "schema": { "type": "array", "items": {}, - "title": "Response Get Distinct Values For Header Concepts Odms Vendor Namespaces Headers Get" + "title": "Response Get Distinct Values For Header Odms Vendor Namespaces Headers Get" } } } @@ -8581,13 +9040,13 @@ } } }, - "/concepts/odms/vendor-namespaces/{odm_vendor_namespace_uid}": { + "/odms/vendor-namespaces/{odm_vendor_namespace_uid}": { "get": { "tags": [ "ODM Vendor Namespaces" ], "summary": "Get details on a specific ODM Vendor Namespace (in a specific version)", - "operationId": "get_odm_vendor_namespace_concepts_odms_vendor_namespaces__odm_vendor_namespace_uid__get", + "operationId": "get_odm_vendor_namespace_odms_vendor_namespaces__odm_vendor_namespace_uid__get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -8675,7 +9134,7 @@ "ODM Vendor Namespaces" ], "summary": "Update ODM Vendor Namespace", - "operationId": "edit_odm_vendor_namespace_concepts_odms_vendor_namespaces__odm_vendor_namespace_uid__patch", + "operationId": "edit_odm_vendor_namespace_odms_vendor_namespaces__odm_vendor_namespace_uid__patch", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -8755,7 +9214,7 @@ "ODM Vendor Namespaces" ], "summary": "Delete draft version of ODM Vendor Namespace", - "operationId": "delete_odm_vendor_namespace_concepts_odms_vendor_namespaces__odm_vendor_namespace_uid__delete", + "operationId": "delete_odm_vendor_namespace_odms_vendor_namespaces__odm_vendor_namespace_uid__delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -8814,13 +9273,13 @@ } } }, - "/concepts/odms/vendor-namespaces/{odm_vendor_namespace_uid}/relationships": { + "/odms/vendor-namespaces/{odm_vendor_namespace_uid}/relationships": { "get": { "tags": [ "ODM Vendor Namespaces" ], "summary": "Get UIDs of a specific ODM Vendor Namespace's relationships", - "operationId": "get_active_relationships_concepts_odms_vendor_namespaces__odm_vendor_namespace_uid__relationships_get", + "operationId": "get_active_relationships_odms_vendor_namespaces__odm_vendor_namespace_uid__relationships_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -8855,7 +9314,7 @@ "type": "string" } }, - "title": "Response Get Active Relationships Concepts Odms Vendor Namespaces Odm Vendor Namespace Uid Relationships Get" + "title": "Response Get Active Relationships Odms Vendor Namespaces Odm Vendor Namespace Uid Relationships Get" } } } @@ -8893,14 +9352,14 @@ } } }, - "/concepts/odms/vendor-namespaces/{odm_vendor_namespace_uid}/versions": { + "/odms/vendor-namespaces/{odm_vendor_namespace_uid}/versions": { "get": { "tags": [ "ODM Vendor Namespaces" ], "summary": "List version history for ODM Vendor Namespace", "description": "State before:\n - uid must exist.\n\nBusiness logic:\n - List version history for ODM Vendor Namespaces.\n - The returned versions are ordered by start_date descending (newest entries first).\n\nState after:\n - No change\n\nPossible errors:\n - Invalid uid.", - "operationId": "get_odm_vendor_namespace_versions_concepts_odms_vendor_namespaces__odm_vendor_namespace_uid__versions_get", + "operationId": "get_odm_vendor_namespace_versions_odms_vendor_namespaces__odm_vendor_namespace_uid__versions_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -8932,7 +9391,7 @@ "items": { "$ref": "#/components/schemas/OdmVendorNamespace" }, - "title": "Response Get Odm Vendor Namespace Versions Concepts Odms Vendor Namespaces Odm Vendor Namespace Uid Versions Get" + "title": "Response Get Odm Vendor Namespace Versions Odms Vendor Namespaces Odm Vendor Namespace Uid Versions Get" } } } @@ -8975,7 +9434,7 @@ ], "summary": " Create a new version of ODM Vendor Namespace", "description": "State before:\n - uid must exist and the ODM Vendor Namespace must be in status Final.\n\nBusiness logic:\n- The ODM Vendor Namespace is changed to a draft state.\n\nState after:\n - ODM Vendor Namespace changed status to Draft and assigned a new minor version number.\n - Audit trail entry must be made with action of creating a new draft version.\n\nPossible errors:\n - Invalid uid or status not Final.", - "operationId": "create_odm_vendor_namespace_version_concepts_odms_vendor_namespaces__odm_vendor_namespace_uid__versions_post", + "operationId": "create_odm_vendor_namespace_version_odms_vendor_namespaces__odm_vendor_namespace_uid__versions_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -9041,13 +9500,13 @@ } } }, - "/concepts/odms/vendor-namespaces/{odm_vendor_namespace_uid}/approvals": { + "/odms/vendor-namespaces/{odm_vendor_namespace_uid}/approvals": { "post": { "tags": [ "ODM Vendor Namespaces" ], "summary": "Approve draft version of ODM Vendor Namespace", - "operationId": "approve_odm_vendor_namespace_concepts_odms_vendor_namespaces__odm_vendor_namespace_uid__approvals_post", + "operationId": "approve_odm_vendor_namespace_odms_vendor_namespaces__odm_vendor_namespace_uid__approvals_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -9113,13 +9572,13 @@ } } }, - "/concepts/odms/vendor-namespaces/{odm_vendor_namespace_uid}/activations": { + "/odms/vendor-namespaces/{odm_vendor_namespace_uid}/activations": { "delete": { "tags": [ "ODM Vendor Namespaces" ], "summary": " Inactivate final version of ODM Vendor Namespace", - "operationId": "inactivate_odm_vendor_namespace_concepts_odms_vendor_namespaces__odm_vendor_namespace_uid__activations_delete", + "operationId": "inactivate_odm_vendor_namespace_odms_vendor_namespaces__odm_vendor_namespace_uid__activations_delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -9189,7 +9648,7 @@ "ODM Vendor Namespaces" ], "summary": "Reactivate retired version of a ODM Vendor Namespace", - "operationId": "reactivate_odm_vendor_namespace_concepts_odms_vendor_namespaces__odm_vendor_namespace_uid__activations_post", + "operationId": "reactivate_odm_vendor_namespace_odms_vendor_namespaces__odm_vendor_namespace_uid__activations_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -9255,13 +9714,13 @@ } } }, - "/concepts/odms/vendor-attributes": { + "/odms/vendor-attributes": { "get": { "tags": [ "ODM Vendor Attributes" ], "summary": "Return every variable related to the selected status and version of the ODM Vendor Attributes", - "operationId": "get_all_odm_vendor_attributes_concepts_odms_vendor_attributes_get", + "operationId": "get_all_odm_vendor_attributes_odms_vendor_attributes_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -9458,7 +9917,7 @@ "ODM Vendor Attributes" ], "summary": "Creates a new Vendor Attribute in 'Draft' status with version 0.1", - "operationId": "create_odm_vendor_attribute_concepts_odms_vendor_attributes_post", + "operationId": "create_odm_vendor_attribute_odms_vendor_attributes_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -9511,14 +9970,14 @@ } } }, - "/concepts/odms/vendor-attributes/headers": { + "/odms/vendor-attributes/headers": { "get": { "tags": [ "ODM Vendor Attributes" ], "summary": "Returns possible values from the database for a given header", "description": "Allowed parameters include : field name for which to get possible\n values, search string to provide filtering for the field name, additional filters to apply on other fields", - "operationId": "get_distinct_values_for_header_concepts_odms_vendor_attributes_headers_get", + "operationId": "get_distinct_values_for_header_odms_vendor_attributes_headers_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -9642,7 +10101,7 @@ "schema": { "type": "array", "items": {}, - "title": "Response Get Distinct Values For Header Concepts Odms Vendor Attributes Headers Get" + "title": "Response Get Distinct Values For Header Odms Vendor Attributes Headers Get" } } } @@ -9680,13 +10139,13 @@ } } }, - "/concepts/odms/vendor-attributes/{odm_vendor_attribute_uid}": { + "/odms/vendor-attributes/{odm_vendor_attribute_uid}": { "get": { "tags": [ "ODM Vendor Attributes" ], "summary": "Get details on a specific ODM Vendor Attribute (in a specific version)", - "operationId": "get_odm_vendor_attribute_concepts_odms_vendor_attributes__odm_vendor_attribute_uid__get", + "operationId": "get_odm_vendor_attribute_odms_vendor_attributes__odm_vendor_attribute_uid__get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -9774,7 +10233,7 @@ "ODM Vendor Attributes" ], "summary": "Update ODM Vendor Attribute", - "operationId": "edit_odm_vendor_attribute_concepts_odms_vendor_attributes__odm_vendor_attribute_uid__patch", + "operationId": "edit_odm_vendor_attribute_odms_vendor_attributes__odm_vendor_attribute_uid__patch", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -9854,7 +10313,7 @@ "ODM Vendor Attributes" ], "summary": "Delete draft version of ODM Vendor Attribute", - "operationId": "delete_odm_vendor_attribute_concepts_odms_vendor_attributes__odm_vendor_attribute_uid__delete", + "operationId": "delete_odm_vendor_attribute_odms_vendor_attributes__odm_vendor_attribute_uid__delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -9913,13 +10372,13 @@ } } }, - "/concepts/odms/vendor-attributes/{odm_vendor_attribute_uid}/relationships": { + "/odms/vendor-attributes/{odm_vendor_attribute_uid}/relationships": { "get": { "tags": [ "ODM Vendor Attributes" ], "summary": "Get UIDs of a specific ODM Vendor Attribute's relationships", - "operationId": "get_active_relationships_concepts_odms_vendor_attributes__odm_vendor_attribute_uid__relationships_get", + "operationId": "get_active_relationships_odms_vendor_attributes__odm_vendor_attribute_uid__relationships_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -9954,7 +10413,7 @@ "type": "string" } }, - "title": "Response Get Active Relationships Concepts Odms Vendor Attributes Odm Vendor Attribute Uid Relationships Get" + "title": "Response Get Active Relationships Odms Vendor Attributes Odm Vendor Attribute Uid Relationships Get" } } } @@ -9992,14 +10451,14 @@ } } }, - "/concepts/odms/vendor-attributes/{odm_vendor_attribute_uid}/versions": { + "/odms/vendor-attributes/{odm_vendor_attribute_uid}/versions": { "get": { "tags": [ "ODM Vendor Attributes" ], "summary": "List version history for ODM Vendor Attribute", "description": "State before:\n - uid must exist.\n\nBusiness logic:\n - List version history for ODM Vendor Attributes.\n - The returned versions are ordered by start_date descending (newest entries first).\n\nState after:\n - No change\n\nPossible errors:\n - Invalid uid.", - "operationId": "get_odm_vendor_attribute_versions_concepts_odms_vendor_attributes__odm_vendor_attribute_uid__versions_get", + "operationId": "get_odm_vendor_attribute_versions_odms_vendor_attributes__odm_vendor_attribute_uid__versions_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -10031,7 +10490,7 @@ "items": { "$ref": "#/components/schemas/OdmVendorAttribute" }, - "title": "Response Get Odm Vendor Attribute Versions Concepts Odms Vendor Attributes Odm Vendor Attribute Uid Versions Get" + "title": "Response Get Odm Vendor Attribute Versions Odms Vendor Attributes Odm Vendor Attribute Uid Versions Get" } } } @@ -10074,7 +10533,7 @@ ], "summary": " Create a new version of ODM Vendor Attribute", "description": "State before:\n - uid must exist and the ODM Vendor Attribute must be in status Final.\n\nBusiness logic:\n- The ODM Vendor Attribute is changed to a draft state.\n\nState after:\n - ODM Vendor Attribute changed status to Draft and assigned a new minor version number.\n - Audit trail entry must be made with action of creating a new draft version.\n\nPossible errors:\n - Invalid uid or status not Final.", - "operationId": "create_odm_vendor_attribute_version_concepts_odms_vendor_attributes__odm_vendor_attribute_uid__versions_post", + "operationId": "create_odm_vendor_attribute_version_odms_vendor_attributes__odm_vendor_attribute_uid__versions_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -10140,13 +10599,13 @@ } } }, - "/concepts/odms/vendor-attributes/{odm_vendor_attribute_uid}/approvals": { + "/odms/vendor-attributes/{odm_vendor_attribute_uid}/approvals": { "post": { "tags": [ "ODM Vendor Attributes" ], "summary": "Approve draft version of ODM Vendor Attribute", - "operationId": "approve_odm_vendor_attribute_concepts_odms_vendor_attributes__odm_vendor_attribute_uid__approvals_post", + "operationId": "approve_odm_vendor_attribute_odms_vendor_attributes__odm_vendor_attribute_uid__approvals_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -10212,13 +10671,13 @@ } } }, - "/concepts/odms/vendor-attributes/{odm_vendor_attribute_uid}/activations": { + "/odms/vendor-attributes/{odm_vendor_attribute_uid}/activations": { "delete": { "tags": [ "ODM Vendor Attributes" ], "summary": " Inactivate final version of ODM Vendor Attribute", - "operationId": "inactivate_odm_vendor_attribute_concepts_odms_vendor_attributes__odm_vendor_attribute_uid__activations_delete", + "operationId": "inactivate_odm_vendor_attribute_odms_vendor_attributes__odm_vendor_attribute_uid__activations_delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -10288,7 +10747,7 @@ "ODM Vendor Attributes" ], "summary": "Reactivate retired version of a ODM Vendor Attribute", - "operationId": "reactivate_odm_vendor_attribute_concepts_odms_vendor_attributes__odm_vendor_attribute_uid__activations_post", + "operationId": "reactivate_odm_vendor_attribute_odms_vendor_attributes__odm_vendor_attribute_uid__activations_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -10354,13 +10813,13 @@ } } }, - "/concepts/odms/vendor-elements": { + "/odms/vendor-elements": { "get": { "tags": [ "ODM Vendor Elements" ], "summary": "Return every variable related to the selected status and version of the ODM Vendor Elements", - "operationId": "get_all_odm_vendor_elements_concepts_odms_vendor_elements_get", + "operationId": "get_all_odm_vendor_elements_odms_vendor_elements_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -10557,7 +11016,7 @@ "ODM Vendor Elements" ], "summary": "Creates a new Vendor Element in 'Draft' status with version 0.1", - "operationId": "create_odm_vendor_element_concepts_odms_vendor_elements_post", + "operationId": "create_odm_vendor_element_odms_vendor_elements_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -10610,14 +11069,14 @@ } } }, - "/concepts/odms/vendor-elements/headers": { + "/odms/vendor-elements/headers": { "get": { "tags": [ "ODM Vendor Elements" ], "summary": "Returns possible values from the database for a given header", "description": "Allowed parameters include : field name for which to get possible\n values, search string to provide filtering for the field name, additional filters to apply on other fields", - "operationId": "get_distinct_values_for_header_concepts_odms_vendor_elements_headers_get", + "operationId": "get_distinct_values_for_header_odms_vendor_elements_headers_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -10741,7 +11200,7 @@ "schema": { "type": "array", "items": {}, - "title": "Response Get Distinct Values For Header Concepts Odms Vendor Elements Headers Get" + "title": "Response Get Distinct Values For Header Odms Vendor Elements Headers Get" } } } @@ -10779,13 +11238,13 @@ } } }, - "/concepts/odms/vendor-elements/{odm_vendor_element_uid}": { + "/odms/vendor-elements/{odm_vendor_element_uid}": { "get": { "tags": [ "ODM Vendor Elements" ], "summary": "Get details on a specific ODM Vendor Element (in a specific version)", - "operationId": "get_odm_vendor_element_concepts_odms_vendor_elements__odm_vendor_element_uid__get", + "operationId": "get_odm_vendor_element_odms_vendor_elements__odm_vendor_element_uid__get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -10873,7 +11332,7 @@ "ODM Vendor Elements" ], "summary": "Update ODM Vendor Element", - "operationId": "edit_odm_vendor_element_concepts_odms_vendor_elements__odm_vendor_element_uid__patch", + "operationId": "edit_odm_vendor_element_odms_vendor_elements__odm_vendor_element_uid__patch", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -10953,7 +11412,7 @@ "ODM Vendor Elements" ], "summary": "Delete draft version of ODM Vendor Element", - "operationId": "delete_odm_vendor_element_concepts_odms_vendor_elements__odm_vendor_element_uid__delete", + "operationId": "delete_odm_vendor_element_odms_vendor_elements__odm_vendor_element_uid__delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -11012,13 +11471,13 @@ } } }, - "/concepts/odms/vendor-elements/{odm_vendor_element_uid}/relationships": { + "/odms/vendor-elements/{odm_vendor_element_uid}/relationships": { "get": { "tags": [ "ODM Vendor Elements" ], "summary": "Get UIDs of a specific ODM Vendor Element's relationships", - "operationId": "get_active_relationships_concepts_odms_vendor_elements__odm_vendor_element_uid__relationships_get", + "operationId": "get_active_relationships_odms_vendor_elements__odm_vendor_element_uid__relationships_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -11053,7 +11512,7 @@ "type": "string" } }, - "title": "Response Get Active Relationships Concepts Odms Vendor Elements Odm Vendor Element Uid Relationships Get" + "title": "Response Get Active Relationships Odms Vendor Elements Odm Vendor Element Uid Relationships Get" } } } @@ -11091,14 +11550,14 @@ } } }, - "/concepts/odms/vendor-elements/{odm_vendor_element_uid}/versions": { + "/odms/vendor-elements/{odm_vendor_element_uid}/versions": { "get": { "tags": [ "ODM Vendor Elements" ], "summary": "List version history for ODM Vendor Element", "description": "State before:\n - uid must exist.\n\nBusiness logic:\n - List version history for ODM Vendor Elements.\n - The returned versions are ordered by start_date descending (newest entries first).\n\nState after:\n - No change\n\nPossible errors:\n - Invalid uid.", - "operationId": "get_odm_vendor_element_versions_concepts_odms_vendor_elements__odm_vendor_element_uid__versions_get", + "operationId": "get_odm_vendor_element_versions_odms_vendor_elements__odm_vendor_element_uid__versions_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -11130,7 +11589,7 @@ "items": { "$ref": "#/components/schemas/OdmVendorElement" }, - "title": "Response Get Odm Vendor Element Versions Concepts Odms Vendor Elements Odm Vendor Element Uid Versions Get" + "title": "Response Get Odm Vendor Element Versions Odms Vendor Elements Odm Vendor Element Uid Versions Get" } } } @@ -11173,7 +11632,7 @@ ], "summary": " Create a new version of ODM Vendor Element", "description": "State before:\n - uid must exist and the ODM Vendor Element must be in status Final.\n\nBusiness logic:\n- The ODM Vendor Element is changed to a draft state.\n\nState after:\n - ODM Vendor Element changed status to Draft and assigned a new minor version number.\n - Audit trail entry must be made with action of creating a new draft version.\n\nPossible errors:\n - Invalid uid or status not Final.", - "operationId": "create_odm_vendor_element_version_concepts_odms_vendor_elements__odm_vendor_element_uid__versions_post", + "operationId": "create_odm_vendor_element_version_odms_vendor_elements__odm_vendor_element_uid__versions_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -11239,13 +11698,13 @@ } } }, - "/concepts/odms/vendor-elements/{odm_vendor_element_uid}/approvals": { + "/odms/vendor-elements/{odm_vendor_element_uid}/approvals": { "post": { "tags": [ "ODM Vendor Elements" ], "summary": "Approve draft version of ODM Vendor Element", - "operationId": "approve_odm_vendor_element_concepts_odms_vendor_elements__odm_vendor_element_uid__approvals_post", + "operationId": "approve_odm_vendor_element_odms_vendor_elements__odm_vendor_element_uid__approvals_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -11311,13 +11770,13 @@ } } }, - "/concepts/odms/vendor-elements/{odm_vendor_element_uid}/activations": { + "/odms/vendor-elements/{odm_vendor_element_uid}/activations": { "delete": { "tags": [ "ODM Vendor Elements" ], "summary": " Inactivate final version of ODM Vendor Element", - "operationId": "inactivate_odm_vendor_element_concepts_odms_vendor_elements__odm_vendor_element_uid__activations_delete", + "operationId": "inactivate_odm_vendor_element_odms_vendor_elements__odm_vendor_element_uid__activations_delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -11387,7 +11846,7 @@ "ODM Vendor Elements" ], "summary": "Reactivate retired version of a ODM Vendor Element", - "operationId": "reactivate_odm_vendor_element_concepts_odms_vendor_elements__odm_vendor_element_uid__activations_post", + "operationId": "reactivate_odm_vendor_element_odms_vendor_elements__odm_vendor_element_uid__activations_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -11453,13 +11912,13 @@ } } }, - "/concepts/odms/metadata/aliases": { + "/odms/metadata/aliases": { "get": { "tags": [ "ODM Metadata" ], "summary": "Listing of ODM Aliases", - "operationId": "get_aliases_concepts_odms_metadata_aliases_get", + "operationId": "get_aliases_odms_metadata_aliases_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -11578,13 +12037,13 @@ } } }, - "/concepts/odms/metadata/translated-texts": { + "/odms/metadata/translated-texts": { "get": { "tags": [ "ODM Metadata" ], "summary": "Listing of ODM Translated Texts", - "operationId": "get_translated_texts_concepts_odms_metadata_translated_texts_get", + "operationId": "get_translated_texts_odms_metadata_translated_texts_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -11703,13 +12162,13 @@ } } }, - "/concepts/odms/metadata/formal-expressions": { + "/odms/metadata/formal-expressions": { "get": { "tags": [ "ODM Metadata" ], "summary": "Listing of ODM Formal Expressions", - "operationId": "get_formal_expressions_concepts_odms_metadata_formal_expressions_get", + "operationId": "get_formal_expressions_odms_metadata_formal_expressions_get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -11828,13 +12287,13 @@ } } }, - "/concepts/odms/metadata/report": { + "/odms/metadata/report": { "post": { "tags": [ "ODM Metadata" ], "summary": "Export ODM Report", - "operationId": "get_odm_report_concepts_odms_metadata_report_post", + "operationId": "get_odm_report_odms_metadata_report_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -11907,13 +12366,13 @@ } } }, - "/concepts/odms/metadata/xmls/export": { + "/odms/metadata/xmls/export": { "post": { "tags": [ "ODM Metadata" ], "summary": "Export ODM XML", - "operationId": "get_odm_document_concepts_odms_metadata_xmls_export_post", + "operationId": "get_odm_document_odms_metadata_xmls_export_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -12002,7 +12461,7 @@ "content": { "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/Body_get_odm_document_concepts_odms_metadata_xmls_export_post" + "$ref": "#/components/schemas/Body_get_odm_document_odms_metadata_xmls_export_post" } } } @@ -12048,13 +12507,13 @@ } } }, - "/concepts/odms/metadata/csvs/export": { + "/odms/metadata/csvs/export": { "post": { "tags": [ "ODM Metadata" ], "summary": "Export ODM CSV", - "operationId": "get_odm_csv_concepts_odms_metadata_csvs_export_post", + "operationId": "get_odm_csv_odms_metadata_csvs_export_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -12122,13 +12581,13 @@ } } }, - "/concepts/odms/metadata/xmls/import": { + "/odms/metadata/xmls/import": { "post": { "tags": [ "ODM Metadata" ], "summary": "Import ODM XML", - "operationId": "store_odm_xml_concepts_odms_metadata_xmls_import_post", + "operationId": "store_odm_xml_odms_metadata_xmls_import_post", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -12173,7 +12632,7 @@ "content": { "multipart/form-data": { "schema": { - "$ref": "#/components/schemas/Body_store_odm_xml_concepts_odms_metadata_xmls_import_post" + "$ref": "#/components/schemas/Body_store_odm_xml_odms_metadata_xmls_import_post" } } } @@ -12220,13 +12679,13 @@ } } }, - "/concepts/odms/metadata/xmls/stylesheets": { + "/odms/metadata/xmls/stylesheets": { "get": { "tags": [ "ODM Metadata" ], "summary": "Listing of all available ODM XML Stylesheet names", - "operationId": "get_available_stylesheet_names_concepts_odms_metadata_xmls_stylesheets_get", + "operationId": "get_available_stylesheet_names_odms_metadata_xmls_stylesheets_get", "responses": { "200": { "description": "Successful Response", @@ -12237,7 +12696,7 @@ "type": "string" }, "type": "array", - "title": "Response Get Available Stylesheet Names Concepts Odms Metadata Xmls Stylesheets Get" + "title": "Response Get Available Stylesheet Names Odms Metadata Xmls Stylesheets Get" } } } @@ -12283,13 +12742,13 @@ ] } }, - "/concepts/odms/metadata/xmls/stylesheets/{stylesheet}": { + "/odms/metadata/xmls/stylesheets/{stylesheet}": { "get": { "tags": [ "ODM Metadata" ], "summary": "Get a specific ODM XML Stylesheet", - "operationId": "get_specific_stylesheet_concepts_odms_metadata_xmls_stylesheets__stylesheet__get", + "operationId": "get_specific_stylesheet_odms_metadata_xmls_stylesheets__stylesheet__get", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -13840,6 +14299,24 @@ "title": "Activity Instruction Template Uid" }, "description": "The unique id of the activity instruction template." + }, + { + "name": "study_uid", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Optionally, the uid of the study to subset the parameters to (e.g. for StudyEndpoints parameters)", + "title": "Study Uid" + }, + "description": "Optionally, the uid of the study to subset the parameters to (e.g. for StudyEndpoints parameters)" } ], "responses": { @@ -18079,6 +18556,24 @@ "title": "Footnote Template Uid" }, "description": "The unique id of the footnote template." + }, + { + "name": "study_uid", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Optionally, the uid of the study to subset the parameters to (e.g. for StudyEndpoints parameters)", + "title": "Study Uid" + }, + "description": "Optionally, the uid of the study to subset the parameters to (e.g. for StudyEndpoints parameters)" } ], "responses": { @@ -22249,6 +22744,24 @@ "title": "Criteria Template Uid" }, "description": "The unique id of the criteria template." + }, + { + "name": "study_uid", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Optionally, the uid of the study to subset the parameters to (e.g. for StudyEndpoints parameters)", + "title": "Study Uid" + }, + "description": "Optionally, the uid of the study to subset the parameters to (e.g. for StudyEndpoints parameters)" } ], "responses": { @@ -30665,6 +31178,24 @@ "title": "Endpoint Template Uid" }, "description": "The unique id of the endpoint template." + }, + { + "name": "study_uid", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Optionally, the uid of the study to subset the parameters to (e.g. for StudyEndpoints parameters)", + "title": "Study Uid" + }, + "description": "Optionally, the uid of the study to subset the parameters to (e.g. for StudyEndpoints parameters)" } ], "responses": { @@ -68849,7 +69380,8 @@ "schema": { "type": "array", "items": { - "type": "object" + "type": "object", + "additionalProperties": true }, "title": "Response Get Caches Admin Caches Get" } @@ -68910,7 +69442,8 @@ "schema": { "type": "array", "items": { - "type": "object" + "type": "object", + "additionalProperties": true }, "title": "Response Clear Caches Admin Caches Delete" } @@ -69327,6 +69860,133 @@ } } }, + "/admin/global-preferences": { + "get": { + "tags": [ + "Admin" + ], + "summary": "Returns global preferences", + "operationId": "get_global_preferences_admin_global_preferences_get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PreferencesResponse" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Entity not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + }, + { + "BearerJwtAuth": [] + } + ] + }, + "patch": { + "tags": [ + "Admin" + ], + "summary": "Update global preferences", + "description": "Update one or more global preference settings", + "operationId": "patch_global_preferences_admin_global_preferences_patch", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalPreferencesPatchInput" + } + } + }, + "required": true + }, + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PreferencesResponse" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Entity not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + }, + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + }, + { + "BearerJwtAuth": [] + } + ] + } + }, "/brands": { "get": { "tags": [ @@ -70895,6 +71555,114 @@ }, "description": "Indicates whether to return minimal response with only `uid`, `id` and `acronym`." }, + { + "name": "has_study_objective", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Filter studies by Study Objectives presence: `true` (has objectives), `false` (no objectives), or omit (all studies).", + "title": "Has Study Objective" + }, + "description": "Filter studies by Study Objectives presence: `true` (has objectives), `false` (no objectives), or omit (all studies)." + }, + { + "name": "has_study_footnote", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Filter studies by Study Objectives presence: `true` (has objectives), `false` (no objectives), or omit (all studies).", + "title": "Has Study Footnote" + }, + "description": "Filter studies by Study Objectives presence: `true` (has objectives), `false` (no objectives), or omit (all studies)." + }, + { + "name": "has_study_endpoint", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Filter studies by Study Endpoints presence: `true` (has endpoints), `false` (no endpoints), or omit (all studies).", + "title": "Has Study Endpoint" + }, + "description": "Filter studies by Study Endpoints presence: `true` (has endpoints), `false` (no endpoints), or omit (all studies)." + }, + { + "name": "has_study_criteria", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Filter studies by Study Criteria presence: `true` (has criteria), `false` (no criteria), or omit (all studies).", + "title": "Has Study Criteria" + }, + "description": "Filter studies by Study Criteria presence: `true` (has criteria), `false` (no criteria), or omit (all studies)." + }, + { + "name": "has_study_activity", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Filter studies by Study Activities presence: `true` (has activities), `false` (no activities), or omit (all studies).", + "title": "Has Study Activity" + }, + "description": "Filter studies by Study Activities presence: `true` (has activities), `false` (no activities), or omit (all studies)." + }, + { + "name": "has_study_activity_instruction", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "description": "Filter studies by Study Activity Instructions presence: `true` (has activity instructions), `false` (no activity instructions), or omit (all studies).", + "title": "Has Study Activity Instruction" + }, + "description": "Filter studies by Study Activity Instructions presence: `true` (has activity instructions), `false` (no activity instructions), or omit (all studies)." + }, { "name": "deleted", "in": "query", @@ -71695,7 +72463,7 @@ ], "summary": "Deletes a Study", "description": "State before:\n - uid must exist\n - The Study must be in status Draft and it couldn't be locked before.\n\nBusiness logic:\n - The draft Study is deleted.\n\nState after:\n - Study is successfully deleted.\n\nPossible errors:\n - Invalid uid or status not Draft or Study was previously locked.", - "operationId": "delete_activity_studies__study_uid__delete", + "operationId": "delete_study_studies__study_uid__delete", "security": [ { "OAuth2AuthorizationCodeBearer": [] @@ -72393,14 +73161,14 @@ "description": "Boolean flag to include the total count of entities in the response.\n\nDefault: `false`\n\nFunctionality: When set to `true`, returns the total number of entities that match the query.\n\nWhen combined with filters, the count reflects only the entities matching those filters.\n\nNote: This operation can be expensive for large datasets.\n\nSpecial case: A value of `-1` indicates that the exact count is unavailable due to performance constraints, but confirms that at least one more entity exists beyond the current page." }, { - "name": "only_latest_major_protcol_version", + "name": "only_latest_major_protocol_version", "in": "query", "required": false, "schema": { "type": "boolean", "description": "Indicates whether Study snapshots without protocol header version should be returned", "default": false, - "title": "Only Latest Major Protcol Version" + "title": "Only Latest Major Protocol Version" }, "description": "Indicates whether Study snapshots without protocol header version should be returned" } @@ -73859,7 +74627,11 @@ "title": "Study Value Version" }, "description": "Study Version Number", - "example": "2.1" + "examples": { + "2.1": { + "value": "2.1" + } + } } ], "responses": { @@ -75244,7 +76016,8 @@ "schema": { "type": "array", "items": { - "type": "object" + "type": "object", + "additionalProperties": true }, "title": "Response Export Detailed Soa Content Studies Study Uid Detailed Soa Exports Get" } @@ -75339,7 +76112,8 @@ "schema": { "type": "array", "items": { - "type": "object" + "type": "object", + "additionalProperties": true }, "title": "Response Export Operational Soa Content Studies Study Uid Operational Soa Exports Get" } @@ -75434,7 +76208,8 @@ "schema": { "type": "array", "items": { - "type": "object" + "type": "object", + "additionalProperties": true }, "title": "Response Export Protocol Soa Content Studies Study Uid Protocol Soa Exports Get" } @@ -75906,7 +76681,8 @@ "schema": { "type": "array", "items": { - "type": "object" + "type": "object", + "additionalProperties": true }, "title": "Response Get A Paginated List Of Study Crfs Of A Study Studies Study Uid Odm Forms Get" } @@ -93539,6 +94315,236 @@ } } }, + "/studies/{study_uid}/data-completeness-tags": { + "get": { + "tags": [ + "Study Selections" + ], + "summary": "Returns all data completeness tags assigned to the given study.", + "operationId": "get_study_data_completeness_tags_studies__study_uid__data_completeness_tags_get", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + }, + { + "BearerJwtAuth": [] + } + ], + "parameters": [ + { + "name": "study_uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique id of the study.", + "title": "Study Uid" + }, + "description": "The unique id of the study." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DataCompletenessTag" + }, + "title": "Response Get Study Data Completeness Tags Studies Study Uid Data Completeness Tags Get" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Entity not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + }, + "post": { + "tags": [ + "Study Selections" + ], + "summary": "Assigns a data completeness tag to the given study.", + "operationId": "assign_data_completeness_tag_to_study_studies__study_uid__data_completeness_tags_post", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + }, + { + "BearerJwtAuth": [] + } + ], + "parameters": [ + { + "name": "study_uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique id of the study.", + "title": "Study Uid" + }, + "description": "The unique id of the study." + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Body_assign_data_completeness_tag_to_study_studies__study_uid__data_completeness_tags_post" + } + } + } + }, + "responses": { + "201": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DataCompletenessTag" + } + } + } + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Entity not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, + "/studies/{study_uid}/data-completeness-tags/{uid}": { + "delete": { + "tags": [ + "Study Selections" + ], + "summary": "Removes a data completeness tag from the given study.", + "operationId": "remove_data_completeness_tag_from_study_studies__study_uid__data_completeness_tags__uid__delete", + "security": [ + { + "OAuth2AuthorizationCodeBearer": [] + }, + { + "BearerJwtAuth": [] + } + ], + "parameters": [ + { + "name": "study_uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique id of the study.", + "title": "Study Uid" + }, + "description": "The unique id of the study." + }, + { + "name": "uid", + "in": "path", + "required": true, + "schema": { + "type": "string", + "title": "UID of the data completeness tag" + } + } + ], + "responses": { + "204": { + "description": "Successful Response" + }, + "403": { + "description": "Forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Entity not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + } + } + } + }, "/studies/{study_uid}/ctr/odm.xml": { "get": { "tags": [ @@ -101587,6 +102593,18 @@ "title": "Derive Props Based On Timeline" }, "description": "Indicates whether the (visit_name, visit_short_name, unique_visit_number) properties are derived based on the study visit timeline and not from database values." + }, + { + "name": "lite", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Whether to use the lightweight implementation of this endpoint, which doesn't support `filters` and `operator` parameters.", + "default": false, + "title": "Lite" + }, + "description": "Whether to use the lightweight implementation of this endpoint, which doesn't support `filters` and `operator` parameters." } ], "responses": { @@ -101595,7 +102613,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/CustomPage_StudyVisit_" + "$ref": "#/components/schemas/CustomPage_Union_StudyVisitLite__StudyVisit__" } } } @@ -110108,6 +111126,28 @@ } ], "parameters": [ + { + "name": "sponsor_model_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "The name of the sponsor model, for instance 'sdtmig_sponsormodel_3.2-NN15'", + "title": "Sponsor Model Name" + }, + "description": "The name of the sponsor model, for instance 'sdtmig_sponsormodel_3.2-NN15'" + }, + { + "name": "sponsor_model_version", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "The version of the sponsor model, for instance '15'", + "title": "Sponsor Model Version" + }, + "description": "The version of the sponsor model, for instance '15'" + }, { "name": "sort_by", "in": "query", @@ -110324,12 +111364,24 @@ ], "parameters": [ { - "name": "field_name", + "name": "sponsor_model_name", "in": "query", "required": true, + "schema": { + "type": "string", + "description": "The name of the sponsor model, for instance 'sdtmig_sponsormodel_3.2-NN15'", + "title": "Sponsor Model Name" + }, + "description": "The name of the sponsor model, for instance 'sdtmig_sponsormodel_3.2-NN15'" + }, + { + "name": "field_name", + "in": "query", + "required": false, "schema": { "type": "string", "description": "The field name for which to lookup possible values in the database.\n\nFunctionality: searches for possible values (aka 'headers') of this field in the database.Errors: invalid field name specified", + "default": "", "title": "Field Name" }, "description": "The field name for which to lookup possible values in the database.\n\nFunctionality: searches for possible values (aka 'headers') of this field in the database.Errors: invalid field name specified" @@ -110476,6 +111528,28 @@ } ], "parameters": [ + { + "name": "sponsor_model_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "The name of the sponsor model, for instance 'sdtmig_sponsormodel_3.2-NN15'", + "title": "Sponsor Model Name" + }, + "description": "The name of the sponsor model, for instance 'sdtmig_sponsormodel_3.2-NN15'" + }, + { + "name": "sponsor_model_version", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "The version number of the sponsor model, for instance '15'", + "title": "Sponsor Model Version" + }, + "description": "The version number of the sponsor model, for instance '15'" + }, { "name": "sort_by", "in": "query", @@ -110692,12 +111766,42 @@ ], "parameters": [ { - "name": "field_name", + "name": "sponsor_model_name", "in": "query", "required": true, + "schema": { + "type": "string", + "description": "The name of the sponsor model, for instance 'sdtmig_sponsormodel_3.2-NN15'", + "title": "Sponsor Model Name" + }, + "description": "The name of the sponsor model, for instance 'sdtmig_sponsormodel_3.2-NN15'" + }, + { + "name": "sponsor_model_version_number", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "The version number of the sponsor model", + "title": "Sponsor Model Version Number" + }, + "description": "The version number of the sponsor model" + }, + { + "name": "field_name", + "in": "query", + "required": false, "schema": { "type": "string", "description": "The field name for which to lookup possible values in the database.\n\nFunctionality: searches for possible values (aka 'headers') of this field in the database.Errors: invalid field name specified", + "default": "", "title": "Field Name" }, "description": "The field name for which to lookup possible values in the database.\n\nFunctionality: searches for possible values (aka 'headers') of this field in the database.Errors: invalid field name specified" @@ -110844,6 +111948,17 @@ } ], "parameters": [ + { + "name": "data_model_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "The full name of the model, for instance 'SDTM v2.0'", + "title": "Data Model Name" + }, + "description": "The full name of the model, for instance 'SDTM v2.0'" + }, { "name": "sort_by", "in": "query", @@ -111010,6 +112125,17 @@ } ], "parameters": [ + { + "name": "data_model_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "The full name of the model, for instance 'SDTM v2.0'", + "title": "Data Model Name" + }, + "description": "The full name of the model, for instance 'SDTM v2.0'" + }, { "name": "field_name", "in": "query", @@ -111173,6 +112299,17 @@ "title": "Dataset Class Uid" }, "description": "The unique id of the DatasetClass" + }, + { + "name": "data_model_name", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "The full name of the model, for instance 'SDTM v2.0'", + "title": "Data Model Name" + }, + "description": "The full name of the model, for instance 'SDTM v2.0'" } ], "responses": { @@ -117308,6 +118445,7 @@ "anyOf": [ { "items": { + "additionalProperties": true, "type": "object" }, "type": "array" @@ -119897,6 +121035,16 @@ "activity_item_class": { "$ref": "#/components/schemas/CompactActivityItemClassForActivityItem" }, + "ct_codelist": { + "anyOf": [ + { + "$ref": "#/components/schemas/CompactCodelist" + }, + { + "type": "null" + } + ] + }, "ct_terms": { "items": { "$ref": "#/components/schemas/CompactCTTerm" @@ -120601,6 +121749,17 @@ "minLength": 1, "title": "Activity Item Class Uid" }, + "ct_codelist_uid": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Ct Codelist Uid" + }, "ct_terms": { "items": { "$ref": "#/components/schemas/CTTermsInput" @@ -121282,6 +122441,19 @@ ], "title": "BatchErrorResponse" }, + "Body_assign_data_completeness_tag_to_study_studies__study_uid__data_completeness_tags_post": { + "properties": { + "uid": { + "type": "string", + "title": "UID of the data completeness tag" + } + }, + "type": "object", + "required": [ + "uid" + ], + "title": "Body_assign_data_completeness_tag_to_study_studies__study_uid__data_completeness_tags_post" + }, "Body_create_ct_packages_sponsor_post": { "properties": { "extends_package": { @@ -121315,7 +122487,7 @@ ], "title": "Body_create_ct_packages_sponsor_post" }, - "Body_get_odm_document_concepts_odms_metadata_xmls_export_post": { + "Body_get_odm_document_odms_metadata_xmls_export_post": { "properties": { "mapper_file": { "anyOf": [ @@ -121332,9 +122504,9 @@ } }, "type": "object", - "title": "Body_get_odm_document_concepts_odms_metadata_xmls_export_post" + "title": "Body_get_odm_document_odms_metadata_xmls_export_post" }, - "Body_store_odm_xml_concepts_odms_metadata_xmls_import_post": { + "Body_store_odm_xml_odms_metadata_xmls_import_post": { "properties": { "xml_file": { "type": "string", @@ -121360,7 +122532,7 @@ "required": [ "xml_file" ], - "title": "Body_store_odm_xml_concepts_odms_metadata_xmls_import_post" + "title": "Body_store_odm_xml_odms_metadata_xmls_import_post" }, "Brand": { "properties": { @@ -122728,6 +123900,30 @@ ], "title": "CTCodelistCreateInput" }, + "CTCodelistItem": { + "properties": { + "uid": { + "type": "string", + "title": "Uid" + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + } + }, + "type": "object", + "required": [ + "uid" + ], + "title": "CTCodelistItem" + }, "CTCodelistName": { "properties": { "catalogue_names": { @@ -125342,6 +126538,20 @@ ], "title": "CTTermRelatives" }, + "CTTermUidInput": { + "properties": { + "term_uid": { + "type": "string", + "title": "Term Uid" + } + }, + "type": "object", + "required": [ + "term_uid" + ], + "title": "CTTermUidInput", + "description": "Minimal input model accepting only a CT term UID.\n\nUsed in POST/PATCH input models to align the input shape with the\nnested-object shape returned by the corresponding GET response model." + }, "CTTermsInput": { "properties": { "term_uid": { @@ -125402,6 +126612,7 @@ "title": "Uid" }, "value_node": { + "additionalProperties": true, "type": "object", "title": "Value Node" }, @@ -126192,6 +127403,36 @@ "type": "object", "title": "CompactCTTerm" }, + "CompactCodelist": { + "properties": { + "uid": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Uid", + "nullable": true + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name", + "nullable": true + } + }, + "type": "object", + "title": "CompactCodelist" + }, "CompactFootnote": { "properties": { "uid": { @@ -133404,11 +134645,11 @@ ], "title": "CustomPage[StudyVisitListing]" }, - "CustomPage_StudyVisit_": { + "CustomPage_TextValue_": { "properties": { "items": { "items": { - "$ref": "#/components/schemas/StudyVisit" + "$ref": "#/components/schemas/TextValue" }, "type": "array", "title": "Items" @@ -133436,13 +134677,13 @@ "page", "size" ], - "title": "CustomPage[StudyVisit]" + "title": "CustomPage[TextValue]" }, - "CustomPage_TextValue_": { + "CustomPage_TimePoint_": { "properties": { "items": { "items": { - "$ref": "#/components/schemas/TextValue" + "$ref": "#/components/schemas/TimePoint" }, "type": "array", "title": "Items" @@ -133470,13 +134711,13 @@ "page", "size" ], - "title": "CustomPage[TextValue]" + "title": "CustomPage[TimePoint]" }, - "CustomPage_TimePoint_": { + "CustomPage_TimeframeTemplate_": { "properties": { "items": { "items": { - "$ref": "#/components/schemas/TimePoint" + "$ref": "#/components/schemas/TimeframeTemplate" }, "type": "array", "title": "Items" @@ -133504,13 +134745,13 @@ "page", "size" ], - "title": "CustomPage[TimePoint]" + "title": "CustomPage[TimeframeTemplate]" }, - "CustomPage_TimeframeTemplate_": { + "CustomPage_Timeframe_": { "properties": { "items": { "items": { - "$ref": "#/components/schemas/TimeframeTemplate" + "$ref": "#/components/schemas/Timeframe" }, "type": "array", "title": "Items" @@ -133538,13 +134779,13 @@ "page", "size" ], - "title": "CustomPage[TimeframeTemplate]" + "title": "CustomPage[Timeframe]" }, - "CustomPage_Timeframe_": { + "CustomPage_TopicCdDef_": { "properties": { "items": { "items": { - "$ref": "#/components/schemas/Timeframe" + "$ref": "#/components/schemas/TopicCdDef" }, "type": "array", "title": "Items" @@ -133572,13 +134813,20 @@ "page", "size" ], - "title": "CustomPage[Timeframe]" + "title": "CustomPage[TopicCdDef]" }, - "CustomPage_TopicCdDef_": { + "CustomPage_Union_CTTermName__CTTermNameSimple__": { "properties": { "items": { "items": { - "$ref": "#/components/schemas/TopicCdDef" + "anyOf": [ + { + "$ref": "#/components/schemas/CTTermName" + }, + { + "$ref": "#/components/schemas/CTTermNameSimple" + } + ] }, "type": "array", "title": "Items" @@ -133606,18 +134854,21 @@ "page", "size" ], - "title": "CustomPage[TopicCdDef]" + "title": "CustomPage[Union[CTTermName, CTTermNameSimple]]" }, - "CustomPage_Union_CTTermName__CTTermNameSimple__": { + "CustomPage_Union_StudyVisitAdamListing__StudyEndpntAdamListing__FlowchartMetadataAdamListing__": { "properties": { "items": { "items": { "anyOf": [ { - "$ref": "#/components/schemas/CTTermName" + "$ref": "#/components/schemas/StudyVisitAdamListing" }, { - "$ref": "#/components/schemas/CTTermNameSimple" + "$ref": "#/components/schemas/StudyEndpntAdamListing" + }, + { + "$ref": "#/components/schemas/FlowchartMetadataAdamListing" } ] }, @@ -133647,21 +134898,18 @@ "page", "size" ], - "title": "CustomPage[Union[CTTermName, CTTermNameSimple]]" + "title": "CustomPage[Union[StudyVisitAdamListing, StudyEndpntAdamListing, FlowchartMetadataAdamListing]]" }, - "CustomPage_Union_StudyVisitAdamListing__StudyEndpntAdamListing__FlowchartMetadataAdamListing__": { + "CustomPage_Union_StudyVisitLite__StudyVisit__": { "properties": { "items": { "items": { "anyOf": [ { - "$ref": "#/components/schemas/StudyVisitAdamListing" + "$ref": "#/components/schemas/StudyVisitLite" }, { - "$ref": "#/components/schemas/StudyEndpntAdamListing" - }, - { - "$ref": "#/components/schemas/FlowchartMetadataAdamListing" + "$ref": "#/components/schemas/StudyVisit" } ] }, @@ -133691,7 +134939,7 @@ "page", "size" ], - "title": "CustomPage[Union[StudyVisitAdamListing, StudyEndpntAdamListing, FlowchartMetadataAdamListing]]" + "title": "CustomPage[Union[StudyVisitLite, StudyVisit]]" }, "CustomPage_UnitDefinitionModel_": { "properties": { @@ -133795,7 +135043,7 @@ ], "title": "CustomPage[VisitName]" }, - "DataModel": { + "DataCompletenessTag": { "properties": { "uid": { "type": "string", @@ -133803,56 +135051,31 @@ }, "name": { "type": "string", - "title": "Name", - "description": "The name or the data model. E.g. 'SDTM', 'ADAM', ..." - }, - "description": { - "type": "string", - "title": "Description" - }, - "implementation_guides": { - "items": { - "$ref": "#/components/schemas/SimpleImplementationGuide" - }, - "type": "array", - "title": "Implementation Guides" - }, - "version_number": { - "type": "string", - "title": "Version Number", - "description": "The version or the data model ig. E.g. '1.4'" - }, - "start_date": { - "type": "string", - "format": "date-time", - "title": "Start Date", - "description": "Version start date in ISO 8601 format with timezone, e.g. '2020-10-31T16:00:00+02:00' for October 31, 2020 at 4pm in UTC+2 timezone." - }, - "status": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Status", - "nullable": true + "title": "Name" } }, "type": "object", "required": [ "uid", - "name", - "description", - "implementation_guides", - "version_number", - "start_date" + "name" ], - "title": "DataModel" + "title": "DataCompletenessTag" }, - "DataModelIG": { + "DataCompletenessTagInput": { + "properties": { + "name": { + "type": "string", + "minLength": 1, + "title": "Name" + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "DataCompletenessTagInput" + }, + "DataModel": { "properties": { "uid": { "type": "string", @@ -133861,27 +135084,84 @@ "name": { "type": "string", "title": "Name", - "description": "The name or the data model ig. E.g. 'SDTM', 'ADAM', ..." + "description": "The name or the data model. E.g. 'SDTM', 'ADAM', ..." }, "description": { "type": "string", "title": "Description" }, - "implemented_data_model": { - "anyOf": [ - { - "$ref": "#/components/schemas/SimpleDataModel" - }, - { - "type": "null" - } - ], - "nullable": true + "implementation_guides": { + "items": { + "$ref": "#/components/schemas/SimpleImplementationGuide" + }, + "type": "array", + "title": "Implementation Guides" }, "version_number": { "type": "string", "title": "Version Number", - "description": "The version or the data model ig. E.g. '1.1.1'" + "description": "The version or the data model ig. E.g. '1.4'" + }, + "start_date": { + "type": "string", + "format": "date-time", + "title": "Start Date", + "description": "Version start date in ISO 8601 format with timezone, e.g. '2020-10-31T16:00:00+02:00' for October 31, 2020 at 4pm in UTC+2 timezone." + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Status", + "nullable": true + } + }, + "type": "object", + "required": [ + "uid", + "name", + "description", + "implementation_guides", + "version_number", + "start_date" + ], + "title": "DataModel" + }, + "DataModelIG": { + "properties": { + "uid": { + "type": "string", + "title": "Uid" + }, + "name": { + "type": "string", + "title": "Name", + "description": "The name or the data model ig. E.g. 'SDTM', 'ADAM', ..." + }, + "description": { + "type": "string", + "title": "Description" + }, + "implemented_data_model": { + "anyOf": [ + { + "$ref": "#/components/schemas/SimpleDataModel" + }, + { + "type": "null" + } + ], + "nullable": true + }, + "version_number": { + "type": "string", + "title": "Version Number", + "description": "The version or the data model ig. E.g. '1.1.1'" }, "start_date": { "type": "string", @@ -134529,7 +135809,7 @@ "type": "string", "title": "Catalogue Name" }, - "parent_class": { + "parent_class_name": { "anyOf": [ { "type": "string" @@ -134538,22 +135818,18 @@ "type": "null" } ], - "title": "Parent Class", + "title": "Parent Class Name", "nullable": true }, - "data_models": { - "items": { - "$ref": "#/components/schemas/SimpleDataModelForDatasetClass" - }, - "type": "array", - "title": "Data Models" + "data_model": { + "$ref": "#/components/schemas/SimpleDataModelForDatasetClass" } }, "type": "object", "required": [ "uid", "catalogue_name", - "data_models" + "data_model" ], "title": "DatasetClass" }, @@ -134764,14 +136040,6 @@ "dataset": { "$ref": "#/components/schemas/SimpleDatasetForDatasetVariable" }, - "data_model_ig_names": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Data Model Ig Names", - "description": "Versions of associated data model implementation guides" - }, "implements_variable": { "anyOf": [ { @@ -134813,8 +136081,7 @@ "type": "object", "required": [ "uid", - "dataset", - "data_model_ig_names" + "dataset" ], "title": "DatasetVariable" }, @@ -134872,6 +136139,7 @@ "required": [ "object_type", "description", + "action", "start_date" ], "title": "DetailedSoAHistory" @@ -140613,6 +141881,59 @@ ], "title": "GenericFilteringReturn[StudySelectionObjective]" }, + "GlobalPreferencesPatchInput": { + "properties": { + "language": { + "anyOf": [ + { + "type": "string", + "const": "en" + }, + { + "type": "null" + } + ], + "title": "Language" + }, + "rows_per_page": { + "anyOf": [ + { + "type": "integer", + "maximum": 100.0, + "minimum": 5.0 + }, + { + "type": "null" + } + ], + "title": "Rows Per Page" + }, + "sidebar_visible": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Sidebar Visible" + }, + "sidebar_auto_minimize": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Sidebar Auto Minimize" + } + }, + "type": "object", + "title": "GlobalPreferencesPatchInput" + }, "GraphUser": { "properties": { "id": { @@ -144730,6 +146051,18 @@ }, "OdmCondition": { "properties": { + "uid": { + "type": "string", + "title": "Uid" + }, + "name": { + "type": "string", + "title": "Name" + }, + "library_name": { + "type": "string", + "title": "Library Name" + }, "start_date": { "type": "string", "format": "date-time", @@ -144774,18 +146107,6 @@ "type": "string", "title": "Change Description" }, - "uid": { - "type": "string", - "title": "Uid" - }, - "name": { - "type": "string", - "title": "Name" - }, - "library_name": { - "type": "string", - "title": "Library Name" - }, "oid": { "anyOf": [ { @@ -144828,13 +146149,13 @@ }, "type": "object", "required": [ + "uid", + "name", + "library_name", "start_date", "status", "version", "change_description", - "uid", - "name", - "library_name", "oid", "formal_expressions", "translated_texts", @@ -144984,6 +146305,18 @@ }, "OdmForm": { "properties": { + "uid": { + "type": "string", + "title": "Uid" + }, + "name": { + "type": "string", + "title": "Name" + }, + "library_name": { + "type": "string", + "title": "Library Name" + }, "start_date": { "type": "string", "format": "date-time", @@ -145028,18 +146361,6 @@ "type": "string", "title": "Change Description" }, - "uid": { - "type": "string", - "title": "Uid" - }, - "name": { - "type": "string", - "title": "Name" - }, - "library_name": { - "type": "string", - "title": "Library Name" - }, "oid": { "anyOf": [ { @@ -145128,13 +146449,13 @@ }, "type": "object", "required": [ + "uid", + "name", + "library_name", "start_date", "status", "version", "change_description", - "uid", - "name", - "library_name", "translated_texts", "aliases", "item_groups", @@ -145480,6 +146801,18 @@ }, "OdmItem": { "properties": { + "uid": { + "type": "string", + "title": "Uid" + }, + "name": { + "type": "string", + "title": "Name" + }, + "library_name": { + "type": "string", + "title": "Library Name" + }, "start_date": { "type": "string", "format": "date-time", @@ -145524,18 +146857,6 @@ "type": "string", "title": "Change Description" }, - "uid": { - "type": "string", - "title": "Uid" - }, - "name": { - "type": "string", - "title": "Name" - }, - "library_name": { - "type": "string", - "title": "Library Name" - }, "oid": { "anyOf": [ { @@ -145730,13 +147051,13 @@ }, "type": "object", "required": [ + "uid", + "name", + "library_name", "start_date", "status", "version", "change_description", - "uid", - "name", - "library_name", "oid", "translated_texts", "aliases", @@ -145771,6 +147092,18 @@ }, "OdmItemGroup": { "properties": { + "uid": { + "type": "string", + "title": "Uid" + }, + "name": { + "type": "string", + "title": "Name" + }, + "library_name": { + "type": "string", + "title": "Library Name" + }, "start_date": { "type": "string", "format": "date-time", @@ -145815,18 +147148,6 @@ "type": "string", "title": "Change Description" }, - "uid": { - "type": "string", - "title": "Uid" - }, - "name": { - "type": "string", - "title": "Name" - }, - "library_name": { - "type": "string", - "title": "Library Name" - }, "oid": { "anyOf": [ { @@ -145969,13 +147290,13 @@ }, "type": "object", "required": [ + "uid", + "name", + "library_name", "start_date", "status", "version", "change_description", - "uid", - "name", - "library_name", "oid", "translated_texts", "aliases", @@ -147244,6 +148565,18 @@ }, "OdmMethod": { "properties": { + "uid": { + "type": "string", + "title": "Uid" + }, + "name": { + "type": "string", + "title": "Name" + }, + "library_name": { + "type": "string", + "title": "Library Name" + }, "start_date": { "type": "string", "format": "date-time", @@ -147288,18 +148621,6 @@ "type": "string", "title": "Change Description" }, - "uid": { - "type": "string", - "title": "Uid" - }, - "name": { - "type": "string", - "title": "Name" - }, - "library_name": { - "type": "string", - "title": "Library Name" - }, "oid": { "anyOf": [ { @@ -147353,13 +148674,13 @@ }, "type": "object", "required": [ + "uid", + "name", + "library_name", "start_date", "status", "version", "change_description", - "uid", - "name", - "library_name", "oid", "method_type", "formal_expressions", @@ -147612,6 +148933,18 @@ }, "OdmStudyEvent": { "properties": { + "uid": { + "type": "string", + "title": "Uid" + }, + "name": { + "type": "string", + "title": "Name" + }, + "library_name": { + "type": "string", + "title": "Library Name" + }, "start_date": { "type": "string", "format": "date-time", @@ -147656,18 +148989,6 @@ "type": "string", "title": "Change Description" }, - "uid": { - "type": "string", - "title": "Uid" - }, - "name": { - "type": "string", - "title": "Name" - }, - "library_name": { - "type": "string", - "title": "Library Name" - }, "oid": { "anyOf": [ { @@ -147740,13 +149061,13 @@ }, "type": "object", "required": [ + "uid", + "name", + "library_name", "start_date", "status", "version", "change_description", - "uid", - "name", - "library_name", "forms", "possible_actions" ], @@ -147981,6 +149302,18 @@ }, "OdmVendorAttribute": { "properties": { + "uid": { + "type": "string", + "title": "Uid" + }, + "name": { + "type": "string", + "title": "Name" + }, + "library_name": { + "type": "string", + "title": "Library Name" + }, "start_date": { "type": "string", "format": "date-time", @@ -148025,18 +149358,6 @@ "type": "string", "title": "Change Description" }, - "uid": { - "type": "string", - "title": "Uid" - }, - "name": { - "type": "string", - "title": "Name" - }, - "library_name": { - "type": "string", - "title": "Library Name" - }, "compatible_types": { "items": { "type": "string" @@ -148100,13 +149421,13 @@ }, "type": "object", "required": [ + "uid", + "name", + "library_name", "start_date", "status", "version", "change_description", - "uid", - "name", - "library_name", "compatible_types", "possible_actions" ], @@ -148392,6 +149713,18 @@ }, "OdmVendorElement": { "properties": { + "uid": { + "type": "string", + "title": "Uid" + }, + "name": { + "type": "string", + "title": "Name" + }, + "library_name": { + "type": "string", + "title": "Library Name" + }, "start_date": { "type": "string", "format": "date-time", @@ -148436,18 +149769,6 @@ "type": "string", "title": "Change Description" }, - "uid": { - "type": "string", - "title": "Uid" - }, - "name": { - "type": "string", - "title": "Name" - }, - "library_name": { - "type": "string", - "title": "Library Name" - }, "compatible_types": { "items": { "type": "string" @@ -148475,13 +149796,13 @@ }, "type": "object", "required": [ + "uid", + "name", + "library_name", "start_date", "status", "version", "change_description", - "uid", - "name", - "library_name", "compatible_types", "vendor_namespace", "vendor_attributes", @@ -148761,6 +150082,18 @@ }, "OdmVendorNamespace": { "properties": { + "uid": { + "type": "string", + "title": "Uid" + }, + "name": { + "type": "string", + "title": "Name" + }, + "library_name": { + "type": "string", + "title": "Library Name" + }, "start_date": { "type": "string", "format": "date-time", @@ -148805,18 +150138,6 @@ "type": "string", "title": "Change Description" }, - "uid": { - "type": "string", - "title": "Uid" - }, - "name": { - "type": "string", - "title": "Name" - }, - "library_name": { - "type": "string", - "title": "Library Name" - }, "prefix": { "anyOf": [ { @@ -148863,13 +150184,13 @@ }, "type": "object", "required": [ + "uid", + "name", + "library_name", "start_date", "status", "version", "change_description", - "uid", - "name", - "library_name", "prefix", "url", "vendor_elements", @@ -149138,6 +150459,11 @@ "type": "string", "title": "Uid" }, + "derived_name": { + "type": "string", + "title": "Derived Name", + "default": "" + }, "external_id": { "anyOf": [ { @@ -149315,6 +150641,117 @@ ], "title": "PharmaceuticalProductEditInput" }, + "PreferenceMetadata": { + "properties": { + "type": { + "type": "string", + "title": "Type" + }, + "label": { + "type": "string", + "title": "Label" + }, + "description": { + "type": "string", + "title": "Description" + }, + "min": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Min", + "nullable": true + }, + "max": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Max", + "nullable": true + }, + "default": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "boolean" + }, + { + "type": "string" + } + ], + "title": "Default" + }, + "allowed_values": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Allowed Values", + "nullable": true + } + }, + "type": "object", + "required": [ + "type", + "label", + "description", + "default" + ], + "title": "PreferenceMetadata" + }, + "PreferencesResponse": { + "properties": { + "preferences": { + "additionalProperties": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "boolean" + }, + { + "type": "string" + } + ] + }, + "type": "object", + "title": "Preferences" + }, + "metadata": { + "additionalProperties": { + "$ref": "#/components/schemas/PreferenceMetadata" + }, + "type": "object", + "title": "Metadata" + } + }, + "type": "object", + "required": [ + "preferences", + "metadata" + ], + "title": "PreferencesResponse" + }, "Project": { "properties": { "uid": { @@ -149457,6 +150894,24 @@ ], "title": "Ref" }, + "ReferencedCodelist": { + "properties": { + "uid": { + "type": "string", + "title": "Uid" + }, + "submission_value": { + "type": "string", + "title": "Submission Value" + } + }, + "type": "object", + "required": [ + "uid", + "submission_value" + ], + "title": "ReferencedCodelist" + }, "ReferencedItem": { "properties": { "item_uid": { @@ -149498,6 +150953,24 @@ ], "title": "ReferencedItem" }, + "ReferencedTerm": { + "properties": { + "uid": { + "type": "string", + "title": "Uid" + }, + "submission_value": { + "type": "string", + "title": "Submission Value" + } + }, + "type": "object", + "required": [ + "uid", + "submission_value" + ], + "title": "ReferencedTerm" + }, "RegistryIdentifiersJsonModel": { "properties": { "ct_gov_id": { @@ -151299,7 +152772,7 @@ "ordinal": { "anyOf": [ { - "type": "string" + "type": "integer" }, { "type": "null" @@ -151738,6 +153211,78 @@ ], "title": "SimpleRoleTerm" }, + "SimpleSponsorModelDataModelIG": { + "properties": { + "ordinal": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Ordinal", + "nullable": true + }, + "name": { + "type": "string", + "title": "Name" + } + }, + "type": "object", + "required": [ + "name" + ], + "title": "SimpleSponsorModelDataModelIG" + }, + "SimpleSponsorModelDataset": { + "properties": { + "uid": { + "type": "string", + "title": "Uid" + }, + "ordinal": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Ordinal", + "nullable": true + }, + "key_order": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Key Order", + "nullable": true + }, + "version_number": { + "type": "integer", + "title": "Version Number" + }, + "sponsor_model_name": { + "type": "string", + "title": "Sponsor Model Name" + } + }, + "type": "object", + "required": [ + "uid", + "version_number", + "sponsor_model_name" + ], + "title": "SimpleSponsorModelDataset" + }, "SimpleStudyActivityGroup": { "properties": { "study_activity_group_uid": { @@ -152066,6 +153611,16 @@ }, "SimplifiedActivityItem": { "properties": { + "ct_codelist": { + "anyOf": [ + { + "$ref": "#/components/schemas/CTCodelistItem" + }, + { + "type": "null" + } + ] + }, "ct_terms": { "items": { "$ref": "#/components/schemas/CTTermItem" @@ -152132,6 +153687,22 @@ }, "SponsorModel": { "properties": { + "uid": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Uid" + }, + "name": { + "type": "string", + "title": "Name", + "description": "The name or the sponsor model. E.g. sdtm_sponsormodel_3.2-NN15" + }, "start_date": { "anyOf": [ { @@ -152173,57 +153744,9 @@ "nullable": true }, "version": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Version", - "nullable": true - }, - "change_description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Change Description", - "nullable": true - }, - "author_username": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Author Username", - "nullable": true - }, - "uid": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Uid", - "nullable": true - }, - "name": { "type": "string", - "title": "Name", - "description": "The name or the sponsor model. E.g. sdtm_sponsormodel_3.2-NN15" + "title": "Version", + "description": "Version of the sponsor model." }, "extended_implementation_guide": { "anyOf": [ @@ -152236,23 +153759,13 @@ ], "title": "Extended Implementation Guide", "nullable": true - }, - "library_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Library Name", - "nullable": true } }, "type": "object", "required": [ - "name" + "uid", + "name", + "version" ], "title": "SponsorModel" }, @@ -152313,16 +153826,15 @@ "title": "Uid", "nullable": true }, - "library_name": { + "sponsor_model": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/SimpleSponsorModelDataModelIG" }, { "type": "null" } ], - "title": "Library Name", "nullable": true }, "is_basic_std": { @@ -152337,18 +153849,6 @@ "title": "Is Basic Std", "nullable": true }, - "implemented_dataset_class": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Implemented Dataset Class", - "nullable": true - }, "xml_path": { "anyOf": [ { @@ -152862,16 +154362,15 @@ "title": "Uid", "nullable": true }, - "library_name": { + "dataset": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/SimpleSponsorModelDataset" }, { "type": "null" } ], - "title": "Library Name", "nullable": true }, "is_basic_std": { @@ -152886,31 +154385,6 @@ "title": "Is Basic Std", "nullable": true }, - "implemented_parent_dataset_class": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Implemented Parent Dataset Class", - "nullable": true - }, - "implemented_variable_class": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Implemented Variable Class", - "nullable": true, - "souce": "has_sponsor_model_instance.implements_variable_class.is_instance_of.uid" - }, "label": { "anyOf": [ { @@ -152923,18 +154397,6 @@ "title": "Label", "nullable": true }, - "order": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Order", - "nullable": true - }, "variable_type": { "anyOf": [ { @@ -153261,6 +154723,20 @@ ], "title": "Enrich Rule", "nullable": true + }, + "referenced_codelists": { + "items": { + "$ref": "#/components/schemas/ReferencedCodelist" + }, + "type": "array", + "title": "Referenced Codelists" + }, + "referenced_terms": { + "items": { + "$ref": "#/components/schemas/ReferencedTerm" + }, + "type": "array", + "title": "Referenced Terms" } }, "additionalProperties": true, @@ -167871,6 +169347,14 @@ } ], "nullable": true + }, + "data_completeness_tags": { + "items": { + "type": "string" + }, + "type": "array", + "title": "Data Completeness Tags", + "description": "List of data completeness tag names assigned to the study." } }, "type": "object", @@ -169536,6 +171020,19 @@ "description": "Metadata version associated with a given Study version", "nullable": true }, + "original_metadata_version": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Original Metadata Version", + "description": "Metadata version of the first occurrence for the same protocol header version", + "nullable": true + }, "protocol_header_major_version": { "anyOf": [ { @@ -169645,7 +171142,8 @@ "type": "number" }, { - "type": "string" + "type": "string", + "pattern": "^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$" }, { "type": "null" @@ -169702,26 +171200,6 @@ "title": "Uid", "description": "Uid of the Visit" }, - "study_epoch_uid": { - "type": "string", - "title": "Study Epoch Uid" - }, - "visit_type_uid": { - "type": "string", - "title": "Visit Type Uid" - }, - "visit_sublabel_reference": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Visit Sublabel Reference", - "nullable": true - }, "consecutive_visit_group": { "anyOf": [ { @@ -169788,6 +171266,136 @@ "title": "Visit Window Unit Uid", "nullable": true }, + "study_epoch_uid": { + "type": "string", + "title": "Study Epoch Uid" + }, + "study_epoch": { + "$ref": "#/components/schemas/SimpleCTTermNameWithConflictFlag" + }, + "study_day_number": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Study Day Number", + "nullable": true + }, + "study_duration_days": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Study Duration Days", + "nullable": true + }, + "study_week_number": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Study Week Number", + "nullable": true + }, + "study_duration_weeks": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Study Duration Weeks", + "nullable": true + }, + "visit_number": { + "type": "number", + "title": "Visit Number" + }, + "unique_visit_number": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Unique Visit Number" + }, + "visit_short_name": { + "type": "string", + "title": "Visit Short Name" + }, + "visit_window_unit_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Visit Window Unit Name", + "nullable": true + }, + "visit_class": { + "$ref": "#/components/schemas/VisitClass" + }, + "visit_subclass": { + "anyOf": [ + { + "$ref": "#/components/schemas/VisitSubclass" + }, + { + "type": "null" + } + ], + "nullable": true + }, + "is_global_anchor_visit": { + "type": "boolean", + "title": "Is Global Anchor Visit" + }, + "is_soa_milestone": { + "type": "boolean", + "title": "Is Soa Milestone" + }, + "visit_type": { + "anyOf": [ + { + "$ref": "#/components/schemas/SimpleCTTermNameWithConflictFlag" + }, + { + "type": "null" + } + ] + }, + "visit_sublabel_reference": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Visit Sublabel Reference", + "nullable": true + }, "description": { "anyOf": [ { @@ -169854,52 +171462,6 @@ "description": "Study version number, if specified, otherwise None.", "nullable": true }, - "study_epoch": { - "$ref": "#/components/schemas/SimpleCTTermNameWithConflictFlag" - }, - "epoch_uid": { - "type": "string", - "title": "Epoch Uid", - "description": "The uid of the study epoch" - }, - "visit_type": { - "anyOf": [ - { - "$ref": "#/components/schemas/SimpleCTTermNameWithConflictFlag" - }, - { - "type": "null" - } - ] - }, - "visit_type_name": { - "type": "string", - "title": "Visit Type Name" - }, - "time_reference_uid": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Time Reference Uid", - "nullable": true - }, - "time_reference_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Time Reference Name", - "nullable": true - }, "time_reference": { "anyOf": [ { @@ -169958,10 +171520,6 @@ ], "nullable": true }, - "visit_contact_mode_uid": { - "type": "string", - "title": "Visit Contact Mode Uid" - }, "visit_contact_mode": { "anyOf": [ { @@ -169972,18 +171530,6 @@ } ] }, - "epoch_allocation_uid": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Epoch Allocation Uid", - "nullable": true - }, "epoch_allocation": { "anyOf": [ { @@ -170042,30 +171588,6 @@ "title": "Duration Time Unit", "nullable": true }, - "study_day_number": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Study Day Number", - "nullable": true - }, - "study_duration_days": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Study Duration Days", - "nullable": true - }, "study_duration_days_label": { "anyOf": [ { @@ -170090,30 +171612,6 @@ "title": "Study Day Label", "nullable": true }, - "study_week_number": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Study Week Number", - "nullable": true - }, - "study_duration_weeks": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Study Duration Weeks", - "nullable": true - }, "study_duration_weeks_label": { "anyOf": [ { @@ -170150,10 +171648,6 @@ "title": "Week In Study Label", "nullable": true }, - "visit_number": { - "type": "number", - "title": "Visit Number" - }, "visit_subnumber": { "type": "integer", "title": "Visit Subnumber" @@ -170162,17 +171656,6 @@ "type": "integer", "title": "Order" }, - "unique_visit_number": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Unique Visit Number" - }, "visit_subname": { "type": "string", "title": "Visit Subname" @@ -170181,44 +171664,6 @@ "type": "string", "title": "Visit Name" }, - "visit_short_name": { - "type": "string", - "title": "Visit Short Name" - }, - "visit_window_unit_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Visit Window Unit Name", - "nullable": true - }, - "visit_class": { - "$ref": "#/components/schemas/VisitClass" - }, - "visit_subclass": { - "anyOf": [ - { - "$ref": "#/components/schemas/VisitSubclass" - }, - { - "type": "null" - } - ], - "nullable": true - }, - "is_global_anchor_visit": { - "type": "boolean", - "title": "Is Global Anchor Visit" - }, - "is_soa_milestone": { - "type": "boolean", - "title": "Is Soa Milestone" - }, "status": { "type": "string", "title": "Status", @@ -170281,26 +171726,22 @@ "type": "object", "required": [ "uid", - "study_epoch_uid", - "visit_type_uid", "show_visit", - "study_uid", + "study_epoch_uid", "study_epoch", - "epoch_uid", - "visit_type", - "visit_type_name", - "visit_contact_mode_uid", - "visit_contact_mode", "visit_number", - "visit_subnumber", - "order", "unique_visit_number", - "visit_subname", - "visit_name", "visit_short_name", "visit_class", "is_global_anchor_visit", "is_soa_milestone", + "visit_type", + "study_uid", + "visit_contact_mode", + "visit_subnumber", + "order", + "visit_subname", + "visit_name", "status", "start_date", "possible_actions" @@ -170417,20 +171858,18 @@ "type": "string", "title": "Study Epoch Uid" }, - "visit_type_uid": { - "type": "string", - "title": "Visit Type Uid" + "visit_type": { + "$ref": "#/components/schemas/CTTermUidInput" }, - "time_reference_uid": { + "time_reference": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/CTTermUidInput" }, { "type": "null" } - ], - "title": "Time Reference Uid" + ] }, "time_value": { "anyOf": [ @@ -170546,20 +171985,18 @@ ], "title": "End Rule" }, - "visit_contact_mode_uid": { - "type": "string", - "title": "Visit Contact Mode Uid" + "visit_contact_mode": { + "$ref": "#/components/schemas/CTTermUidInput" }, - "epoch_allocation_uid": { + "epoch_allocation": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/CTTermUidInput" }, { "type": "null" } - ], - "title": "Epoch Allocation Uid" + ] }, "visit_class": { "$ref": "#/components/schemas/VisitClass" @@ -170645,9 +172082,9 @@ "type": "object", "required": [ "study_epoch_uid", - "visit_type_uid", + "visit_type", "show_visit", - "visit_contact_mode_uid", + "visit_contact_mode", "visit_class", "is_global_anchor_visit" ], @@ -170664,20 +172101,18 @@ "type": "string", "title": "Study Epoch Uid" }, - "visit_type_uid": { - "type": "string", - "title": "Visit Type Uid" + "visit_type": { + "$ref": "#/components/schemas/CTTermUidInput" }, - "time_reference_uid": { + "time_reference": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/CTTermUidInput" }, { "type": "null" } - ], - "title": "Time Reference Uid" + ] }, "time_value": { "anyOf": [ @@ -170793,20 +172228,18 @@ ], "title": "End Rule" }, - "visit_contact_mode_uid": { - "type": "string", - "title": "Visit Contact Mode Uid" + "visit_contact_mode": { + "$ref": "#/components/schemas/CTTermUidInput" }, - "epoch_allocation_uid": { + "epoch_allocation": { "anyOf": [ { - "type": "string" + "$ref": "#/components/schemas/CTTermUidInput" }, { "type": "null" } - ], - "title": "Epoch Allocation Uid" + ] }, "visit_class": { "anyOf": [ @@ -170900,9 +172333,9 @@ "required": [ "uid", "study_epoch_uid", - "visit_type_uid", + "visit_type", "show_visit", - "visit_contact_mode_uid", + "visit_contact_mode", "is_global_anchor_visit" ], "title": "StudyVisitEditInput" @@ -171148,22 +172581,154 @@ ], "title": "StudyVisitListingModel" }, - "StudyVisitVersion": { + "StudyVisitLite": { "properties": { "uid": { "type": "string", "title": "Uid", "description": "Uid of the Visit" }, + "consecutive_visit_group": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Consecutive Visit Group", + "nullable": true + }, + "consecutive_visit_group_uid": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Consecutive Visit Group Uid", + "nullable": true + }, + "show_visit": { + "type": "boolean", + "title": "Show Visit" + }, + "min_visit_window_value": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Min Visit Window Value", + "default": -9999, + "nullable": true + }, + "max_visit_window_value": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Max Visit Window Value", + "default": 9999, + "nullable": true + }, + "visit_window_unit_uid": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Visit Window Unit Uid", + "nullable": true + }, "study_epoch_uid": { "type": "string", "title": "Study Epoch Uid" }, - "visit_type_uid": { + "study_epoch": { + "$ref": "#/components/schemas/SimpleCTTermNameWithConflictFlag" + }, + "study_day_number": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Study Day Number", + "nullable": true + }, + "study_duration_days": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Study Duration Days", + "nullable": true + }, + "study_week_number": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Study Week Number", + "nullable": true + }, + "study_duration_weeks": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Study Duration Weeks", + "nullable": true + }, + "visit_number": { + "type": "number", + "title": "Visit Number" + }, + "unique_visit_number": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Unique Visit Number" + }, + "visit_short_name": { "type": "string", - "title": "Visit Type Uid" + "title": "Visit Short Name" }, - "visit_sublabel_reference": { + "visit_window_unit_name": { "anyOf": [ { "type": "string" @@ -171172,9 +172737,65 @@ "type": "null" } ], - "title": "Visit Sublabel Reference", + "title": "Visit Window Unit Name", "nullable": true }, + "visit_class": { + "$ref": "#/components/schemas/VisitClass" + }, + "visit_subclass": { + "anyOf": [ + { + "$ref": "#/components/schemas/VisitSubclass" + }, + { + "type": "null" + } + ], + "nullable": true + }, + "is_global_anchor_visit": { + "type": "boolean", + "title": "Is Global Anchor Visit" + }, + "is_soa_milestone": { + "type": "boolean", + "title": "Is Soa Milestone" + }, + "visit_type": { + "anyOf": [ + { + "$ref": "#/components/schemas/SimpleCTTermNameWithConflictFlag" + }, + { + "type": "null" + } + ] + } + }, + "type": "object", + "required": [ + "uid", + "show_visit", + "study_epoch_uid", + "study_epoch", + "visit_number", + "unique_visit_number", + "visit_short_name", + "visit_class", + "is_global_anchor_visit", + "is_soa_milestone", + "visit_type" + ], + "title": "StudyVisitLite" + }, + "StudyVisitVersion": { + "properties": { + "uid": { + "type": "string", + "title": "Uid", + "description": "Uid of the Visit" + }, "consecutive_visit_group": { "anyOf": [ { @@ -171241,6 +172862,136 @@ "title": "Visit Window Unit Uid", "nullable": true }, + "study_epoch_uid": { + "type": "string", + "title": "Study Epoch Uid" + }, + "study_epoch": { + "$ref": "#/components/schemas/SimpleCTTermNameWithConflictFlag" + }, + "study_day_number": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Study Day Number", + "nullable": true + }, + "study_duration_days": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Study Duration Days", + "nullable": true + }, + "study_week_number": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Study Week Number", + "nullable": true + }, + "study_duration_weeks": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Study Duration Weeks", + "nullable": true + }, + "visit_number": { + "type": "number", + "title": "Visit Number" + }, + "unique_visit_number": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Unique Visit Number" + }, + "visit_short_name": { + "type": "string", + "title": "Visit Short Name" + }, + "visit_window_unit_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Visit Window Unit Name", + "nullable": true + }, + "visit_class": { + "$ref": "#/components/schemas/VisitClass" + }, + "visit_subclass": { + "anyOf": [ + { + "$ref": "#/components/schemas/VisitSubclass" + }, + { + "type": "null" + } + ], + "nullable": true + }, + "is_global_anchor_visit": { + "type": "boolean", + "title": "Is Global Anchor Visit" + }, + "is_soa_milestone": { + "type": "boolean", + "title": "Is Soa Milestone" + }, + "visit_type": { + "anyOf": [ + { + "$ref": "#/components/schemas/SimpleCTTermNameWithConflictFlag" + }, + { + "type": "null" + } + ] + }, + "visit_sublabel_reference": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Visit Sublabel Reference", + "nullable": true + }, "description": { "anyOf": [ { @@ -171307,52 +173058,6 @@ "description": "Study version number, if specified, otherwise None.", "nullable": true }, - "study_epoch": { - "$ref": "#/components/schemas/SimpleCTTermNameWithConflictFlag" - }, - "epoch_uid": { - "type": "string", - "title": "Epoch Uid", - "description": "The uid of the study epoch" - }, - "visit_type": { - "anyOf": [ - { - "$ref": "#/components/schemas/SimpleCTTermNameWithConflictFlag" - }, - { - "type": "null" - } - ] - }, - "visit_type_name": { - "type": "string", - "title": "Visit Type Name" - }, - "time_reference_uid": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Time Reference Uid", - "nullable": true - }, - "time_reference_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Time Reference Name", - "nullable": true - }, "time_reference": { "anyOf": [ { @@ -171411,10 +173116,6 @@ ], "nullable": true }, - "visit_contact_mode_uid": { - "type": "string", - "title": "Visit Contact Mode Uid" - }, "visit_contact_mode": { "anyOf": [ { @@ -171425,18 +173126,6 @@ } ] }, - "epoch_allocation_uid": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Epoch Allocation Uid", - "nullable": true - }, "epoch_allocation": { "anyOf": [ { @@ -171495,30 +173184,6 @@ "title": "Duration Time Unit", "nullable": true }, - "study_day_number": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Study Day Number", - "nullable": true - }, - "study_duration_days": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Study Duration Days", - "nullable": true - }, "study_duration_days_label": { "anyOf": [ { @@ -171543,30 +173208,6 @@ "title": "Study Day Label", "nullable": true }, - "study_week_number": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Study Week Number", - "nullable": true - }, - "study_duration_weeks": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Study Duration Weeks", - "nullable": true - }, "study_duration_weeks_label": { "anyOf": [ { @@ -171603,10 +173244,6 @@ "title": "Week In Study Label", "nullable": true }, - "visit_number": { - "type": "number", - "title": "Visit Number" - }, "visit_subnumber": { "type": "integer", "title": "Visit Subnumber" @@ -171622,17 +173259,6 @@ ], "title": "Order" }, - "unique_visit_number": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Unique Visit Number" - }, "visit_subname": { "type": "string", "title": "Visit Subname" @@ -171641,44 +173267,6 @@ "type": "string", "title": "Visit Name" }, - "visit_short_name": { - "type": "string", - "title": "Visit Short Name" - }, - "visit_window_unit_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Visit Window Unit Name", - "nullable": true - }, - "visit_class": { - "$ref": "#/components/schemas/VisitClass" - }, - "visit_subclass": { - "anyOf": [ - { - "$ref": "#/components/schemas/VisitSubclass" - }, - { - "type": "null" - } - ], - "nullable": true - }, - "is_global_anchor_visit": { - "type": "boolean", - "title": "Is Global Anchor Visit" - }, - "is_soa_milestone": { - "type": "boolean", - "title": "Is Soa Milestone" - }, "status": { "type": "string", "title": "Status", @@ -171748,25 +173336,21 @@ "type": "object", "required": [ "uid", - "study_epoch_uid", - "visit_type_uid", "show_visit", - "study_uid", + "study_epoch_uid", "study_epoch", - "epoch_uid", - "visit_type", - "visit_type_name", - "visit_contact_mode_uid", - "visit_contact_mode", "visit_number", - "visit_subnumber", "unique_visit_number", - "visit_subname", - "visit_name", "visit_short_name", "visit_class", "is_global_anchor_visit", "is_soa_milestone", + "visit_type", + "study_uid", + "visit_contact_mode", + "visit_subnumber", + "visit_subname", + "visit_name", "status", "start_date", "possible_actions", @@ -172164,6 +173748,7 @@ "title": "Uid" }, "value_node": { + "additionalProperties": true, "type": "object", "title": "Value Node" }, @@ -174589,6 +176174,99 @@ "type": "object", "title": "UserInfoPatchInput" }, + "UserPreferencesPatchInput": { + "properties": { + "language": { + "anyOf": [ + { + "type": "string", + "const": "en" + }, + { + "type": "null" + } + ], + "title": "Language" + }, + "rows_per_page": { + "anyOf": [ + { + "type": "integer", + "maximum": 100.0, + "minimum": 5.0 + }, + { + "type": "null" + } + ], + "title": "Rows Per Page" + }, + "sidebar_visible": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Sidebar Visible" + }, + "sidebar_auto_minimize": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "title": "Sidebar Auto Minimize" + } + }, + "type": "object", + "title": "UserPreferencesPatchInput" + }, + "UserPreferencesResponse": { + "properties": { + "preferences": { + "additionalProperties": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "boolean" + }, + { + "type": "string" + } + ] + }, + "type": "object", + "title": "Preferences" + }, + "overrides": { + "additionalProperties": true, + "type": "object", + "title": "Overrides" + }, + "metadata": { + "additionalProperties": { + "$ref": "#/components/schemas/PreferenceMetadata" + }, + "type": "object", + "title": "Metadata" + } + }, + "type": "object", + "required": [ + "preferences", + "overrides", + "metadata" + ], + "title": "UserPreferencesResponse" + }, "ValidCodelistMappingInput": { "properties": { "valid_codelist_uids": { @@ -174861,38 +176539,23 @@ "dataset_class": { "$ref": "#/components/schemas/SimpleDatasetClassForVariableClass" }, - "dataset_variable_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Dataset Variable Name", - "nullable": true - }, "catalogue_name": { "type": "string", "title": "Catalogue Name" }, - "data_model_names": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Data Model Names" - }, - "has_mapping_target": { + "has_mapping_targets": { "anyOf": [ { - "$ref": "#/components/schemas/SimpleMappingTarget" + "items": { + "$ref": "#/components/schemas/SimpleMappingTarget" + }, + "type": "array" }, { "type": "null" } ], + "title": "Has Mapping Targets", "nullable": true }, "referenced_codelists": { @@ -174910,15 +176573,19 @@ "title": "Referenced Codelists", "nullable": true }, - "qualifies_variable": { + "qualifies_variables": { "anyOf": [ { - "$ref": "#/components/schemas/SimpleVariableClass" + "items": { + "$ref": "#/components/schemas/SimpleVariableClass" + }, + "type": "array" }, { "type": "null" } ], + "title": "Qualifies Variables", "nullable": true } }, @@ -174928,8 +176595,7 @@ "label", "title", "dataset_class", - "catalogue_name", - "data_model_names" + "catalogue_name" ], "title": "VariableClass" }, diff --git a/clinical-mdr-api/pyproject.toml b/clinical-mdr-api/pyproject.toml index 18fe2406..04de5d23 100644 --- a/clinical-mdr-api/pyproject.toml +++ b/clinical-mdr-api/pyproject.toml @@ -1,7 +1,7 @@ [project] name = 'clinical-mdr-api' readme = 'README.md' -requires-python = '>=3.13' +requires-python = '>=3.14' license = 'TBD' authors = [ {name = 'OpenStudyBuilder', email = 'OpenStudyBuilder@gmail.com'} @@ -20,6 +20,7 @@ addopts = "--cov-config=.coveragerc" [tool.isort] profile = 'black' src_paths = ['clinical_mdr_api', 'consumer_api', 'common', 'sblint', 'extensions'] +known_third_party = ['neomodel'] [tool.pylint.'MASTER'] extension-pkg-allow-list = 'pydantic, lxml' diff --git a/clinical-mdr-api/sbom.md b/clinical-mdr-api/sbom.md index f3a694c1..f1abf6e2 100644 --- a/clinical-mdr-api/sbom.md +++ b/clinical-mdr-api/sbom.md @@ -1,97 +1,96 @@ ## Installed packages -| Package | Version | License | -|--------------------------|-------------|--------------------------------------------------------------| -| annotated-doc | 0.0.4 | [MIT](#annotated-doc) | -| annotated-types | 0.6.0 | [see below](#annotated-types) | -| anyio | 4.12.1 | [MIT](#anyio) | -| asyncache | 0.3.1 | [MIT](#asyncache) | -| attrs | 25.4.0 | [MIT](#attrs) | -| Authlib | 1.6.8 | [BSD-3-Clause](#authlib) | -| azure-core | 1.38.2 | [MIT License](#azure-core) | -| azure-identity | 1.25.2 | [MIT](#azure-identity) | -| beautifulsoup4 | 4.12.3 | [MIT License](#beautifulsoup4) | -| brotli | 1.2.0 | [MIT](#brotli) | -| cachetools | 5.5.2 | [MIT](#cachetools) | -| certifi | 2026.1.4 | [MPL-2.0](#certifi) | -| cffi | 2.0.0 | [MIT](#cffi) | -| charset-normalizer | 3.4.4 | [MIT](#charset-normalizer) | -| click | 8.3.1 | [BSD-3-Clause](#click) | -| colour | 0.1.5 | [BSD 3-Clause License](#colour) | -| cryptography | 46.0.5 | [Apache-2.0 OR BSD-3-Clause](#cryptography) | -| cssselect2 | 0.9.0 | [see below](#cssselect2) | -| deepdiff | 8.6.1 | [see below](#deepdiff) | -| dict2xml | 1.7.8 | [MIT](#dict2xml) | -| docraptor | 3.1.0 | [MIT](#docraptor) | -| et_xmlfile | 2.0.0 | [MIT](#et_xmlfile) | -| fastapi | 0.131.0 | [MIT](#fastapi) | -| fhir_core | 1.1.5 | [BSD license](#fhir_core) | -| fhir.resources | 8.2.0 | BSD license (missing) | -| fonttools | 4.61.1 | [MIT](#fonttools) | -| google-api-core | 2.30.0 | [Apache 2.0](#google-api-core) | -| google-auth | 2.48.0 | [Apache 2.0](#google-auth) | -| googleapis-common-protos | 1.72.0 | [Apache 2.0](#googleapis-common-protos) | -| h11 | 0.16.0 | [MIT](#h11) | -| httpcore | 1.0.9 | [BSD-3-Clause](#httpcore) | -| httpx | 0.27.2 | [BSD-3-Clause](#httpx) | -| hypothesis | 6.115.6 | [MPL-2.0](#hypothesis) | -| idna | 3.11 | [BSD-3-Clause](#idna) | -| Jinja2 | 3.1.6 | [see below](#jinja2) | -| lxml | 5.3.2 | [BSD-3-Clause](#lxml) | -| MarkupSafe | 3.0.3 | [BSD-3-Clause](#markupsafe) | -| msal | 1.35.0 | [MIT](#msal) | -| msal-extensions | 1.3.1 | [MIT License](#msal-extensions) | -| neo4j | 5.28.3 | [Apache License, Version 2.0](#neo4j) | -| neomodel | 5.5.3 | [MIT](#neomodel) | -| nh3 | 0.2.22 | [MIT](#nh3) | -| numpy | 2.4.2 | [BSD-3-Clause AND 0BSD AND MIT AND Zlib AND CC0-1.0](#numpy) | -| opencensus | 0.11.4 | [Apache-2.0](#opencensus) | -| opencensus-context | 0.1.3 | [Apache-2.0](#opencensus-context) | -| opencensus-ext-azure | 1.1.15 | [Apache-2.0](#opencensus-ext-azure) | -| openpyxl | 3.1.5 | [MIT](#openpyxl) | -| orderly-set | 5.5.0 | [see below](#orderly-set) | -| pandas | 3.0.1 | [see below](#pandas) | -| pillow | 12.1.1 | [MIT-CMU](#pillow) | -| proto-plus | 1.27.1 | [Apache 2.0](#proto-plus) | -| protobuf | 6.33.5 | [3-Clause BSD License](#protobuf) | -| psutil | 7.2.2 | [BSD-3-Clause](#psutil) | -| pyasn1 | 0.6.2 | [BSD-2-Clause](#pyasn1) | -| pyasn1_modules | 0.4.2 | [BSD](#pyasn1_modules) | -| pycparser | 3.0 | [BSD-3-Clause](#pycparser) | -| pydantic | 2.10.6 | [MIT](#pydantic) | -| pydantic_core | 2.27.2 | [MIT](#pydantic_core) | -| pydantic-settings | 2.7.1 | [MIT](#pydantic-settings) | -| pydyf | 0.12.1 | [see below](#pydyf) | -| PyJWT | 2.11.0 | [MIT](#pyjwt) | -| pyphen | 0.17.2 | [see below](#pyphen) | -| python-dateutil | 2.9.0.post0 | [Dual License](#python-dateutil) | -| python-docx | 1.1.2 | [MIT](#python-docx) | -| python-dotenv | 1.2.1 | [BSD-3-Clause](#python-dotenv) | -| python-multipart | 0.0.22 | [Apache-2.0](#python-multipart) | -| pytz | 2025.2 | [MIT](#pytz) | -| PyYAML | 6.0.3 | [MIT](#pyyaml) | -| requests | 2.32.5 | [Apache-2.0](#requests) | -| rsa | 4.9.1 | [Apache-2.0](#rsa) | -| six | 1.17.0 | [MIT](#six) | -| sniffio | 1.3.1 | [MIT OR Apache-2.0](#sniffio) | -| sortedcontainers | 2.4.0 | [Apache 2.0](#sortedcontainers) | -| soupsieve | 2.8.3 | [MIT](#soupsieve) | -| starlette | 0.52.1 | [BSD-3-Clause](#starlette) | -| starlette-context | 0.4.0 | [MIT](#starlette-context) | -| stringcase | 1.2.0 | [MIT](#stringcase) | -| tinycss2 | 1.5.1 | [see below](#tinycss2) | -| tinyhtml5 | 2.0.0 | [see below](#tinyhtml5) | -| typing_extensions | 4.15.0 | [PSF-2.0](#typing_extensions) | -| typing-inspection | 0.4.2 | [MIT](#typing-inspection) | -| urllib3 | 2.6.3 | [MIT](#urllib3) | -| usdm | 0.65.0 | [see below](#usdm) | -| uvicorn | 0.32.1 | [BSD-3-Clause](#uvicorn) | -| weasyprint | 68.1 | [see below](#weasyprint) | -| webencodings | 0.5.1 | [BSD](#webencodings) | -| xsdata | 24.11 | [MIT](#xsdata) | -| yattag | 1.16.1 | [see below](#yattag) | -| zopfli | 0.4.1 | [Apache-2.0](#zopfli) | +| Package | Version | License | +|--------------------------|--------------|--------------------------------------------------------------| +| annotated-doc | 0.0.4 | [MIT](#annotated-doc) | +| annotated-types | 0.6.0 | [see below](#annotated-types) | +| anyio | 4.12.1 | [MIT](#anyio) | +| asyncache | 0.3.1 | [MIT](#asyncache) | +| attrs | 25.4.0 | [MIT](#attrs) | +| Authlib | 1.6.9 | [BSD-3-Clause](#authlib) | +| azure-core | 1.38.3 | [MIT](#azure-core) | +| azure-identity | 1.25.3 | [MIT](#azure-identity) | +| beautifulsoup4 | 4.12.3 | [MIT License](#beautifulsoup4) | +| brotli | 1.2.0 | [MIT](#brotli) | +| cachetools | 5.5.2 | [MIT](#cachetools) | +| certifi | 2026.2.25 | [MPL-2.0](#certifi) | +| cffi | 2.0.0 | [MIT](#cffi) | +| charset-normalizer | 3.4.6 | [MIT](#charset-normalizer) | +| click | 8.3.1 | [BSD-3-Clause](#click) | +| colour | 0.1.5 | [BSD 3-Clause License](#colour) | +| cryptography | 46.0.5 | [Apache-2.0 OR BSD-3-Clause](#cryptography) | +| cssselect2 | 0.9.0 | [see below](#cssselect2) | +| deepdiff | 8.6.1 | [see below](#deepdiff) | +| dict2xml | 1.7.8 | [MIT](#dict2xml) | +| docraptor | 3.1.0 | [MIT](#docraptor) | +| et_xmlfile | 2.0.0 | [MIT](#et_xmlfile) | +| fastapi | 0.131.0 | [MIT](#fastapi) | +| fhir_core | 1.1.5 | [BSD license](#fhir_core) | +| fhir.resources | 8.2.0 | [BSD license](#fhirresources) | +| fonttools | 4.62.1 | [MIT](#fonttools) | +| google-api-core | 2.30.0 | [Apache 2.0](#google-api-core) | +| google-auth | 2.49.1 | [Apache 2.0](#google-auth) | +| googleapis-common-protos | 1.73.0 | [Apache 2.0](#googleapis-common-protos) | +| h11 | 0.16.0 | [MIT](#h11) | +| httpcore | 1.0.9 | [BSD-3-Clause](#httpcore) | +| httpx | 0.27.2 | [BSD-3-Clause](#httpx) | +| hypothesis | 6.115.6 | [MPL-2.0](#hypothesis) | +| idna | 3.11 | [BSD-3-Clause](#idna) | +| Jinja2 | 3.1.6 | [see below](#jinja2) | +| lxml | 5.3.2 | [BSD-3-Clause](#lxml) | +| MarkupSafe | 3.0.3 | [BSD-3-Clause](#markupsafe) | +| msal | 1.35.1 | [MIT](#msal) | +| msal-extensions | 1.3.1 | [MIT License](#msal-extensions) | +| neo4j | 6.1.0 | [Apache-2.0 AND Python-2.0](#neo4j) | +| neomodel | 6.1.0 | [MIT](#neomodel) | +| nh3 | 0.2.22 | [MIT](#nh3) | +| numpy | 2.4.3 | [BSD-3-Clause AND 0BSD AND MIT AND Zlib AND CC0-1.0](#numpy) | +| opencensus | 0.11.4 | [Apache-2.0](#opencensus) | +| opencensus-context | 0.1.3 | [Apache-2.0](#opencensus-context) | +| opencensus-ext-azure | 1.1.15 | [Apache-2.0](#opencensus-ext-azure) | +| openpyxl | 3.1.5 | [MIT](#openpyxl) | +| orderly-set | 5.5.0 | [see below](#orderly-set) | +| pandas | 3.0.1 | [see below](#pandas) | +| pillow | 12.1.1 | [MIT-CMU](#pillow) | +| proto-plus | 1.27.1 | [Apache 2.0](#proto-plus) | +| protobuf | 6.33.5 | [3-Clause BSD License](#protobuf) | +| psutil | 7.2.2 | [BSD-3-Clause](#psutil) | +| pyasn1 | 0.6.2 | [BSD-2-Clause](#pyasn1) | +| pyasn1_modules | 0.4.2 | [BSD](#pyasn1_modules) | +| pycparser | 3.0 | [BSD-3-Clause](#pycparser) | +| pydantic | 2.12.5 | [MIT](#pydantic) | +| pydantic_core | 2.41.5 | [MIT](#pydantic_core) | +| pydantic-settings | 2.7.1 | [MIT](#pydantic-settings) | +| pydyf | 0.12.1 | [see below](#pydyf) | +| PyJWT | 2.12.1 | [MIT](#pyjwt) | +| pyphen | 0.17.2 | [see below](#pyphen) | +| python-dateutil | 2.9.0.post0 | [Dual License](#python-dateutil) | +| python-docx | 1.1.2 | [MIT](#python-docx) | +| python-dotenv | 1.2.2 | [BSD-3-Clause](#python-dotenv) | +| python-multipart | 0.0.22 | [Apache-2.0](#python-multipart) | +| pytz | 2026.1.post1 | [MIT](#pytz) | +| PyYAML | 6.0.3 | [MIT](#pyyaml) | +| requests | 2.32.5 | [Apache-2.0](#requests) | +| six | 1.17.0 | [MIT](#six) | +| sniffio | 1.3.1 | [MIT OR Apache-2.0](#sniffio) | +| sortedcontainers | 2.4.0 | [Apache 2.0](#sortedcontainers) | +| soupsieve | 2.8.3 | [MIT](#soupsieve) | +| starlette | 0.52.1 | [BSD-3-Clause](#starlette) | +| starlette-context | 0.4.0 | [MIT](#starlette-context) | +| stringcase | 1.2.0 | [MIT](#stringcase) | +| tinycss2 | 1.5.1 | [see below](#tinycss2) | +| tinyhtml5 | 2.1.0 | [see below](#tinyhtml5) | +| typing_extensions | 4.15.0 | [PSF-2.0](#typing_extensions) | +| typing-inspection | 0.4.2 | [MIT](#typing-inspection) | +| urllib3 | 2.6.3 | [MIT](#urllib3) | +| usdm | 0.65.0 | [see below](#usdm) | +| uvicorn | 0.32.1 | [BSD-3-Clause](#uvicorn) | +| weasyprint | 68.1 | [see below](#weasyprint) | +| webencodings | 0.5.1 | [BSD](#webencodings) | +| xsdata | 26.2 | [MIT](#xsdata) | +| yattag | 1.16.1 | [see below](#yattag) | +| zopfli | 0.4.1 | [Apache-2.0](#zopfli) | ## Third-party package licenses @@ -1304,6 +1303,39 @@ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--- +### fhir.resources + + BSD License + + Copyright (c) 2019, Md Nazrul Islam + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + + * Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + OF THE POSSIBILITY OF SUCH DAMAGE. + --- ### fonttools @@ -9298,23 +9330,6 @@ incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. ---- -### rsa - - Copyright 2011 Sybren A. Stüvel| Units: | -
- {% for unit in units %}
-
-
-
-
-
- {% endfor %}
- |
-