From a08c6b794f6da539b870633183065ff3959e5d6f Mon Sep 17 00:00:00 2001 From: Nile Walker Date: Mon, 22 Mar 2021 17:30:49 -0400 Subject: [PATCH 01/15] Updated Study Associate Endpoints --- crc/api.yml | 57 +++++++++++++++++++++++++++++++++++ crc/api/study.py | 5 ++- crc/models/study.py | 4 +++ crc/services/study_service.py | 21 +++++-------- 4 files changed, 72 insertions(+), 15 deletions(-) diff --git a/crc/api.yml b/crc/api.yml index dbc10fa4..171059f1 100644 --- a/crc/api.yml +++ b/crc/api.yml @@ -357,6 +357,28 @@ paths: application/json: schema: $ref: "#/components/schemas/Study" + /study/{study_id}/associates': + parameters: + - name: study_id + in: path + required: true + description: The id of the study for which workflows should be returned. + schema: + type: integer + format: int32 + get: + operationId: crc.api.study.get_study_associates + summary: Provides a single study + tags: + - Studies + responses: + '200': + description: An Study Associate Object + content: + application/json: + schema: + $ref: "#/components/schemas/StudyAssociate" + /workflow-specification: get: operationId: crc.api.workflow.all_specifications @@ -1421,6 +1443,41 @@ components: type: string x-nullable: true example: "27b-6-1212" + StudyAssociate: + properties: + id: + type: integer + example: 1234 + title: + type: string + example: The impact of fried pickles on beer consumption in bipedal software developers. + last_updated: + type: string + format: date_time + example: "2019-12-25T09:12:33.001Z" + primary_investigator_id: + type: string + x-nullable: true + example: dhf8r + user_uid: + type: string + example: dhf8r + status: + type: string + enum: ['in_progress', 'hold', 'open_for_enrollment', 'abandoned'] + example: done + sponsor: + type: string + x-nullable: true + example: "Sartography Pharmaceuticals" + ind_number: + type: string + x-nullable: true + example: "27b-6-42" + hsr_number: + type: string + x-nullable: true + example: "27b-6-1212" DataStore: properties: id: diff --git a/crc/api/study.py b/crc/api/study.py index d91827b6..cc6f4409 100644 --- a/crc/api/study.py +++ b/crc/api/study.py @@ -7,7 +7,7 @@ from crc import session from crc.api.common import ApiError, ApiErrorSchema from crc.models.protocol_builder import ProtocolBuilderStatus from crc.models.study import Study, StudyEvent, StudyEventType, StudyModel, StudySchema, StudyForUpdateSchema, \ - StudyStatus + StudyStatus, StudyAssociatedSchema from crc.services.study_service import StudyService from crc.services.user_service import UserService from crc.services.workflow_service import WorkflowService @@ -80,6 +80,9 @@ def get_study(study_id): raise ApiError("unknown_study", 'The study "' + study_id + '" is not recognized.', status_code=404) return StudySchema().dump(study) +def get_study_associates(study_id): + return StudyService.get_study_associates(study_id) + def delete_study(study_id): try: diff --git a/crc/models/study.py b/crc/models/study.py index d6209013..a5d2b6b9 100644 --- a/crc/models/study.py +++ b/crc/models/study.py @@ -79,6 +79,10 @@ class StudyAssociated(db.Model): role = db.Column(db.String, nullable=True) send_email = db.Column(db.Boolean, nullable=True) access = db.Column(db.Boolean, nullable=True) +class StudyAssociatedSchema(ma.Schema): + class Meta: + model = StudyAssociated + unknown = INCLUDE class StudyEvent(db.Model): __tablename__ = 'study_event' diff --git a/crc/services/study_service.py b/crc/services/study_service.py index c4576578..7c6eeb1a 100644 --- a/crc/services/study_service.py +++ b/crc/services/study_service.py @@ -14,7 +14,7 @@ from crc.models.file import FileDataModel, FileModel, FileModelSchema, File, Loo from crc.models.ldap import LdapSchema from crc.models.protocol_builder import ProtocolBuilderStudy, ProtocolBuilderStatus from crc.models.study import StudyModel, Study, StudyStatus, Category, WorkflowMetadata, StudyEventType, StudyEvent, \ - IrbStatus, StudyAssociated + IrbStatus, StudyAssociated, StudyAssociatedSchema from crc.models.task_event import TaskEventModel, TaskEvent from crc.models.workflow import WorkflowSpecCategoryModel, WorkflowModel, WorkflowSpecModel, WorkflowState, \ WorkflowStatus, WorkflowSpecDependencyFile @@ -113,11 +113,7 @@ class StudyService(object): person = db.session.query(StudyAssociated).filter((StudyAssociated.study_id == study_id)&( StudyAssociated.uid == uid)).first() if person: - newAssociate = {'uid':person.uid} - newAssociate['role'] = person.role - newAssociate['send_email'] = person.send_email - newAssociate['access'] = person.access - return newAssociate + return StudyAssociatedSchema().dump(person) raise ApiError('uid_not_associated_with_study',"user id %s was not associated with study number %d"%(uid, study_id)) @@ -132,19 +128,16 @@ class StudyService(object): raise ApiError('study_not_found','No study found with id = %d'%study_id) ownerid = study.user_uid - people_list = [{'uid':ownerid,'role':'owner','send_email':True,'access':True}] + people = db.session.query(StudyAssociated).filter(StudyAssociated.study_id == study_id) - for person in people: - newAssociate = {'uid':person.uid} - newAssociate['role'] = person.role - newAssociate['send_email'] = person.send_email - newAssociate['access'] = person.access - people_list.append(newAssociate) + + people_list = [{'uid':ownerid,'role':'owner','send_email':True,'access':True}] + people_list += StudyAssociatedSchema().dump(people, many=True) return people_list @staticmethod - def update_study_associates(study_id,associates): + def update_study_associates(study_id, associates): """ updates the list of associates in the database for a study_id and a list of dicts that contains associates From a263447806f4b97f5dd9820f66ec7af2f69a74a0 Mon Sep 17 00:00:00 2001 From: NWalker4483 Date: Tue, 20 Jul 2021 13:57:32 -0400 Subject: [PATCH 02/15] Merges getStudyAssociates() endpoint --- .gitignore | 2 +- .sonarcloud.properties | 0 .travis.yml | 0 Dockerfile | 0 LICENSE.md | 0 Pipfile | 0 Pipfile.lock | 0 README.md | 0 config/default.py | 0 config/logging_example.py | 0 config/testing.py | 0 crc/__init__.py | 0 crc/api.yml | 0 crc/api/__init__.py | 0 crc/api/admin.py | 0 crc/api/common.py | 0 crc/api/data_store.py | 0 crc/api/document.py | 0 crc/api/file.py | 0 crc/api/study.py | 0 crc/api/tools.py | 0 crc/api/user.py | 0 crc/api/workflow.py | 0 crc/api/workflow_sync.py | 0 crc/models/__init__.py | 0 crc/models/api_models.py | 0 crc/models/data_store.py | 0 crc/models/email.py | 0 crc/models/file.py | 0 crc/models/ldap.py | 0 crc/models/protocol_builder.py | 0 crc/models/study.py | 1 + crc/models/task_event.py | 0 crc/models/user.py | 0 crc/models/workflow.py | 0 crc/scripts/__init__.py | 0 crc/scripts/check_study.py | 0 crc/scripts/complete_template.py | 0 crc/scripts/delete_file.py | 0 crc/scripts/email.py | 0 crc/scripts/fact_service.py | 0 crc/scripts/failing_script.py | 0 crc/scripts/file_data_get.py | 0 crc/scripts/file_data_set.py | 0 crc/scripts/get_dashboard_url.py | 0 crc/scripts/get_irb_info.py | 0 crc/scripts/get_study_associate.py | 0 crc/scripts/get_study_associates.py | 0 crc/scripts/is_file_uploaded.py | 0 crc/scripts/ldap.py | 0 crc/scripts/reset_workflow.py | 0 crc/scripts/script.py | 0 crc/scripts/study_data_get.py | 0 crc/scripts/study_data_set.py | 0 crc/scripts/study_info.py | 0 crc/scripts/update_study.py | 0 crc/scripts/update_study_associate.py | 0 crc/scripts/update_study_associates.py | 0 crc/scripts/user_data_get.py | 0 crc/scripts/user_data_set.py | 0 crc/services/__init__.py | 0 crc/services/cache_service.py | 0 crc/services/data_store_service.py | 0 crc/services/document_service.py | 0 crc/services/email_service.py | 0 crc/services/error_service.py | 0 crc/services/failing_service.py | 0 crc/services/file_service.py | 0 crc/services/ldap_service.py | 0 crc/services/lookup_service.py | 0 crc/services/protocol_builder.py | 0 crc/services/study_service.py | 14 ++++++++++++-- crc/services/user_service.py | 0 crc/services/workflow_processor.py | 0 crc/services/workflow_service.py | 4 ++-- crc/services/workflow_sync.py | 0 crc/static/bpmn/abandoned/abandoned.bpmn | 0 crc/static/bpmn/core_info/SponsorList.xls | Bin crc/static/bpmn/core_info/core_info.bpmn | 0 .../decision_core_info_multi_site_q12.dmn | 0 .../decision_core_info_multi_site_q14.dmn | 0 .../decision_core_info_multi_site_q28.dmn | 0 crc/static/bpmn/data_security_plan/HIPAA_Ids.xls | Bin .../bpmn/data_security_plan/NEW_DSP_template.docx | Bin .../UVA_ServersWebsitesList.xls | Bin .../data_security_plan/data_security_plan.bpmn | 0 .../decision_dept_chair.dmn | 0 .../dept_chair_approval.bpmn | 0 .../documents_approvals/documents_approvals.bpmn | 0 .../bpmn/enrollment_date/enrollment_date.bpmn | 0 crc/static/bpmn/finance/finance.bpmn | 0 crc/static/bpmn/hold/hold.bpmn | 0 crc/static/bpmn/ide_supplement/SponsorList.xls | Bin .../bpmn/ide_supplement/decision_ide_check.dmn | 0 crc/static/bpmn/ide_supplement/ide_update.bpmn | 0 .../ids_full_submission/ids_full_submission.bpmn | 0 .../investigators_brochure.dmn | 0 .../bpmn/ids_full_submission/ivrs_iwrs_ixrs.dmn | 0 .../bpmn/ids_full_submission/pharmacy_manual.dmn | 0 crc/static/bpmn/ids_waiver/ids_waiver.bpmn | 0 crc/static/bpmn/ind_update/SponsorList.xls | Bin crc/static/bpmn/ind_update/decision_ind_check.dmn | 0 .../bpmn/ind_update/decision_ind_uva_check.dmn | 0 crc/static/bpmn/ind_update/ind_update.bpmn | 0 .../bpmn/irb_api_details/irb_api_details.bpmn | 0 .../DepartmentList-ArtsSciences.xlsx | Bin .../DepartmentList-Education.xlsx | Bin .../DepartmentList-Medicine.xlsx | Bin crc/static/bpmn/irb_api_personnel/SchoolList.xls | Bin .../bpmn/irb_api_personnel/check_for_pi.dmn | 0 .../irb_api_personnel/decision_dept_chair.dmn | 0 .../bpmn/irb_api_personnel/decision_pi_dept.dmn | 0 .../bpmn/irb_api_personnel/decision_pi_school.dmn | 0 crc/static/bpmn/irb_api_personnel/decision_ro.dmn | 0 .../bpmn/irb_api_personnel/decision_ro_chair.dmn | 0 .../bpmn/irb_api_personnel/decision_ro_dept.dmn | 0 .../bpmn/irb_api_personnel/irb_api_personnel.bpmn | 0 .../bpmn/non_uva_approval/non_uva_approval.bpmn | 0 crc/static/bpmn/notifications/notifications.bpmn | 0 crc/static/bpmn/protocol/protocol.bpmn | 0 crc/static/bpmn/research_rampup/BuildingList.xls | Bin .../DepartmentList-Architecture.xlsx | Bin .../DepartmentList-ArtsSciences.xlsx | Bin .../research_rampup/DepartmentList-Education.xlsx | Bin .../DepartmentList-Engineering.xlsx | Bin .../research_rampup/DepartmentList-Medicine.xlsx | Bin .../DepartmentList-ProvostOffice.xlsx | Bin .../bpmn/research_rampup/DepartmentList.xlsx | Bin crc/static/bpmn/research_rampup/LabSpaces.xlsx | Bin crc/static/bpmn/research_rampup/RTT_Approvers.dmn | 0 .../bpmn/research_rampup/ResearchRampUpPlan.docx | Bin crc/static/bpmn/research_rampup/SchoolList.xls | Bin .../research_rampup/exclusive_area_monitors.dmn | 0 .../bpmn/research_rampup/research_rampup.bpmn | 0 .../bpmn/research_rampup/shared_area_monitors.dmn | 0 .../rrt_top_level_workflow.bpmn | 0 .../rsc_hire_committee/decision_support_lang.dmn | 0 .../rsc_hire_committee/rsc_hire_committee.bpmn | 0 .../rsc_hire_submission/rsc_hire_submission.bpmn | 0 .../bpmn/sponsor_funding_source/SponsorList.xls | Bin .../sponsor_funding_source.bpmn | 0 .../top_level_workflow/data_security_plan.dmn | 0 .../bpmn/top_level_workflow/enter_core_info.dmn | 0 .../bpmn/top_level_workflow/ide_supplement.dmn | 0 .../top_level_workflow/ids_full_submission.dmn | 0 crc/static/bpmn/top_level_workflow/ids_waiver.dmn | 0 crc/static/bpmn/top_level_workflow/ind_update.dmn | 0 crc/static/bpmn/top_level_workflow/personnel.dmn | 0 .../top_level_workflow/sponsor_funding_source.dmn | 0 .../top_level_workflow/top_level_workflow.bpmn | 0 crc/static/jinja_extensions.py | 0 crc/static/reference/investigators.xlsx | Bin crc/static/reference/irb_documents.xlsx | Bin crc/static/reference/rrt_documents.xlsx | Bin crc/static/templates/placeholder.docx | Bin crc/static/templates/placeholder.png | Bin crc/static/uva_rotunda.svg | 0 crc/templates/mail_content_template.html | 0 crc/templates/mail_main_template.html | 0 crconnect.wsgi | 0 deploy/requirements.txt | 0 docs/Makefile | 0 docs/conf.py | 0 docs/index.rst | 0 docs/make.bat | 0 docs/protocol_builder.html | 0 example_data.py | 0 fact_runner.py | 0 migrations/README | 0 migrations/alembic.ini | 0 migrations/env.py | 0 migrations/script.py.mako | 0 migrations/versions/0718ad13e5f3_.py | 0 migrations/versions/0f38d7a36f21_.py | 0 migrations/versions/13424d5a6de8_.py | 0 migrations/versions/1685be1cc232_.py | 0 migrations/versions/17597692d0b0_.py | 0 migrations/versions/1c3f88dbccc3_.py | 0 migrations/versions/1fdd1bdb600e_.py | 0 migrations/versions/23c62c933848_.py | 0 migrations/versions/2e7b377cbc7b_.py | 0 migrations/versions/30e017a03948_.py | 0 migrations/versions/476f8a4933ba_.py | 0 migrations/versions/5064b72284b7_.py | 0 migrations/versions/55c6cd407d89_.py | 0 migrations/versions/5acd138e969c_.py | 0 migrations/versions/5e0709e172fa_.py | 0 migrations/versions/5f06108116ae_.py | 0 migrations/versions/62910318009f_.py | 0 migrations/versions/65f3fce6031a_.py | 0 migrations/versions/665624ac29f1_.py | 0 migrations/versions/69081f1ff387_.py | 0 migrations/versions/7be7cecbeea8_.py | 0 migrations/versions/7c0de7621a1f_.py | 0 migrations/versions/87af86338630_.py | 0 migrations/versions/8856126b6658_.py | 0 migrations/versions/8b976945a54e_.py | 0 migrations/versions/90dd63672e0a_.py | 0 migrations/versions/9b43e725f39c_.py | 0 migrations/versions/ab06a94e5d4c_.py | 0 ...effe547305_update_type_on_task_events_table.py | 0 migrations/versions/afecb64d2e66_.py | 0 migrations/versions/bbf064082623_.py | 0 migrations/versions/bec71f7dc652_.py | 0 migrations/versions/c1449d1d1681_.py | 0 migrations/versions/c16d3047abbe_.py | 0 migrations/versions/c4ddb69e7ef4_.py | 0 migrations/versions/c6261ac7a7bc_.py | 0 migrations/versions/c872232ebdcb_.py | 0 migrations/versions/cb892916166a_.py | 0 migrations/versions/cc4bccc5e5a8_.py | 0 ...8f6571c_merge_30e017a03948_and_c16d3047abbe.py | 0 migrations/versions/ddd5fc9ea75b_.py | 0 migrations/versions/de30304ff5e6_.py | 0 migrations/versions/e0dfdbfd6f69_add_columns.py | 0 migrations/versions/f186725c1ad3_.py | 0 migrations/versions/f28ee3722c49_.py | 0 migrations/versions/ff29528a9909_.py | 0 migrations/versions/ffef4661a37d_.py | 0 package-lock.json | 0 postgres/docker-compose.yml | 0 postgres/docker-windows-compose.yml | 0 postgres/package-lock.json | 0 postgres/pg-init-scripts/initdb.sh | 0 readme_images/new_project.png | Bin readme_images/run.png | Bin readme_images/run_config.png | Bin readme_images/settings.png | Bin run.py | 0 schema/__init__.py | 0 setup.cfg | 0 setup.py | 0 tests/__init__.py | 0 tests/base_test.py | 0 .../add_delete_irb_document.bpmn | 0 tests/data/associated_email/associated_email.bpmn | 0 .../boolean_default_value.bpmn | 0 .../check_study_script/check_study_script.bpmn | 0 tests/data/decision_table/decision_table.bpmn | 0 tests/data/decision_table/message_to_ginger.dmn | 0 .../decision_table_dictionary_output.bpmn | 0 .../decision_table_dictionary_output.dmn | 0 tests/data/decision_table_invalid/bad_dmn.dmn | 0 .../decision_table_invalid.bpmn | 0 tests/data/docx/Letter.docx | Bin tests/data/docx/docx.bpmn | 0 tests/data/email/email.bpmn | 0 .../email_dashboard_url/email_dashboard_url.bpmn | 0 tests/data/email_script/email_script.bpmn | 0 tests/data/empty_workflow/empty_workflow.bpmn | 0 tests/data/enum_empty_list/empty_spreadsheet.xlsx | Bin tests/data/enum_empty_list/enum_empty_list.bpmn | 0 .../enum_options_competing_files/animals.xlsx | Bin .../enum_options_competing_files.bpmn | 0 .../data/enum_options_competing_files/fruits.xlsx | Bin .../enum_options_from_file/customer_list.xlsx | Bin .../enum_options_from_file.bpmn | 0 .../enum_options_from_task_data.bpmn | 0 .../enum_options_with_search.bpmn | 0 tests/data/enum_options_with_search/sponsors.xlsx | Bin .../sponsors_modified.xlsx | Bin tests/data/enum_results/enum_results.bpmn | 0 .../Decision_Value_Expression.dmn | 0 .../enum_value_expression.bpmn | 0 .../Decision_Value_Expression.dmn | 0 .../enum_value_expression_fail.bpmn | 0 .../data/exclusive_gateway/exclusive_gateway.bpmn | 0 .../exclusive_gateway_2/exclusive_gateway_2.bpmn | 0 tests/data/extension_error/extension_error.bpmn | 0 .../failing_gateway_workflow.bpmn | 0 tests/data/failing_workflow/failing_workflow.bpmn | 0 tests/data/file_data_store/file_data_store.bpmn | 0 tests/data/file_upload_form/file_upload_form.bpmn | 0 .../file_upload_form_single.bpmn | 0 tests/data/form_expressions/form_expressions.bpmn | 0 .../get_study_associate/get_study_associate.bpmn | 0 tests/data/hello_world/hello_world.bpmn | 0 .../hidden_required_field.bpmn | 0 .../hidden_required_field_pass.bpmn | 0 .../hidden_required_field_pass_expression.bpmn | 0 tests/data/infinite_loop/infinite_loop.bpmn | 0 .../invalid_expression/invalid_expression.bpmn | 0 tests/data/invalid_roles/invalid_roles.bpmn | 0 tests/data/invalid_script/invalid_script.bpmn | 0 tests/data/invalid_script2/invalid_script2.bpmn | 0 tests/data/invalid_script3/invalid_script3.bpmn | 0 tests/data/invalid_spec/invalid_spec.bpmn | 0 .../data/irb_api_personnel/irb_api_personnel.bpmn | 0 tests/data/irb_info_script/irb_info_script.bpmn | 0 tests/data/ldap_lookup/ldap_lookup.bpmn | 0 tests/data/ldap_response.json | 0 tests/data/ldap_script/ldap_script.bpmn | 0 tests/data/looping_task/looping_task.bpmn | 0 .../Task_Manual_One.md | 0 .../manual_task_with_external_documentation.bpmn | 0 tests/data/message_event/message_event.bpmn | 0 tests/data/missing_form_key/missing_form_key.bpmn | 0 tests/data/multi_instance/multi_instance.bpmn | 0 .../multi_instance_parallel.bpmn | 0 tests/data/nav_order/nav_order.bpmn | 0 tests/data/parallel_tasks/parallel_tasks.bpmn | 0 tests/data/pb_responses/check_study.json | 0 tests/data/pb_responses/investigators.json | 0 tests/data/pb_responses/irb_info.json | 0 tests/data/pb_responses/required_docs.json | 0 tests/data/pb_responses/sponsors.json | 0 tests/data/pb_responses/study_details.json | 0 .../study_details_bad_review_type.json | 0 tests/data/pb_responses/user_studies.json | 0 tests/data/random_fact/random_fact.bpmn | 0 tests/data/random_fact/random_fact2.bpmn | 0 tests/data/read_only_field/read_only_field.bpmn | 0 tests/data/repeat_form/repeat_form.bpmn | 0 tests/data/required_fields/required_fields.bpmn | 0 tests/data/reset_workflow/reset_workflow.bpmn | 0 tests/data/roles/roles.bpmn | 0 .../script_with_name_error.bpmn | 0 .../study_cancellations/study_cancellations.bpmn | 0 tests/data/study_details/study_details.bpmn | 0 .../data/study_info_script/study_info_script.bpmn | 0 tests/data/study_sponsors/study_sponsors.bpmn | 0 .../study_sponsors_associate.bpmn | 0 .../study_sponsors_associate_fail.bpmn | 0 .../study_sponsors_associate_switch_user.bpmn | 0 .../study_sponsors_associates_delete.bpmn | 0 .../study_sponsors_data_store.bpmn | 0 tests/data/subprocess/subprocess.bpmn | 0 tests/data/table.docx | Bin .../test_value_expression.bpmn | 0 tests/data/timer_event/timer_event.bpmn | 0 .../data/timer_event_error/timer_event_error.bpmn | 0 .../top_level_workflow/data_security_plan.dmn | 0 tests/data/top_level_workflow/enter_core_info.dmn | 0 .../top_level_workflow/sponsor_funding_source.dmn | 0 .../top_level_workflow/top_level_workflow.bpmn | 0 .../two_forms/modified/two_forms_struc_mod.bpmn | 0 .../two_forms/modified/two_forms_text_mod.bpmn | 0 tests/data/two_forms/two_forms.bpmn | 0 tests/data/two_user_tasks/two_user_tasks.bpmn | 0 tests/data/verify_end_event/verify_end_event.bpmn | 0 .../workflow_form_field_name.bpmn | 0 .../workflow_form_field_type.bpmn | 0 .../workflow_sync_responses/random_fact2.bpmn | 0 tests/data/workflow_sync_responses/test.txt | 0 tests/emails/__init__.py | 0 tests/emails/test_email_script.py | 0 tests/emails/test_email_service.py | 0 tests/files/__init__.py | 0 tests/files/test_file_service.py | 0 tests/files/test_files_api.py | 0 tests/ldap/__init__.py | 0 tests/ldap/test_ldap_lookup_script.py | 0 tests/scripts/__init__.py | 0 tests/scripts/test_check_study.py | 0 .../test_get_study_associate_validation.py | 0 tests/study/__init__.py | 0 tests/study/test_get_study_from_model.py | 0 tests/study/test_study_actions_status.py | 0 tests/study/test_study_api.py | 0 tests/study/test_study_associate_script.py | 0 tests/study/test_study_cancellations.py | 0 tests/study/test_study_data_store_script.py | 0 tests/study/test_study_details.py | 0 tests/study/test_study_details_documents.py | 0 tests/study/test_study_service.py | 0 tests/study/test_study_sponsors_script.py | 0 tests/study/test_study_status_message.py | 0 tests/study/test_update_study_script.py | 0 tests/test_authentication.py | 0 tests/test_auto_set_primary_bpmn.py | 0 tests/test_complete_template_script.py | 0 tests/test_datastore_api.py | 0 tests/test_decision_table_dictionary_output.py | 0 tests/test_document_directories.py | 0 tests/test_email_script.py | 0 tests/test_events.py | 0 tests/test_file_datastore.py | 0 tests/test_get_dashboard_url_script.py | 0 tests/test_irb_info_script.py | 0 tests/test_is_file_uploaded_script.py | 0 tests/test_launch_workflow_outside_study.py | 0 tests/test_ldap_service.py | 0 tests/test_lookup_service.py | 0 tests/test_looping_task.py | 0 tests/test_message_event.py | 0 tests/test_multi_instance_tasks_api.py | 0 tests/test_protocol_builder.py | 0 tests/test_study_info_script.py | 0 tests/test_tasks_api.py | 0 tests/test_tools_api.py | 0 tests/test_user_in_logs.py | 0 tests/test_user_roles.py | 0 tests/test_verify_end_event.py | 0 tests/test_wait_event.py | 0 tests/test_workflow_api.py | 0 tests/test_workflow_sync.py | 0 tests/workflow/__init__.py | 0 .../workflow/test_duplicate_workflow_spec_file.py | 0 tests/workflow/test_workflow_boolean_default.py | 0 tests/workflow/test_workflow_customer_error.py | 0 .../workflow/test_workflow_delete_irb_document.py | 0 ...test_workflow_enum_default_value_expression.py | 0 tests/workflow/test_workflow_enum_empty_list.py | 0 tests/workflow/test_workflow_form_field_name.py | 0 tests/workflow/test_workflow_form_field_type.py | 0 .../test_workflow_hidden_required_field.py | 0 tests/workflow/test_workflow_infinite_loop.py | 0 tests/workflow/test_workflow_missing_form_key.py | 0 tests/workflow/test_workflow_name_error_hint.py | 0 tests/workflow/test_workflow_processor.py | 0 .../test_workflow_processor_multi_instance.py | 0 tests/workflow/test_workflow_read_only_field.py | 0 tests/workflow/test_workflow_reset.py | 0 tests/workflow/test_workflow_restart.py | 0 tests/workflow/test_workflow_service.py | 0 tests/workflow/test_workflow_spec_api.py | 0 .../workflow/test_workflow_spec_validation_api.py | 0 tests/workflow/test_workflow_value_expression.py | 0 wsgi.py | 0 419 files changed, 16 insertions(+), 5 deletions(-) mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .sonarcloud.properties mode change 100644 => 100755 .travis.yml mode change 100644 => 100755 Dockerfile mode change 100644 => 100755 LICENSE.md mode change 100644 => 100755 Pipfile mode change 100644 => 100755 Pipfile.lock mode change 100644 => 100755 README.md mode change 100644 => 100755 config/default.py mode change 100644 => 100755 config/logging_example.py mode change 100644 => 100755 config/testing.py mode change 100644 => 100755 crc/__init__.py mode change 100644 => 100755 crc/api.yml mode change 100644 => 100755 crc/api/__init__.py mode change 100644 => 100755 crc/api/admin.py mode change 100644 => 100755 crc/api/common.py mode change 100644 => 100755 crc/api/data_store.py mode change 100644 => 100755 crc/api/document.py mode change 100644 => 100755 crc/api/file.py mode change 100644 => 100755 crc/api/study.py mode change 100644 => 100755 crc/api/tools.py mode change 100644 => 100755 crc/api/user.py mode change 100644 => 100755 crc/api/workflow.py mode change 100644 => 100755 crc/api/workflow_sync.py mode change 100644 => 100755 crc/models/__init__.py mode change 100644 => 100755 crc/models/api_models.py mode change 100644 => 100755 crc/models/data_store.py mode change 100644 => 100755 crc/models/email.py mode change 100644 => 100755 crc/models/file.py mode change 100644 => 100755 crc/models/ldap.py mode change 100644 => 100755 crc/models/protocol_builder.py mode change 100644 => 100755 crc/models/study.py mode change 100644 => 100755 crc/models/task_event.py mode change 100644 => 100755 crc/models/user.py mode change 100644 => 100755 crc/models/workflow.py mode change 100644 => 100755 crc/scripts/__init__.py mode change 100644 => 100755 crc/scripts/check_study.py mode change 100644 => 100755 crc/scripts/complete_template.py mode change 100644 => 100755 crc/scripts/delete_file.py mode change 100644 => 100755 crc/scripts/email.py mode change 100644 => 100755 crc/scripts/fact_service.py mode change 100644 => 100755 crc/scripts/failing_script.py mode change 100644 => 100755 crc/scripts/file_data_get.py mode change 100644 => 100755 crc/scripts/file_data_set.py mode change 100644 => 100755 crc/scripts/get_dashboard_url.py mode change 100644 => 100755 crc/scripts/get_irb_info.py mode change 100644 => 100755 crc/scripts/get_study_associate.py mode change 100644 => 100755 crc/scripts/get_study_associates.py mode change 100644 => 100755 crc/scripts/is_file_uploaded.py mode change 100644 => 100755 crc/scripts/ldap.py mode change 100644 => 100755 crc/scripts/reset_workflow.py mode change 100644 => 100755 crc/scripts/script.py mode change 100644 => 100755 crc/scripts/study_data_get.py mode change 100644 => 100755 crc/scripts/study_data_set.py mode change 100644 => 100755 crc/scripts/study_info.py mode change 100644 => 100755 crc/scripts/update_study.py mode change 100644 => 100755 crc/scripts/update_study_associate.py mode change 100644 => 100755 crc/scripts/update_study_associates.py mode change 100644 => 100755 crc/scripts/user_data_get.py mode change 100644 => 100755 crc/scripts/user_data_set.py mode change 100644 => 100755 crc/services/__init__.py mode change 100644 => 100755 crc/services/cache_service.py mode change 100644 => 100755 crc/services/data_store_service.py mode change 100644 => 100755 crc/services/document_service.py mode change 100644 => 100755 crc/services/email_service.py mode change 100644 => 100755 crc/services/error_service.py mode change 100644 => 100755 crc/services/failing_service.py mode change 100644 => 100755 crc/services/file_service.py mode change 100644 => 100755 crc/services/ldap_service.py mode change 100644 => 100755 crc/services/lookup_service.py mode change 100644 => 100755 crc/services/protocol_builder.py mode change 100644 => 100755 crc/services/study_service.py mode change 100644 => 100755 crc/services/user_service.py mode change 100644 => 100755 crc/services/workflow_processor.py mode change 100644 => 100755 crc/services/workflow_service.py mode change 100644 => 100755 crc/services/workflow_sync.py mode change 100644 => 100755 crc/static/bpmn/abandoned/abandoned.bpmn mode change 100644 => 100755 crc/static/bpmn/core_info/SponsorList.xls mode change 100644 => 100755 crc/static/bpmn/core_info/core_info.bpmn mode change 100644 => 100755 crc/static/bpmn/core_info/decision_core_info_multi_site_q12.dmn mode change 100644 => 100755 crc/static/bpmn/core_info/decision_core_info_multi_site_q14.dmn mode change 100644 => 100755 crc/static/bpmn/core_info/decision_core_info_multi_site_q28.dmn mode change 100644 => 100755 crc/static/bpmn/data_security_plan/HIPAA_Ids.xls mode change 100644 => 100755 crc/static/bpmn/data_security_plan/NEW_DSP_template.docx mode change 100644 => 100755 crc/static/bpmn/data_security_plan/UVA_ServersWebsitesList.xls mode change 100644 => 100755 crc/static/bpmn/data_security_plan/data_security_plan.bpmn mode change 100644 => 100755 crc/static/bpmn/department_chair_approval/decision_dept_chair.dmn mode change 100644 => 100755 crc/static/bpmn/department_chair_approval/dept_chair_approval.bpmn mode change 100644 => 100755 crc/static/bpmn/documents_approvals/documents_approvals.bpmn mode change 100644 => 100755 crc/static/bpmn/enrollment_date/enrollment_date.bpmn mode change 100644 => 100755 crc/static/bpmn/finance/finance.bpmn mode change 100644 => 100755 crc/static/bpmn/hold/hold.bpmn mode change 100644 => 100755 crc/static/bpmn/ide_supplement/SponsorList.xls mode change 100644 => 100755 crc/static/bpmn/ide_supplement/decision_ide_check.dmn mode change 100644 => 100755 crc/static/bpmn/ide_supplement/ide_update.bpmn mode change 100644 => 100755 crc/static/bpmn/ids_full_submission/ids_full_submission.bpmn mode change 100644 => 100755 crc/static/bpmn/ids_full_submission/investigators_brochure.dmn mode change 100644 => 100755 crc/static/bpmn/ids_full_submission/ivrs_iwrs_ixrs.dmn mode change 100644 => 100755 crc/static/bpmn/ids_full_submission/pharmacy_manual.dmn mode change 100644 => 100755 crc/static/bpmn/ids_waiver/ids_waiver.bpmn mode change 100644 => 100755 crc/static/bpmn/ind_update/SponsorList.xls mode change 100644 => 100755 crc/static/bpmn/ind_update/decision_ind_check.dmn mode change 100644 => 100755 crc/static/bpmn/ind_update/decision_ind_uva_check.dmn mode change 100644 => 100755 crc/static/bpmn/ind_update/ind_update.bpmn mode change 100644 => 100755 crc/static/bpmn/irb_api_details/irb_api_details.bpmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/DepartmentList-ArtsSciences.xlsx mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/DepartmentList-Education.xlsx mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/DepartmentList-Medicine.xlsx mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/SchoolList.xls mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/check_for_pi.dmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/decision_dept_chair.dmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/decision_pi_dept.dmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/decision_pi_school.dmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/decision_ro.dmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/decision_ro_chair.dmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/decision_ro_dept.dmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/irb_api_personnel.bpmn mode change 100644 => 100755 crc/static/bpmn/non_uva_approval/non_uva_approval.bpmn mode change 100644 => 100755 crc/static/bpmn/notifications/notifications.bpmn mode change 100644 => 100755 crc/static/bpmn/protocol/protocol.bpmn mode change 100644 => 100755 crc/static/bpmn/research_rampup/BuildingList.xls mode change 100644 => 100755 crc/static/bpmn/research_rampup/DepartmentList-Architecture.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/DepartmentList-ArtsSciences.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/DepartmentList-Education.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/DepartmentList-Engineering.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/DepartmentList-Medicine.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/DepartmentList-ProvostOffice.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/DepartmentList.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/LabSpaces.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/RTT_Approvers.dmn mode change 100644 => 100755 crc/static/bpmn/research_rampup/ResearchRampUpPlan.docx mode change 100644 => 100755 crc/static/bpmn/research_rampup/SchoolList.xls mode change 100644 => 100755 crc/static/bpmn/research_rampup/exclusive_area_monitors.dmn mode change 100644 => 100755 crc/static/bpmn/research_rampup/research_rampup.bpmn mode change 100644 => 100755 crc/static/bpmn/research_rampup/shared_area_monitors.dmn mode change 100644 => 100755 crc/static/bpmn/rrt_top_level_workflow/rrt_top_level_workflow.bpmn mode change 100644 => 100755 crc/static/bpmn/rsc_hire_committee/decision_support_lang.dmn mode change 100644 => 100755 crc/static/bpmn/rsc_hire_committee/rsc_hire_committee.bpmn mode change 100644 => 100755 crc/static/bpmn/rsc_hire_submission/rsc_hire_submission.bpmn mode change 100644 => 100755 crc/static/bpmn/sponsor_funding_source/SponsorList.xls mode change 100644 => 100755 crc/static/bpmn/sponsor_funding_source/sponsor_funding_source.bpmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/data_security_plan.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/enter_core_info.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/ide_supplement.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/ids_full_submission.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/ids_waiver.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/ind_update.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/personnel.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/sponsor_funding_source.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/top_level_workflow.bpmn mode change 100644 => 100755 crc/static/jinja_extensions.py mode change 100644 => 100755 crc/static/reference/investigators.xlsx mode change 100644 => 100755 crc/static/reference/irb_documents.xlsx mode change 100644 => 100755 crc/static/reference/rrt_documents.xlsx mode change 100644 => 100755 crc/static/templates/placeholder.docx mode change 100644 => 100755 crc/static/templates/placeholder.png mode change 100644 => 100755 crc/static/uva_rotunda.svg mode change 100644 => 100755 crc/templates/mail_content_template.html mode change 100644 => 100755 crc/templates/mail_main_template.html mode change 100644 => 100755 crconnect.wsgi mode change 100644 => 100755 deploy/requirements.txt mode change 100644 => 100755 docs/Makefile mode change 100644 => 100755 docs/conf.py mode change 100644 => 100755 docs/index.rst mode change 100644 => 100755 docs/make.bat mode change 100644 => 100755 docs/protocol_builder.html mode change 100644 => 100755 example_data.py mode change 100644 => 100755 fact_runner.py mode change 100644 => 100755 migrations/README mode change 100644 => 100755 migrations/alembic.ini mode change 100644 => 100755 migrations/env.py mode change 100644 => 100755 migrations/script.py.mako mode change 100644 => 100755 migrations/versions/0718ad13e5f3_.py mode change 100644 => 100755 migrations/versions/0f38d7a36f21_.py mode change 100644 => 100755 migrations/versions/13424d5a6de8_.py mode change 100644 => 100755 migrations/versions/1685be1cc232_.py mode change 100644 => 100755 migrations/versions/17597692d0b0_.py mode change 100644 => 100755 migrations/versions/1c3f88dbccc3_.py mode change 100644 => 100755 migrations/versions/1fdd1bdb600e_.py mode change 100644 => 100755 migrations/versions/23c62c933848_.py mode change 100644 => 100755 migrations/versions/2e7b377cbc7b_.py mode change 100644 => 100755 migrations/versions/30e017a03948_.py mode change 100644 => 100755 migrations/versions/476f8a4933ba_.py mode change 100644 => 100755 migrations/versions/5064b72284b7_.py mode change 100644 => 100755 migrations/versions/55c6cd407d89_.py mode change 100644 => 100755 migrations/versions/5acd138e969c_.py mode change 100644 => 100755 migrations/versions/5e0709e172fa_.py mode change 100644 => 100755 migrations/versions/5f06108116ae_.py mode change 100644 => 100755 migrations/versions/62910318009f_.py mode change 100644 => 100755 migrations/versions/65f3fce6031a_.py mode change 100644 => 100755 migrations/versions/665624ac29f1_.py mode change 100644 => 100755 migrations/versions/69081f1ff387_.py mode change 100644 => 100755 migrations/versions/7be7cecbeea8_.py mode change 100644 => 100755 migrations/versions/7c0de7621a1f_.py mode change 100644 => 100755 migrations/versions/87af86338630_.py mode change 100644 => 100755 migrations/versions/8856126b6658_.py mode change 100644 => 100755 migrations/versions/8b976945a54e_.py mode change 100644 => 100755 migrations/versions/90dd63672e0a_.py mode change 100644 => 100755 migrations/versions/9b43e725f39c_.py mode change 100644 => 100755 migrations/versions/ab06a94e5d4c_.py mode change 100644 => 100755 migrations/versions/abeffe547305_update_type_on_task_events_table.py mode change 100644 => 100755 migrations/versions/afecb64d2e66_.py mode change 100644 => 100755 migrations/versions/bbf064082623_.py mode change 100644 => 100755 migrations/versions/bec71f7dc652_.py mode change 100644 => 100755 migrations/versions/c1449d1d1681_.py mode change 100644 => 100755 migrations/versions/c16d3047abbe_.py mode change 100644 => 100755 migrations/versions/c4ddb69e7ef4_.py mode change 100644 => 100755 migrations/versions/c6261ac7a7bc_.py mode change 100644 => 100755 migrations/versions/c872232ebdcb_.py mode change 100644 => 100755 migrations/versions/cb892916166a_.py mode change 100644 => 100755 migrations/versions/cc4bccc5e5a8_.py mode change 100644 => 100755 migrations/versions/dc30b8f6571c_merge_30e017a03948_and_c16d3047abbe.py mode change 100644 => 100755 migrations/versions/ddd5fc9ea75b_.py mode change 100644 => 100755 migrations/versions/de30304ff5e6_.py mode change 100644 => 100755 migrations/versions/e0dfdbfd6f69_add_columns.py mode change 100644 => 100755 migrations/versions/f186725c1ad3_.py mode change 100644 => 100755 migrations/versions/f28ee3722c49_.py mode change 100644 => 100755 migrations/versions/ff29528a9909_.py mode change 100644 => 100755 migrations/versions/ffef4661a37d_.py mode change 100644 => 100755 package-lock.json mode change 100644 => 100755 postgres/docker-compose.yml mode change 100644 => 100755 postgres/docker-windows-compose.yml mode change 100644 => 100755 postgres/package-lock.json mode change 100644 => 100755 postgres/pg-init-scripts/initdb.sh mode change 100644 => 100755 readme_images/new_project.png mode change 100644 => 100755 readme_images/run.png mode change 100644 => 100755 readme_images/run_config.png mode change 100644 => 100755 readme_images/settings.png mode change 100644 => 100755 run.py mode change 100644 => 100755 schema/__init__.py mode change 100644 => 100755 setup.cfg mode change 100644 => 100755 setup.py mode change 100644 => 100755 tests/__init__.py mode change 100644 => 100755 tests/base_test.py mode change 100644 => 100755 tests/data/add_delete_irb_document/add_delete_irb_document.bpmn mode change 100644 => 100755 tests/data/associated_email/associated_email.bpmn mode change 100644 => 100755 tests/data/boolean_default_value/boolean_default_value.bpmn mode change 100644 => 100755 tests/data/check_study_script/check_study_script.bpmn mode change 100644 => 100755 tests/data/decision_table/decision_table.bpmn mode change 100644 => 100755 tests/data/decision_table/message_to_ginger.dmn mode change 100644 => 100755 tests/data/decision_table_dictionary_output/decision_table_dictionary_output.bpmn mode change 100644 => 100755 tests/data/decision_table_dictionary_output/decision_table_dictionary_output.dmn mode change 100644 => 100755 tests/data/decision_table_invalid/bad_dmn.dmn mode change 100644 => 100755 tests/data/decision_table_invalid/decision_table_invalid.bpmn mode change 100644 => 100755 tests/data/docx/Letter.docx mode change 100644 => 100755 tests/data/docx/docx.bpmn mode change 100644 => 100755 tests/data/email/email.bpmn mode change 100644 => 100755 tests/data/email_dashboard_url/email_dashboard_url.bpmn mode change 100644 => 100755 tests/data/email_script/email_script.bpmn mode change 100644 => 100755 tests/data/empty_workflow/empty_workflow.bpmn mode change 100644 => 100755 tests/data/enum_empty_list/empty_spreadsheet.xlsx mode change 100644 => 100755 tests/data/enum_empty_list/enum_empty_list.bpmn mode change 100644 => 100755 tests/data/enum_options_competing_files/animals.xlsx mode change 100644 => 100755 tests/data/enum_options_competing_files/enum_options_competing_files.bpmn mode change 100644 => 100755 tests/data/enum_options_competing_files/fruits.xlsx mode change 100644 => 100755 tests/data/enum_options_from_file/customer_list.xlsx mode change 100644 => 100755 tests/data/enum_options_from_file/enum_options_from_file.bpmn mode change 100644 => 100755 tests/data/enum_options_from_task_data/enum_options_from_task_data.bpmn mode change 100644 => 100755 tests/data/enum_options_with_search/enum_options_with_search.bpmn mode change 100644 => 100755 tests/data/enum_options_with_search/sponsors.xlsx mode change 100644 => 100755 tests/data/enum_options_with_search/sponsors_modified.xlsx mode change 100644 => 100755 tests/data/enum_results/enum_results.bpmn mode change 100644 => 100755 tests/data/enum_value_expression/Decision_Value_Expression.dmn mode change 100644 => 100755 tests/data/enum_value_expression/enum_value_expression.bpmn mode change 100644 => 100755 tests/data/enum_value_expression_fail/Decision_Value_Expression.dmn mode change 100644 => 100755 tests/data/enum_value_expression_fail/enum_value_expression_fail.bpmn mode change 100644 => 100755 tests/data/exclusive_gateway/exclusive_gateway.bpmn mode change 100644 => 100755 tests/data/exclusive_gateway_2/exclusive_gateway_2.bpmn mode change 100644 => 100755 tests/data/extension_error/extension_error.bpmn mode change 100644 => 100755 tests/data/failing_gateway_workflow/failing_gateway_workflow.bpmn mode change 100644 => 100755 tests/data/failing_workflow/failing_workflow.bpmn mode change 100644 => 100755 tests/data/file_data_store/file_data_store.bpmn mode change 100644 => 100755 tests/data/file_upload_form/file_upload_form.bpmn mode change 100644 => 100755 tests/data/file_upload_form_single/file_upload_form_single.bpmn mode change 100644 => 100755 tests/data/form_expressions/form_expressions.bpmn mode change 100644 => 100755 tests/data/get_study_associate/get_study_associate.bpmn mode change 100644 => 100755 tests/data/hello_world/hello_world.bpmn mode change 100644 => 100755 tests/data/hidden_required_field/hidden_required_field.bpmn mode change 100644 => 100755 tests/data/hidden_required_field_pass/hidden_required_field_pass.bpmn mode change 100644 => 100755 tests/data/hidden_required_field_pass_expression/hidden_required_field_pass_expression.bpmn mode change 100644 => 100755 tests/data/infinite_loop/infinite_loop.bpmn mode change 100644 => 100755 tests/data/invalid_expression/invalid_expression.bpmn mode change 100644 => 100755 tests/data/invalid_roles/invalid_roles.bpmn mode change 100644 => 100755 tests/data/invalid_script/invalid_script.bpmn mode change 100644 => 100755 tests/data/invalid_script2/invalid_script2.bpmn mode change 100644 => 100755 tests/data/invalid_script3/invalid_script3.bpmn mode change 100644 => 100755 tests/data/invalid_spec/invalid_spec.bpmn mode change 100644 => 100755 tests/data/irb_api_personnel/irb_api_personnel.bpmn mode change 100644 => 100755 tests/data/irb_info_script/irb_info_script.bpmn mode change 100644 => 100755 tests/data/ldap_lookup/ldap_lookup.bpmn mode change 100644 => 100755 tests/data/ldap_response.json mode change 100644 => 100755 tests/data/ldap_script/ldap_script.bpmn mode change 100644 => 100755 tests/data/looping_task/looping_task.bpmn mode change 100644 => 100755 tests/data/manual_task_with_external_documentation/Task_Manual_One.md mode change 100644 => 100755 tests/data/manual_task_with_external_documentation/manual_task_with_external_documentation.bpmn mode change 100644 => 100755 tests/data/message_event/message_event.bpmn mode change 100644 => 100755 tests/data/missing_form_key/missing_form_key.bpmn mode change 100644 => 100755 tests/data/multi_instance/multi_instance.bpmn mode change 100644 => 100755 tests/data/multi_instance_parallel/multi_instance_parallel.bpmn mode change 100644 => 100755 tests/data/nav_order/nav_order.bpmn mode change 100644 => 100755 tests/data/parallel_tasks/parallel_tasks.bpmn mode change 100644 => 100755 tests/data/pb_responses/check_study.json mode change 100644 => 100755 tests/data/pb_responses/investigators.json mode change 100644 => 100755 tests/data/pb_responses/irb_info.json mode change 100644 => 100755 tests/data/pb_responses/required_docs.json mode change 100644 => 100755 tests/data/pb_responses/sponsors.json mode change 100644 => 100755 tests/data/pb_responses/study_details.json mode change 100644 => 100755 tests/data/pb_responses/study_details_bad_review_type.json mode change 100644 => 100755 tests/data/pb_responses/user_studies.json mode change 100644 => 100755 tests/data/random_fact/random_fact.bpmn mode change 100644 => 100755 tests/data/random_fact/random_fact2.bpmn mode change 100644 => 100755 tests/data/read_only_field/read_only_field.bpmn mode change 100644 => 100755 tests/data/repeat_form/repeat_form.bpmn mode change 100644 => 100755 tests/data/required_fields/required_fields.bpmn mode change 100644 => 100755 tests/data/reset_workflow/reset_workflow.bpmn mode change 100644 => 100755 tests/data/roles/roles.bpmn mode change 100644 => 100755 tests/data/script_with_name_error/script_with_name_error.bpmn mode change 100644 => 100755 tests/data/study_cancellations/study_cancellations.bpmn mode change 100644 => 100755 tests/data/study_details/study_details.bpmn mode change 100644 => 100755 tests/data/study_info_script/study_info_script.bpmn mode change 100644 => 100755 tests/data/study_sponsors/study_sponsors.bpmn mode change 100644 => 100755 tests/data/study_sponsors_associate/study_sponsors_associate.bpmn mode change 100644 => 100755 tests/data/study_sponsors_associate_fail/study_sponsors_associate_fail.bpmn mode change 100644 => 100755 tests/data/study_sponsors_associate_switch_user/study_sponsors_associate_switch_user.bpmn mode change 100644 => 100755 tests/data/study_sponsors_associates_delete/study_sponsors_associates_delete.bpmn mode change 100644 => 100755 tests/data/study_sponsors_data_store/study_sponsors_data_store.bpmn mode change 100644 => 100755 tests/data/subprocess/subprocess.bpmn mode change 100644 => 100755 tests/data/table.docx mode change 100644 => 100755 tests/data/test_value_expression/test_value_expression.bpmn mode change 100644 => 100755 tests/data/timer_event/timer_event.bpmn mode change 100644 => 100755 tests/data/timer_event_error/timer_event_error.bpmn mode change 100644 => 100755 tests/data/top_level_workflow/data_security_plan.dmn mode change 100644 => 100755 tests/data/top_level_workflow/enter_core_info.dmn mode change 100644 => 100755 tests/data/top_level_workflow/sponsor_funding_source.dmn mode change 100644 => 100755 tests/data/top_level_workflow/top_level_workflow.bpmn mode change 100644 => 100755 tests/data/two_forms/modified/two_forms_struc_mod.bpmn mode change 100644 => 100755 tests/data/two_forms/modified/two_forms_text_mod.bpmn mode change 100644 => 100755 tests/data/two_forms/two_forms.bpmn mode change 100644 => 100755 tests/data/two_user_tasks/two_user_tasks.bpmn mode change 100644 => 100755 tests/data/verify_end_event/verify_end_event.bpmn mode change 100644 => 100755 tests/data/workflow_form_field_name/workflow_form_field_name.bpmn mode change 100644 => 100755 tests/data/workflow_form_field_type/workflow_form_field_type.bpmn mode change 100644 => 100755 tests/data/workflow_sync_responses/random_fact2.bpmn mode change 100644 => 100755 tests/data/workflow_sync_responses/test.txt mode change 100644 => 100755 tests/emails/__init__.py mode change 100644 => 100755 tests/emails/test_email_script.py mode change 100644 => 100755 tests/emails/test_email_service.py mode change 100644 => 100755 tests/files/__init__.py mode change 100644 => 100755 tests/files/test_file_service.py mode change 100644 => 100755 tests/files/test_files_api.py mode change 100644 => 100755 tests/ldap/__init__.py mode change 100644 => 100755 tests/ldap/test_ldap_lookup_script.py mode change 100644 => 100755 tests/scripts/__init__.py mode change 100644 => 100755 tests/scripts/test_check_study.py mode change 100644 => 100755 tests/scripts/test_get_study_associate_validation.py mode change 100644 => 100755 tests/study/__init__.py mode change 100644 => 100755 tests/study/test_get_study_from_model.py mode change 100644 => 100755 tests/study/test_study_actions_status.py mode change 100644 => 100755 tests/study/test_study_api.py mode change 100644 => 100755 tests/study/test_study_associate_script.py mode change 100644 => 100755 tests/study/test_study_cancellations.py mode change 100644 => 100755 tests/study/test_study_data_store_script.py mode change 100644 => 100755 tests/study/test_study_details.py mode change 100644 => 100755 tests/study/test_study_details_documents.py mode change 100644 => 100755 tests/study/test_study_service.py mode change 100644 => 100755 tests/study/test_study_sponsors_script.py mode change 100644 => 100755 tests/study/test_study_status_message.py mode change 100644 => 100755 tests/study/test_update_study_script.py mode change 100644 => 100755 tests/test_authentication.py mode change 100644 => 100755 tests/test_auto_set_primary_bpmn.py mode change 100644 => 100755 tests/test_complete_template_script.py mode change 100644 => 100755 tests/test_datastore_api.py mode change 100644 => 100755 tests/test_decision_table_dictionary_output.py mode change 100644 => 100755 tests/test_document_directories.py mode change 100644 => 100755 tests/test_email_script.py mode change 100644 => 100755 tests/test_events.py mode change 100644 => 100755 tests/test_file_datastore.py mode change 100644 => 100755 tests/test_get_dashboard_url_script.py mode change 100644 => 100755 tests/test_irb_info_script.py mode change 100644 => 100755 tests/test_is_file_uploaded_script.py mode change 100644 => 100755 tests/test_launch_workflow_outside_study.py mode change 100644 => 100755 tests/test_ldap_service.py mode change 100644 => 100755 tests/test_lookup_service.py mode change 100644 => 100755 tests/test_looping_task.py mode change 100644 => 100755 tests/test_message_event.py mode change 100644 => 100755 tests/test_multi_instance_tasks_api.py mode change 100644 => 100755 tests/test_protocol_builder.py mode change 100644 => 100755 tests/test_study_info_script.py mode change 100644 => 100755 tests/test_tasks_api.py mode change 100644 => 100755 tests/test_tools_api.py mode change 100644 => 100755 tests/test_user_in_logs.py mode change 100644 => 100755 tests/test_user_roles.py mode change 100644 => 100755 tests/test_verify_end_event.py mode change 100644 => 100755 tests/test_wait_event.py mode change 100644 => 100755 tests/test_workflow_api.py mode change 100644 => 100755 tests/test_workflow_sync.py mode change 100644 => 100755 tests/workflow/__init__.py mode change 100644 => 100755 tests/workflow/test_duplicate_workflow_spec_file.py mode change 100644 => 100755 tests/workflow/test_workflow_boolean_default.py mode change 100644 => 100755 tests/workflow/test_workflow_customer_error.py mode change 100644 => 100755 tests/workflow/test_workflow_delete_irb_document.py mode change 100644 => 100755 tests/workflow/test_workflow_enum_default_value_expression.py mode change 100644 => 100755 tests/workflow/test_workflow_enum_empty_list.py mode change 100644 => 100755 tests/workflow/test_workflow_form_field_name.py mode change 100644 => 100755 tests/workflow/test_workflow_form_field_type.py mode change 100644 => 100755 tests/workflow/test_workflow_hidden_required_field.py mode change 100644 => 100755 tests/workflow/test_workflow_infinite_loop.py mode change 100644 => 100755 tests/workflow/test_workflow_missing_form_key.py mode change 100644 => 100755 tests/workflow/test_workflow_name_error_hint.py mode change 100644 => 100755 tests/workflow/test_workflow_processor.py mode change 100644 => 100755 tests/workflow/test_workflow_processor_multi_instance.py mode change 100644 => 100755 tests/workflow/test_workflow_read_only_field.py mode change 100644 => 100755 tests/workflow/test_workflow_reset.py mode change 100644 => 100755 tests/workflow/test_workflow_restart.py mode change 100644 => 100755 tests/workflow/test_workflow_service.py mode change 100644 => 100755 tests/workflow/test_workflow_spec_api.py mode change 100644 => 100755 tests/workflow/test_workflow_spec_validation_api.py mode change 100644 => 100755 tests/workflow/test_workflow_value_expression.py mode change 100644 => 100755 wsgi.py diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index ee558d50..92974e1a --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ local.properties .settings/ .loadpath .recommenders - +.vscode/ # External tool builders .externalToolBuilders/ diff --git a/.sonarcloud.properties b/.sonarcloud.properties old mode 100644 new mode 100755 diff --git a/.travis.yml b/.travis.yml old mode 100644 new mode 100755 diff --git a/Dockerfile b/Dockerfile old mode 100644 new mode 100755 diff --git a/LICENSE.md b/LICENSE.md old mode 100644 new mode 100755 diff --git a/Pipfile b/Pipfile old mode 100644 new mode 100755 diff --git a/Pipfile.lock b/Pipfile.lock old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/config/default.py b/config/default.py old mode 100644 new mode 100755 diff --git a/config/logging_example.py b/config/logging_example.py old mode 100644 new mode 100755 diff --git a/config/testing.py b/config/testing.py old mode 100644 new mode 100755 diff --git a/crc/__init__.py b/crc/__init__.py old mode 100644 new mode 100755 diff --git a/crc/api.yml b/crc/api.yml old mode 100644 new mode 100755 diff --git a/crc/api/__init__.py b/crc/api/__init__.py old mode 100644 new mode 100755 diff --git a/crc/api/admin.py b/crc/api/admin.py old mode 100644 new mode 100755 diff --git a/crc/api/common.py b/crc/api/common.py old mode 100644 new mode 100755 diff --git a/crc/api/data_store.py b/crc/api/data_store.py old mode 100644 new mode 100755 diff --git a/crc/api/document.py b/crc/api/document.py old mode 100644 new mode 100755 diff --git a/crc/api/file.py b/crc/api/file.py old mode 100644 new mode 100755 diff --git a/crc/api/study.py b/crc/api/study.py old mode 100644 new mode 100755 diff --git a/crc/api/tools.py b/crc/api/tools.py old mode 100644 new mode 100755 diff --git a/crc/api/user.py b/crc/api/user.py old mode 100644 new mode 100755 diff --git a/crc/api/workflow.py b/crc/api/workflow.py old mode 100644 new mode 100755 diff --git a/crc/api/workflow_sync.py b/crc/api/workflow_sync.py old mode 100644 new mode 100755 diff --git a/crc/models/__init__.py b/crc/models/__init__.py old mode 100644 new mode 100755 diff --git a/crc/models/api_models.py b/crc/models/api_models.py old mode 100644 new mode 100755 diff --git a/crc/models/data_store.py b/crc/models/data_store.py old mode 100644 new mode 100755 diff --git a/crc/models/email.py b/crc/models/email.py old mode 100644 new mode 100755 diff --git a/crc/models/file.py b/crc/models/file.py old mode 100644 new mode 100755 diff --git a/crc/models/ldap.py b/crc/models/ldap.py old mode 100644 new mode 100755 diff --git a/crc/models/protocol_builder.py b/crc/models/protocol_builder.py old mode 100644 new mode 100755 diff --git a/crc/models/study.py b/crc/models/study.py old mode 100644 new mode 100755 index 69da16fe..155ac7a4 --- a/crc/models/study.py +++ b/crc/models/study.py @@ -79,6 +79,7 @@ class StudyAssociated(db.Model): role = db.Column(db.String, nullable=True) send_email = db.Column(db.Boolean, nullable=True) access = db.Column(db.Boolean, nullable=True) + class StudyAssociatedSchema(ma.Schema): class Meta: model = StudyAssociated diff --git a/crc/models/task_event.py b/crc/models/task_event.py old mode 100644 new mode 100755 diff --git a/crc/models/user.py b/crc/models/user.py old mode 100644 new mode 100755 diff --git a/crc/models/workflow.py b/crc/models/workflow.py old mode 100644 new mode 100755 diff --git a/crc/scripts/__init__.py b/crc/scripts/__init__.py old mode 100644 new mode 100755 diff --git a/crc/scripts/check_study.py b/crc/scripts/check_study.py old mode 100644 new mode 100755 diff --git a/crc/scripts/complete_template.py b/crc/scripts/complete_template.py old mode 100644 new mode 100755 diff --git a/crc/scripts/delete_file.py b/crc/scripts/delete_file.py old mode 100644 new mode 100755 diff --git a/crc/scripts/email.py b/crc/scripts/email.py old mode 100644 new mode 100755 diff --git a/crc/scripts/fact_service.py b/crc/scripts/fact_service.py old mode 100644 new mode 100755 diff --git a/crc/scripts/failing_script.py b/crc/scripts/failing_script.py old mode 100644 new mode 100755 diff --git a/crc/scripts/file_data_get.py b/crc/scripts/file_data_get.py old mode 100644 new mode 100755 diff --git a/crc/scripts/file_data_set.py b/crc/scripts/file_data_set.py old mode 100644 new mode 100755 diff --git a/crc/scripts/get_dashboard_url.py b/crc/scripts/get_dashboard_url.py old mode 100644 new mode 100755 diff --git a/crc/scripts/get_irb_info.py b/crc/scripts/get_irb_info.py old mode 100644 new mode 100755 diff --git a/crc/scripts/get_study_associate.py b/crc/scripts/get_study_associate.py old mode 100644 new mode 100755 diff --git a/crc/scripts/get_study_associates.py b/crc/scripts/get_study_associates.py old mode 100644 new mode 100755 diff --git a/crc/scripts/is_file_uploaded.py b/crc/scripts/is_file_uploaded.py old mode 100644 new mode 100755 diff --git a/crc/scripts/ldap.py b/crc/scripts/ldap.py old mode 100644 new mode 100755 diff --git a/crc/scripts/reset_workflow.py b/crc/scripts/reset_workflow.py old mode 100644 new mode 100755 diff --git a/crc/scripts/script.py b/crc/scripts/script.py old mode 100644 new mode 100755 diff --git a/crc/scripts/study_data_get.py b/crc/scripts/study_data_get.py old mode 100644 new mode 100755 diff --git a/crc/scripts/study_data_set.py b/crc/scripts/study_data_set.py old mode 100644 new mode 100755 diff --git a/crc/scripts/study_info.py b/crc/scripts/study_info.py old mode 100644 new mode 100755 diff --git a/crc/scripts/update_study.py b/crc/scripts/update_study.py old mode 100644 new mode 100755 diff --git a/crc/scripts/update_study_associate.py b/crc/scripts/update_study_associate.py old mode 100644 new mode 100755 diff --git a/crc/scripts/update_study_associates.py b/crc/scripts/update_study_associates.py old mode 100644 new mode 100755 diff --git a/crc/scripts/user_data_get.py b/crc/scripts/user_data_get.py old mode 100644 new mode 100755 diff --git a/crc/scripts/user_data_set.py b/crc/scripts/user_data_set.py old mode 100644 new mode 100755 diff --git a/crc/services/__init__.py b/crc/services/__init__.py old mode 100644 new mode 100755 diff --git a/crc/services/cache_service.py b/crc/services/cache_service.py old mode 100644 new mode 100755 diff --git a/crc/services/data_store_service.py b/crc/services/data_store_service.py old mode 100644 new mode 100755 diff --git a/crc/services/document_service.py b/crc/services/document_service.py old mode 100644 new mode 100755 diff --git a/crc/services/email_service.py b/crc/services/email_service.py old mode 100644 new mode 100755 diff --git a/crc/services/error_service.py b/crc/services/error_service.py old mode 100644 new mode 100755 diff --git a/crc/services/failing_service.py b/crc/services/failing_service.py old mode 100644 new mode 100755 diff --git a/crc/services/file_service.py b/crc/services/file_service.py old mode 100644 new mode 100755 diff --git a/crc/services/ldap_service.py b/crc/services/ldap_service.py old mode 100644 new mode 100755 diff --git a/crc/services/lookup_service.py b/crc/services/lookup_service.py old mode 100644 new mode 100755 diff --git a/crc/services/protocol_builder.py b/crc/services/protocol_builder.py old mode 100644 new mode 100755 diff --git a/crc/services/study_service.py b/crc/services/study_service.py old mode 100644 new mode 100755 index 5b8d12ea..fff41b69 --- a/crc/services/study_service.py +++ b/crc/services/study_service.py @@ -24,6 +24,7 @@ from crc.models.task_event import TaskEventModel, TaskEvent from crc.models.workflow import WorkflowSpecCategoryModel, WorkflowModel, WorkflowSpecModel, WorkflowState, \ WorkflowStatus, WorkflowSpecDependencyFile from crc.services.document_service import DocumentService + from crc.services.file_service import FileService from crc.services.ldap_service import LdapService from crc.services.lookup_service import LookupService @@ -129,7 +130,11 @@ class StudyService(object): person = db.session.query(StudyAssociated).filter((StudyAssociated.study_id == study_id)&( StudyAssociated.uid == uid)).first() if person: - return StudyAssociatedSchema().dump(person) + newAssociate = {'uid': person.uid} + newAssociate['role'] = person.role + newAssociate['send_email'] = person.send_email + newAssociate['access'] = person.access + return newAssociate raise ApiError('uid_not_associated_with_study',"user id %s was not associated with study number %d"%(uid, study_id)) @@ -148,7 +153,12 @@ class StudyService(object): people = db.session.query(StudyAssociated).filter(StudyAssociated.study_id == study_id) people_list = [{'uid':ownerid,'role':'owner','send_email':True,'access':True}] - people_list += StudyAssociatedSchema().dump(people, many=True) + for person in people: + newAssociate = {'uid':person.uid} + newAssociate['role'] = person.role + newAssociate['send_email'] = person.send_email + newAssociate['access'] = person.access + people_list.append(newAssociate) return people_list diff --git a/crc/services/user_service.py b/crc/services/user_service.py old mode 100644 new mode 100755 diff --git a/crc/services/workflow_processor.py b/crc/services/workflow_processor.py old mode 100644 new mode 100755 diff --git a/crc/services/workflow_service.py b/crc/services/workflow_service.py old mode 100644 new mode 100755 index 31e26c28..44077fe7 --- a/crc/services/workflow_service.py +++ b/crc/services/workflow_service.py @@ -765,7 +765,7 @@ class WorkflowService(object): else: if not hasattr(spiff_task.task_spec, 'lane') or spiff_task.task_spec.lane is None: associated = StudyService.get_study_associates(processor.workflow_model.study.id) - return [user['uid'] for user in associated if user['access']] + return [user['uid'] for user in associated if user.get("access")] if spiff_task.task_spec.lane not in spiff_task.data: return [] # No users are assignable to the task at this moment lane_users = spiff_task.data[spiff_task.task_spec.lane] @@ -775,7 +775,7 @@ class WorkflowService(object): lane_uids = [] for user in lane_users: if isinstance(user, dict): - if 'value' in user and user['value'] is not None: + if user.get("value"): lane_uids.append(user['value']) else: raise ApiError.from_task(code="task_lane_user_error", message="Spiff Task %s lane user dict must have a key called 'value' with the user's uid in it." % diff --git a/crc/services/workflow_sync.py b/crc/services/workflow_sync.py old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/abandoned/abandoned.bpmn b/crc/static/bpmn/abandoned/abandoned.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/core_info/SponsorList.xls b/crc/static/bpmn/core_info/SponsorList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/core_info/core_info.bpmn b/crc/static/bpmn/core_info/core_info.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/core_info/decision_core_info_multi_site_q12.dmn b/crc/static/bpmn/core_info/decision_core_info_multi_site_q12.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/core_info/decision_core_info_multi_site_q14.dmn b/crc/static/bpmn/core_info/decision_core_info_multi_site_q14.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/core_info/decision_core_info_multi_site_q28.dmn b/crc/static/bpmn/core_info/decision_core_info_multi_site_q28.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/data_security_plan/HIPAA_Ids.xls b/crc/static/bpmn/data_security_plan/HIPAA_Ids.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/data_security_plan/NEW_DSP_template.docx b/crc/static/bpmn/data_security_plan/NEW_DSP_template.docx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/data_security_plan/UVA_ServersWebsitesList.xls b/crc/static/bpmn/data_security_plan/UVA_ServersWebsitesList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/data_security_plan/data_security_plan.bpmn b/crc/static/bpmn/data_security_plan/data_security_plan.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/department_chair_approval/decision_dept_chair.dmn b/crc/static/bpmn/department_chair_approval/decision_dept_chair.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/department_chair_approval/dept_chair_approval.bpmn b/crc/static/bpmn/department_chair_approval/dept_chair_approval.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/documents_approvals/documents_approvals.bpmn b/crc/static/bpmn/documents_approvals/documents_approvals.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/enrollment_date/enrollment_date.bpmn b/crc/static/bpmn/enrollment_date/enrollment_date.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/finance/finance.bpmn b/crc/static/bpmn/finance/finance.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/hold/hold.bpmn b/crc/static/bpmn/hold/hold.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ide_supplement/SponsorList.xls b/crc/static/bpmn/ide_supplement/SponsorList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ide_supplement/decision_ide_check.dmn b/crc/static/bpmn/ide_supplement/decision_ide_check.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ide_supplement/ide_update.bpmn b/crc/static/bpmn/ide_supplement/ide_update.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ids_full_submission/ids_full_submission.bpmn b/crc/static/bpmn/ids_full_submission/ids_full_submission.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ids_full_submission/investigators_brochure.dmn b/crc/static/bpmn/ids_full_submission/investigators_brochure.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ids_full_submission/ivrs_iwrs_ixrs.dmn b/crc/static/bpmn/ids_full_submission/ivrs_iwrs_ixrs.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ids_full_submission/pharmacy_manual.dmn b/crc/static/bpmn/ids_full_submission/pharmacy_manual.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ids_waiver/ids_waiver.bpmn b/crc/static/bpmn/ids_waiver/ids_waiver.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ind_update/SponsorList.xls b/crc/static/bpmn/ind_update/SponsorList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ind_update/decision_ind_check.dmn b/crc/static/bpmn/ind_update/decision_ind_check.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ind_update/decision_ind_uva_check.dmn b/crc/static/bpmn/ind_update/decision_ind_uva_check.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ind_update/ind_update.bpmn b/crc/static/bpmn/ind_update/ind_update.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_details/irb_api_details.bpmn b/crc/static/bpmn/irb_api_details/irb_api_details.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/DepartmentList-ArtsSciences.xlsx b/crc/static/bpmn/irb_api_personnel/DepartmentList-ArtsSciences.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/DepartmentList-Education.xlsx b/crc/static/bpmn/irb_api_personnel/DepartmentList-Education.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/DepartmentList-Medicine.xlsx b/crc/static/bpmn/irb_api_personnel/DepartmentList-Medicine.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/SchoolList.xls b/crc/static/bpmn/irb_api_personnel/SchoolList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/check_for_pi.dmn b/crc/static/bpmn/irb_api_personnel/check_for_pi.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/decision_dept_chair.dmn b/crc/static/bpmn/irb_api_personnel/decision_dept_chair.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/decision_pi_dept.dmn b/crc/static/bpmn/irb_api_personnel/decision_pi_dept.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/decision_pi_school.dmn b/crc/static/bpmn/irb_api_personnel/decision_pi_school.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/decision_ro.dmn b/crc/static/bpmn/irb_api_personnel/decision_ro.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/decision_ro_chair.dmn b/crc/static/bpmn/irb_api_personnel/decision_ro_chair.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/decision_ro_dept.dmn b/crc/static/bpmn/irb_api_personnel/decision_ro_dept.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/irb_api_personnel.bpmn b/crc/static/bpmn/irb_api_personnel/irb_api_personnel.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/non_uva_approval/non_uva_approval.bpmn b/crc/static/bpmn/non_uva_approval/non_uva_approval.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/notifications/notifications.bpmn b/crc/static/bpmn/notifications/notifications.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/protocol/protocol.bpmn b/crc/static/bpmn/protocol/protocol.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/BuildingList.xls b/crc/static/bpmn/research_rampup/BuildingList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/DepartmentList-Architecture.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-Architecture.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/DepartmentList-ArtsSciences.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-ArtsSciences.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/DepartmentList-Education.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-Education.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/DepartmentList-Engineering.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-Engineering.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/DepartmentList-Medicine.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-Medicine.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/DepartmentList-ProvostOffice.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-ProvostOffice.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/DepartmentList.xlsx b/crc/static/bpmn/research_rampup/DepartmentList.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/LabSpaces.xlsx b/crc/static/bpmn/research_rampup/LabSpaces.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/RTT_Approvers.dmn b/crc/static/bpmn/research_rampup/RTT_Approvers.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/ResearchRampUpPlan.docx b/crc/static/bpmn/research_rampup/ResearchRampUpPlan.docx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/SchoolList.xls b/crc/static/bpmn/research_rampup/SchoolList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/exclusive_area_monitors.dmn b/crc/static/bpmn/research_rampup/exclusive_area_monitors.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/research_rampup.bpmn b/crc/static/bpmn/research_rampup/research_rampup.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/shared_area_monitors.dmn b/crc/static/bpmn/research_rampup/shared_area_monitors.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/rrt_top_level_workflow/rrt_top_level_workflow.bpmn b/crc/static/bpmn/rrt_top_level_workflow/rrt_top_level_workflow.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/rsc_hire_committee/decision_support_lang.dmn b/crc/static/bpmn/rsc_hire_committee/decision_support_lang.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/rsc_hire_committee/rsc_hire_committee.bpmn b/crc/static/bpmn/rsc_hire_committee/rsc_hire_committee.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/rsc_hire_submission/rsc_hire_submission.bpmn b/crc/static/bpmn/rsc_hire_submission/rsc_hire_submission.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/sponsor_funding_source/SponsorList.xls b/crc/static/bpmn/sponsor_funding_source/SponsorList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/sponsor_funding_source/sponsor_funding_source.bpmn b/crc/static/bpmn/sponsor_funding_source/sponsor_funding_source.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/data_security_plan.dmn b/crc/static/bpmn/top_level_workflow/data_security_plan.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/enter_core_info.dmn b/crc/static/bpmn/top_level_workflow/enter_core_info.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/ide_supplement.dmn b/crc/static/bpmn/top_level_workflow/ide_supplement.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/ids_full_submission.dmn b/crc/static/bpmn/top_level_workflow/ids_full_submission.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/ids_waiver.dmn b/crc/static/bpmn/top_level_workflow/ids_waiver.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/ind_update.dmn b/crc/static/bpmn/top_level_workflow/ind_update.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/personnel.dmn b/crc/static/bpmn/top_level_workflow/personnel.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/sponsor_funding_source.dmn b/crc/static/bpmn/top_level_workflow/sponsor_funding_source.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/top_level_workflow.bpmn b/crc/static/bpmn/top_level_workflow/top_level_workflow.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/jinja_extensions.py b/crc/static/jinja_extensions.py old mode 100644 new mode 100755 diff --git a/crc/static/reference/investigators.xlsx b/crc/static/reference/investigators.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/reference/irb_documents.xlsx b/crc/static/reference/irb_documents.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/reference/rrt_documents.xlsx b/crc/static/reference/rrt_documents.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/templates/placeholder.docx b/crc/static/templates/placeholder.docx old mode 100644 new mode 100755 diff --git a/crc/static/templates/placeholder.png b/crc/static/templates/placeholder.png old mode 100644 new mode 100755 diff --git a/crc/static/uva_rotunda.svg b/crc/static/uva_rotunda.svg old mode 100644 new mode 100755 diff --git a/crc/templates/mail_content_template.html b/crc/templates/mail_content_template.html old mode 100644 new mode 100755 diff --git a/crc/templates/mail_main_template.html b/crc/templates/mail_main_template.html old mode 100644 new mode 100755 diff --git a/crconnect.wsgi b/crconnect.wsgi old mode 100644 new mode 100755 diff --git a/deploy/requirements.txt b/deploy/requirements.txt old mode 100644 new mode 100755 diff --git a/docs/Makefile b/docs/Makefile old mode 100644 new mode 100755 diff --git a/docs/conf.py b/docs/conf.py old mode 100644 new mode 100755 diff --git a/docs/index.rst b/docs/index.rst old mode 100644 new mode 100755 diff --git a/docs/make.bat b/docs/make.bat old mode 100644 new mode 100755 diff --git a/docs/protocol_builder.html b/docs/protocol_builder.html old mode 100644 new mode 100755 diff --git a/example_data.py b/example_data.py old mode 100644 new mode 100755 diff --git a/fact_runner.py b/fact_runner.py old mode 100644 new mode 100755 diff --git a/migrations/README b/migrations/README old mode 100644 new mode 100755 diff --git a/migrations/alembic.ini b/migrations/alembic.ini old mode 100644 new mode 100755 diff --git a/migrations/env.py b/migrations/env.py old mode 100644 new mode 100755 diff --git a/migrations/script.py.mako b/migrations/script.py.mako old mode 100644 new mode 100755 diff --git a/migrations/versions/0718ad13e5f3_.py b/migrations/versions/0718ad13e5f3_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/0f38d7a36f21_.py b/migrations/versions/0f38d7a36f21_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/13424d5a6de8_.py b/migrations/versions/13424d5a6de8_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/1685be1cc232_.py b/migrations/versions/1685be1cc232_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/17597692d0b0_.py b/migrations/versions/17597692d0b0_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/1c3f88dbccc3_.py b/migrations/versions/1c3f88dbccc3_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/1fdd1bdb600e_.py b/migrations/versions/1fdd1bdb600e_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/23c62c933848_.py b/migrations/versions/23c62c933848_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/2e7b377cbc7b_.py b/migrations/versions/2e7b377cbc7b_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/30e017a03948_.py b/migrations/versions/30e017a03948_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/476f8a4933ba_.py b/migrations/versions/476f8a4933ba_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/5064b72284b7_.py b/migrations/versions/5064b72284b7_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/55c6cd407d89_.py b/migrations/versions/55c6cd407d89_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/5acd138e969c_.py b/migrations/versions/5acd138e969c_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/5e0709e172fa_.py b/migrations/versions/5e0709e172fa_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/5f06108116ae_.py b/migrations/versions/5f06108116ae_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/62910318009f_.py b/migrations/versions/62910318009f_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/65f3fce6031a_.py b/migrations/versions/65f3fce6031a_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/665624ac29f1_.py b/migrations/versions/665624ac29f1_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/69081f1ff387_.py b/migrations/versions/69081f1ff387_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/7be7cecbeea8_.py b/migrations/versions/7be7cecbeea8_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/7c0de7621a1f_.py b/migrations/versions/7c0de7621a1f_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/87af86338630_.py b/migrations/versions/87af86338630_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/8856126b6658_.py b/migrations/versions/8856126b6658_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/8b976945a54e_.py b/migrations/versions/8b976945a54e_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/90dd63672e0a_.py b/migrations/versions/90dd63672e0a_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/9b43e725f39c_.py b/migrations/versions/9b43e725f39c_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/ab06a94e5d4c_.py b/migrations/versions/ab06a94e5d4c_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/abeffe547305_update_type_on_task_events_table.py b/migrations/versions/abeffe547305_update_type_on_task_events_table.py old mode 100644 new mode 100755 diff --git a/migrations/versions/afecb64d2e66_.py b/migrations/versions/afecb64d2e66_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/bbf064082623_.py b/migrations/versions/bbf064082623_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/bec71f7dc652_.py b/migrations/versions/bec71f7dc652_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/c1449d1d1681_.py b/migrations/versions/c1449d1d1681_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/c16d3047abbe_.py b/migrations/versions/c16d3047abbe_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/c4ddb69e7ef4_.py b/migrations/versions/c4ddb69e7ef4_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/c6261ac7a7bc_.py b/migrations/versions/c6261ac7a7bc_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/c872232ebdcb_.py b/migrations/versions/c872232ebdcb_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/cb892916166a_.py b/migrations/versions/cb892916166a_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/cc4bccc5e5a8_.py b/migrations/versions/cc4bccc5e5a8_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/dc30b8f6571c_merge_30e017a03948_and_c16d3047abbe.py b/migrations/versions/dc30b8f6571c_merge_30e017a03948_and_c16d3047abbe.py old mode 100644 new mode 100755 diff --git a/migrations/versions/ddd5fc9ea75b_.py b/migrations/versions/ddd5fc9ea75b_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/de30304ff5e6_.py b/migrations/versions/de30304ff5e6_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/e0dfdbfd6f69_add_columns.py b/migrations/versions/e0dfdbfd6f69_add_columns.py old mode 100644 new mode 100755 diff --git a/migrations/versions/f186725c1ad3_.py b/migrations/versions/f186725c1ad3_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/f28ee3722c49_.py b/migrations/versions/f28ee3722c49_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/ff29528a9909_.py b/migrations/versions/ff29528a9909_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/ffef4661a37d_.py b/migrations/versions/ffef4661a37d_.py old mode 100644 new mode 100755 diff --git a/package-lock.json b/package-lock.json old mode 100644 new mode 100755 diff --git a/postgres/docker-compose.yml b/postgres/docker-compose.yml old mode 100644 new mode 100755 diff --git a/postgres/docker-windows-compose.yml b/postgres/docker-windows-compose.yml old mode 100644 new mode 100755 diff --git a/postgres/package-lock.json b/postgres/package-lock.json old mode 100644 new mode 100755 diff --git a/postgres/pg-init-scripts/initdb.sh b/postgres/pg-init-scripts/initdb.sh old mode 100644 new mode 100755 diff --git a/readme_images/new_project.png b/readme_images/new_project.png old mode 100644 new mode 100755 diff --git a/readme_images/run.png b/readme_images/run.png old mode 100644 new mode 100755 diff --git a/readme_images/run_config.png b/readme_images/run_config.png old mode 100644 new mode 100755 diff --git a/readme_images/settings.png b/readme_images/settings.png old mode 100644 new mode 100755 diff --git a/run.py b/run.py old mode 100644 new mode 100755 diff --git a/schema/__init__.py b/schema/__init__.py old mode 100644 new mode 100755 diff --git a/setup.cfg b/setup.cfg old mode 100644 new mode 100755 diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 diff --git a/tests/__init__.py b/tests/__init__.py old mode 100644 new mode 100755 diff --git a/tests/base_test.py b/tests/base_test.py old mode 100644 new mode 100755 diff --git a/tests/data/add_delete_irb_document/add_delete_irb_document.bpmn b/tests/data/add_delete_irb_document/add_delete_irb_document.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/associated_email/associated_email.bpmn b/tests/data/associated_email/associated_email.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/boolean_default_value/boolean_default_value.bpmn b/tests/data/boolean_default_value/boolean_default_value.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/check_study_script/check_study_script.bpmn b/tests/data/check_study_script/check_study_script.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/decision_table/decision_table.bpmn b/tests/data/decision_table/decision_table.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/decision_table/message_to_ginger.dmn b/tests/data/decision_table/message_to_ginger.dmn old mode 100644 new mode 100755 diff --git a/tests/data/decision_table_dictionary_output/decision_table_dictionary_output.bpmn b/tests/data/decision_table_dictionary_output/decision_table_dictionary_output.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/decision_table_dictionary_output/decision_table_dictionary_output.dmn b/tests/data/decision_table_dictionary_output/decision_table_dictionary_output.dmn old mode 100644 new mode 100755 diff --git a/tests/data/decision_table_invalid/bad_dmn.dmn b/tests/data/decision_table_invalid/bad_dmn.dmn old mode 100644 new mode 100755 diff --git a/tests/data/decision_table_invalid/decision_table_invalid.bpmn b/tests/data/decision_table_invalid/decision_table_invalid.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/docx/Letter.docx b/tests/data/docx/Letter.docx old mode 100644 new mode 100755 diff --git a/tests/data/docx/docx.bpmn b/tests/data/docx/docx.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/email/email.bpmn b/tests/data/email/email.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/email_dashboard_url/email_dashboard_url.bpmn b/tests/data/email_dashboard_url/email_dashboard_url.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/email_script/email_script.bpmn b/tests/data/email_script/email_script.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/empty_workflow/empty_workflow.bpmn b/tests/data/empty_workflow/empty_workflow.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_empty_list/empty_spreadsheet.xlsx b/tests/data/enum_empty_list/empty_spreadsheet.xlsx old mode 100644 new mode 100755 diff --git a/tests/data/enum_empty_list/enum_empty_list.bpmn b/tests/data/enum_empty_list/enum_empty_list.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_competing_files/animals.xlsx b/tests/data/enum_options_competing_files/animals.xlsx old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_competing_files/enum_options_competing_files.bpmn b/tests/data/enum_options_competing_files/enum_options_competing_files.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_competing_files/fruits.xlsx b/tests/data/enum_options_competing_files/fruits.xlsx old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_from_file/customer_list.xlsx b/tests/data/enum_options_from_file/customer_list.xlsx old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_from_file/enum_options_from_file.bpmn b/tests/data/enum_options_from_file/enum_options_from_file.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_from_task_data/enum_options_from_task_data.bpmn b/tests/data/enum_options_from_task_data/enum_options_from_task_data.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_with_search/enum_options_with_search.bpmn b/tests/data/enum_options_with_search/enum_options_with_search.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_with_search/sponsors.xlsx b/tests/data/enum_options_with_search/sponsors.xlsx old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_with_search/sponsors_modified.xlsx b/tests/data/enum_options_with_search/sponsors_modified.xlsx old mode 100644 new mode 100755 diff --git a/tests/data/enum_results/enum_results.bpmn b/tests/data/enum_results/enum_results.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_value_expression/Decision_Value_Expression.dmn b/tests/data/enum_value_expression/Decision_Value_Expression.dmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_value_expression/enum_value_expression.bpmn b/tests/data/enum_value_expression/enum_value_expression.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_value_expression_fail/Decision_Value_Expression.dmn b/tests/data/enum_value_expression_fail/Decision_Value_Expression.dmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_value_expression_fail/enum_value_expression_fail.bpmn b/tests/data/enum_value_expression_fail/enum_value_expression_fail.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/exclusive_gateway/exclusive_gateway.bpmn b/tests/data/exclusive_gateway/exclusive_gateway.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/exclusive_gateway_2/exclusive_gateway_2.bpmn b/tests/data/exclusive_gateway_2/exclusive_gateway_2.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/extension_error/extension_error.bpmn b/tests/data/extension_error/extension_error.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/failing_gateway_workflow/failing_gateway_workflow.bpmn b/tests/data/failing_gateway_workflow/failing_gateway_workflow.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/failing_workflow/failing_workflow.bpmn b/tests/data/failing_workflow/failing_workflow.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/file_data_store/file_data_store.bpmn b/tests/data/file_data_store/file_data_store.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/file_upload_form/file_upload_form.bpmn b/tests/data/file_upload_form/file_upload_form.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/file_upload_form_single/file_upload_form_single.bpmn b/tests/data/file_upload_form_single/file_upload_form_single.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/form_expressions/form_expressions.bpmn b/tests/data/form_expressions/form_expressions.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/get_study_associate/get_study_associate.bpmn b/tests/data/get_study_associate/get_study_associate.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/hello_world/hello_world.bpmn b/tests/data/hello_world/hello_world.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/hidden_required_field/hidden_required_field.bpmn b/tests/data/hidden_required_field/hidden_required_field.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/hidden_required_field_pass/hidden_required_field_pass.bpmn b/tests/data/hidden_required_field_pass/hidden_required_field_pass.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/hidden_required_field_pass_expression/hidden_required_field_pass_expression.bpmn b/tests/data/hidden_required_field_pass_expression/hidden_required_field_pass_expression.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/infinite_loop/infinite_loop.bpmn b/tests/data/infinite_loop/infinite_loop.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/invalid_expression/invalid_expression.bpmn b/tests/data/invalid_expression/invalid_expression.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/invalid_roles/invalid_roles.bpmn b/tests/data/invalid_roles/invalid_roles.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/invalid_script/invalid_script.bpmn b/tests/data/invalid_script/invalid_script.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/invalid_script2/invalid_script2.bpmn b/tests/data/invalid_script2/invalid_script2.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/invalid_script3/invalid_script3.bpmn b/tests/data/invalid_script3/invalid_script3.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/invalid_spec/invalid_spec.bpmn b/tests/data/invalid_spec/invalid_spec.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/irb_api_personnel/irb_api_personnel.bpmn b/tests/data/irb_api_personnel/irb_api_personnel.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/irb_info_script/irb_info_script.bpmn b/tests/data/irb_info_script/irb_info_script.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/ldap_lookup/ldap_lookup.bpmn b/tests/data/ldap_lookup/ldap_lookup.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/ldap_response.json b/tests/data/ldap_response.json old mode 100644 new mode 100755 diff --git a/tests/data/ldap_script/ldap_script.bpmn b/tests/data/ldap_script/ldap_script.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/looping_task/looping_task.bpmn b/tests/data/looping_task/looping_task.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/manual_task_with_external_documentation/Task_Manual_One.md b/tests/data/manual_task_with_external_documentation/Task_Manual_One.md old mode 100644 new mode 100755 diff --git a/tests/data/manual_task_with_external_documentation/manual_task_with_external_documentation.bpmn b/tests/data/manual_task_with_external_documentation/manual_task_with_external_documentation.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/message_event/message_event.bpmn b/tests/data/message_event/message_event.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/missing_form_key/missing_form_key.bpmn b/tests/data/missing_form_key/missing_form_key.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/multi_instance/multi_instance.bpmn b/tests/data/multi_instance/multi_instance.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/multi_instance_parallel/multi_instance_parallel.bpmn b/tests/data/multi_instance_parallel/multi_instance_parallel.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/nav_order/nav_order.bpmn b/tests/data/nav_order/nav_order.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/parallel_tasks/parallel_tasks.bpmn b/tests/data/parallel_tasks/parallel_tasks.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/check_study.json b/tests/data/pb_responses/check_study.json old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/investigators.json b/tests/data/pb_responses/investigators.json old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/irb_info.json b/tests/data/pb_responses/irb_info.json old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/required_docs.json b/tests/data/pb_responses/required_docs.json old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/sponsors.json b/tests/data/pb_responses/sponsors.json old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/study_details.json b/tests/data/pb_responses/study_details.json old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/study_details_bad_review_type.json b/tests/data/pb_responses/study_details_bad_review_type.json old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/user_studies.json b/tests/data/pb_responses/user_studies.json old mode 100644 new mode 100755 diff --git a/tests/data/random_fact/random_fact.bpmn b/tests/data/random_fact/random_fact.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/random_fact/random_fact2.bpmn b/tests/data/random_fact/random_fact2.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/read_only_field/read_only_field.bpmn b/tests/data/read_only_field/read_only_field.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/repeat_form/repeat_form.bpmn b/tests/data/repeat_form/repeat_form.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/required_fields/required_fields.bpmn b/tests/data/required_fields/required_fields.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/reset_workflow/reset_workflow.bpmn b/tests/data/reset_workflow/reset_workflow.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/roles/roles.bpmn b/tests/data/roles/roles.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/script_with_name_error/script_with_name_error.bpmn b/tests/data/script_with_name_error/script_with_name_error.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_cancellations/study_cancellations.bpmn b/tests/data/study_cancellations/study_cancellations.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_details/study_details.bpmn b/tests/data/study_details/study_details.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_info_script/study_info_script.bpmn b/tests/data/study_info_script/study_info_script.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_sponsors/study_sponsors.bpmn b/tests/data/study_sponsors/study_sponsors.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_sponsors_associate/study_sponsors_associate.bpmn b/tests/data/study_sponsors_associate/study_sponsors_associate.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_sponsors_associate_fail/study_sponsors_associate_fail.bpmn b/tests/data/study_sponsors_associate_fail/study_sponsors_associate_fail.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_sponsors_associate_switch_user/study_sponsors_associate_switch_user.bpmn b/tests/data/study_sponsors_associate_switch_user/study_sponsors_associate_switch_user.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_sponsors_associates_delete/study_sponsors_associates_delete.bpmn b/tests/data/study_sponsors_associates_delete/study_sponsors_associates_delete.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_sponsors_data_store/study_sponsors_data_store.bpmn b/tests/data/study_sponsors_data_store/study_sponsors_data_store.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/subprocess/subprocess.bpmn b/tests/data/subprocess/subprocess.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/table.docx b/tests/data/table.docx old mode 100644 new mode 100755 diff --git a/tests/data/test_value_expression/test_value_expression.bpmn b/tests/data/test_value_expression/test_value_expression.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/timer_event/timer_event.bpmn b/tests/data/timer_event/timer_event.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/timer_event_error/timer_event_error.bpmn b/tests/data/timer_event_error/timer_event_error.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/top_level_workflow/data_security_plan.dmn b/tests/data/top_level_workflow/data_security_plan.dmn old mode 100644 new mode 100755 diff --git a/tests/data/top_level_workflow/enter_core_info.dmn b/tests/data/top_level_workflow/enter_core_info.dmn old mode 100644 new mode 100755 diff --git a/tests/data/top_level_workflow/sponsor_funding_source.dmn b/tests/data/top_level_workflow/sponsor_funding_source.dmn old mode 100644 new mode 100755 diff --git a/tests/data/top_level_workflow/top_level_workflow.bpmn b/tests/data/top_level_workflow/top_level_workflow.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/two_forms/modified/two_forms_struc_mod.bpmn b/tests/data/two_forms/modified/two_forms_struc_mod.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/two_forms/modified/two_forms_text_mod.bpmn b/tests/data/two_forms/modified/two_forms_text_mod.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/two_forms/two_forms.bpmn b/tests/data/two_forms/two_forms.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/two_user_tasks/two_user_tasks.bpmn b/tests/data/two_user_tasks/two_user_tasks.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/verify_end_event/verify_end_event.bpmn b/tests/data/verify_end_event/verify_end_event.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/workflow_form_field_name/workflow_form_field_name.bpmn b/tests/data/workflow_form_field_name/workflow_form_field_name.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/workflow_form_field_type/workflow_form_field_type.bpmn b/tests/data/workflow_form_field_type/workflow_form_field_type.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/workflow_sync_responses/random_fact2.bpmn b/tests/data/workflow_sync_responses/random_fact2.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/workflow_sync_responses/test.txt b/tests/data/workflow_sync_responses/test.txt old mode 100644 new mode 100755 diff --git a/tests/emails/__init__.py b/tests/emails/__init__.py old mode 100644 new mode 100755 diff --git a/tests/emails/test_email_script.py b/tests/emails/test_email_script.py old mode 100644 new mode 100755 diff --git a/tests/emails/test_email_service.py b/tests/emails/test_email_service.py old mode 100644 new mode 100755 diff --git a/tests/files/__init__.py b/tests/files/__init__.py old mode 100644 new mode 100755 diff --git a/tests/files/test_file_service.py b/tests/files/test_file_service.py old mode 100644 new mode 100755 diff --git a/tests/files/test_files_api.py b/tests/files/test_files_api.py old mode 100644 new mode 100755 diff --git a/tests/ldap/__init__.py b/tests/ldap/__init__.py old mode 100644 new mode 100755 diff --git a/tests/ldap/test_ldap_lookup_script.py b/tests/ldap/test_ldap_lookup_script.py old mode 100644 new mode 100755 diff --git a/tests/scripts/__init__.py b/tests/scripts/__init__.py old mode 100644 new mode 100755 diff --git a/tests/scripts/test_check_study.py b/tests/scripts/test_check_study.py old mode 100644 new mode 100755 diff --git a/tests/scripts/test_get_study_associate_validation.py b/tests/scripts/test_get_study_associate_validation.py old mode 100644 new mode 100755 diff --git a/tests/study/__init__.py b/tests/study/__init__.py old mode 100644 new mode 100755 diff --git a/tests/study/test_get_study_from_model.py b/tests/study/test_get_study_from_model.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_actions_status.py b/tests/study/test_study_actions_status.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_api.py b/tests/study/test_study_api.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_associate_script.py b/tests/study/test_study_associate_script.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_cancellations.py b/tests/study/test_study_cancellations.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_data_store_script.py b/tests/study/test_study_data_store_script.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_details.py b/tests/study/test_study_details.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_details_documents.py b/tests/study/test_study_details_documents.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_service.py b/tests/study/test_study_service.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_sponsors_script.py b/tests/study/test_study_sponsors_script.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_status_message.py b/tests/study/test_study_status_message.py old mode 100644 new mode 100755 diff --git a/tests/study/test_update_study_script.py b/tests/study/test_update_study_script.py old mode 100644 new mode 100755 diff --git a/tests/test_authentication.py b/tests/test_authentication.py old mode 100644 new mode 100755 diff --git a/tests/test_auto_set_primary_bpmn.py b/tests/test_auto_set_primary_bpmn.py old mode 100644 new mode 100755 diff --git a/tests/test_complete_template_script.py b/tests/test_complete_template_script.py old mode 100644 new mode 100755 diff --git a/tests/test_datastore_api.py b/tests/test_datastore_api.py old mode 100644 new mode 100755 diff --git a/tests/test_decision_table_dictionary_output.py b/tests/test_decision_table_dictionary_output.py old mode 100644 new mode 100755 diff --git a/tests/test_document_directories.py b/tests/test_document_directories.py old mode 100644 new mode 100755 diff --git a/tests/test_email_script.py b/tests/test_email_script.py old mode 100644 new mode 100755 diff --git a/tests/test_events.py b/tests/test_events.py old mode 100644 new mode 100755 diff --git a/tests/test_file_datastore.py b/tests/test_file_datastore.py old mode 100644 new mode 100755 diff --git a/tests/test_get_dashboard_url_script.py b/tests/test_get_dashboard_url_script.py old mode 100644 new mode 100755 diff --git a/tests/test_irb_info_script.py b/tests/test_irb_info_script.py old mode 100644 new mode 100755 diff --git a/tests/test_is_file_uploaded_script.py b/tests/test_is_file_uploaded_script.py old mode 100644 new mode 100755 diff --git a/tests/test_launch_workflow_outside_study.py b/tests/test_launch_workflow_outside_study.py old mode 100644 new mode 100755 diff --git a/tests/test_ldap_service.py b/tests/test_ldap_service.py old mode 100644 new mode 100755 diff --git a/tests/test_lookup_service.py b/tests/test_lookup_service.py old mode 100644 new mode 100755 diff --git a/tests/test_looping_task.py b/tests/test_looping_task.py old mode 100644 new mode 100755 diff --git a/tests/test_message_event.py b/tests/test_message_event.py old mode 100644 new mode 100755 diff --git a/tests/test_multi_instance_tasks_api.py b/tests/test_multi_instance_tasks_api.py old mode 100644 new mode 100755 diff --git a/tests/test_protocol_builder.py b/tests/test_protocol_builder.py old mode 100644 new mode 100755 diff --git a/tests/test_study_info_script.py b/tests/test_study_info_script.py old mode 100644 new mode 100755 diff --git a/tests/test_tasks_api.py b/tests/test_tasks_api.py old mode 100644 new mode 100755 diff --git a/tests/test_tools_api.py b/tests/test_tools_api.py old mode 100644 new mode 100755 diff --git a/tests/test_user_in_logs.py b/tests/test_user_in_logs.py old mode 100644 new mode 100755 diff --git a/tests/test_user_roles.py b/tests/test_user_roles.py old mode 100644 new mode 100755 diff --git a/tests/test_verify_end_event.py b/tests/test_verify_end_event.py old mode 100644 new mode 100755 diff --git a/tests/test_wait_event.py b/tests/test_wait_event.py old mode 100644 new mode 100755 diff --git a/tests/test_workflow_api.py b/tests/test_workflow_api.py old mode 100644 new mode 100755 diff --git a/tests/test_workflow_sync.py b/tests/test_workflow_sync.py old mode 100644 new mode 100755 diff --git a/tests/workflow/__init__.py b/tests/workflow/__init__.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_duplicate_workflow_spec_file.py b/tests/workflow/test_duplicate_workflow_spec_file.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_boolean_default.py b/tests/workflow/test_workflow_boolean_default.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_customer_error.py b/tests/workflow/test_workflow_customer_error.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_delete_irb_document.py b/tests/workflow/test_workflow_delete_irb_document.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_enum_default_value_expression.py b/tests/workflow/test_workflow_enum_default_value_expression.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_enum_empty_list.py b/tests/workflow/test_workflow_enum_empty_list.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_form_field_name.py b/tests/workflow/test_workflow_form_field_name.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_form_field_type.py b/tests/workflow/test_workflow_form_field_type.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_hidden_required_field.py b/tests/workflow/test_workflow_hidden_required_field.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_infinite_loop.py b/tests/workflow/test_workflow_infinite_loop.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_missing_form_key.py b/tests/workflow/test_workflow_missing_form_key.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_name_error_hint.py b/tests/workflow/test_workflow_name_error_hint.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_processor.py b/tests/workflow/test_workflow_processor.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_processor_multi_instance.py b/tests/workflow/test_workflow_processor_multi_instance.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_read_only_field.py b/tests/workflow/test_workflow_read_only_field.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_reset.py b/tests/workflow/test_workflow_reset.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_restart.py b/tests/workflow/test_workflow_restart.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_service.py b/tests/workflow/test_workflow_service.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_spec_api.py b/tests/workflow/test_workflow_spec_api.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_spec_validation_api.py b/tests/workflow/test_workflow_spec_validation_api.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_value_expression.py b/tests/workflow/test_workflow_value_expression.py old mode 100644 new mode 100755 diff --git a/wsgi.py b/wsgi.py old mode 100644 new mode 100755 From 390658060451ab9c7e43d2d68cf739a93afe886b Mon Sep 17 00:00:00 2001 From: NWalker4483 Date: Tue, 20 Jul 2021 14:25:01 -0400 Subject: [PATCH 03/15] Merges getStudyAssociates() endpoint --- crc/api.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crc/api.yml b/crc/api.yml index 24fb0cda..6944598e 100755 --- a/crc/api.yml +++ b/crc/api.yml @@ -394,7 +394,7 @@ paths: application/json: schema: $ref: "#/components/schemas/Study" - /study/{study_id}/associates': + /study/{study_id}/associates: parameters: - name: study_id in: path From 1cfb7f96fa575c5100b75cb573e55a4b11928cf0 Mon Sep 17 00:00:00 2001 From: NWalker4483 Date: Thu, 22 Jul 2021 11:28:11 -0400 Subject: [PATCH 04/15] Missing uid declaration in study service corrected --- crc/api.yml | 48 ++++++++++------------------------- crc/services/study_service.py | 2 +- 2 files changed, 14 insertions(+), 36 deletions(-) diff --git a/crc/api.yml b/crc/api.yml index 6944598e..4a995b23 100755 --- a/crc/api.yml +++ b/crc/api.yml @@ -399,22 +399,24 @@ paths: - name: study_id in: path required: true - description: The id of the study for which workflows should be returned. + description: The id of the study for which associates should be returned. schema: type: integer format: int32 get: operationId: crc.api.study.get_study_associates - summary: Provides a single study + summary: Provides a list of associates for a particular study tags: - Studies responses: '200': - description: An Study Associate Object + description: list of Study Associate Objects content: application/json: schema: - $ref: "#/components/schemas/StudyAssociate" + type: array + items: + $ref: "#/components/schemas/StudyAssociate" /workflow-specification: get: @@ -1589,39 +1591,15 @@ components: example: "27b-6-1212" StudyAssociate: properties: - id: - type: integer - example: 1234 - title: + uid: type: string - example: The impact of fried pickles on beer consumption in bipedal software developers. - last_updated: + example: "dhf8r" + access: + type: boolean + example: False + role: type: string - format: date_time - example: "2019-12-25T09:12:33.001Z" - primary_investigator_id: - type: string - x-nullable: true - example: dhf8r - user_uid: - type: string - example: dhf8r - status: - type: string - enum: ['in_progress', 'hold', 'open_for_enrollment', 'abandoned'] - example: done - sponsor: - type: string - x-nullable: true - example: "Sartography Pharmaceuticals" - ind_number: - type: string - x-nullable: true - example: "27b-6-42" - hsr_number: - type: string - x-nullable: true - example: "27b-6-1212" + example: "TODO" DocumentDirectory: properties: level: diff --git a/crc/services/study_service.py b/crc/services/study_service.py index fff41b69..bc1cafa3 100755 --- a/crc/services/study_service.py +++ b/crc/services/study_service.py @@ -123,7 +123,7 @@ class StudyService(object): raise ApiError('uid not specified','A valid uva uid is required for this function') if uid == study.user_uid: - return {'uid': ownerid, 'role': 'owner', 'send_email': True, 'access': True} + return {'uid': uid, 'role': 'owner', 'send_email': True, 'access': True} From a73d1794ebc30e85c84888424e9a2782addfee06 Mon Sep 17 00:00:00 2001 From: NWalker4483 Date: Tue, 20 Jul 2021 13:57:32 -0400 Subject: [PATCH 05/15] Fixed Associate API Endpoint description --- .gitignore | 2 +- .sonarcloud.properties | 0 .travis.yml | 0 Dockerfile | 0 LICENSE.md | 0 Pipfile | 0 Pipfile.lock | 0 README.md | 0 config/default.py | 0 config/logging_example.py | 0 config/testing.py | 0 crc/__init__.py | 0 crc/api.yml | 48 +++++------------- crc/api/__init__.py | 0 crc/api/admin.py | 0 crc/api/common.py | 0 crc/api/data_store.py | 0 crc/api/document.py | 0 crc/api/file.py | 0 crc/api/study.py | 0 crc/api/tools.py | 0 crc/api/user.py | 0 crc/api/workflow.py | 0 crc/api/workflow_sync.py | 0 crc/models/__init__.py | 0 crc/models/api_models.py | 0 crc/models/data_store.py | 0 crc/models/email.py | 0 crc/models/file.py | 0 crc/models/ldap.py | 0 crc/models/protocol_builder.py | 0 crc/models/study.py | 1 + crc/models/task_event.py | 0 crc/models/user.py | 0 crc/models/workflow.py | 0 crc/scripts/__init__.py | 0 crc/scripts/check_study.py | 0 crc/scripts/complete_template.py | 0 crc/scripts/delete_file.py | 0 crc/scripts/email.py | 0 crc/scripts/fact_service.py | 0 crc/scripts/failing_script.py | 0 crc/scripts/file_data_get.py | 0 crc/scripts/file_data_set.py | 0 crc/scripts/get_dashboard_url.py | 0 crc/scripts/get_irb_info.py | 0 crc/scripts/get_study_associate.py | 0 crc/scripts/get_study_associates.py | 0 crc/scripts/is_file_uploaded.py | 0 crc/scripts/ldap.py | 0 crc/scripts/reset_workflow.py | 0 crc/scripts/script.py | 0 crc/scripts/study_data_get.py | 0 crc/scripts/study_data_set.py | 0 crc/scripts/study_info.py | 0 crc/scripts/update_study.py | 0 crc/scripts/update_study_associate.py | 0 crc/scripts/update_study_associates.py | 0 crc/scripts/user_data_get.py | 0 crc/scripts/user_data_set.py | 0 crc/services/__init__.py | 0 crc/services/cache_service.py | 0 crc/services/data_store_service.py | 0 crc/services/document_service.py | 0 crc/services/email_service.py | 0 crc/services/error_service.py | 0 crc/services/failing_service.py | 0 crc/services/file_service.py | 0 crc/services/ldap_service.py | 0 crc/services/lookup_service.py | 0 crc/services/protocol_builder.py | 0 crc/services/study_service.py | 21 ++++++-- crc/services/user_service.py | 0 crc/services/workflow_processor.py | 0 crc/services/workflow_service.py | 4 +- crc/services/workflow_sync.py | 0 crc/static/bpmn/abandoned/abandoned.bpmn | 0 crc/static/bpmn/core_info/SponsorList.xls | Bin crc/static/bpmn/core_info/core_info.bpmn | 0 .../decision_core_info_multi_site_q12.dmn | 0 .../decision_core_info_multi_site_q14.dmn | 0 .../decision_core_info_multi_site_q28.dmn | 0 .../bpmn/data_security_plan/HIPAA_Ids.xls | Bin .../data_security_plan/NEW_DSP_template.docx | Bin .../UVA_ServersWebsitesList.xls | Bin .../data_security_plan.bpmn | 0 .../decision_dept_chair.dmn | 0 .../dept_chair_approval.bpmn | 0 .../documents_approvals.bpmn | 0 .../bpmn/enrollment_date/enrollment_date.bpmn | 0 crc/static/bpmn/finance/finance.bpmn | 0 crc/static/bpmn/hold/hold.bpmn | 0 .../bpmn/ide_supplement/SponsorList.xls | Bin .../ide_supplement/decision_ide_check.dmn | 0 .../bpmn/ide_supplement/ide_update.bpmn | 0 .../ids_full_submission.bpmn | 0 .../investigators_brochure.dmn | 0 .../ids_full_submission/ivrs_iwrs_ixrs.dmn | 0 .../ids_full_submission/pharmacy_manual.dmn | 0 crc/static/bpmn/ids_waiver/ids_waiver.bpmn | 0 crc/static/bpmn/ind_update/SponsorList.xls | Bin .../bpmn/ind_update/decision_ind_check.dmn | 0 .../ind_update/decision_ind_uva_check.dmn | 0 crc/static/bpmn/ind_update/ind_update.bpmn | 0 .../bpmn/irb_api_details/irb_api_details.bpmn | 0 .../DepartmentList-ArtsSciences.xlsx | Bin .../DepartmentList-Education.xlsx | Bin .../DepartmentList-Medicine.xlsx | Bin .../bpmn/irb_api_personnel/SchoolList.xls | Bin .../bpmn/irb_api_personnel/check_for_pi.dmn | 0 .../irb_api_personnel/decision_dept_chair.dmn | 0 .../irb_api_personnel/decision_pi_dept.dmn | 0 .../irb_api_personnel/decision_pi_school.dmn | 0 .../bpmn/irb_api_personnel/decision_ro.dmn | 0 .../irb_api_personnel/decision_ro_chair.dmn | 0 .../irb_api_personnel/decision_ro_dept.dmn | 0 .../irb_api_personnel/irb_api_personnel.bpmn | 0 .../non_uva_approval/non_uva_approval.bpmn | 0 .../bpmn/notifications/notifications.bpmn | 0 crc/static/bpmn/protocol/protocol.bpmn | 0 .../bpmn/research_rampup/BuildingList.xls | Bin .../DepartmentList-Architecture.xlsx | Bin .../DepartmentList-ArtsSciences.xlsx | Bin .../DepartmentList-Education.xlsx | Bin .../DepartmentList-Engineering.xlsx | Bin .../DepartmentList-Medicine.xlsx | Bin .../DepartmentList-ProvostOffice.xlsx | Bin .../bpmn/research_rampup/DepartmentList.xlsx | Bin .../bpmn/research_rampup/LabSpaces.xlsx | Bin .../bpmn/research_rampup/RTT_Approvers.dmn | 0 .../research_rampup/ResearchRampUpPlan.docx | Bin .../bpmn/research_rampup/SchoolList.xls | Bin .../exclusive_area_monitors.dmn | 0 .../bpmn/research_rampup/research_rampup.bpmn | 0 .../research_rampup/shared_area_monitors.dmn | 0 .../rrt_top_level_workflow.bpmn | 0 .../decision_support_lang.dmn | 0 .../rsc_hire_committee.bpmn | 0 .../rsc_hire_submission.bpmn | 0 .../sponsor_funding_source/SponsorList.xls | Bin .../sponsor_funding_source.bpmn | 0 .../top_level_workflow/data_security_plan.dmn | 0 .../top_level_workflow/enter_core_info.dmn | 0 .../top_level_workflow/ide_supplement.dmn | 0 .../ids_full_submission.dmn | 0 .../bpmn/top_level_workflow/ids_waiver.dmn | 0 .../bpmn/top_level_workflow/ind_update.dmn | 0 .../bpmn/top_level_workflow/personnel.dmn | 0 .../sponsor_funding_source.dmn | 0 .../top_level_workflow.bpmn | 0 crc/static/jinja_extensions.py | 0 crc/static/reference/investigators.xlsx | Bin crc/static/reference/irb_documents.xlsx | Bin crc/static/reference/rrt_documents.xlsx | Bin crc/static/templates/placeholder.docx | Bin crc/static/templates/placeholder.png | Bin crc/static/uva_rotunda.svg | 0 crc/templates/mail_content_template.html | 0 crc/templates/mail_main_template.html | 0 crconnect.wsgi | 0 deploy/requirements.txt | 0 docs/Makefile | 0 docs/conf.py | 0 docs/index.rst | 0 docs/make.bat | 0 docs/protocol_builder.html | 0 example_data.py | 0 fact_runner.py | 0 migrations/README | 0 migrations/alembic.ini | 0 migrations/env.py | 0 migrations/script.py.mako | 0 migrations/versions/0718ad13e5f3_.py | 0 migrations/versions/0f38d7a36f21_.py | 0 migrations/versions/13424d5a6de8_.py | 0 migrations/versions/1685be1cc232_.py | 0 migrations/versions/17597692d0b0_.py | 0 migrations/versions/1c3f88dbccc3_.py | 0 migrations/versions/1fdd1bdb600e_.py | 0 migrations/versions/23c62c933848_.py | 0 migrations/versions/2e7b377cbc7b_.py | 0 migrations/versions/30e017a03948_.py | 0 migrations/versions/476f8a4933ba_.py | 0 migrations/versions/5064b72284b7_.py | 0 migrations/versions/55c6cd407d89_.py | 0 migrations/versions/5acd138e969c_.py | 0 migrations/versions/5e0709e172fa_.py | 0 migrations/versions/5f06108116ae_.py | 0 migrations/versions/62910318009f_.py | 0 migrations/versions/65f3fce6031a_.py | 0 migrations/versions/665624ac29f1_.py | 0 migrations/versions/69081f1ff387_.py | 0 migrations/versions/7be7cecbeea8_.py | 0 migrations/versions/7c0de7621a1f_.py | 0 migrations/versions/87af86338630_.py | 0 migrations/versions/8856126b6658_.py | 0 migrations/versions/8b976945a54e_.py | 0 migrations/versions/90dd63672e0a_.py | 0 migrations/versions/9b43e725f39c_.py | 0 migrations/versions/ab06a94e5d4c_.py | 0 ...547305_update_type_on_task_events_table.py | 0 migrations/versions/afecb64d2e66_.py | 0 migrations/versions/bbf064082623_.py | 0 migrations/versions/bec71f7dc652_.py | 0 migrations/versions/c1449d1d1681_.py | 0 migrations/versions/c16d3047abbe_.py | 0 migrations/versions/c4ddb69e7ef4_.py | 0 migrations/versions/c6261ac7a7bc_.py | 0 migrations/versions/c872232ebdcb_.py | 0 migrations/versions/cb892916166a_.py | 0 migrations/versions/cc4bccc5e5a8_.py | 0 ...71c_merge_30e017a03948_and_c16d3047abbe.py | 0 migrations/versions/ddd5fc9ea75b_.py | 0 migrations/versions/de30304ff5e6_.py | 0 .../versions/e0dfdbfd6f69_add_columns.py | 0 migrations/versions/f186725c1ad3_.py | 0 migrations/versions/f28ee3722c49_.py | 0 migrations/versions/ff29528a9909_.py | 0 migrations/versions/ffef4661a37d_.py | 0 package-lock.json | 0 postgres/docker-compose.yml | 0 postgres/docker-windows-compose.yml | 0 postgres/package-lock.json | 0 postgres/pg-init-scripts/initdb.sh | 0 readme_images/new_project.png | Bin readme_images/run.png | Bin readme_images/run_config.png | Bin readme_images/settings.png | Bin run.py | 0 schema/__init__.py | 0 setup.cfg | 0 setup.py | 0 tests/__init__.py | 0 tests/base_test.py | 0 .../add_delete_irb_document.bpmn | 0 .../associated_email/associated_email.bpmn | 0 .../boolean_default_value.bpmn | 0 .../check_study_script.bpmn | 0 tests/data/decision_table/decision_table.bpmn | 0 .../data/decision_table/message_to_ginger.dmn | 0 .../decision_table_dictionary_output.bpmn | 0 .../decision_table_dictionary_output.dmn | 0 tests/data/decision_table_invalid/bad_dmn.dmn | 0 .../decision_table_invalid.bpmn | 0 tests/data/docx/Letter.docx | Bin tests/data/docx/docx.bpmn | 0 tests/data/email/email.bpmn | 0 .../email_dashboard_url.bpmn | 0 tests/data/email_script/email_script.bpmn | 0 tests/data/empty_workflow/empty_workflow.bpmn | 0 .../enum_empty_list/empty_spreadsheet.xlsx | Bin .../data/enum_empty_list/enum_empty_list.bpmn | 0 .../enum_options_competing_files/animals.xlsx | Bin .../enum_options_competing_files.bpmn | 0 .../enum_options_competing_files/fruits.xlsx | Bin .../enum_options_from_file/customer_list.xlsx | Bin .../enum_options_from_file.bpmn | 0 .../enum_options_from_task_data.bpmn | 0 .../enum_options_with_search.bpmn | 0 .../enum_options_with_search/sponsors.xlsx | Bin .../sponsors_modified.xlsx | Bin tests/data/enum_results/enum_results.bpmn | 0 .../Decision_Value_Expression.dmn | 0 .../enum_value_expression.bpmn | 0 .../Decision_Value_Expression.dmn | 0 .../enum_value_expression_fail.bpmn | 0 .../exclusive_gateway/exclusive_gateway.bpmn | 0 .../exclusive_gateway_2.bpmn | 0 .../data/extension_error/extension_error.bpmn | 0 .../failing_gateway_workflow.bpmn | 0 .../failing_workflow/failing_workflow.bpmn | 0 .../data/file_data_store/file_data_store.bpmn | 0 .../file_upload_form/file_upload_form.bpmn | 0 .../file_upload_form_single.bpmn | 0 .../form_expressions/form_expressions.bpmn | 0 .../get_study_associate.bpmn | 0 tests/data/hello_world/hello_world.bpmn | 0 .../hidden_required_field.bpmn | 0 .../hidden_required_field_pass.bpmn | 0 ...hidden_required_field_pass_expression.bpmn | 0 tests/data/infinite_loop/infinite_loop.bpmn | 0 .../invalid_expression.bpmn | 0 tests/data/invalid_roles/invalid_roles.bpmn | 0 tests/data/invalid_script/invalid_script.bpmn | 0 .../data/invalid_script2/invalid_script2.bpmn | 0 .../data/invalid_script3/invalid_script3.bpmn | 0 tests/data/invalid_spec/invalid_spec.bpmn | 0 .../irb_api_personnel/irb_api_personnel.bpmn | 0 .../data/irb_info_script/irb_info_script.bpmn | 0 tests/data/ldap_lookup/ldap_lookup.bpmn | 0 tests/data/ldap_response.json | 0 tests/data/ldap_script/ldap_script.bpmn | 0 tests/data/looping_task/looping_task.bpmn | 0 .../Task_Manual_One.md | 0 ...nual_task_with_external_documentation.bpmn | 0 tests/data/message_event/message_event.bpmn | 0 .../missing_form_key/missing_form_key.bpmn | 0 tests/data/multi_instance/multi_instance.bpmn | 0 .../multi_instance_parallel.bpmn | 0 tests/data/nav_order/nav_order.bpmn | 0 tests/data/parallel_tasks/parallel_tasks.bpmn | 0 tests/data/pb_responses/check_study.json | 0 tests/data/pb_responses/investigators.json | 0 tests/data/pb_responses/irb_info.json | 0 tests/data/pb_responses/required_docs.json | 0 tests/data/pb_responses/sponsors.json | 0 tests/data/pb_responses/study_details.json | 0 .../study_details_bad_review_type.json | 0 tests/data/pb_responses/user_studies.json | 0 tests/data/random_fact/random_fact.bpmn | 0 tests/data/random_fact/random_fact2.bpmn | 0 .../data/read_only_field/read_only_field.bpmn | 0 tests/data/repeat_form/repeat_form.bpmn | 0 .../data/required_fields/required_fields.bpmn | 0 tests/data/reset_workflow/reset_workflow.bpmn | 0 tests/data/roles/roles.bpmn | 0 .../script_with_name_error.bpmn | 0 .../study_cancellations.bpmn | 0 tests/data/study_details/study_details.bpmn | 0 .../study_info_script/study_info_script.bpmn | 0 tests/data/study_sponsors/study_sponsors.bpmn | 0 .../study_sponsors_associate.bpmn | 0 .../study_sponsors_associate_fail.bpmn | 0 .../study_sponsors_associate_switch_user.bpmn | 0 .../study_sponsors_associates_delete.bpmn | 0 .../study_sponsors_data_store.bpmn | 0 tests/data/subprocess/subprocess.bpmn | 0 tests/data/table.docx | Bin .../test_value_expression.bpmn | 0 tests/data/timer_event/timer_event.bpmn | 0 .../timer_event_error/timer_event_error.bpmn | 0 .../top_level_workflow/data_security_plan.dmn | 0 .../top_level_workflow/enter_core_info.dmn | 0 .../sponsor_funding_source.dmn | 0 .../top_level_workflow.bpmn | 0 .../modified/two_forms_struc_mod.bpmn | 0 .../modified/two_forms_text_mod.bpmn | 0 tests/data/two_forms/two_forms.bpmn | 0 tests/data/two_user_tasks/two_user_tasks.bpmn | 0 .../verify_end_event/verify_end_event.bpmn | 0 .../workflow_form_field_name.bpmn | 0 .../workflow_form_field_type.bpmn | 0 .../workflow_sync_responses/random_fact2.bpmn | 0 tests/data/workflow_sync_responses/test.txt | 0 tests/emails/__init__.py | 0 tests/emails/test_email_script.py | 0 tests/emails/test_email_service.py | 0 tests/files/__init__.py | 0 tests/files/test_file_service.py | 0 tests/files/test_files_api.py | 0 tests/ldap/__init__.py | 0 tests/ldap/test_ldap_lookup_script.py | 0 tests/scripts/__init__.py | 0 tests/scripts/test_check_study.py | 0 .../test_get_study_associate_validation.py | 0 tests/study/__init__.py | 0 tests/study/test_get_study_from_model.py | 0 tests/study/test_study_actions_status.py | 0 tests/study/test_study_api.py | 0 tests/study/test_study_associate_script.py | 0 tests/study/test_study_cancellations.py | 0 tests/study/test_study_data_store_script.py | 0 tests/study/test_study_details.py | 0 tests/study/test_study_details_documents.py | 0 tests/study/test_study_service.py | 0 tests/study/test_study_sponsors_script.py | 0 tests/study/test_study_status_message.py | 0 tests/study/test_update_study_script.py | 0 tests/test_authentication.py | 0 tests/test_auto_set_primary_bpmn.py | 0 tests/test_complete_template_script.py | 0 tests/test_datastore_api.py | 0 .../test_decision_table_dictionary_output.py | 0 tests/test_document_directories.py | 0 tests/test_email_script.py | 0 tests/test_events.py | 0 tests/test_file_datastore.py | 0 tests/test_get_dashboard_url_script.py | 0 tests/test_irb_info_script.py | 0 tests/test_is_file_uploaded_script.py | 0 tests/test_launch_workflow_outside_study.py | 0 tests/test_ldap_service.py | 0 tests/test_lookup_service.py | 0 tests/test_looping_task.py | 0 tests/test_message_event.py | 0 tests/test_multi_instance_tasks_api.py | 0 tests/test_protocol_builder.py | 0 tests/test_study_info_script.py | 0 tests/test_tasks_api.py | 0 tests/test_tools_api.py | 0 tests/test_user_in_logs.py | 0 tests/test_user_roles.py | 0 tests/test_verify_end_event.py | 0 tests/test_wait_event.py | 0 tests/test_workflow_api.py | 0 tests/test_workflow_sync.py | 0 tests/workflow/__init__.py | 0 .../test_duplicate_workflow_spec_file.py | 0 .../workflow/test_workflow_boolean_default.py | 0 .../workflow/test_workflow_customer_error.py | 0 .../test_workflow_delete_irb_document.py | 0 ..._workflow_enum_default_value_expression.py | 0 .../workflow/test_workflow_enum_empty_list.py | 0 .../workflow/test_workflow_form_field_name.py | 0 .../workflow/test_workflow_form_field_type.py | 0 .../test_workflow_hidden_required_field.py | 0 tests/workflow/test_workflow_infinite_loop.py | 0 .../test_workflow_missing_form_key.py | 0 .../workflow/test_workflow_name_error_hint.py | 0 tests/workflow/test_workflow_processor.py | 0 .../test_workflow_processor_multi_instance.py | 0 .../workflow/test_workflow_read_only_field.py | 0 tests/workflow/test_workflow_reset.py | 0 tests/workflow/test_workflow_restart.py | 0 tests/workflow/test_workflow_service.py | 0 tests/workflow/test_workflow_spec_api.py | 0 .../test_workflow_spec_validation_api.py | 0 .../test_workflow_value_expression.py | 0 wsgi.py | 0 419 files changed, 33 insertions(+), 43 deletions(-) mode change 100644 => 100755 .gitignore mode change 100644 => 100755 .sonarcloud.properties mode change 100644 => 100755 .travis.yml mode change 100644 => 100755 Dockerfile mode change 100644 => 100755 LICENSE.md mode change 100644 => 100755 Pipfile mode change 100644 => 100755 Pipfile.lock mode change 100644 => 100755 README.md mode change 100644 => 100755 config/default.py mode change 100644 => 100755 config/logging_example.py mode change 100644 => 100755 config/testing.py mode change 100644 => 100755 crc/__init__.py mode change 100644 => 100755 crc/api.yml mode change 100644 => 100755 crc/api/__init__.py mode change 100644 => 100755 crc/api/admin.py mode change 100644 => 100755 crc/api/common.py mode change 100644 => 100755 crc/api/data_store.py mode change 100644 => 100755 crc/api/document.py mode change 100644 => 100755 crc/api/file.py mode change 100644 => 100755 crc/api/study.py mode change 100644 => 100755 crc/api/tools.py mode change 100644 => 100755 crc/api/user.py mode change 100644 => 100755 crc/api/workflow.py mode change 100644 => 100755 crc/api/workflow_sync.py mode change 100644 => 100755 crc/models/__init__.py mode change 100644 => 100755 crc/models/api_models.py mode change 100644 => 100755 crc/models/data_store.py mode change 100644 => 100755 crc/models/email.py mode change 100644 => 100755 crc/models/file.py mode change 100644 => 100755 crc/models/ldap.py mode change 100644 => 100755 crc/models/protocol_builder.py mode change 100644 => 100755 crc/models/study.py mode change 100644 => 100755 crc/models/task_event.py mode change 100644 => 100755 crc/models/user.py mode change 100644 => 100755 crc/models/workflow.py mode change 100644 => 100755 crc/scripts/__init__.py mode change 100644 => 100755 crc/scripts/check_study.py mode change 100644 => 100755 crc/scripts/complete_template.py mode change 100644 => 100755 crc/scripts/delete_file.py mode change 100644 => 100755 crc/scripts/email.py mode change 100644 => 100755 crc/scripts/fact_service.py mode change 100644 => 100755 crc/scripts/failing_script.py mode change 100644 => 100755 crc/scripts/file_data_get.py mode change 100644 => 100755 crc/scripts/file_data_set.py mode change 100644 => 100755 crc/scripts/get_dashboard_url.py mode change 100644 => 100755 crc/scripts/get_irb_info.py mode change 100644 => 100755 crc/scripts/get_study_associate.py mode change 100644 => 100755 crc/scripts/get_study_associates.py mode change 100644 => 100755 crc/scripts/is_file_uploaded.py mode change 100644 => 100755 crc/scripts/ldap.py mode change 100644 => 100755 crc/scripts/reset_workflow.py mode change 100644 => 100755 crc/scripts/script.py mode change 100644 => 100755 crc/scripts/study_data_get.py mode change 100644 => 100755 crc/scripts/study_data_set.py mode change 100644 => 100755 crc/scripts/study_info.py mode change 100644 => 100755 crc/scripts/update_study.py mode change 100644 => 100755 crc/scripts/update_study_associate.py mode change 100644 => 100755 crc/scripts/update_study_associates.py mode change 100644 => 100755 crc/scripts/user_data_get.py mode change 100644 => 100755 crc/scripts/user_data_set.py mode change 100644 => 100755 crc/services/__init__.py mode change 100644 => 100755 crc/services/cache_service.py mode change 100644 => 100755 crc/services/data_store_service.py mode change 100644 => 100755 crc/services/document_service.py mode change 100644 => 100755 crc/services/email_service.py mode change 100644 => 100755 crc/services/error_service.py mode change 100644 => 100755 crc/services/failing_service.py mode change 100644 => 100755 crc/services/file_service.py mode change 100644 => 100755 crc/services/ldap_service.py mode change 100644 => 100755 crc/services/lookup_service.py mode change 100644 => 100755 crc/services/protocol_builder.py mode change 100644 => 100755 crc/services/study_service.py mode change 100644 => 100755 crc/services/user_service.py mode change 100644 => 100755 crc/services/workflow_processor.py mode change 100644 => 100755 crc/services/workflow_service.py mode change 100644 => 100755 crc/services/workflow_sync.py mode change 100644 => 100755 crc/static/bpmn/abandoned/abandoned.bpmn mode change 100644 => 100755 crc/static/bpmn/core_info/SponsorList.xls mode change 100644 => 100755 crc/static/bpmn/core_info/core_info.bpmn mode change 100644 => 100755 crc/static/bpmn/core_info/decision_core_info_multi_site_q12.dmn mode change 100644 => 100755 crc/static/bpmn/core_info/decision_core_info_multi_site_q14.dmn mode change 100644 => 100755 crc/static/bpmn/core_info/decision_core_info_multi_site_q28.dmn mode change 100644 => 100755 crc/static/bpmn/data_security_plan/HIPAA_Ids.xls mode change 100644 => 100755 crc/static/bpmn/data_security_plan/NEW_DSP_template.docx mode change 100644 => 100755 crc/static/bpmn/data_security_plan/UVA_ServersWebsitesList.xls mode change 100644 => 100755 crc/static/bpmn/data_security_plan/data_security_plan.bpmn mode change 100644 => 100755 crc/static/bpmn/department_chair_approval/decision_dept_chair.dmn mode change 100644 => 100755 crc/static/bpmn/department_chair_approval/dept_chair_approval.bpmn mode change 100644 => 100755 crc/static/bpmn/documents_approvals/documents_approvals.bpmn mode change 100644 => 100755 crc/static/bpmn/enrollment_date/enrollment_date.bpmn mode change 100644 => 100755 crc/static/bpmn/finance/finance.bpmn mode change 100644 => 100755 crc/static/bpmn/hold/hold.bpmn mode change 100644 => 100755 crc/static/bpmn/ide_supplement/SponsorList.xls mode change 100644 => 100755 crc/static/bpmn/ide_supplement/decision_ide_check.dmn mode change 100644 => 100755 crc/static/bpmn/ide_supplement/ide_update.bpmn mode change 100644 => 100755 crc/static/bpmn/ids_full_submission/ids_full_submission.bpmn mode change 100644 => 100755 crc/static/bpmn/ids_full_submission/investigators_brochure.dmn mode change 100644 => 100755 crc/static/bpmn/ids_full_submission/ivrs_iwrs_ixrs.dmn mode change 100644 => 100755 crc/static/bpmn/ids_full_submission/pharmacy_manual.dmn mode change 100644 => 100755 crc/static/bpmn/ids_waiver/ids_waiver.bpmn mode change 100644 => 100755 crc/static/bpmn/ind_update/SponsorList.xls mode change 100644 => 100755 crc/static/bpmn/ind_update/decision_ind_check.dmn mode change 100644 => 100755 crc/static/bpmn/ind_update/decision_ind_uva_check.dmn mode change 100644 => 100755 crc/static/bpmn/ind_update/ind_update.bpmn mode change 100644 => 100755 crc/static/bpmn/irb_api_details/irb_api_details.bpmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/DepartmentList-ArtsSciences.xlsx mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/DepartmentList-Education.xlsx mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/DepartmentList-Medicine.xlsx mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/SchoolList.xls mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/check_for_pi.dmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/decision_dept_chair.dmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/decision_pi_dept.dmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/decision_pi_school.dmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/decision_ro.dmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/decision_ro_chair.dmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/decision_ro_dept.dmn mode change 100644 => 100755 crc/static/bpmn/irb_api_personnel/irb_api_personnel.bpmn mode change 100644 => 100755 crc/static/bpmn/non_uva_approval/non_uva_approval.bpmn mode change 100644 => 100755 crc/static/bpmn/notifications/notifications.bpmn mode change 100644 => 100755 crc/static/bpmn/protocol/protocol.bpmn mode change 100644 => 100755 crc/static/bpmn/research_rampup/BuildingList.xls mode change 100644 => 100755 crc/static/bpmn/research_rampup/DepartmentList-Architecture.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/DepartmentList-ArtsSciences.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/DepartmentList-Education.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/DepartmentList-Engineering.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/DepartmentList-Medicine.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/DepartmentList-ProvostOffice.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/DepartmentList.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/LabSpaces.xlsx mode change 100644 => 100755 crc/static/bpmn/research_rampup/RTT_Approvers.dmn mode change 100644 => 100755 crc/static/bpmn/research_rampup/ResearchRampUpPlan.docx mode change 100644 => 100755 crc/static/bpmn/research_rampup/SchoolList.xls mode change 100644 => 100755 crc/static/bpmn/research_rampup/exclusive_area_monitors.dmn mode change 100644 => 100755 crc/static/bpmn/research_rampup/research_rampup.bpmn mode change 100644 => 100755 crc/static/bpmn/research_rampup/shared_area_monitors.dmn mode change 100644 => 100755 crc/static/bpmn/rrt_top_level_workflow/rrt_top_level_workflow.bpmn mode change 100644 => 100755 crc/static/bpmn/rsc_hire_committee/decision_support_lang.dmn mode change 100644 => 100755 crc/static/bpmn/rsc_hire_committee/rsc_hire_committee.bpmn mode change 100644 => 100755 crc/static/bpmn/rsc_hire_submission/rsc_hire_submission.bpmn mode change 100644 => 100755 crc/static/bpmn/sponsor_funding_source/SponsorList.xls mode change 100644 => 100755 crc/static/bpmn/sponsor_funding_source/sponsor_funding_source.bpmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/data_security_plan.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/enter_core_info.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/ide_supplement.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/ids_full_submission.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/ids_waiver.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/ind_update.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/personnel.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/sponsor_funding_source.dmn mode change 100644 => 100755 crc/static/bpmn/top_level_workflow/top_level_workflow.bpmn mode change 100644 => 100755 crc/static/jinja_extensions.py mode change 100644 => 100755 crc/static/reference/investigators.xlsx mode change 100644 => 100755 crc/static/reference/irb_documents.xlsx mode change 100644 => 100755 crc/static/reference/rrt_documents.xlsx mode change 100644 => 100755 crc/static/templates/placeholder.docx mode change 100644 => 100755 crc/static/templates/placeholder.png mode change 100644 => 100755 crc/static/uva_rotunda.svg mode change 100644 => 100755 crc/templates/mail_content_template.html mode change 100644 => 100755 crc/templates/mail_main_template.html mode change 100644 => 100755 crconnect.wsgi mode change 100644 => 100755 deploy/requirements.txt mode change 100644 => 100755 docs/Makefile mode change 100644 => 100755 docs/conf.py mode change 100644 => 100755 docs/index.rst mode change 100644 => 100755 docs/make.bat mode change 100644 => 100755 docs/protocol_builder.html mode change 100644 => 100755 example_data.py mode change 100644 => 100755 fact_runner.py mode change 100644 => 100755 migrations/README mode change 100644 => 100755 migrations/alembic.ini mode change 100644 => 100755 migrations/env.py mode change 100644 => 100755 migrations/script.py.mako mode change 100644 => 100755 migrations/versions/0718ad13e5f3_.py mode change 100644 => 100755 migrations/versions/0f38d7a36f21_.py mode change 100644 => 100755 migrations/versions/13424d5a6de8_.py mode change 100644 => 100755 migrations/versions/1685be1cc232_.py mode change 100644 => 100755 migrations/versions/17597692d0b0_.py mode change 100644 => 100755 migrations/versions/1c3f88dbccc3_.py mode change 100644 => 100755 migrations/versions/1fdd1bdb600e_.py mode change 100644 => 100755 migrations/versions/23c62c933848_.py mode change 100644 => 100755 migrations/versions/2e7b377cbc7b_.py mode change 100644 => 100755 migrations/versions/30e017a03948_.py mode change 100644 => 100755 migrations/versions/476f8a4933ba_.py mode change 100644 => 100755 migrations/versions/5064b72284b7_.py mode change 100644 => 100755 migrations/versions/55c6cd407d89_.py mode change 100644 => 100755 migrations/versions/5acd138e969c_.py mode change 100644 => 100755 migrations/versions/5e0709e172fa_.py mode change 100644 => 100755 migrations/versions/5f06108116ae_.py mode change 100644 => 100755 migrations/versions/62910318009f_.py mode change 100644 => 100755 migrations/versions/65f3fce6031a_.py mode change 100644 => 100755 migrations/versions/665624ac29f1_.py mode change 100644 => 100755 migrations/versions/69081f1ff387_.py mode change 100644 => 100755 migrations/versions/7be7cecbeea8_.py mode change 100644 => 100755 migrations/versions/7c0de7621a1f_.py mode change 100644 => 100755 migrations/versions/87af86338630_.py mode change 100644 => 100755 migrations/versions/8856126b6658_.py mode change 100644 => 100755 migrations/versions/8b976945a54e_.py mode change 100644 => 100755 migrations/versions/90dd63672e0a_.py mode change 100644 => 100755 migrations/versions/9b43e725f39c_.py mode change 100644 => 100755 migrations/versions/ab06a94e5d4c_.py mode change 100644 => 100755 migrations/versions/abeffe547305_update_type_on_task_events_table.py mode change 100644 => 100755 migrations/versions/afecb64d2e66_.py mode change 100644 => 100755 migrations/versions/bbf064082623_.py mode change 100644 => 100755 migrations/versions/bec71f7dc652_.py mode change 100644 => 100755 migrations/versions/c1449d1d1681_.py mode change 100644 => 100755 migrations/versions/c16d3047abbe_.py mode change 100644 => 100755 migrations/versions/c4ddb69e7ef4_.py mode change 100644 => 100755 migrations/versions/c6261ac7a7bc_.py mode change 100644 => 100755 migrations/versions/c872232ebdcb_.py mode change 100644 => 100755 migrations/versions/cb892916166a_.py mode change 100644 => 100755 migrations/versions/cc4bccc5e5a8_.py mode change 100644 => 100755 migrations/versions/dc30b8f6571c_merge_30e017a03948_and_c16d3047abbe.py mode change 100644 => 100755 migrations/versions/ddd5fc9ea75b_.py mode change 100644 => 100755 migrations/versions/de30304ff5e6_.py mode change 100644 => 100755 migrations/versions/e0dfdbfd6f69_add_columns.py mode change 100644 => 100755 migrations/versions/f186725c1ad3_.py mode change 100644 => 100755 migrations/versions/f28ee3722c49_.py mode change 100644 => 100755 migrations/versions/ff29528a9909_.py mode change 100644 => 100755 migrations/versions/ffef4661a37d_.py mode change 100644 => 100755 package-lock.json mode change 100644 => 100755 postgres/docker-compose.yml mode change 100644 => 100755 postgres/docker-windows-compose.yml mode change 100644 => 100755 postgres/package-lock.json mode change 100644 => 100755 postgres/pg-init-scripts/initdb.sh mode change 100644 => 100755 readme_images/new_project.png mode change 100644 => 100755 readme_images/run.png mode change 100644 => 100755 readme_images/run_config.png mode change 100644 => 100755 readme_images/settings.png mode change 100644 => 100755 run.py mode change 100644 => 100755 schema/__init__.py mode change 100644 => 100755 setup.cfg mode change 100644 => 100755 setup.py mode change 100644 => 100755 tests/__init__.py mode change 100644 => 100755 tests/base_test.py mode change 100644 => 100755 tests/data/add_delete_irb_document/add_delete_irb_document.bpmn mode change 100644 => 100755 tests/data/associated_email/associated_email.bpmn mode change 100644 => 100755 tests/data/boolean_default_value/boolean_default_value.bpmn mode change 100644 => 100755 tests/data/check_study_script/check_study_script.bpmn mode change 100644 => 100755 tests/data/decision_table/decision_table.bpmn mode change 100644 => 100755 tests/data/decision_table/message_to_ginger.dmn mode change 100644 => 100755 tests/data/decision_table_dictionary_output/decision_table_dictionary_output.bpmn mode change 100644 => 100755 tests/data/decision_table_dictionary_output/decision_table_dictionary_output.dmn mode change 100644 => 100755 tests/data/decision_table_invalid/bad_dmn.dmn mode change 100644 => 100755 tests/data/decision_table_invalid/decision_table_invalid.bpmn mode change 100644 => 100755 tests/data/docx/Letter.docx mode change 100644 => 100755 tests/data/docx/docx.bpmn mode change 100644 => 100755 tests/data/email/email.bpmn mode change 100644 => 100755 tests/data/email_dashboard_url/email_dashboard_url.bpmn mode change 100644 => 100755 tests/data/email_script/email_script.bpmn mode change 100644 => 100755 tests/data/empty_workflow/empty_workflow.bpmn mode change 100644 => 100755 tests/data/enum_empty_list/empty_spreadsheet.xlsx mode change 100644 => 100755 tests/data/enum_empty_list/enum_empty_list.bpmn mode change 100644 => 100755 tests/data/enum_options_competing_files/animals.xlsx mode change 100644 => 100755 tests/data/enum_options_competing_files/enum_options_competing_files.bpmn mode change 100644 => 100755 tests/data/enum_options_competing_files/fruits.xlsx mode change 100644 => 100755 tests/data/enum_options_from_file/customer_list.xlsx mode change 100644 => 100755 tests/data/enum_options_from_file/enum_options_from_file.bpmn mode change 100644 => 100755 tests/data/enum_options_from_task_data/enum_options_from_task_data.bpmn mode change 100644 => 100755 tests/data/enum_options_with_search/enum_options_with_search.bpmn mode change 100644 => 100755 tests/data/enum_options_with_search/sponsors.xlsx mode change 100644 => 100755 tests/data/enum_options_with_search/sponsors_modified.xlsx mode change 100644 => 100755 tests/data/enum_results/enum_results.bpmn mode change 100644 => 100755 tests/data/enum_value_expression/Decision_Value_Expression.dmn mode change 100644 => 100755 tests/data/enum_value_expression/enum_value_expression.bpmn mode change 100644 => 100755 tests/data/enum_value_expression_fail/Decision_Value_Expression.dmn mode change 100644 => 100755 tests/data/enum_value_expression_fail/enum_value_expression_fail.bpmn mode change 100644 => 100755 tests/data/exclusive_gateway/exclusive_gateway.bpmn mode change 100644 => 100755 tests/data/exclusive_gateway_2/exclusive_gateway_2.bpmn mode change 100644 => 100755 tests/data/extension_error/extension_error.bpmn mode change 100644 => 100755 tests/data/failing_gateway_workflow/failing_gateway_workflow.bpmn mode change 100644 => 100755 tests/data/failing_workflow/failing_workflow.bpmn mode change 100644 => 100755 tests/data/file_data_store/file_data_store.bpmn mode change 100644 => 100755 tests/data/file_upload_form/file_upload_form.bpmn mode change 100644 => 100755 tests/data/file_upload_form_single/file_upload_form_single.bpmn mode change 100644 => 100755 tests/data/form_expressions/form_expressions.bpmn mode change 100644 => 100755 tests/data/get_study_associate/get_study_associate.bpmn mode change 100644 => 100755 tests/data/hello_world/hello_world.bpmn mode change 100644 => 100755 tests/data/hidden_required_field/hidden_required_field.bpmn mode change 100644 => 100755 tests/data/hidden_required_field_pass/hidden_required_field_pass.bpmn mode change 100644 => 100755 tests/data/hidden_required_field_pass_expression/hidden_required_field_pass_expression.bpmn mode change 100644 => 100755 tests/data/infinite_loop/infinite_loop.bpmn mode change 100644 => 100755 tests/data/invalid_expression/invalid_expression.bpmn mode change 100644 => 100755 tests/data/invalid_roles/invalid_roles.bpmn mode change 100644 => 100755 tests/data/invalid_script/invalid_script.bpmn mode change 100644 => 100755 tests/data/invalid_script2/invalid_script2.bpmn mode change 100644 => 100755 tests/data/invalid_script3/invalid_script3.bpmn mode change 100644 => 100755 tests/data/invalid_spec/invalid_spec.bpmn mode change 100644 => 100755 tests/data/irb_api_personnel/irb_api_personnel.bpmn mode change 100644 => 100755 tests/data/irb_info_script/irb_info_script.bpmn mode change 100644 => 100755 tests/data/ldap_lookup/ldap_lookup.bpmn mode change 100644 => 100755 tests/data/ldap_response.json mode change 100644 => 100755 tests/data/ldap_script/ldap_script.bpmn mode change 100644 => 100755 tests/data/looping_task/looping_task.bpmn mode change 100644 => 100755 tests/data/manual_task_with_external_documentation/Task_Manual_One.md mode change 100644 => 100755 tests/data/manual_task_with_external_documentation/manual_task_with_external_documentation.bpmn mode change 100644 => 100755 tests/data/message_event/message_event.bpmn mode change 100644 => 100755 tests/data/missing_form_key/missing_form_key.bpmn mode change 100644 => 100755 tests/data/multi_instance/multi_instance.bpmn mode change 100644 => 100755 tests/data/multi_instance_parallel/multi_instance_parallel.bpmn mode change 100644 => 100755 tests/data/nav_order/nav_order.bpmn mode change 100644 => 100755 tests/data/parallel_tasks/parallel_tasks.bpmn mode change 100644 => 100755 tests/data/pb_responses/check_study.json mode change 100644 => 100755 tests/data/pb_responses/investigators.json mode change 100644 => 100755 tests/data/pb_responses/irb_info.json mode change 100644 => 100755 tests/data/pb_responses/required_docs.json mode change 100644 => 100755 tests/data/pb_responses/sponsors.json mode change 100644 => 100755 tests/data/pb_responses/study_details.json mode change 100644 => 100755 tests/data/pb_responses/study_details_bad_review_type.json mode change 100644 => 100755 tests/data/pb_responses/user_studies.json mode change 100644 => 100755 tests/data/random_fact/random_fact.bpmn mode change 100644 => 100755 tests/data/random_fact/random_fact2.bpmn mode change 100644 => 100755 tests/data/read_only_field/read_only_field.bpmn mode change 100644 => 100755 tests/data/repeat_form/repeat_form.bpmn mode change 100644 => 100755 tests/data/required_fields/required_fields.bpmn mode change 100644 => 100755 tests/data/reset_workflow/reset_workflow.bpmn mode change 100644 => 100755 tests/data/roles/roles.bpmn mode change 100644 => 100755 tests/data/script_with_name_error/script_with_name_error.bpmn mode change 100644 => 100755 tests/data/study_cancellations/study_cancellations.bpmn mode change 100644 => 100755 tests/data/study_details/study_details.bpmn mode change 100644 => 100755 tests/data/study_info_script/study_info_script.bpmn mode change 100644 => 100755 tests/data/study_sponsors/study_sponsors.bpmn mode change 100644 => 100755 tests/data/study_sponsors_associate/study_sponsors_associate.bpmn mode change 100644 => 100755 tests/data/study_sponsors_associate_fail/study_sponsors_associate_fail.bpmn mode change 100644 => 100755 tests/data/study_sponsors_associate_switch_user/study_sponsors_associate_switch_user.bpmn mode change 100644 => 100755 tests/data/study_sponsors_associates_delete/study_sponsors_associates_delete.bpmn mode change 100644 => 100755 tests/data/study_sponsors_data_store/study_sponsors_data_store.bpmn mode change 100644 => 100755 tests/data/subprocess/subprocess.bpmn mode change 100644 => 100755 tests/data/table.docx mode change 100644 => 100755 tests/data/test_value_expression/test_value_expression.bpmn mode change 100644 => 100755 tests/data/timer_event/timer_event.bpmn mode change 100644 => 100755 tests/data/timer_event_error/timer_event_error.bpmn mode change 100644 => 100755 tests/data/top_level_workflow/data_security_plan.dmn mode change 100644 => 100755 tests/data/top_level_workflow/enter_core_info.dmn mode change 100644 => 100755 tests/data/top_level_workflow/sponsor_funding_source.dmn mode change 100644 => 100755 tests/data/top_level_workflow/top_level_workflow.bpmn mode change 100644 => 100755 tests/data/two_forms/modified/two_forms_struc_mod.bpmn mode change 100644 => 100755 tests/data/two_forms/modified/two_forms_text_mod.bpmn mode change 100644 => 100755 tests/data/two_forms/two_forms.bpmn mode change 100644 => 100755 tests/data/two_user_tasks/two_user_tasks.bpmn mode change 100644 => 100755 tests/data/verify_end_event/verify_end_event.bpmn mode change 100644 => 100755 tests/data/workflow_form_field_name/workflow_form_field_name.bpmn mode change 100644 => 100755 tests/data/workflow_form_field_type/workflow_form_field_type.bpmn mode change 100644 => 100755 tests/data/workflow_sync_responses/random_fact2.bpmn mode change 100644 => 100755 tests/data/workflow_sync_responses/test.txt mode change 100644 => 100755 tests/emails/__init__.py mode change 100644 => 100755 tests/emails/test_email_script.py mode change 100644 => 100755 tests/emails/test_email_service.py mode change 100644 => 100755 tests/files/__init__.py mode change 100644 => 100755 tests/files/test_file_service.py mode change 100644 => 100755 tests/files/test_files_api.py mode change 100644 => 100755 tests/ldap/__init__.py mode change 100644 => 100755 tests/ldap/test_ldap_lookup_script.py mode change 100644 => 100755 tests/scripts/__init__.py mode change 100644 => 100755 tests/scripts/test_check_study.py mode change 100644 => 100755 tests/scripts/test_get_study_associate_validation.py mode change 100644 => 100755 tests/study/__init__.py mode change 100644 => 100755 tests/study/test_get_study_from_model.py mode change 100644 => 100755 tests/study/test_study_actions_status.py mode change 100644 => 100755 tests/study/test_study_api.py mode change 100644 => 100755 tests/study/test_study_associate_script.py mode change 100644 => 100755 tests/study/test_study_cancellations.py mode change 100644 => 100755 tests/study/test_study_data_store_script.py mode change 100644 => 100755 tests/study/test_study_details.py mode change 100644 => 100755 tests/study/test_study_details_documents.py mode change 100644 => 100755 tests/study/test_study_service.py mode change 100644 => 100755 tests/study/test_study_sponsors_script.py mode change 100644 => 100755 tests/study/test_study_status_message.py mode change 100644 => 100755 tests/study/test_update_study_script.py mode change 100644 => 100755 tests/test_authentication.py mode change 100644 => 100755 tests/test_auto_set_primary_bpmn.py mode change 100644 => 100755 tests/test_complete_template_script.py mode change 100644 => 100755 tests/test_datastore_api.py mode change 100644 => 100755 tests/test_decision_table_dictionary_output.py mode change 100644 => 100755 tests/test_document_directories.py mode change 100644 => 100755 tests/test_email_script.py mode change 100644 => 100755 tests/test_events.py mode change 100644 => 100755 tests/test_file_datastore.py mode change 100644 => 100755 tests/test_get_dashboard_url_script.py mode change 100644 => 100755 tests/test_irb_info_script.py mode change 100644 => 100755 tests/test_is_file_uploaded_script.py mode change 100644 => 100755 tests/test_launch_workflow_outside_study.py mode change 100644 => 100755 tests/test_ldap_service.py mode change 100644 => 100755 tests/test_lookup_service.py mode change 100644 => 100755 tests/test_looping_task.py mode change 100644 => 100755 tests/test_message_event.py mode change 100644 => 100755 tests/test_multi_instance_tasks_api.py mode change 100644 => 100755 tests/test_protocol_builder.py mode change 100644 => 100755 tests/test_study_info_script.py mode change 100644 => 100755 tests/test_tasks_api.py mode change 100644 => 100755 tests/test_tools_api.py mode change 100644 => 100755 tests/test_user_in_logs.py mode change 100644 => 100755 tests/test_user_roles.py mode change 100644 => 100755 tests/test_verify_end_event.py mode change 100644 => 100755 tests/test_wait_event.py mode change 100644 => 100755 tests/test_workflow_api.py mode change 100644 => 100755 tests/test_workflow_sync.py mode change 100644 => 100755 tests/workflow/__init__.py mode change 100644 => 100755 tests/workflow/test_duplicate_workflow_spec_file.py mode change 100644 => 100755 tests/workflow/test_workflow_boolean_default.py mode change 100644 => 100755 tests/workflow/test_workflow_customer_error.py mode change 100644 => 100755 tests/workflow/test_workflow_delete_irb_document.py mode change 100644 => 100755 tests/workflow/test_workflow_enum_default_value_expression.py mode change 100644 => 100755 tests/workflow/test_workflow_enum_empty_list.py mode change 100644 => 100755 tests/workflow/test_workflow_form_field_name.py mode change 100644 => 100755 tests/workflow/test_workflow_form_field_type.py mode change 100644 => 100755 tests/workflow/test_workflow_hidden_required_field.py mode change 100644 => 100755 tests/workflow/test_workflow_infinite_loop.py mode change 100644 => 100755 tests/workflow/test_workflow_missing_form_key.py mode change 100644 => 100755 tests/workflow/test_workflow_name_error_hint.py mode change 100644 => 100755 tests/workflow/test_workflow_processor.py mode change 100644 => 100755 tests/workflow/test_workflow_processor_multi_instance.py mode change 100644 => 100755 tests/workflow/test_workflow_read_only_field.py mode change 100644 => 100755 tests/workflow/test_workflow_reset.py mode change 100644 => 100755 tests/workflow/test_workflow_restart.py mode change 100644 => 100755 tests/workflow/test_workflow_service.py mode change 100644 => 100755 tests/workflow/test_workflow_spec_api.py mode change 100644 => 100755 tests/workflow/test_workflow_spec_validation_api.py mode change 100644 => 100755 tests/workflow/test_workflow_value_expression.py mode change 100644 => 100755 wsgi.py diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index ee558d50..92974e1a --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ local.properties .settings/ .loadpath .recommenders - +.vscode/ # External tool builders .externalToolBuilders/ diff --git a/.sonarcloud.properties b/.sonarcloud.properties old mode 100644 new mode 100755 diff --git a/.travis.yml b/.travis.yml old mode 100644 new mode 100755 diff --git a/Dockerfile b/Dockerfile old mode 100644 new mode 100755 diff --git a/LICENSE.md b/LICENSE.md old mode 100644 new mode 100755 diff --git a/Pipfile b/Pipfile old mode 100644 new mode 100755 diff --git a/Pipfile.lock b/Pipfile.lock old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/config/default.py b/config/default.py old mode 100644 new mode 100755 diff --git a/config/logging_example.py b/config/logging_example.py old mode 100644 new mode 100755 diff --git a/config/testing.py b/config/testing.py old mode 100644 new mode 100755 diff --git a/crc/__init__.py b/crc/__init__.py old mode 100644 new mode 100755 diff --git a/crc/api.yml b/crc/api.yml old mode 100644 new mode 100755 index 24fb0cda..38388de5 --- a/crc/api.yml +++ b/crc/api.yml @@ -399,22 +399,24 @@ paths: - name: study_id in: path required: true - description: The id of the study for which workflows should be returned. + description: The id of the study for which associates should be returned. schema: type: integer format: int32 get: operationId: crc.api.study.get_study_associates - summary: Provides a single study + summary: Provides a list of associates for a particular study tags: - Studies responses: '200': - description: An Study Associate Object + description: list of Study Associate Objects content: application/json: schema: - $ref: "#/components/schemas/StudyAssociate" + type: array + items: + $ref: "#/components/schemas/StudyAssociate" /workflow-specification: get: @@ -1589,39 +1591,15 @@ components: example: "27b-6-1212" StudyAssociate: properties: - id: - type: integer - example: 1234 - title: + uid: type: string - example: The impact of fried pickles on beer consumption in bipedal software developers. - last_updated: + example: "dhf8r" + access: + type: boolean + example: False + role: type: string - format: date_time - example: "2019-12-25T09:12:33.001Z" - primary_investigator_id: - type: string - x-nullable: true - example: dhf8r - user_uid: - type: string - example: dhf8r - status: - type: string - enum: ['in_progress', 'hold', 'open_for_enrollment', 'abandoned'] - example: done - sponsor: - type: string - x-nullable: true - example: "Sartography Pharmaceuticals" - ind_number: - type: string - x-nullable: true - example: "27b-6-42" - hsr_number: - type: string - x-nullable: true - example: "27b-6-1212" + example: "TODO" DocumentDirectory: properties: level: diff --git a/crc/api/__init__.py b/crc/api/__init__.py old mode 100644 new mode 100755 diff --git a/crc/api/admin.py b/crc/api/admin.py old mode 100644 new mode 100755 diff --git a/crc/api/common.py b/crc/api/common.py old mode 100644 new mode 100755 diff --git a/crc/api/data_store.py b/crc/api/data_store.py old mode 100644 new mode 100755 diff --git a/crc/api/document.py b/crc/api/document.py old mode 100644 new mode 100755 diff --git a/crc/api/file.py b/crc/api/file.py old mode 100644 new mode 100755 diff --git a/crc/api/study.py b/crc/api/study.py old mode 100644 new mode 100755 diff --git a/crc/api/tools.py b/crc/api/tools.py old mode 100644 new mode 100755 diff --git a/crc/api/user.py b/crc/api/user.py old mode 100644 new mode 100755 diff --git a/crc/api/workflow.py b/crc/api/workflow.py old mode 100644 new mode 100755 diff --git a/crc/api/workflow_sync.py b/crc/api/workflow_sync.py old mode 100644 new mode 100755 diff --git a/crc/models/__init__.py b/crc/models/__init__.py old mode 100644 new mode 100755 diff --git a/crc/models/api_models.py b/crc/models/api_models.py old mode 100644 new mode 100755 diff --git a/crc/models/data_store.py b/crc/models/data_store.py old mode 100644 new mode 100755 diff --git a/crc/models/email.py b/crc/models/email.py old mode 100644 new mode 100755 diff --git a/crc/models/file.py b/crc/models/file.py old mode 100644 new mode 100755 diff --git a/crc/models/ldap.py b/crc/models/ldap.py old mode 100644 new mode 100755 diff --git a/crc/models/protocol_builder.py b/crc/models/protocol_builder.py old mode 100644 new mode 100755 diff --git a/crc/models/study.py b/crc/models/study.py old mode 100644 new mode 100755 index 69da16fe..155ac7a4 --- a/crc/models/study.py +++ b/crc/models/study.py @@ -79,6 +79,7 @@ class StudyAssociated(db.Model): role = db.Column(db.String, nullable=True) send_email = db.Column(db.Boolean, nullable=True) access = db.Column(db.Boolean, nullable=True) + class StudyAssociatedSchema(ma.Schema): class Meta: model = StudyAssociated diff --git a/crc/models/task_event.py b/crc/models/task_event.py old mode 100644 new mode 100755 diff --git a/crc/models/user.py b/crc/models/user.py old mode 100644 new mode 100755 diff --git a/crc/models/workflow.py b/crc/models/workflow.py old mode 100644 new mode 100755 diff --git a/crc/scripts/__init__.py b/crc/scripts/__init__.py old mode 100644 new mode 100755 diff --git a/crc/scripts/check_study.py b/crc/scripts/check_study.py old mode 100644 new mode 100755 diff --git a/crc/scripts/complete_template.py b/crc/scripts/complete_template.py old mode 100644 new mode 100755 diff --git a/crc/scripts/delete_file.py b/crc/scripts/delete_file.py old mode 100644 new mode 100755 diff --git a/crc/scripts/email.py b/crc/scripts/email.py old mode 100644 new mode 100755 diff --git a/crc/scripts/fact_service.py b/crc/scripts/fact_service.py old mode 100644 new mode 100755 diff --git a/crc/scripts/failing_script.py b/crc/scripts/failing_script.py old mode 100644 new mode 100755 diff --git a/crc/scripts/file_data_get.py b/crc/scripts/file_data_get.py old mode 100644 new mode 100755 diff --git a/crc/scripts/file_data_set.py b/crc/scripts/file_data_set.py old mode 100644 new mode 100755 diff --git a/crc/scripts/get_dashboard_url.py b/crc/scripts/get_dashboard_url.py old mode 100644 new mode 100755 diff --git a/crc/scripts/get_irb_info.py b/crc/scripts/get_irb_info.py old mode 100644 new mode 100755 diff --git a/crc/scripts/get_study_associate.py b/crc/scripts/get_study_associate.py old mode 100644 new mode 100755 diff --git a/crc/scripts/get_study_associates.py b/crc/scripts/get_study_associates.py old mode 100644 new mode 100755 diff --git a/crc/scripts/is_file_uploaded.py b/crc/scripts/is_file_uploaded.py old mode 100644 new mode 100755 diff --git a/crc/scripts/ldap.py b/crc/scripts/ldap.py old mode 100644 new mode 100755 diff --git a/crc/scripts/reset_workflow.py b/crc/scripts/reset_workflow.py old mode 100644 new mode 100755 diff --git a/crc/scripts/script.py b/crc/scripts/script.py old mode 100644 new mode 100755 diff --git a/crc/scripts/study_data_get.py b/crc/scripts/study_data_get.py old mode 100644 new mode 100755 diff --git a/crc/scripts/study_data_set.py b/crc/scripts/study_data_set.py old mode 100644 new mode 100755 diff --git a/crc/scripts/study_info.py b/crc/scripts/study_info.py old mode 100644 new mode 100755 diff --git a/crc/scripts/update_study.py b/crc/scripts/update_study.py old mode 100644 new mode 100755 diff --git a/crc/scripts/update_study_associate.py b/crc/scripts/update_study_associate.py old mode 100644 new mode 100755 diff --git a/crc/scripts/update_study_associates.py b/crc/scripts/update_study_associates.py old mode 100644 new mode 100755 diff --git a/crc/scripts/user_data_get.py b/crc/scripts/user_data_get.py old mode 100644 new mode 100755 diff --git a/crc/scripts/user_data_set.py b/crc/scripts/user_data_set.py old mode 100644 new mode 100755 diff --git a/crc/services/__init__.py b/crc/services/__init__.py old mode 100644 new mode 100755 diff --git a/crc/services/cache_service.py b/crc/services/cache_service.py old mode 100644 new mode 100755 diff --git a/crc/services/data_store_service.py b/crc/services/data_store_service.py old mode 100644 new mode 100755 diff --git a/crc/services/document_service.py b/crc/services/document_service.py old mode 100644 new mode 100755 diff --git a/crc/services/email_service.py b/crc/services/email_service.py old mode 100644 new mode 100755 diff --git a/crc/services/error_service.py b/crc/services/error_service.py old mode 100644 new mode 100755 diff --git a/crc/services/failing_service.py b/crc/services/failing_service.py old mode 100644 new mode 100755 diff --git a/crc/services/file_service.py b/crc/services/file_service.py old mode 100644 new mode 100755 diff --git a/crc/services/ldap_service.py b/crc/services/ldap_service.py old mode 100644 new mode 100755 diff --git a/crc/services/lookup_service.py b/crc/services/lookup_service.py old mode 100644 new mode 100755 diff --git a/crc/services/protocol_builder.py b/crc/services/protocol_builder.py old mode 100644 new mode 100755 diff --git a/crc/services/study_service.py b/crc/services/study_service.py old mode 100644 new mode 100755 index 5b8d12ea..90b52368 --- a/crc/services/study_service.py +++ b/crc/services/study_service.py @@ -24,6 +24,7 @@ from crc.models.task_event import TaskEventModel, TaskEvent from crc.models.workflow import WorkflowSpecCategoryModel, WorkflowModel, WorkflowSpecModel, WorkflowState, \ WorkflowStatus, WorkflowSpecDependencyFile from crc.services.document_service import DocumentService + from crc.services.file_service import FileService from crc.services.ldap_service import LdapService from crc.services.lookup_service import LookupService @@ -122,14 +123,18 @@ class StudyService(object): raise ApiError('uid not specified','A valid uva uid is required for this function') if uid == study.user_uid: - return {'uid': ownerid, 'role': 'owner', 'send_email': True, 'access': True} + return {'uid': uid, 'role': 'owner', 'send_email': True, 'access': True} person = db.session.query(StudyAssociated).filter((StudyAssociated.study_id == study_id)&( StudyAssociated.uid == uid)).first() if person: - return StudyAssociatedSchema().dump(person) + newAssociate = {'uid': person.uid} + newAssociate['role'] = person.role + newAssociate['send_email'] = person.send_email + newAssociate['access'] = person.access + return newAssociate raise ApiError('uid_not_associated_with_study',"user id %s was not associated with study number %d"%(uid, study_id)) @@ -148,7 +153,12 @@ class StudyService(object): people = db.session.query(StudyAssociated).filter(StudyAssociated.study_id == study_id) people_list = [{'uid':ownerid,'role':'owner','send_email':True,'access':True}] - people_list += StudyAssociatedSchema().dump(people, many=True) + for person in people: + newAssociate = {'uid':person.uid} + newAssociate['role'] = person.role + newAssociate['send_email'] = person.send_email + newAssociate['access'] = person.access + people_list.append(newAssociate) return people_list @@ -227,6 +237,7 @@ class StudyService(object): for workflow in session.query(WorkflowModel).filter_by(study_id=study_id): StudyService.delete_workflow(workflow.id) study = session.query(StudyModel).filter_by(id=study_id).first() + study = session.query(StudyModel).filter_by(id=study_id).first() session.delete(study) session.commit() @@ -382,7 +393,6 @@ class StudyService(object): in sync with the studies available in protocol builder. """ if ProtocolBuilderService.is_enabled(): - app.logger.info("The Protocol Builder is enabled. app.config['PB_ENABLED'] = " + str(app.config['PB_ENABLED'])) @@ -398,10 +408,11 @@ class StudyService(object): for pb_study in pb_studies: new_status = None db_study = next((s for s in db_studies if s.id == pb_study.STUDYID), None) - if not db_study: + if not db_study: # Create a Study db_study = StudyModel(id=pb_study.STUDYID) db_study.status = None # Force a new sa new_status = StudyStatus.in_progress + session.add(db_study) db_studies.append(db_study) diff --git a/crc/services/user_service.py b/crc/services/user_service.py old mode 100644 new mode 100755 diff --git a/crc/services/workflow_processor.py b/crc/services/workflow_processor.py old mode 100644 new mode 100755 diff --git a/crc/services/workflow_service.py b/crc/services/workflow_service.py old mode 100644 new mode 100755 index 31e26c28..44077fe7 --- a/crc/services/workflow_service.py +++ b/crc/services/workflow_service.py @@ -765,7 +765,7 @@ class WorkflowService(object): else: if not hasattr(spiff_task.task_spec, 'lane') or spiff_task.task_spec.lane is None: associated = StudyService.get_study_associates(processor.workflow_model.study.id) - return [user['uid'] for user in associated if user['access']] + return [user['uid'] for user in associated if user.get("access")] if spiff_task.task_spec.lane not in spiff_task.data: return [] # No users are assignable to the task at this moment lane_users = spiff_task.data[spiff_task.task_spec.lane] @@ -775,7 +775,7 @@ class WorkflowService(object): lane_uids = [] for user in lane_users: if isinstance(user, dict): - if 'value' in user and user['value'] is not None: + if user.get("value"): lane_uids.append(user['value']) else: raise ApiError.from_task(code="task_lane_user_error", message="Spiff Task %s lane user dict must have a key called 'value' with the user's uid in it." % diff --git a/crc/services/workflow_sync.py b/crc/services/workflow_sync.py old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/abandoned/abandoned.bpmn b/crc/static/bpmn/abandoned/abandoned.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/core_info/SponsorList.xls b/crc/static/bpmn/core_info/SponsorList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/core_info/core_info.bpmn b/crc/static/bpmn/core_info/core_info.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/core_info/decision_core_info_multi_site_q12.dmn b/crc/static/bpmn/core_info/decision_core_info_multi_site_q12.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/core_info/decision_core_info_multi_site_q14.dmn b/crc/static/bpmn/core_info/decision_core_info_multi_site_q14.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/core_info/decision_core_info_multi_site_q28.dmn b/crc/static/bpmn/core_info/decision_core_info_multi_site_q28.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/data_security_plan/HIPAA_Ids.xls b/crc/static/bpmn/data_security_plan/HIPAA_Ids.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/data_security_plan/NEW_DSP_template.docx b/crc/static/bpmn/data_security_plan/NEW_DSP_template.docx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/data_security_plan/UVA_ServersWebsitesList.xls b/crc/static/bpmn/data_security_plan/UVA_ServersWebsitesList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/data_security_plan/data_security_plan.bpmn b/crc/static/bpmn/data_security_plan/data_security_plan.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/department_chair_approval/decision_dept_chair.dmn b/crc/static/bpmn/department_chair_approval/decision_dept_chair.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/department_chair_approval/dept_chair_approval.bpmn b/crc/static/bpmn/department_chair_approval/dept_chair_approval.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/documents_approvals/documents_approvals.bpmn b/crc/static/bpmn/documents_approvals/documents_approvals.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/enrollment_date/enrollment_date.bpmn b/crc/static/bpmn/enrollment_date/enrollment_date.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/finance/finance.bpmn b/crc/static/bpmn/finance/finance.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/hold/hold.bpmn b/crc/static/bpmn/hold/hold.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ide_supplement/SponsorList.xls b/crc/static/bpmn/ide_supplement/SponsorList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ide_supplement/decision_ide_check.dmn b/crc/static/bpmn/ide_supplement/decision_ide_check.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ide_supplement/ide_update.bpmn b/crc/static/bpmn/ide_supplement/ide_update.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ids_full_submission/ids_full_submission.bpmn b/crc/static/bpmn/ids_full_submission/ids_full_submission.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ids_full_submission/investigators_brochure.dmn b/crc/static/bpmn/ids_full_submission/investigators_brochure.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ids_full_submission/ivrs_iwrs_ixrs.dmn b/crc/static/bpmn/ids_full_submission/ivrs_iwrs_ixrs.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ids_full_submission/pharmacy_manual.dmn b/crc/static/bpmn/ids_full_submission/pharmacy_manual.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ids_waiver/ids_waiver.bpmn b/crc/static/bpmn/ids_waiver/ids_waiver.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ind_update/SponsorList.xls b/crc/static/bpmn/ind_update/SponsorList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ind_update/decision_ind_check.dmn b/crc/static/bpmn/ind_update/decision_ind_check.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ind_update/decision_ind_uva_check.dmn b/crc/static/bpmn/ind_update/decision_ind_uva_check.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/ind_update/ind_update.bpmn b/crc/static/bpmn/ind_update/ind_update.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_details/irb_api_details.bpmn b/crc/static/bpmn/irb_api_details/irb_api_details.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/DepartmentList-ArtsSciences.xlsx b/crc/static/bpmn/irb_api_personnel/DepartmentList-ArtsSciences.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/DepartmentList-Education.xlsx b/crc/static/bpmn/irb_api_personnel/DepartmentList-Education.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/DepartmentList-Medicine.xlsx b/crc/static/bpmn/irb_api_personnel/DepartmentList-Medicine.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/SchoolList.xls b/crc/static/bpmn/irb_api_personnel/SchoolList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/check_for_pi.dmn b/crc/static/bpmn/irb_api_personnel/check_for_pi.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/decision_dept_chair.dmn b/crc/static/bpmn/irb_api_personnel/decision_dept_chair.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/decision_pi_dept.dmn b/crc/static/bpmn/irb_api_personnel/decision_pi_dept.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/decision_pi_school.dmn b/crc/static/bpmn/irb_api_personnel/decision_pi_school.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/decision_ro.dmn b/crc/static/bpmn/irb_api_personnel/decision_ro.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/decision_ro_chair.dmn b/crc/static/bpmn/irb_api_personnel/decision_ro_chair.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/decision_ro_dept.dmn b/crc/static/bpmn/irb_api_personnel/decision_ro_dept.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/irb_api_personnel/irb_api_personnel.bpmn b/crc/static/bpmn/irb_api_personnel/irb_api_personnel.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/non_uva_approval/non_uva_approval.bpmn b/crc/static/bpmn/non_uva_approval/non_uva_approval.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/notifications/notifications.bpmn b/crc/static/bpmn/notifications/notifications.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/protocol/protocol.bpmn b/crc/static/bpmn/protocol/protocol.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/BuildingList.xls b/crc/static/bpmn/research_rampup/BuildingList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/DepartmentList-Architecture.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-Architecture.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/DepartmentList-ArtsSciences.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-ArtsSciences.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/DepartmentList-Education.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-Education.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/DepartmentList-Engineering.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-Engineering.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/DepartmentList-Medicine.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-Medicine.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/DepartmentList-ProvostOffice.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-ProvostOffice.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/DepartmentList.xlsx b/crc/static/bpmn/research_rampup/DepartmentList.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/LabSpaces.xlsx b/crc/static/bpmn/research_rampup/LabSpaces.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/RTT_Approvers.dmn b/crc/static/bpmn/research_rampup/RTT_Approvers.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/ResearchRampUpPlan.docx b/crc/static/bpmn/research_rampup/ResearchRampUpPlan.docx old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/SchoolList.xls b/crc/static/bpmn/research_rampup/SchoolList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/exclusive_area_monitors.dmn b/crc/static/bpmn/research_rampup/exclusive_area_monitors.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/research_rampup.bpmn b/crc/static/bpmn/research_rampup/research_rampup.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/research_rampup/shared_area_monitors.dmn b/crc/static/bpmn/research_rampup/shared_area_monitors.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/rrt_top_level_workflow/rrt_top_level_workflow.bpmn b/crc/static/bpmn/rrt_top_level_workflow/rrt_top_level_workflow.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/rsc_hire_committee/decision_support_lang.dmn b/crc/static/bpmn/rsc_hire_committee/decision_support_lang.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/rsc_hire_committee/rsc_hire_committee.bpmn b/crc/static/bpmn/rsc_hire_committee/rsc_hire_committee.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/rsc_hire_submission/rsc_hire_submission.bpmn b/crc/static/bpmn/rsc_hire_submission/rsc_hire_submission.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/sponsor_funding_source/SponsorList.xls b/crc/static/bpmn/sponsor_funding_source/SponsorList.xls old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/sponsor_funding_source/sponsor_funding_source.bpmn b/crc/static/bpmn/sponsor_funding_source/sponsor_funding_source.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/data_security_plan.dmn b/crc/static/bpmn/top_level_workflow/data_security_plan.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/enter_core_info.dmn b/crc/static/bpmn/top_level_workflow/enter_core_info.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/ide_supplement.dmn b/crc/static/bpmn/top_level_workflow/ide_supplement.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/ids_full_submission.dmn b/crc/static/bpmn/top_level_workflow/ids_full_submission.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/ids_waiver.dmn b/crc/static/bpmn/top_level_workflow/ids_waiver.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/ind_update.dmn b/crc/static/bpmn/top_level_workflow/ind_update.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/personnel.dmn b/crc/static/bpmn/top_level_workflow/personnel.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/sponsor_funding_source.dmn b/crc/static/bpmn/top_level_workflow/sponsor_funding_source.dmn old mode 100644 new mode 100755 diff --git a/crc/static/bpmn/top_level_workflow/top_level_workflow.bpmn b/crc/static/bpmn/top_level_workflow/top_level_workflow.bpmn old mode 100644 new mode 100755 diff --git a/crc/static/jinja_extensions.py b/crc/static/jinja_extensions.py old mode 100644 new mode 100755 diff --git a/crc/static/reference/investigators.xlsx b/crc/static/reference/investigators.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/reference/irb_documents.xlsx b/crc/static/reference/irb_documents.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/reference/rrt_documents.xlsx b/crc/static/reference/rrt_documents.xlsx old mode 100644 new mode 100755 diff --git a/crc/static/templates/placeholder.docx b/crc/static/templates/placeholder.docx old mode 100644 new mode 100755 diff --git a/crc/static/templates/placeholder.png b/crc/static/templates/placeholder.png old mode 100644 new mode 100755 diff --git a/crc/static/uva_rotunda.svg b/crc/static/uva_rotunda.svg old mode 100644 new mode 100755 diff --git a/crc/templates/mail_content_template.html b/crc/templates/mail_content_template.html old mode 100644 new mode 100755 diff --git a/crc/templates/mail_main_template.html b/crc/templates/mail_main_template.html old mode 100644 new mode 100755 diff --git a/crconnect.wsgi b/crconnect.wsgi old mode 100644 new mode 100755 diff --git a/deploy/requirements.txt b/deploy/requirements.txt old mode 100644 new mode 100755 diff --git a/docs/Makefile b/docs/Makefile old mode 100644 new mode 100755 diff --git a/docs/conf.py b/docs/conf.py old mode 100644 new mode 100755 diff --git a/docs/index.rst b/docs/index.rst old mode 100644 new mode 100755 diff --git a/docs/make.bat b/docs/make.bat old mode 100644 new mode 100755 diff --git a/docs/protocol_builder.html b/docs/protocol_builder.html old mode 100644 new mode 100755 diff --git a/example_data.py b/example_data.py old mode 100644 new mode 100755 diff --git a/fact_runner.py b/fact_runner.py old mode 100644 new mode 100755 diff --git a/migrations/README b/migrations/README old mode 100644 new mode 100755 diff --git a/migrations/alembic.ini b/migrations/alembic.ini old mode 100644 new mode 100755 diff --git a/migrations/env.py b/migrations/env.py old mode 100644 new mode 100755 diff --git a/migrations/script.py.mako b/migrations/script.py.mako old mode 100644 new mode 100755 diff --git a/migrations/versions/0718ad13e5f3_.py b/migrations/versions/0718ad13e5f3_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/0f38d7a36f21_.py b/migrations/versions/0f38d7a36f21_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/13424d5a6de8_.py b/migrations/versions/13424d5a6de8_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/1685be1cc232_.py b/migrations/versions/1685be1cc232_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/17597692d0b0_.py b/migrations/versions/17597692d0b0_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/1c3f88dbccc3_.py b/migrations/versions/1c3f88dbccc3_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/1fdd1bdb600e_.py b/migrations/versions/1fdd1bdb600e_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/23c62c933848_.py b/migrations/versions/23c62c933848_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/2e7b377cbc7b_.py b/migrations/versions/2e7b377cbc7b_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/30e017a03948_.py b/migrations/versions/30e017a03948_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/476f8a4933ba_.py b/migrations/versions/476f8a4933ba_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/5064b72284b7_.py b/migrations/versions/5064b72284b7_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/55c6cd407d89_.py b/migrations/versions/55c6cd407d89_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/5acd138e969c_.py b/migrations/versions/5acd138e969c_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/5e0709e172fa_.py b/migrations/versions/5e0709e172fa_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/5f06108116ae_.py b/migrations/versions/5f06108116ae_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/62910318009f_.py b/migrations/versions/62910318009f_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/65f3fce6031a_.py b/migrations/versions/65f3fce6031a_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/665624ac29f1_.py b/migrations/versions/665624ac29f1_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/69081f1ff387_.py b/migrations/versions/69081f1ff387_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/7be7cecbeea8_.py b/migrations/versions/7be7cecbeea8_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/7c0de7621a1f_.py b/migrations/versions/7c0de7621a1f_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/87af86338630_.py b/migrations/versions/87af86338630_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/8856126b6658_.py b/migrations/versions/8856126b6658_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/8b976945a54e_.py b/migrations/versions/8b976945a54e_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/90dd63672e0a_.py b/migrations/versions/90dd63672e0a_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/9b43e725f39c_.py b/migrations/versions/9b43e725f39c_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/ab06a94e5d4c_.py b/migrations/versions/ab06a94e5d4c_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/abeffe547305_update_type_on_task_events_table.py b/migrations/versions/abeffe547305_update_type_on_task_events_table.py old mode 100644 new mode 100755 diff --git a/migrations/versions/afecb64d2e66_.py b/migrations/versions/afecb64d2e66_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/bbf064082623_.py b/migrations/versions/bbf064082623_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/bec71f7dc652_.py b/migrations/versions/bec71f7dc652_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/c1449d1d1681_.py b/migrations/versions/c1449d1d1681_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/c16d3047abbe_.py b/migrations/versions/c16d3047abbe_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/c4ddb69e7ef4_.py b/migrations/versions/c4ddb69e7ef4_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/c6261ac7a7bc_.py b/migrations/versions/c6261ac7a7bc_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/c872232ebdcb_.py b/migrations/versions/c872232ebdcb_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/cb892916166a_.py b/migrations/versions/cb892916166a_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/cc4bccc5e5a8_.py b/migrations/versions/cc4bccc5e5a8_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/dc30b8f6571c_merge_30e017a03948_and_c16d3047abbe.py b/migrations/versions/dc30b8f6571c_merge_30e017a03948_and_c16d3047abbe.py old mode 100644 new mode 100755 diff --git a/migrations/versions/ddd5fc9ea75b_.py b/migrations/versions/ddd5fc9ea75b_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/de30304ff5e6_.py b/migrations/versions/de30304ff5e6_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/e0dfdbfd6f69_add_columns.py b/migrations/versions/e0dfdbfd6f69_add_columns.py old mode 100644 new mode 100755 diff --git a/migrations/versions/f186725c1ad3_.py b/migrations/versions/f186725c1ad3_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/f28ee3722c49_.py b/migrations/versions/f28ee3722c49_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/ff29528a9909_.py b/migrations/versions/ff29528a9909_.py old mode 100644 new mode 100755 diff --git a/migrations/versions/ffef4661a37d_.py b/migrations/versions/ffef4661a37d_.py old mode 100644 new mode 100755 diff --git a/package-lock.json b/package-lock.json old mode 100644 new mode 100755 diff --git a/postgres/docker-compose.yml b/postgres/docker-compose.yml old mode 100644 new mode 100755 diff --git a/postgres/docker-windows-compose.yml b/postgres/docker-windows-compose.yml old mode 100644 new mode 100755 diff --git a/postgres/package-lock.json b/postgres/package-lock.json old mode 100644 new mode 100755 diff --git a/postgres/pg-init-scripts/initdb.sh b/postgres/pg-init-scripts/initdb.sh old mode 100644 new mode 100755 diff --git a/readme_images/new_project.png b/readme_images/new_project.png old mode 100644 new mode 100755 diff --git a/readme_images/run.png b/readme_images/run.png old mode 100644 new mode 100755 diff --git a/readme_images/run_config.png b/readme_images/run_config.png old mode 100644 new mode 100755 diff --git a/readme_images/settings.png b/readme_images/settings.png old mode 100644 new mode 100755 diff --git a/run.py b/run.py old mode 100644 new mode 100755 diff --git a/schema/__init__.py b/schema/__init__.py old mode 100644 new mode 100755 diff --git a/setup.cfg b/setup.cfg old mode 100644 new mode 100755 diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 diff --git a/tests/__init__.py b/tests/__init__.py old mode 100644 new mode 100755 diff --git a/tests/base_test.py b/tests/base_test.py old mode 100644 new mode 100755 diff --git a/tests/data/add_delete_irb_document/add_delete_irb_document.bpmn b/tests/data/add_delete_irb_document/add_delete_irb_document.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/associated_email/associated_email.bpmn b/tests/data/associated_email/associated_email.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/boolean_default_value/boolean_default_value.bpmn b/tests/data/boolean_default_value/boolean_default_value.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/check_study_script/check_study_script.bpmn b/tests/data/check_study_script/check_study_script.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/decision_table/decision_table.bpmn b/tests/data/decision_table/decision_table.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/decision_table/message_to_ginger.dmn b/tests/data/decision_table/message_to_ginger.dmn old mode 100644 new mode 100755 diff --git a/tests/data/decision_table_dictionary_output/decision_table_dictionary_output.bpmn b/tests/data/decision_table_dictionary_output/decision_table_dictionary_output.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/decision_table_dictionary_output/decision_table_dictionary_output.dmn b/tests/data/decision_table_dictionary_output/decision_table_dictionary_output.dmn old mode 100644 new mode 100755 diff --git a/tests/data/decision_table_invalid/bad_dmn.dmn b/tests/data/decision_table_invalid/bad_dmn.dmn old mode 100644 new mode 100755 diff --git a/tests/data/decision_table_invalid/decision_table_invalid.bpmn b/tests/data/decision_table_invalid/decision_table_invalid.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/docx/Letter.docx b/tests/data/docx/Letter.docx old mode 100644 new mode 100755 diff --git a/tests/data/docx/docx.bpmn b/tests/data/docx/docx.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/email/email.bpmn b/tests/data/email/email.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/email_dashboard_url/email_dashboard_url.bpmn b/tests/data/email_dashboard_url/email_dashboard_url.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/email_script/email_script.bpmn b/tests/data/email_script/email_script.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/empty_workflow/empty_workflow.bpmn b/tests/data/empty_workflow/empty_workflow.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_empty_list/empty_spreadsheet.xlsx b/tests/data/enum_empty_list/empty_spreadsheet.xlsx old mode 100644 new mode 100755 diff --git a/tests/data/enum_empty_list/enum_empty_list.bpmn b/tests/data/enum_empty_list/enum_empty_list.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_competing_files/animals.xlsx b/tests/data/enum_options_competing_files/animals.xlsx old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_competing_files/enum_options_competing_files.bpmn b/tests/data/enum_options_competing_files/enum_options_competing_files.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_competing_files/fruits.xlsx b/tests/data/enum_options_competing_files/fruits.xlsx old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_from_file/customer_list.xlsx b/tests/data/enum_options_from_file/customer_list.xlsx old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_from_file/enum_options_from_file.bpmn b/tests/data/enum_options_from_file/enum_options_from_file.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_from_task_data/enum_options_from_task_data.bpmn b/tests/data/enum_options_from_task_data/enum_options_from_task_data.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_with_search/enum_options_with_search.bpmn b/tests/data/enum_options_with_search/enum_options_with_search.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_with_search/sponsors.xlsx b/tests/data/enum_options_with_search/sponsors.xlsx old mode 100644 new mode 100755 diff --git a/tests/data/enum_options_with_search/sponsors_modified.xlsx b/tests/data/enum_options_with_search/sponsors_modified.xlsx old mode 100644 new mode 100755 diff --git a/tests/data/enum_results/enum_results.bpmn b/tests/data/enum_results/enum_results.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_value_expression/Decision_Value_Expression.dmn b/tests/data/enum_value_expression/Decision_Value_Expression.dmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_value_expression/enum_value_expression.bpmn b/tests/data/enum_value_expression/enum_value_expression.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_value_expression_fail/Decision_Value_Expression.dmn b/tests/data/enum_value_expression_fail/Decision_Value_Expression.dmn old mode 100644 new mode 100755 diff --git a/tests/data/enum_value_expression_fail/enum_value_expression_fail.bpmn b/tests/data/enum_value_expression_fail/enum_value_expression_fail.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/exclusive_gateway/exclusive_gateway.bpmn b/tests/data/exclusive_gateway/exclusive_gateway.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/exclusive_gateway_2/exclusive_gateway_2.bpmn b/tests/data/exclusive_gateway_2/exclusive_gateway_2.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/extension_error/extension_error.bpmn b/tests/data/extension_error/extension_error.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/failing_gateway_workflow/failing_gateway_workflow.bpmn b/tests/data/failing_gateway_workflow/failing_gateway_workflow.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/failing_workflow/failing_workflow.bpmn b/tests/data/failing_workflow/failing_workflow.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/file_data_store/file_data_store.bpmn b/tests/data/file_data_store/file_data_store.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/file_upload_form/file_upload_form.bpmn b/tests/data/file_upload_form/file_upload_form.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/file_upload_form_single/file_upload_form_single.bpmn b/tests/data/file_upload_form_single/file_upload_form_single.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/form_expressions/form_expressions.bpmn b/tests/data/form_expressions/form_expressions.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/get_study_associate/get_study_associate.bpmn b/tests/data/get_study_associate/get_study_associate.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/hello_world/hello_world.bpmn b/tests/data/hello_world/hello_world.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/hidden_required_field/hidden_required_field.bpmn b/tests/data/hidden_required_field/hidden_required_field.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/hidden_required_field_pass/hidden_required_field_pass.bpmn b/tests/data/hidden_required_field_pass/hidden_required_field_pass.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/hidden_required_field_pass_expression/hidden_required_field_pass_expression.bpmn b/tests/data/hidden_required_field_pass_expression/hidden_required_field_pass_expression.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/infinite_loop/infinite_loop.bpmn b/tests/data/infinite_loop/infinite_loop.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/invalid_expression/invalid_expression.bpmn b/tests/data/invalid_expression/invalid_expression.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/invalid_roles/invalid_roles.bpmn b/tests/data/invalid_roles/invalid_roles.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/invalid_script/invalid_script.bpmn b/tests/data/invalid_script/invalid_script.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/invalid_script2/invalid_script2.bpmn b/tests/data/invalid_script2/invalid_script2.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/invalid_script3/invalid_script3.bpmn b/tests/data/invalid_script3/invalid_script3.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/invalid_spec/invalid_spec.bpmn b/tests/data/invalid_spec/invalid_spec.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/irb_api_personnel/irb_api_personnel.bpmn b/tests/data/irb_api_personnel/irb_api_personnel.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/irb_info_script/irb_info_script.bpmn b/tests/data/irb_info_script/irb_info_script.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/ldap_lookup/ldap_lookup.bpmn b/tests/data/ldap_lookup/ldap_lookup.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/ldap_response.json b/tests/data/ldap_response.json old mode 100644 new mode 100755 diff --git a/tests/data/ldap_script/ldap_script.bpmn b/tests/data/ldap_script/ldap_script.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/looping_task/looping_task.bpmn b/tests/data/looping_task/looping_task.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/manual_task_with_external_documentation/Task_Manual_One.md b/tests/data/manual_task_with_external_documentation/Task_Manual_One.md old mode 100644 new mode 100755 diff --git a/tests/data/manual_task_with_external_documentation/manual_task_with_external_documentation.bpmn b/tests/data/manual_task_with_external_documentation/manual_task_with_external_documentation.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/message_event/message_event.bpmn b/tests/data/message_event/message_event.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/missing_form_key/missing_form_key.bpmn b/tests/data/missing_form_key/missing_form_key.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/multi_instance/multi_instance.bpmn b/tests/data/multi_instance/multi_instance.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/multi_instance_parallel/multi_instance_parallel.bpmn b/tests/data/multi_instance_parallel/multi_instance_parallel.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/nav_order/nav_order.bpmn b/tests/data/nav_order/nav_order.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/parallel_tasks/parallel_tasks.bpmn b/tests/data/parallel_tasks/parallel_tasks.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/check_study.json b/tests/data/pb_responses/check_study.json old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/investigators.json b/tests/data/pb_responses/investigators.json old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/irb_info.json b/tests/data/pb_responses/irb_info.json old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/required_docs.json b/tests/data/pb_responses/required_docs.json old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/sponsors.json b/tests/data/pb_responses/sponsors.json old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/study_details.json b/tests/data/pb_responses/study_details.json old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/study_details_bad_review_type.json b/tests/data/pb_responses/study_details_bad_review_type.json old mode 100644 new mode 100755 diff --git a/tests/data/pb_responses/user_studies.json b/tests/data/pb_responses/user_studies.json old mode 100644 new mode 100755 diff --git a/tests/data/random_fact/random_fact.bpmn b/tests/data/random_fact/random_fact.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/random_fact/random_fact2.bpmn b/tests/data/random_fact/random_fact2.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/read_only_field/read_only_field.bpmn b/tests/data/read_only_field/read_only_field.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/repeat_form/repeat_form.bpmn b/tests/data/repeat_form/repeat_form.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/required_fields/required_fields.bpmn b/tests/data/required_fields/required_fields.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/reset_workflow/reset_workflow.bpmn b/tests/data/reset_workflow/reset_workflow.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/roles/roles.bpmn b/tests/data/roles/roles.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/script_with_name_error/script_with_name_error.bpmn b/tests/data/script_with_name_error/script_with_name_error.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_cancellations/study_cancellations.bpmn b/tests/data/study_cancellations/study_cancellations.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_details/study_details.bpmn b/tests/data/study_details/study_details.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_info_script/study_info_script.bpmn b/tests/data/study_info_script/study_info_script.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_sponsors/study_sponsors.bpmn b/tests/data/study_sponsors/study_sponsors.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_sponsors_associate/study_sponsors_associate.bpmn b/tests/data/study_sponsors_associate/study_sponsors_associate.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_sponsors_associate_fail/study_sponsors_associate_fail.bpmn b/tests/data/study_sponsors_associate_fail/study_sponsors_associate_fail.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_sponsors_associate_switch_user/study_sponsors_associate_switch_user.bpmn b/tests/data/study_sponsors_associate_switch_user/study_sponsors_associate_switch_user.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_sponsors_associates_delete/study_sponsors_associates_delete.bpmn b/tests/data/study_sponsors_associates_delete/study_sponsors_associates_delete.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/study_sponsors_data_store/study_sponsors_data_store.bpmn b/tests/data/study_sponsors_data_store/study_sponsors_data_store.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/subprocess/subprocess.bpmn b/tests/data/subprocess/subprocess.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/table.docx b/tests/data/table.docx old mode 100644 new mode 100755 diff --git a/tests/data/test_value_expression/test_value_expression.bpmn b/tests/data/test_value_expression/test_value_expression.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/timer_event/timer_event.bpmn b/tests/data/timer_event/timer_event.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/timer_event_error/timer_event_error.bpmn b/tests/data/timer_event_error/timer_event_error.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/top_level_workflow/data_security_plan.dmn b/tests/data/top_level_workflow/data_security_plan.dmn old mode 100644 new mode 100755 diff --git a/tests/data/top_level_workflow/enter_core_info.dmn b/tests/data/top_level_workflow/enter_core_info.dmn old mode 100644 new mode 100755 diff --git a/tests/data/top_level_workflow/sponsor_funding_source.dmn b/tests/data/top_level_workflow/sponsor_funding_source.dmn old mode 100644 new mode 100755 diff --git a/tests/data/top_level_workflow/top_level_workflow.bpmn b/tests/data/top_level_workflow/top_level_workflow.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/two_forms/modified/two_forms_struc_mod.bpmn b/tests/data/two_forms/modified/two_forms_struc_mod.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/two_forms/modified/two_forms_text_mod.bpmn b/tests/data/two_forms/modified/two_forms_text_mod.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/two_forms/two_forms.bpmn b/tests/data/two_forms/two_forms.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/two_user_tasks/two_user_tasks.bpmn b/tests/data/two_user_tasks/two_user_tasks.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/verify_end_event/verify_end_event.bpmn b/tests/data/verify_end_event/verify_end_event.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/workflow_form_field_name/workflow_form_field_name.bpmn b/tests/data/workflow_form_field_name/workflow_form_field_name.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/workflow_form_field_type/workflow_form_field_type.bpmn b/tests/data/workflow_form_field_type/workflow_form_field_type.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/workflow_sync_responses/random_fact2.bpmn b/tests/data/workflow_sync_responses/random_fact2.bpmn old mode 100644 new mode 100755 diff --git a/tests/data/workflow_sync_responses/test.txt b/tests/data/workflow_sync_responses/test.txt old mode 100644 new mode 100755 diff --git a/tests/emails/__init__.py b/tests/emails/__init__.py old mode 100644 new mode 100755 diff --git a/tests/emails/test_email_script.py b/tests/emails/test_email_script.py old mode 100644 new mode 100755 diff --git a/tests/emails/test_email_service.py b/tests/emails/test_email_service.py old mode 100644 new mode 100755 diff --git a/tests/files/__init__.py b/tests/files/__init__.py old mode 100644 new mode 100755 diff --git a/tests/files/test_file_service.py b/tests/files/test_file_service.py old mode 100644 new mode 100755 diff --git a/tests/files/test_files_api.py b/tests/files/test_files_api.py old mode 100644 new mode 100755 diff --git a/tests/ldap/__init__.py b/tests/ldap/__init__.py old mode 100644 new mode 100755 diff --git a/tests/ldap/test_ldap_lookup_script.py b/tests/ldap/test_ldap_lookup_script.py old mode 100644 new mode 100755 diff --git a/tests/scripts/__init__.py b/tests/scripts/__init__.py old mode 100644 new mode 100755 diff --git a/tests/scripts/test_check_study.py b/tests/scripts/test_check_study.py old mode 100644 new mode 100755 diff --git a/tests/scripts/test_get_study_associate_validation.py b/tests/scripts/test_get_study_associate_validation.py old mode 100644 new mode 100755 diff --git a/tests/study/__init__.py b/tests/study/__init__.py old mode 100644 new mode 100755 diff --git a/tests/study/test_get_study_from_model.py b/tests/study/test_get_study_from_model.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_actions_status.py b/tests/study/test_study_actions_status.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_api.py b/tests/study/test_study_api.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_associate_script.py b/tests/study/test_study_associate_script.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_cancellations.py b/tests/study/test_study_cancellations.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_data_store_script.py b/tests/study/test_study_data_store_script.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_details.py b/tests/study/test_study_details.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_details_documents.py b/tests/study/test_study_details_documents.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_service.py b/tests/study/test_study_service.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_sponsors_script.py b/tests/study/test_study_sponsors_script.py old mode 100644 new mode 100755 diff --git a/tests/study/test_study_status_message.py b/tests/study/test_study_status_message.py old mode 100644 new mode 100755 diff --git a/tests/study/test_update_study_script.py b/tests/study/test_update_study_script.py old mode 100644 new mode 100755 diff --git a/tests/test_authentication.py b/tests/test_authentication.py old mode 100644 new mode 100755 diff --git a/tests/test_auto_set_primary_bpmn.py b/tests/test_auto_set_primary_bpmn.py old mode 100644 new mode 100755 diff --git a/tests/test_complete_template_script.py b/tests/test_complete_template_script.py old mode 100644 new mode 100755 diff --git a/tests/test_datastore_api.py b/tests/test_datastore_api.py old mode 100644 new mode 100755 diff --git a/tests/test_decision_table_dictionary_output.py b/tests/test_decision_table_dictionary_output.py old mode 100644 new mode 100755 diff --git a/tests/test_document_directories.py b/tests/test_document_directories.py old mode 100644 new mode 100755 diff --git a/tests/test_email_script.py b/tests/test_email_script.py old mode 100644 new mode 100755 diff --git a/tests/test_events.py b/tests/test_events.py old mode 100644 new mode 100755 diff --git a/tests/test_file_datastore.py b/tests/test_file_datastore.py old mode 100644 new mode 100755 diff --git a/tests/test_get_dashboard_url_script.py b/tests/test_get_dashboard_url_script.py old mode 100644 new mode 100755 diff --git a/tests/test_irb_info_script.py b/tests/test_irb_info_script.py old mode 100644 new mode 100755 diff --git a/tests/test_is_file_uploaded_script.py b/tests/test_is_file_uploaded_script.py old mode 100644 new mode 100755 diff --git a/tests/test_launch_workflow_outside_study.py b/tests/test_launch_workflow_outside_study.py old mode 100644 new mode 100755 diff --git a/tests/test_ldap_service.py b/tests/test_ldap_service.py old mode 100644 new mode 100755 diff --git a/tests/test_lookup_service.py b/tests/test_lookup_service.py old mode 100644 new mode 100755 diff --git a/tests/test_looping_task.py b/tests/test_looping_task.py old mode 100644 new mode 100755 diff --git a/tests/test_message_event.py b/tests/test_message_event.py old mode 100644 new mode 100755 diff --git a/tests/test_multi_instance_tasks_api.py b/tests/test_multi_instance_tasks_api.py old mode 100644 new mode 100755 diff --git a/tests/test_protocol_builder.py b/tests/test_protocol_builder.py old mode 100644 new mode 100755 diff --git a/tests/test_study_info_script.py b/tests/test_study_info_script.py old mode 100644 new mode 100755 diff --git a/tests/test_tasks_api.py b/tests/test_tasks_api.py old mode 100644 new mode 100755 diff --git a/tests/test_tools_api.py b/tests/test_tools_api.py old mode 100644 new mode 100755 diff --git a/tests/test_user_in_logs.py b/tests/test_user_in_logs.py old mode 100644 new mode 100755 diff --git a/tests/test_user_roles.py b/tests/test_user_roles.py old mode 100644 new mode 100755 diff --git a/tests/test_verify_end_event.py b/tests/test_verify_end_event.py old mode 100644 new mode 100755 diff --git a/tests/test_wait_event.py b/tests/test_wait_event.py old mode 100644 new mode 100755 diff --git a/tests/test_workflow_api.py b/tests/test_workflow_api.py old mode 100644 new mode 100755 diff --git a/tests/test_workflow_sync.py b/tests/test_workflow_sync.py old mode 100644 new mode 100755 diff --git a/tests/workflow/__init__.py b/tests/workflow/__init__.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_duplicate_workflow_spec_file.py b/tests/workflow/test_duplicate_workflow_spec_file.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_boolean_default.py b/tests/workflow/test_workflow_boolean_default.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_customer_error.py b/tests/workflow/test_workflow_customer_error.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_delete_irb_document.py b/tests/workflow/test_workflow_delete_irb_document.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_enum_default_value_expression.py b/tests/workflow/test_workflow_enum_default_value_expression.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_enum_empty_list.py b/tests/workflow/test_workflow_enum_empty_list.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_form_field_name.py b/tests/workflow/test_workflow_form_field_name.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_form_field_type.py b/tests/workflow/test_workflow_form_field_type.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_hidden_required_field.py b/tests/workflow/test_workflow_hidden_required_field.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_infinite_loop.py b/tests/workflow/test_workflow_infinite_loop.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_missing_form_key.py b/tests/workflow/test_workflow_missing_form_key.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_name_error_hint.py b/tests/workflow/test_workflow_name_error_hint.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_processor.py b/tests/workflow/test_workflow_processor.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_processor_multi_instance.py b/tests/workflow/test_workflow_processor_multi_instance.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_read_only_field.py b/tests/workflow/test_workflow_read_only_field.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_reset.py b/tests/workflow/test_workflow_reset.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_restart.py b/tests/workflow/test_workflow_restart.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_service.py b/tests/workflow/test_workflow_service.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_spec_api.py b/tests/workflow/test_workflow_spec_api.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_spec_validation_api.py b/tests/workflow/test_workflow_spec_validation_api.py old mode 100644 new mode 100755 diff --git a/tests/workflow/test_workflow_value_expression.py b/tests/workflow/test_workflow_value_expression.py old mode 100644 new mode 100755 diff --git a/wsgi.py b/wsgi.py old mode 100644 new mode 100755 From b94d49076d856f0edf12c840e4d277f89ef4e3f1 Mon Sep 17 00:00:00 2001 From: NWalker4483 Date: Thu, 22 Jul 2021 14:36:00 -0400 Subject: [PATCH 06/15] Fixed Associate API Endpoint description --- crc/api.yml | 48 +++++++++++++----------------------------------- 1 file changed, 13 insertions(+), 35 deletions(-) mode change 100644 => 100755 crc/api.yml diff --git a/crc/api.yml b/crc/api.yml old mode 100644 new mode 100755 index 24fb0cda..38388de5 --- a/crc/api.yml +++ b/crc/api.yml @@ -399,22 +399,24 @@ paths: - name: study_id in: path required: true - description: The id of the study for which workflows should be returned. + description: The id of the study for which associates should be returned. schema: type: integer format: int32 get: operationId: crc.api.study.get_study_associates - summary: Provides a single study + summary: Provides a list of associates for a particular study tags: - Studies responses: '200': - description: An Study Associate Object + description: list of Study Associate Objects content: application/json: schema: - $ref: "#/components/schemas/StudyAssociate" + type: array + items: + $ref: "#/components/schemas/StudyAssociate" /workflow-specification: get: @@ -1589,39 +1591,15 @@ components: example: "27b-6-1212" StudyAssociate: properties: - id: - type: integer - example: 1234 - title: + uid: type: string - example: The impact of fried pickles on beer consumption in bipedal software developers. - last_updated: + example: "dhf8r" + access: + type: boolean + example: False + role: type: string - format: date_time - example: "2019-12-25T09:12:33.001Z" - primary_investigator_id: - type: string - x-nullable: true - example: dhf8r - user_uid: - type: string - example: dhf8r - status: - type: string - enum: ['in_progress', 'hold', 'open_for_enrollment', 'abandoned'] - example: done - sponsor: - type: string - x-nullable: true - example: "Sartography Pharmaceuticals" - ind_number: - type: string - x-nullable: true - example: "27b-6-42" - hsr_number: - type: string - x-nullable: true - example: "27b-6-1212" + example: "TODO" DocumentDirectory: properties: level: From 38b8c7fcdfe6674de8bc0819f20050b4b48693d9 Mon Sep 17 00:00:00 2001 From: NWalker4483 Date: Thu, 22 Jul 2021 15:08:28 -0400 Subject: [PATCH 07/15] Fixed email_cc test --- crc/api.yml | 2 +- crc/services/study_service.py | 16 +++++++++++++--- crc/services/workflow_service.py | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/crc/api.yml b/crc/api.yml index 38388de5..4a995b23 100755 --- a/crc/api.yml +++ b/crc/api.yml @@ -394,7 +394,7 @@ paths: application/json: schema: $ref: "#/components/schemas/Study" - /study/{study_id}/associates': + /study/{study_id}/associates: parameters: - name: study_id in: path diff --git a/crc/services/study_service.py b/crc/services/study_service.py index 5b8d12ea..338b9c94 100644 --- a/crc/services/study_service.py +++ b/crc/services/study_service.py @@ -122,14 +122,18 @@ class StudyService(object): raise ApiError('uid not specified','A valid uva uid is required for this function') if uid == study.user_uid: - return {'uid': ownerid, 'role': 'owner', 'send_email': True, 'access': True} + return {'uid': uid, 'role': 'owner', 'send_email': True, 'access': True} person = db.session.query(StudyAssociated).filter((StudyAssociated.study_id == study_id)&( StudyAssociated.uid == uid)).first() if person: - return StudyAssociatedSchema().dump(person) + newAssociate = {'uid': person.uid} + newAssociate['role'] = person.role + newAssociate['send_email'] = person.send_email + newAssociate['access'] = person.access + return newAssociate raise ApiError('uid_not_associated_with_study',"user id %s was not associated with study number %d"%(uid, study_id)) @@ -148,7 +152,13 @@ class StudyService(object): people = db.session.query(StudyAssociated).filter(StudyAssociated.study_id == study_id) people_list = [{'uid':ownerid,'role':'owner','send_email':True,'access':True}] - people_list += StudyAssociatedSchema().dump(people, many=True) + + for person in people: + newAssociate = {'uid': person.uid} + newAssociate['role'] = person.role + newAssociate['send_email'] = person.send_email + newAssociate['access'] = person.access + people_list.append(newAssociate) return people_list diff --git a/crc/services/workflow_service.py b/crc/services/workflow_service.py index 31e26c28..4d5baf4e 100644 --- a/crc/services/workflow_service.py +++ b/crc/services/workflow_service.py @@ -765,7 +765,7 @@ class WorkflowService(object): else: if not hasattr(spiff_task.task_spec, 'lane') or spiff_task.task_spec.lane is None: associated = StudyService.get_study_associates(processor.workflow_model.study.id) - return [user['uid'] for user in associated if user['access']] + return [user['uid'] for user in associated if user.get('access')] if spiff_task.task_spec.lane not in spiff_task.data: return [] # No users are assignable to the task at this moment lane_users = spiff_task.data[spiff_task.task_spec.lane] From 848c2e622fba0d62c2154844f932cc98860d41c3 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 10 Aug 2021 16:16:08 -0400 Subject: [PATCH 08/15] Always use a schema to define what is being returned, it enforces consistency of the API and internally we can depend on well defined objects. --- crc/api/study.py | 3 +- crc/models/study.py | 3 + crc/scripts/email.py | 4 +- crc/scripts/get_study_associate.py | 11 +- crc/scripts/get_study_associates.py | 4 +- crc/services/study_service.py | 103 ++++++++---------- crc/services/workflow_service.py | 2 +- .../study_sponsors_associate.bpmn | 36 +++--- tests/study/test_study_associate_script.py | 25 ++--- 9 files changed, 89 insertions(+), 102 deletions(-) diff --git a/crc/api/study.py b/crc/api/study.py index 484fc012..df469710 100644 --- a/crc/api/study.py +++ b/crc/api/study.py @@ -80,8 +80,9 @@ def get_study(study_id, update_status=False): raise ApiError("unknown_study", 'The study "' + study_id + '" is not recognized.', status_code=404) return StudySchema().dump(study) + def get_study_associates(study_id): - return StudyService.get_study_associates(study_id) + return StudyAssociatedSchema(many=True).dump(StudyService.get_study_associates(study_id)) def delete_study(study_id): diff --git a/crc/models/study.py b/crc/models/study.py index 69da16fe..3918fe5f 100644 --- a/crc/models/study.py +++ b/crc/models/study.py @@ -79,8 +79,11 @@ class StudyAssociated(db.Model): role = db.Column(db.String, nullable=True) send_email = db.Column(db.Boolean, nullable=True) access = db.Column(db.Boolean, nullable=True) + + class StudyAssociatedSchema(ma.Schema): class Meta: + fields=['uid', 'role', 'send_email', 'access'] model = StudyAssociated unknown = INCLUDE diff --git a/crc/scripts/email.py b/crc/scripts/email.py index f98fde2f..3d92d110 100644 --- a/crc/scripts/email.py +++ b/crc/scripts/email.py @@ -114,7 +114,7 @@ email (subject="My Subject", recipients=["dhf8r@virginia.edu", pi.email], cc='as associated_emails = [] associates = StudyService.get_study_associates(study_id) for associate in associates: - if associate['send_email'] is True: - user_info = LdapService.user_info(associate['uid']) + if associate.send_email is True: + user_info = LdapService.user_info(associate.uid) associated_emails.append(user_info.email_address) return associated_emails diff --git a/crc/scripts/get_study_associate.py b/crc/scripts/get_study_associate.py index c27fbf7d..e5d38e54 100644 --- a/crc/scripts/get_study_associate.py +++ b/crc/scripts/get_study_associate.py @@ -1,24 +1,24 @@ from crc.api.common import ApiError +from crc.models.study import StudyAssociatedSchema from crc.scripts.script import Script from crc.services.study_service import StudyService -class GetStudyAssociates(Script): +class GetStudyAssociate(Script): def get_description(self): return """ -Returns people associated with a study or an error if one is not associated. +Returns how a single person is associated with a study and what access they need, + or raises an error if the person is not associated with the study. example : get_study_associate('sbp3ey') => {'uid':'sbp3ey','role':'Unicorn Herder', 'send_email': False, 'access':True} """ - def do_task_validate_only(self, task, study_id, workflow_id, *args, **kwargs): if len(args) < 1: raise ApiError('no_user_id_specified', 'A uva uid is the sole argument to this function') - return {'uid': 'sbp3ey', 'role': 'Unicorn Herder', 'send_email': False, 'access': True} def do_task(self, task, study_id, workflow_id, *args, **kwargs): @@ -26,4 +26,5 @@ example : get_study_associate('sbp3ey') => {'uid':'sbp3ey','role':'Unicorn Herde raise ApiError('no_user_id_specified', 'A uva uid is the sole argument to this function') if not isinstance(args[0], str): raise ApiError('argument_should_be_string', 'A uva uid is always a string, please check type') - return StudyService.get_study_associate(study_id=study_id, uid=args[0]) + associate = StudyService.get_study_associate(study_id=study_id, uid=args[0]) + return StudyAssociatedSchema().dump(associate) diff --git a/crc/scripts/get_study_associates.py b/crc/scripts/get_study_associates.py index 0175469d..5258600c 100644 --- a/crc/scripts/get_study_associates.py +++ b/crc/scripts/get_study_associates.py @@ -1,4 +1,5 @@ from crc.api.common import ApiError +from crc.models.study import StudyAssociatedSchema from crc.scripts.script import Script from crc.services.study_service import StudyService @@ -26,7 +27,6 @@ example : get_study_associates() => [{'uid':'sbp3ey','role':'Unicorn Herder', 's return study_associates def do_task(self, task, study_id, workflow_id, *args, **kwargs): - - return StudyService.get_study_associates(study_id) + return StudyAssociatedSchema(many=True).dump(StudyService.get_study_associates(study_id)) diff --git a/crc/services/study_service.py b/crc/services/study_service.py index 338b9c94..738ee0e9 100644 --- a/crc/services/study_service.py +++ b/crc/services/study_service.py @@ -44,15 +44,15 @@ class StudyService(object): def get_studies_for_user(self, user): """Returns a list of all studies for the given user.""" - associated = session.query(StudyAssociated).filter_by(uid=user.uid,access=True).all() + associated = session.query(StudyAssociated).filter_by(uid=user.uid, access=True).all() associated_studies = [x.study_id for x in associated] - db_studies = session.query(StudyModel).filter((StudyModel.user_uid==user.uid)| + db_studies = session.query(StudyModel).filter((StudyModel.user_uid == user.uid) | (StudyModel.id.in_(associated_studies))).all() studies = [] for study_model in db_studies: if self._is_valid_study(study_model.id): - studies.append(StudyService.get_study(study_model.id, study_model,do_status=False)) + studies.append(StudyService.get_study(study_model.id, study_model, do_status=False)) return studies @staticmethod @@ -76,8 +76,8 @@ class StudyService(object): study = Study.from_model(study_model) study.create_user_display = LdapService.user_info(study.user_uid).display_name - last_event: TaskEventModel = session.query(TaskEventModel)\ - .filter_by(study_id=study_id,action='COMPLETE')\ + last_event: TaskEventModel = session.query(TaskEventModel) \ + .filter_by(study_id=study_id, action='COMPLETE') \ .order_by(TaskEventModel.date.desc()).first() if last_event is None: study.last_activity_user = 'Not Started' @@ -109,9 +109,9 @@ class StudyService(object): return study @staticmethod - def get_study_associate(study_id = None, uid=None): + def get_study_associate(study_id=None, uid=None): """ - gets all associated people for a study from the database + gets details on how one uid is related to a study, returns a StudyAssociated model """ study = db.session.query(StudyModel).filter(StudyModel.id == study_id).first() @@ -119,23 +119,18 @@ class StudyService(object): raise ApiError('study_not_found', 'No study found with id = %d' % study_id) if uid is None: - raise ApiError('uid not specified','A valid uva uid is required for this function') + raise ApiError('uid not specified', 'A valid uva uid is required for this function') if uid == study.user_uid: - return {'uid': uid, 'role': 'owner', 'send_email': True, 'access': True} + return StudyAssociated(uid=uid, role='owner', send_email=True, access=True) - - - person = db.session.query(StudyAssociated).filter((StudyAssociated.study_id == study_id)&( - StudyAssociated.uid == uid)).first() - if person: - newAssociate = {'uid': person.uid} - newAssociate['role'] = person.role - newAssociate['send_email'] = person.send_email - newAssociate['access'] = person.access - return newAssociate - raise ApiError('uid_not_associated_with_study',"user id %s was not associated with study number %d"%(uid, - study_id)) + people = db.session.query(StudyAssociated).filter((StudyAssociated.study_id == study_id) & + (StudyAssociated.uid == uid)).first() + if people: + return people + else: + raise ApiError('uid_not_associated_with_study', "user id %s was not associated with study number %d" % (uid, + study_id)) @staticmethod def get_study_associates(study_id): @@ -145,22 +140,12 @@ class StudyService(object): study = db.session.query(StudyModel).filter(StudyModel.id == study_id).first() if study is None: - raise ApiError('study_not_found','No study found with id = %d'%study_id) - - ownerid = study.user_uid - - people = db.session.query(StudyAssociated).filter(StudyAssociated.study_id == study_id) - - people_list = [{'uid':ownerid,'role':'owner','send_email':True,'access':True}] - - for person in people: - newAssociate = {'uid': person.uid} - newAssociate['role'] = person.role - newAssociate['send_email'] = person.send_email - newAssociate['access'] = person.access - people_list.append(newAssociate) - return people_list + raise ApiError('study_not_found', 'No study found with id = %d' % study_id) + people = db.session.query(StudyAssociated).filter(StudyAssociated.study_id == study_id).all() + owner = StudyAssociated(uid=study.user_uid, role='owner', send_email=True, access=True) + people.append(owner) + return people @staticmethod def update_study_associates(study_id, associates): @@ -172,20 +157,19 @@ class StudyService(object): raise ApiError('study_id not specified', "This function requires the study_id parameter") for person in associates: - if not LdapService.user_exists(person.get('uid','impossible_uid')): - if person.get('uid','impossible_uid') == 'impossible_uid': - raise ApiError('associate with no uid','One of the associates passed as a parameter doesnt have ' + if not LdapService.user_exists(person.get('uid', 'impossible_uid')): + if person.get('uid', 'impossible_uid') == 'impossible_uid': + raise ApiError('associate with no uid', 'One of the associates passed as a parameter doesnt have ' 'a uid specified') - raise ApiError('trying_to_grant_access_to_user_not_found_in_ldap',"You are trying to grant access to " - "%s, but that user was not found in " - "ldap " - "- please check to ensure it is a " - "valid uva uid"%person.get('uid')) + raise ApiError('trying_to_grant_access_to_user_not_found_in_ldap', "You are trying to grant access to " + "%s, but that user was not found in " + "ldap " + "- please check to ensure it is a " + "valid uva uid" % person.get('uid')) study = db.session.query(StudyModel).filter(StudyModel.id == study_id).first() if study is None: - raise ApiError('study_id not found', "A study with id# %d was not found"%study_id) - + raise ApiError('study_id not found', "A study with id# %d was not found" % study_id) db.session.query(StudyAssociated).filter(StudyAssociated.study_id == study_id).delete() for person in associates: @@ -194,27 +178,27 @@ class StudyService(object): newAssociate.uid = person['uid'] newAssociate.role = person.get('role', None) newAssociate.send_email = person.get('send_email', False) - newAssociate.access = person.get('access',False) + newAssociate.access = person.get('access', False) session.add(newAssociate) session.commit() @staticmethod - def update_study_associate(study_id=None,uid=None,role="",send_email=False,access=False): + def update_study_associate(study_id=None, uid=None, role="", send_email=False, access=False): if study_id is None: raise ApiError('study_id not specified', "This function requires the study_id parameter") if uid is None: raise ApiError('uid not specified', "This function requires a uva uid parameter") if not LdapService.user_exists(uid): - raise ApiError('trying_to_grant_access_to_user_not_found_in_ldap',"You are trying to grant access to " - "%s but they were not found in ldap " - "- please check to ensure it is a " - "valid uva uid"%uid) + raise ApiError('trying_to_grant_access_to_user_not_found_in_ldap', "You are trying to grant access to " + "%s but they were not found in ldap " + "- please check to ensure it is a " + "valid uva uid" % uid) study = db.session.query(StudyModel).filter(StudyModel.id == study_id).first() if study is None: - raise ApiError('study_id not found', "A study with id# %d was not found"%study_id) - db.session.query(StudyAssociated).filter((StudyAssociated.study_id == study_id)&(StudyAssociated.uid == - uid) ).delete() + raise ApiError('study_id not found', "A study with id# %d was not found" % study_id) + db.session.query(StudyAssociated).filter((StudyAssociated.study_id == study_id) & (StudyAssociated.uid == + uid)).delete() newAssociate = StudyAssociated() newAssociate.study_id = study_id @@ -226,7 +210,6 @@ class StudyService(object): session.commit() return True - @staticmethod def delete_study(study_id): session.query(TaskEventModel).filter_by(study_id=study_id).delete() @@ -309,18 +292,18 @@ class StudyService(object): # when we run tests - it doesn't look like the user is available # so we return a bogus token token = 'not_available' - if hasattr(flask.g,'user'): + if hasattr(flask.g, 'user'): token = flask.g.user.encode_auth_token() for file in doc_files: file_data = {'file_id': file.id, 'name': file.name, - 'url': app.config['APPLICATION_ROOT']+ + 'url': app.config['APPLICATION_ROOT'] + 'file/' + str(file.id) + - '/download?auth_token='+ + '/download?auth_token=' + urllib.parse.quote_plus(token), 'workflow_id': file.workflow_id } - data = db.session.query(DataStoreModel).filter(DataStoreModel.file_id==file.id).all() + data = db.session.query(DataStoreModel).filter(DataStoreModel.file_id == file.id).all() data_store_data = {} for d in data: data_store_data[d.key] = d.value diff --git a/crc/services/workflow_service.py b/crc/services/workflow_service.py index 93fa2d18..63eda27b 100644 --- a/crc/services/workflow_service.py +++ b/crc/services/workflow_service.py @@ -770,7 +770,7 @@ class WorkflowService(object): else: if not hasattr(spiff_task.task_spec, 'lane') or spiff_task.task_spec.lane is None: associated = StudyService.get_study_associates(processor.workflow_model.study.id) - return [user['uid'] for user in associated if user.get('access')] + return [user.uid for user in associated if user.access] if spiff_task.task_spec.lane not in spiff_task.data: return [] # No users are assignable to the task at this moment lane_users = spiff_task.data[spiff_task.task_spec.lane] diff --git a/tests/data/study_sponsors_associate/study_sponsors_associate.bpmn b/tests/data/study_sponsors_associate/study_sponsors_associate.bpmn index e588df92..924dd03e 100644 --- a/tests/data/study_sponsors_associate/study_sponsors_associate.bpmn +++ b/tests/data/study_sponsors_associate/study_sponsors_associate.bpmn @@ -1,5 +1,5 @@ - + SequenceFlow_1nfe5m9 @@ -32,7 +32,7 @@ out4 = get_study_associate('lb3dp') Flow_1vlh6s0 uids = [] for assoc in out: - uids.append(assoc['uid']) + uids.append(assoc.uid) update_study_associates([{'uid':'lb3dp','role':'SuperGal','send_email':False,'access':True}]) @@ -46,6 +46,22 @@ out2 = get_study_associate('lb3dp') + + + + + + + + + + + + + + + + @@ -60,10 +76,6 @@ out2 = get_study_associate('lb3dp') - - - - @@ -73,24 +85,12 @@ out2 = get_study_associate('lb3dp') - - - - - - - - - - - - diff --git a/tests/study/test_study_associate_script.py b/tests/study/test_study_associate_script.py index a6a07a90..b5865389 100644 --- a/tests/study/test_study_associate_script.py +++ b/tests/study/test_study_associate_script.py @@ -53,19 +53,18 @@ class TestSudySponsorsScript(BaseTest): self.assertIn('sponsors', data) self.assertIn('out', data) print(data['out']) - self.assertEquals([{'uid': 'dhf8r', 'role': 'owner', 'send_email': True, 'access': True}, - {'uid': 'lb3dp', 'role': 'SuperDude', 'send_email': False, 'access': True}] - , data['out']) - self.assertEquals({'uid': 'lb3dp', 'role': 'SuperDude', 'send_email': False, 'access': True} - , data['out2']) - - self.assertEquals([{'uid': 'dhf8r', 'role': 'owner', 'send_email': True, 'access': True}, - {'uid': 'lb3dp', 'role': 'SuperGal', 'send_email': False, 'access': True}] - , data['out3']) - self.assertEquals({'uid': 'lb3dp', 'role': 'SuperGal', 'send_email': False, 'access': True} - , data['out4']) - - + self.assertDictEqual({'uid': 'dhf8r', 'role': 'owner', 'send_email': True, 'access': True}, + data['out'][1]) + self.assertDictEqual({'uid': 'lb3dp', 'role': 'SuperDude', 'send_email': False, 'access': True}, + data['out'][0]) + self.assertDictEqual({'uid': 'lb3dp', 'role': 'SuperDude', 'send_email': False, 'access': True}, + data['out2']) + self.assertDictEqual({'uid': 'dhf8r', 'role': 'owner', 'send_email': True, 'access': True}, + data['out3'][1]) + self.assertDictEqual({'uid': 'lb3dp', 'role': 'SuperGal', 'send_email': False, 'access': True}, + data['out3'][0]) + self.assertDictEqual({'uid': 'lb3dp', 'role': 'SuperGal', 'send_email': False, 'access': True}, + data['out4']) self.assertEquals(3, len(data['sponsors'])) From 318cd34f819dbc054ccd3a9bae4625e4bc48a01b Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 11 Aug 2021 14:21:23 -0400 Subject: [PATCH 09/15] bouncing to fix a bug in SpiffWorkflow that was holding outo outdated data deed within the python_script_engine. This caused validation to fail for valid repeat sections, so including a fix to allow that validation to continue. --- Pipfile.lock | 2 +- crc/services/workflow_service.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Pipfile.lock b/Pipfile.lock index eb82ab7e..2b7bf98a 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -979,7 +979,7 @@ }, "spiffworkflow": { "git": "https://github.com/sartography/SpiffWorkflow.git", - "ref": "1df28b940ec0d32b672e59e3d17e7a804cb2b186" + "ref": "e266745f6ff74995f125dd3821eab36cfe745a54" }, "sqlalchemy": { "hashes": [ diff --git a/crc/services/workflow_service.py b/crc/services/workflow_service.py index 63eda27b..895cccfb 100644 --- a/crc/services/workflow_service.py +++ b/crc/services/workflow_service.py @@ -1,3 +1,4 @@ +import copy import string from datetime import datetime import random @@ -328,7 +329,13 @@ class WorkflowService(object): # Then you must evaluate the expression based on the data within the group only. group = field.get_property(Task.FIELD_PROP_REPEAT) if group in task.data: + # Here we must make the current group data top level (as it would be in a repeat section) but + # make all other top level task data available as well. + new_data = copy.deepcopy(task.data) + del(new_data[group]) data = task.data[group][0] + data.update(new_data) + try: return task.workflow.script_engine.eval(expression, data) except Exception as e: From 172448386c1d8af0faea29eab531cdb07290056b Mon Sep 17 00:00:00 2001 From: Dan Date: Wed, 11 Aug 2021 15:13:48 -0400 Subject: [PATCH 10/15] bouncing spiffworkflow to pick up some recent changes. --- Pipfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Pipfile.lock b/Pipfile.lock index 2b7bf98a..1630bb6f 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -979,7 +979,7 @@ }, "spiffworkflow": { "git": "https://github.com/sartography/SpiffWorkflow.git", - "ref": "e266745f6ff74995f125dd3821eab36cfe745a54" + "ref": "0b4a878f9b6d4f7fc320c26f59ca5e458a6130e8" }, "sqlalchemy": { "hashes": [ From d07bac27cad4c65364fd9be71ec9a6a40f28b447 Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Wed, 11 Aug 2021 16:43:50 -0400 Subject: [PATCH 11/15] Fix for hidden file data field. We were processing a field that didn't have a value. Ticket 408 --- crc/services/workflow_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crc/services/workflow_service.py b/crc/services/workflow_service.py index 83fda52a..48325ffa 100644 --- a/crc/services/workflow_service.py +++ b/crc/services/workflow_service.py @@ -312,7 +312,7 @@ class WorkflowService(object): data = {} if field.has_property(Task.FIELD_PROP_FILE_DATA) and \ field.get_property(Task.FIELD_PROP_FILE_DATA) in data and \ - field.id in data: + field.id in data and data[field.id]: file_id = data[field.get_property(Task.FIELD_PROP_FILE_DATA)]["id"] if field.type == 'enum': data_args = (field.id, data[field.id]['label']) From e0096ebc8e2f6cd712655fe1ad820df0496315a5 Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Wed, 11 Aug 2021 16:44:45 -0400 Subject: [PATCH 12/15] Test and BPMN to make sure we don't process when field is hidden, but do process when field is not hidden --- .../hidden_file_data_field.bpmn | 87 +++++++++++++++++++ .../test_workflow_hidden_file_data_field.py | 60 +++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 tests/data/hidden_file_data_field/hidden_file_data_field.bpmn create mode 100644 tests/workflow/test_workflow_hidden_file_data_field.py diff --git a/tests/data/hidden_file_data_field/hidden_file_data_field.bpmn b/tests/data/hidden_file_data_field/hidden_file_data_field.bpmn new file mode 100644 index 00000000..291c42a4 --- /dev/null +++ b/tests/data/hidden_file_data_field/hidden_file_data_field.bpmn @@ -0,0 +1,87 @@ + + + + + Flow_0eg42kv + + + + + + + + + + + + + + + + + + + Flow_074gk91 + Flow_1gseke4 + + + + + + Flow_04ozqju + + + + Flow_1gseke4 + Flow_04ozqju + + + + + + + + + + + + Flow_0eg42kv + Flow_074gk91 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/workflow/test_workflow_hidden_file_data_field.py b/tests/workflow/test_workflow_hidden_file_data_field.py new file mode 100644 index 00000000..febc8572 --- /dev/null +++ b/tests/workflow/test_workflow_hidden_file_data_field.py @@ -0,0 +1,60 @@ +from tests.base_test import BaseTest +from io import BytesIO +import json + + +class TestHiddenFileDataField(BaseTest): + + def test_hidden_file_data_field(self): + + self.load_example_data() + workflow = self.create_workflow('hidden_file_data_field') + workflow_api = self.get_workflow_api(workflow) + task = workflow_api.next_task + + self.complete_form(workflow, task, {'hide_field': True}) + workflow_api = self.get_workflow_api(workflow) + task = workflow_api.next_task + + data = {'file': (BytesIO(b"abcdef"), 'test_file.txt')} + rv = self.app.post('/v1.0/file?study_id=%i&workflow_id=%s&task_id=%s&form_field_key=%s' % + (workflow.study_id, workflow.id, task.id, 'Study_App_Doc'), data=data, follow_redirects=True, + content_type='multipart/form-data', headers=self.logged_in_headers()) + self.assert_success(rv) + file_id = json.loads(rv.get_data())['id'] + + self.complete_form(workflow, task, {'UploadFile': {'id': file_id}, + 'Name': 'Some Name String'}) + workflow_api = self.get_workflow_api(workflow) + new_task = workflow_api.next_task + self.assertEqual('Activity_ViewData', new_task.name) + self.assertEqual('Some Name String', new_task.data['Name']) + self.assertNotIn('ExtraField', new_task.data) + + def test_not_hidden_file_data_field(self): + + self.load_example_data() + workflow = self.create_workflow('hidden_file_data_field') + workflow_api = self.get_workflow_api(workflow) + task = workflow_api.next_task + + self.complete_form(workflow, task, {'hide_field': False}) + workflow_api = self.get_workflow_api(workflow) + task = workflow_api.next_task + + data = {'file': (BytesIO(b"abcdef"), 'test_file.txt')} + rv = self.app.post('/v1.0/file?study_id=%i&workflow_id=%s&task_id=%s&form_field_key=%s' % + (workflow.study_id, workflow.id, task.id, 'Study_App_Doc'), data=data, follow_redirects=True, + content_type='multipart/form-data', headers=self.logged_in_headers()) + self.assert_success(rv) + file_id = json.loads(rv.get_data())['id'] + + self.complete_form(workflow, task, {'UploadFile': {'id': file_id}, + 'Name': 'Some Name String', + 'ExtraField': 'Some Extra String'}) + workflow_api = self.get_workflow_api(workflow) + new_task = workflow_api.next_task + self.assertEqual('Activity_ViewData', new_task.name) + self.assertEqual('Some Name String', new_task.data['Name']) + self.assertIn('ExtraField', new_task.data) + self.assertEqual('Some Extra String', new_task.data['ExtraField']) From 40727c7ce66014a1b4382939f5f9a352c60ce994 Mon Sep 17 00:00:00 2001 From: Dan Date: Thu, 12 Aug 2021 11:35:05 -0400 Subject: [PATCH 13/15] avoid erroring out when unable to calculate a value expression as a part of finding a default value. --- crc/services/workflow_service.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crc/services/workflow_service.py b/crc/services/workflow_service.py index f152b448..7dbf18e5 100644 --- a/crc/services/workflow_service.py +++ b/crc/services/workflow_service.py @@ -326,7 +326,8 @@ class WorkflowService(object): expression = field.get_property(property_name) data = task.data if field.has_property(Task.FIELD_PROP_REPEAT): - # Then you must evaluate the expression based on the data within the group only. + # Then you must evaluate the expression based on the data within the group, if that data exists. + # There may not be data available in the group, if no groups where added group = field.get_property(Task.FIELD_PROP_REPEAT) if group in task.data: # Here we must make the current group data top level (as it would be in a repeat section) but @@ -335,6 +336,8 @@ class WorkflowService(object): del(new_data[group]) data = task.data[group][0] data.update(new_data) + else: + return None # We may not have enough information to process this try: return task.workflow.script_engine.eval(expression, data) From d20b68e483582faf483eb8946f6b12698ba3ae7a Mon Sep 17 00:00:00 2001 From: nilez Date: Thu, 12 Aug 2021 12:33:27 -0400 Subject: [PATCH 14/15] Fixed Deprecation Warnings in Test Files --- crc/api/file.py | 12 ++++----- crc/api/tools.py | 4 +-- tests/files/test_file_service.py | 2 +- tests/files/test_files_api.py | 2 +- tests/study/test_study_associate_script.py | 10 ++++---- tests/study/test_study_data_store_script.py | 6 ++--- tests/study/test_study_details_documents.py | 25 ++++++++----------- tests/study/test_study_sponsors_script.py | 2 +- tests/test_document_directories.py | 16 ++++++------ tests/test_multi_instance_tasks_api.py | 2 +- tests/test_wait_event.py | 4 +-- .../workflow/test_workflow_enum_empty_list.py | 4 +-- .../test_workflow_spec_validation_api.py | 2 +- 13 files changed, 44 insertions(+), 47 deletions(-) diff --git a/crc/api/file.py b/crc/api/file.py index 118dccfc..2b5bbd18 100755 --- a/crc/api/file.py +++ b/crc/api/file.py @@ -71,9 +71,9 @@ def get_reference_file(name): file_data = FileService.get_reference_file_data(name) return send_file( io.BytesIO(file_data.data), - attachment_filename=file_data.file_model.name, + download_name=file_data.file_model.name, mimetype=file_data.file_model.content_type, - cache_timeout=-1 # Don't cache these files on the browser. + max_age=-1 # Don't cache these files on the browser. ) @@ -120,9 +120,9 @@ def get_file_data(file_id, version=None): raise ApiError('no_such_file', 'The file id you provided does not exist') return send_file( io.BytesIO(file_data.data), - attachment_filename=file_data.file_model.name, + download_name=file_data.file_model.name, mimetype=file_data.file_model.content_type, - cache_timeout=-1, # Don't cache these files on the browser. + max_age=-1, # Don't cache these files on the browser. last_modified=file_data.date_created ) @@ -135,9 +135,9 @@ def get_file_data_link(file_id, auth_token, version=None): raise ApiError('no_such_file', 'The file id you provided does not exist') return send_file( io.BytesIO(file_data.data), - attachment_filename=file_data.file_model.name, + download_name=file_data.file_model.name, mimetype=file_data.file_model.content_type, - cache_timeout=-1, # Don't cache these files on the browser. + max_age=-1, # Don't cache these files on the browser. last_modified=file_data.date_created, as_attachment = True ) diff --git a/crc/api/tools.py b/crc/api/tools.py index e93c2124..a418a429 100755 --- a/crc/api/tools.py +++ b/crc/api/tools.py @@ -43,9 +43,9 @@ def render_docx(): return send_file( io.BytesIO(target_stream.read()), as_attachment=True, - attachment_filename="output.docx", + download_name="output.docx", mimetype="application/octet-stream", - cache_timeout=-1 # Don't cache these files on the browser. + max_age=-1 # Don't cache these files on the browser. ) except ValueError as e: raise ApiError(code="undefined_field", message=str(e)) diff --git a/tests/files/test_file_service.py b/tests/files/test_file_service.py index 94f5945f..13f90c9b 100755 --- a/tests/files/test_file_service.py +++ b/tests/files/test_file_service.py @@ -72,7 +72,7 @@ class TestFileService(BaseTest): file_data = FileService.get_workflow_data_files(workflow_id=workflow.id) self.assertEqual(1, len(file_data)) self.assertEqual(2, file_data[0].version) - self.assertEquals(4, file_data[0].size) # File dat size is included. + self.assertEqual(4, file_data[0].size) # File dat size is included. def test_add_file_from_form_increments_version_and_replaces_on_subsequent_add_with_same_name(self): self.load_example_data() diff --git a/tests/files/test_files_api.py b/tests/files/test_files_api.py index 24d8f898..59a2e2fb 100755 --- a/tests/files/test_files_api.py +++ b/tests/files/test_files_api.py @@ -191,7 +191,7 @@ class TestFilesApi(BaseTest): rv = self.app.post('/v1.0/file?workflow_spec_id=%s' % spec.id, data=data, follow_redirects=True, content_type='multipart/form-data', headers=self.logged_in_headers()) file_json = json.loads(rv.get_data(as_text=True)) - self.assertEquals(80, file_json['size']) + self.assertEqual(80, file_json['size']) data['file'] = io.BytesIO(self.minimal_bpmn("efghijk")), 'my_new_file.bpmn' rv = self.app.put('/v1.0/file/%i/data' % file_json['id'], data=data, follow_redirects=True, diff --git a/tests/study/test_study_associate_script.py b/tests/study/test_study_associate_script.py index a6a07a90..a6b105dd 100755 --- a/tests/study/test_study_associate_script.py +++ b/tests/study/test_study_associate_script.py @@ -53,20 +53,20 @@ class TestSudySponsorsScript(BaseTest): self.assertIn('sponsors', data) self.assertIn('out', data) print(data['out']) - self.assertEquals([{'uid': 'dhf8r', 'role': 'owner', 'send_email': True, 'access': True}, + self.assertEqual([{'uid': 'dhf8r', 'role': 'owner', 'send_email': True, 'access': True}, {'uid': 'lb3dp', 'role': 'SuperDude', 'send_email': False, 'access': True}] , data['out']) - self.assertEquals({'uid': 'lb3dp', 'role': 'SuperDude', 'send_email': False, 'access': True} + self.assertEqual({'uid': 'lb3dp', 'role': 'SuperDude', 'send_email': False, 'access': True} , data['out2']) - self.assertEquals([{'uid': 'dhf8r', 'role': 'owner', 'send_email': True, 'access': True}, + self.assertEqual([{'uid': 'dhf8r', 'role': 'owner', 'send_email': True, 'access': True}, {'uid': 'lb3dp', 'role': 'SuperGal', 'send_email': False, 'access': True}] , data['out3']) - self.assertEquals({'uid': 'lb3dp', 'role': 'SuperGal', 'send_email': False, 'access': True} + self.assertEqual({'uid': 'lb3dp', 'role': 'SuperGal', 'send_email': False, 'access': True} , data['out4']) - self.assertEquals(3, len(data['sponsors'])) + self.assertEqual(3, len(data['sponsors'])) @patch('crc.services.protocol_builder.requests.get') diff --git a/tests/study/test_study_data_store_script.py b/tests/study/test_study_data_store_script.py index 4f134945..6f7924c5 100755 --- a/tests/study/test_study_data_store_script.py +++ b/tests/study/test_study_data_store_script.py @@ -50,6 +50,6 @@ class TestSudySponsorsScript(BaseTest): data = processor.next_task().data self.assertIn('sponsors', data) self.assertIn('out', data) - self.assertEquals('empty', data['empty']) - self.assertEquals('newval', data['out']) - self.assertEquals(3, len(data['sponsors'])) + self.assertEqual('empty', data['empty']) + self.assertEqual('newval', data['out']) + self.assertEqual(3, len(data['sponsors'])) diff --git a/tests/study/test_study_details_documents.py b/tests/study/test_study_details_documents.py index 98281f68..3cb0fb46 100755 --- a/tests/study/test_study_details_documents.py +++ b/tests/study/test_study_details_documents.py @@ -1,4 +1,3 @@ - from SpiffWorkflow.bpmn.PythonScriptEngine import Box from tests.base_test import BaseTest @@ -56,7 +55,6 @@ class TestStudyDetailsDocumentsScript(BaseTest): @patch('crc.services.protocol_builder.requests.get') def test_no_validation_error_when_correct_file_exists(self, mock_get): - mock_get.return_value.ok = True mock_get.return_value.text = self.protocol_builder_response('required_docs.json') @@ -105,15 +103,15 @@ class TestStudyDetailsDocumentsScript(BaseTest): workflow_model = StudyService._create_workflow_model(study, workflow_spec_model) irb_code = "UVACompl_PRCAppr" # The first file referenced in pb required docs. file = FileService.add_workflow_file(workflow_id=workflow_model.id, - name="anything.png", content_type="text", - binary_data=b'1234', irb_doc_code=irb_code) + name="anything.png", content_type="text", + binary_data=b'1234', irb_doc_code=irb_code) processor = WorkflowProcessor(workflow_model) task = processor.next_task() FileDataSet().do_task(task, study.id, workflow_model.id, key="ginger", value="doodle", file_id=file.id) docs = StudyInfo().do_task(task, study.id, workflow_model.id, "documents") self.assertTrue(isinstance(docs, Box)) - self.assertEquals(1, len(docs.UVACompl_PRCAppr.files)) - self.assertEquals("doodle", docs.UVACompl_PRCAppr.files[0].data_store.ginger) + self.assertEqual(1, len(docs.UVACompl_PRCAppr.files)) + self.assertEqual("doodle", docs.UVACompl_PRCAppr.files[0].data_store.ginger) @patch('crc.services.protocol_builder.requests.get') def test_file_data_set_changes_irb_code(self, mock_get): @@ -126,16 +124,15 @@ class TestStudyDetailsDocumentsScript(BaseTest): workflow_model = StudyService._create_workflow_model(study, workflow_spec_model) irb_code = "UVACompl_PRCAppr" # The first file referenced in pb required docs. file = FileService.add_workflow_file(workflow_id=workflow_model.id, - name="anything.png", content_type="text", - binary_data=b'1234', irb_doc_code=irb_code) + name="anything.png", content_type="text", + binary_data=b'1234', irb_doc_code=irb_code) processor = WorkflowProcessor(workflow_model) task = processor.next_task() FileDataSet().do_task(task, study.id, workflow_model.id, key="irb_code", value="Study_App_Doc", file_id=file.id) docs = StudyInfo().do_task(task, study.id, workflow_model.id, "documents") self.assertTrue(isinstance(docs, Box)) - self.assertEquals(1, len(docs.Study_App_Doc.files)) - self.assertEquals("Study_App_Doc", docs.Study_App_Doc.files[0].data_store.irb_code) - + self.assertEqual(1, len(docs.Study_App_Doc.files)) + self.assertEqual("Study_App_Doc", docs.Study_App_Doc.files[0].data_store.irb_code) @patch('crc.services.protocol_builder.requests.get') def test_file_data_set_invalid_irb_code_fails(self, mock_get): @@ -148,10 +145,10 @@ class TestStudyDetailsDocumentsScript(BaseTest): workflow_model = StudyService._create_workflow_model(study, workflow_spec_model) irb_code = "UVACompl_PRCAppr" # The first file referenced in pb required docs. file = FileService.add_workflow_file(workflow_id=workflow_model.id, - name="anything.png", content_type="text", - binary_data=b'1234', irb_doc_code=irb_code) + name="anything.png", content_type="text", + binary_data=b'1234', irb_doc_code=irb_code) processor = WorkflowProcessor(workflow_model) task = processor.next_task() with self.assertRaises(ApiError): FileDataSet().do_task(task, study.id, workflow_model.id, key="irb_code", value="My_Pretty_Pony", - file_id=file.id) + file_id=file.id) diff --git a/tests/study/test_study_sponsors_script.py b/tests/study/test_study_sponsors_script.py index b47927c4..ab5e6f3b 100755 --- a/tests/study/test_study_sponsors_script.py +++ b/tests/study/test_study_sponsors_script.py @@ -45,4 +45,4 @@ class TestSudySponsorsScript(BaseTest): self.assertTrue(processor.bpmn_workflow.is_completed()) data = processor.next_task().data self.assertIn('sponsors', data) - self.assertEquals(3, len(data['sponsors'])) + self.assertEqual(3, len(data['sponsors'])) diff --git a/tests/test_document_directories.py b/tests/test_document_directories.py index 670af86b..7b3f75fd 100755 --- a/tests/test_document_directories.py +++ b/tests/test_document_directories.py @@ -28,11 +28,11 @@ class TestDocumentDirectories(BaseTest): self.assert_success(rv) json_data = json.loads(rv.get_data(as_text=True)) print(json_data) - self.assertEquals(2, len(json_data)) - self.assertEquals('UVA Compliance', json_data[0]['level']) - self.assertEquals('PRC Approval', json_data[0]['children'][0]['level']) - self.assertEquals('something.png', json_data[0]['children'][0]['children'][0]['file']['name']) - self.assertEquals('Study', json_data[1]['level']) - self.assertEquals('Application', json_data[1]['children'][0]['level']) - self.assertEquals('Document', json_data[1]['children'][0]['children'][0]['level']) - self.assertEquals('anything.png', json_data[1]['children'][0]['children'][0]['children'][0]['file']['name']) + self.assertEqual(2, len(json_data)) + self.assertEqual('UVA Compliance', json_data[0]['level']) + self.assertEqual('PRC Approval', json_data[0]['children'][0]['level']) + self.assertEqual('something.png', json_data[0]['children'][0]['children'][0]['file']['name']) + self.assertEqual('Study', json_data[1]['level']) + self.assertEqual('Application', json_data[1]['children'][0]['level']) + self.assertEqual('Document', json_data[1]['children'][0]['children'][0]['level']) + self.assertEqual('anything.png', json_data[1]['children'][0]['children'][0]['children'][0]['file']['name']) diff --git a/tests/test_multi_instance_tasks_api.py b/tests/test_multi_instance_tasks_api.py index 12036e2d..ca5100f5 100755 --- a/tests/test_multi_instance_tasks_api.py +++ b/tests/test_multi_instance_tasks_api.py @@ -106,6 +106,6 @@ class TestMultiinstanceTasksApi(BaseTest): self.assertEqual(WorkflowStatus.complete, workflow.status) data = workflow.next_task.data for key in data["StudyInfo"]["investigators"]: - self.assertEquals("dhf8r@virginia.edu", data["StudyInfo"]["investigators"][key]['email']) + self.assertEqual("dhf8r@virginia.edu", data["StudyInfo"]["investigators"][key]['email']) diff --git a/tests/test_wait_event.py b/tests/test_wait_event.py index 352f3b43..18ee1ed9 100755 --- a/tests/test_wait_event.py +++ b/tests/test_wait_event.py @@ -40,7 +40,7 @@ class TestTimerEvent(BaseTest): with self.assertLogs('crc', level='ERROR') as cm: WorkflowService.do_waiting() self.assertEqual(1, len(cm.output)) - self.assertRegexpMatches(cm.output[0], f"workflow #%i" % workflow.id) - self.assertRegexpMatches(cm.output[0], f"study #%i" % workflow.study_id) + self.assertRegex(cm.output[0], f"workflow #%i" % workflow.id) + self.assertRegex(cm.output[0], f"study #%i" % workflow.study_id) self.assertTrue(wf.status == WorkflowStatus.waiting) diff --git a/tests/workflow/test_workflow_enum_empty_list.py b/tests/workflow/test_workflow_enum_empty_list.py index 38f1def7..0effdf74 100755 --- a/tests/workflow/test_workflow_enum_empty_list.py +++ b/tests/workflow/test_workflow_enum_empty_list.py @@ -24,5 +24,5 @@ class TestEmptyEnumList(BaseTest): service = WorkflowService() checkbox_enum_field = task.task_spec.form.fields[0] radio_enum_field = task.task_spec.form.fields[1] - self.assertEquals([], service.get_default_value(checkbox_enum_field, task)) - self.assertEquals({'label': None, 'value': None}, service.get_default_value(radio_enum_field, task)) + self.assertEqual([], service.get_default_value(checkbox_enum_field, task)) + self.assertEqual({'label': None, 'value': None}, service.get_default_value(radio_enum_field, task)) diff --git a/tests/workflow/test_workflow_spec_validation_api.py b/tests/workflow/test_workflow_spec_validation_api.py index 9ada7cd7..3c144d39 100755 --- a/tests/workflow/test_workflow_spec_validation_api.py +++ b/tests/workflow/test_workflow_spec_validation_api.py @@ -145,5 +145,5 @@ class TestWorkflowSpecValidation(BaseTest): final_data = WorkflowService.test_spec(spec_model.id, required_only=True) self.assertIsNotNone(final_data) self.assertIn('enum_with_default', final_data) - self.assertEquals('maybe', final_data['enum_with_default']['value']) + self.assertEqual('maybe', final_data['enum_with_default']['value']) From 4a2581e938d1872fcd61075351b1bb7e0e5f0c9c Mon Sep 17 00:00:00 2001 From: nilez Date: Thu, 12 Aug 2021 14:03:44 -0400 Subject: [PATCH 15/15] get studies raises and error when invalid studies are the only studies associated with the user --- crc/api/study.py | 6 ++++++ crc/services/study_service.py | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/crc/api/study.py b/crc/api/study.py index df469710..bbdcad01 100755 --- a/crc/api/study.py +++ b/crc/api/study.py @@ -99,6 +99,12 @@ def user_studies(): user = UserService.current_user(allow_admin_impersonate=True) StudyService.synch_with_protocol_builder_if_enabled(user) studies = StudyService().get_studies_for_user(user) + if len(studies) == 0: + studies = StudyService().get_studies_for_user(user, include_invalid=True) + if len(studies) > 0: + message = f"All studies associated with User: {user.display_name} failed study validation" + raise ApiError(code="study_integrity_error", message=message) + results = StudySchema(many=True).dump(studies) return results diff --git a/crc/services/study_service.py b/crc/services/study_service.py index 738ee0e9..b21c8e5b 100755 --- a/crc/services/study_service.py +++ b/crc/services/study_service.py @@ -42,7 +42,7 @@ class StudyService(object): return True return False - def get_studies_for_user(self, user): + def get_studies_for_user(self, user, include_invalid=False): """Returns a list of all studies for the given user.""" associated = session.query(StudyAssociated).filter_by(uid=user.uid, access=True).all() associated_studies = [x.study_id for x in associated] @@ -51,7 +51,7 @@ class StudyService(object): studies = [] for study_model in db_studies: - if self._is_valid_study(study_model.id): + if include_invalid or self._is_valid_study(study_model.id): studies.append(StudyService.get_study(study_model.id, study_model, do_status=False)) return studies @@ -130,7 +130,7 @@ class StudyService(object): return people else: raise ApiError('uid_not_associated_with_study', "user id %s was not associated with study number %d" % (uid, - study_id)) + study_id)) @staticmethod def get_study_associates(study_id):