From 2e94ab1584e9d7d092a0eaf2bde35fd17bb50e0c Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Fri, 22 May 2020 14:55:55 -0400 Subject: [PATCH 01/43] Only runs upgrade if env variable says to. --- Dockerfile | 1 - docker_run.sh | 12 +++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index fae1657f..fc86ddb0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,7 +17,6 @@ RUN pip install pipenv && \ COPY . /app/ ENV FLASK_APP=/app/crc/__init__.py -CMD ["pipenv", "run", "flask", "db", "upgrade"] CMD ["pipenv", "run", "python", "/app/run.py"] # expose ports diff --git a/docker_run.sh b/docker_run.sh index 95792392..1ff01c11 100755 --- a/docker_run.sh +++ b/docker_run.sh @@ -3,17 +3,15 @@ # run migrations export FLASK_APP=./crc/__init__.py -for entry in ./instance/* ; do - echo "$entry" - cat $entry -done - if [ "$DOWNGRADE_DB" = "true" ]; then - echo 'Downgrading...' + echo 'Downgrading database...' pipenv run flask db downgrade fi -pipenv run flask db upgrade +if [ "$UPGRADE_DB" = "true" ]; then + echo 'Upgrading database...' + pipenv run flask db upgrade +fi if [ "$RESET_DB" = "true" ]; then echo 'Resetting database...' From 20bf01a88800b6e36a64a4c12a9396e9ca4397ba Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Fri, 22 May 2020 22:04:11 -0400 Subject: [PATCH 02/43] Adds cascade to study relationship so data loader doesn't freak out. --- crc/models/approval.py | 2 +- example_data.py | 3 ++- migrations/versions/55c6cd407d89_.py | 39 ++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 migrations/versions/55c6cd407d89_.py diff --git a/crc/models/approval.py b/crc/models/approval.py index 4860bf59..7d513a7f 100644 --- a/crc/models/approval.py +++ b/crc/models/approval.py @@ -18,7 +18,7 @@ class ApprovalModel(db.Model): __tablename__ = 'approval' id = db.Column(db.Integer, primary_key=True) study_id = db.Column(db.Integer, db.ForeignKey(StudyModel.id), nullable=False) - study = db.relationship(StudyModel, backref='approval') + study = db.relationship(StudyModel, backref='approval', cascade='all,delete') workflow_id = db.Column(db.Integer, db.ForeignKey(WorkflowModel.id), nullable=False) workflow_version = db.Column(db.String) approver_uid = db.Column(db.String) # Not linked to user model, as they may not have logged in yet. diff --git a/example_data.py b/example_data.py index 22e6f95b..7f53b13c 100644 --- a/example_data.py +++ b/example_data.py @@ -14,7 +14,8 @@ class ExampleDataLoader: session.flush() # Clear out any transactions before deleting it all to avoid spurious errors. for table in reversed(db.metadata.sorted_tables): session.execute(table.delete()) - session.flush() + session.commit() + session.flush() def load_all(self): diff --git a/migrations/versions/55c6cd407d89_.py b/migrations/versions/55c6cd407d89_.py new file mode 100644 index 00000000..e5dd02ee --- /dev/null +++ b/migrations/versions/55c6cd407d89_.py @@ -0,0 +1,39 @@ +"""empty message + +Revision ID: 55c6cd407d89 +Revises: cc4bccc5e5a8 +Create Date: 2020-05-22 22:02:46.650170 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '55c6cd407d89' +down_revision = 'cc4bccc5e5a8' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('approval', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('study_id', sa.Integer(), nullable=False), + sa.Column('workflow_id', sa.Integer(), nullable=False), + sa.Column('workflow_version', sa.String(), nullable=True), + sa.Column('approver_uid', sa.String(), nullable=True), + sa.Column('status', sa.String(), nullable=True), + sa.Column('message', sa.String(), nullable=True), + sa.ForeignKeyConstraint(['study_id'], ['study.id'], ), + sa.ForeignKeyConstraint(['workflow_id'], ['workflow.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('approval') + # ### end Alembic commands ### From 6c14248ef9fa8e0ecb86dff82d379de223f7f7b5 Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Sat, 23 May 2020 14:49:02 -0400 Subject: [PATCH 03/43] Adds 'v1.0/' to login route --- crc/api/user.py | 2 +- tests/test_authentication.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crc/api/user.py b/crc/api/user.py index 6924eb27..3e423fc6 100644 --- a/crc/api/user.py +++ b/crc/api/user.py @@ -32,7 +32,7 @@ def verify_token(token): def get_current_user(): return UserModelSchema().dump(g.user) -@app.route('/login') +@app.route('/v1.0/login') def sso_login(): # This what I see coming back: # X-Remote-Cn: Daniel Harold Funk (dhf8r) diff --git a/tests/test_authentication.py b/tests/test_authentication.py index 2767797a..7601a220 100644 --- a/tests/test_authentication.py +++ b/tests/test_authentication.py @@ -44,7 +44,7 @@ class TestAuthentication(BaseTest): self.assertIsNone(user) redirect_url = 'http://worlds.best.website/admin' headers = dict(Uid=new_uid) - rv = self.app.get('login', follow_redirects=False, headers=headers) + rv = self.app.get('v1.0/login', follow_redirects=False, headers=headers) self.assert_success(rv) user = db.session.query(UserModel).filter(UserModel.uid == new_uid).first() self.assertIsNotNone(user) From 68084a84cf0648aa48dc40f2c6d66ca97101402e Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Sat, 23 May 2020 22:07:22 -0400 Subject: [PATCH 04/43] Adds base href environment variable. Sets base path for API and all routes from BASE_HREF environment variable. --- config/default.py | 8 ++++++-- crc/__init__.py | 2 +- crc/api/user.py | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/config/default.py b/config/default.py index f31f2889..cb6cb832 100644 --- a/config/default.py +++ b/config/default.py @@ -13,6 +13,9 @@ DEVELOPMENT = environ.get('DEVELOPMENT', default="true") == "true" TESTING = environ.get('TESTING', default="false") == "true" PRODUCTION = (environ.get('PRODUCTION', default="false") == "true") or (not DEVELOPMENT and not TESTING) +# Add trailing slash to base path +BASE_HREF = re.sub(r'//', '/', '/%s/' % environ.get('BASE_HREF', default="/").strip('/')) + DB_HOST = environ.get('DB_HOST', default="localhost") DB_PORT = environ.get('DB_PORT', default="5432") DB_NAME = environ.get('DB_NAME', default="crc_dev") @@ -29,13 +32,13 @@ SWAGGER_AUTH_KEY = environ.get('SWAGGER_AUTH_KEY', default="SWAGGER") # %s/%i placeholders expected for uva_id and study_id in various calls. PB_ENABLED = environ.get('PB_ENABLED', default=True) -PB_BASE_URL = environ.get('PB_BASE_URL', default="http://localhost:5001/pb/") +PB_BASE_URL = environ.get('PB_BASE_URL', default="http://localhost:5001/pb/").strip('/') + '/' # Trailing slash required PB_USER_STUDIES_URL = environ.get('PB_USER_STUDIES_URL', default=PB_BASE_URL + "user_studies?uva_id=%s") PB_INVESTIGATORS_URL = environ.get('PB_INVESTIGATORS_URL', default=PB_BASE_URL + "investigators?studyid=%i") PB_REQUIRED_DOCS_URL = environ.get('PB_REQUIRED_DOCS_URL', default=PB_BASE_URL + "required_docs?studyid=%i") PB_STUDY_DETAILS_URL = environ.get('PB_STUDY_DETAILS_URL', default=PB_BASE_URL + "study?studyid=%i") -LDAP_URL = environ.get('LDAP_URL', default="ldap.virginia.edu") +LDAP_URL = environ.get('LDAP_URL', default="ldap.virginia.edu").strip('/') # No trailing slash or http:// LDAP_TIMEOUT_SEC = environ.get('LDAP_TIMEOUT_SEC', default=3) print('=== USING DEFAULT CONFIG: ===') print('DB_HOST = ', DB_HOST) @@ -45,4 +48,5 @@ print('TESTING = ', TESTING) print('PRODUCTION = ', PRODUCTION) print('PB_BASE_URL = ', PB_BASE_URL) print('LDAP_URL = ', LDAP_URL) +print('BASE_HREF = ', BASE_HREF) diff --git a/crc/__init__.py b/crc/__init__.py index 9f1c4ee3..c0569e68 100644 --- a/crc/__init__.py +++ b/crc/__init__.py @@ -34,7 +34,7 @@ ma = Marshmallow(app) from crc import models from crc import api -connexion_app.add_api('api.yml') +connexion_app.add_api('api.yml', base_path=app.config['BASE_HREF'] + 'v1.0') # Convert list of allowed origins to list of regexes origins_re = [r"^https?:\/\/%s(.*)" % o.replace('.', '\.') for o in app.config['CORS_ALLOW_ORIGINS']] diff --git a/crc/api/user.py b/crc/api/user.py index 3e423fc6..cb3bd91d 100644 --- a/crc/api/user.py +++ b/crc/api/user.py @@ -32,7 +32,7 @@ def verify_token(token): def get_current_user(): return UserModelSchema().dump(g.user) -@app.route('/v1.0/login') +@app.route(app.config['BASE_HREF'] + 'v1.0/login') def sso_login(): # This what I see coming back: # X-Remote-Cn: Daniel Harold Funk (dhf8r) @@ -67,7 +67,7 @@ def sso_login(): return _handle_login(info, redirect) -@app.route('/sso') +@app.route(app.config['BASE_HREF'] + 'sso') def sso(): response = "" response += "

Headers

" From 4eaee570769082ff58ad8a8e77bf801cafb4ed25 Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Sun, 24 May 2020 00:05:13 -0400 Subject: [PATCH 05/43] Apparently, APPLICATION_ROOT does something. --- config/default.py | 4 ++-- crc/__init__.py | 2 +- crc/api/user.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/config/default.py b/config/default.py index cb6cb832..8eff8dfa 100644 --- a/config/default.py +++ b/config/default.py @@ -14,7 +14,7 @@ TESTING = environ.get('TESTING', default="false") == "true" PRODUCTION = (environ.get('PRODUCTION', default="false") == "true") or (not DEVELOPMENT and not TESTING) # Add trailing slash to base path -BASE_HREF = re.sub(r'//', '/', '/%s/' % environ.get('BASE_HREF', default="/").strip('/')) +APPLICATION_ROOT = re.sub(r'//', '/', '/%s/' % environ.get('APPLICATION_ROOT', default="/").strip('/')) DB_HOST = environ.get('DB_HOST', default="localhost") DB_PORT = environ.get('DB_PORT', default="5432") @@ -48,5 +48,5 @@ print('TESTING = ', TESTING) print('PRODUCTION = ', PRODUCTION) print('PB_BASE_URL = ', PB_BASE_URL) print('LDAP_URL = ', LDAP_URL) -print('BASE_HREF = ', BASE_HREF) +print('APPLICATION_ROOT = ', APPLICATION_ROOT) diff --git a/crc/__init__.py b/crc/__init__.py index c0569e68..76919d2a 100644 --- a/crc/__init__.py +++ b/crc/__init__.py @@ -34,7 +34,7 @@ ma = Marshmallow(app) from crc import models from crc import api -connexion_app.add_api('api.yml', base_path=app.config['BASE_HREF'] + 'v1.0') +connexion_app.add_api('api.yml', base_path='/v1.0') # Convert list of allowed origins to list of regexes origins_re = [r"^https?:\/\/%s(.*)" % o.replace('.', '\.') for o in app.config['CORS_ALLOW_ORIGINS']] diff --git a/crc/api/user.py b/crc/api/user.py index cb3bd91d..3e423fc6 100644 --- a/crc/api/user.py +++ b/crc/api/user.py @@ -32,7 +32,7 @@ def verify_token(token): def get_current_user(): return UserModelSchema().dump(g.user) -@app.route(app.config['BASE_HREF'] + 'v1.0/login') +@app.route('/v1.0/login') def sso_login(): # This what I see coming back: # X-Remote-Cn: Daniel Harold Funk (dhf8r) @@ -67,7 +67,7 @@ def sso_login(): return _handle_login(info, redirect) -@app.route(app.config['BASE_HREF'] + 'sso') +@app.route('/sso') def sso(): response = "" response += "

Headers

" From be1d54bbc5bc0409ce26d86c45ec5dfc97a9d406 Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Sun, 24 May 2020 12:37:11 -0400 Subject: [PATCH 06/43] Builds Docker image as WSGI + gunicorn --- Dockerfile | 54 ++++++++++++++++++++++++++++++++++++---------------- Pipfile | 1 + Pipfile.lock | 16 ++++++++++++---- setup.cfg | 5 +++++ setup.py | 3 +++ 5 files changed, 59 insertions(+), 20 deletions(-) create mode 100644 setup.cfg create mode 100644 setup.py diff --git a/Dockerfile b/Dockerfile index fc86ddb0..1b0fda01 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,45 @@ -FROM python:3.6.9-slim +# +# https://medium.com/@greut/building-a-python-package-a-docker-image-using-pipenv-233d8793b6cc +# https://github.com/greut/pipenv-to-wheel +# +FROM kennethreitz/pipenv as pipenv +ADD . /app WORKDIR /app -COPY Pipfile Pipfile.lock /app/ +RUN pipenv install --dev \ + && pipenv lock -r > requirements.txt \ + && pipenv run python setup.py bdist_wheel -RUN pip install pipenv && \ - apt-get update && \ - apt-get install -y --no-install-recommends \ - gcc python3-dev libssl-dev \ - curl postgresql-client git-core && \ - pipenv install --dev && \ - apt-get remove -y gcc python3-dev libssl-dev && \ - apt-get purge -y --auto-remove && \ - rm -rf /var/lib/apt/lists/ * +# ---------------------------------------------------------------------------- +FROM ubuntu:bionic -COPY . /app/ +ARG DEBIAN_FRONTEND=noninteractive -ENV FLASK_APP=/app/crc/__init__.py -CMD ["pipenv", "run", "python", "/app/run.py"] +COPY --from=pipenv /app/dist/*.whl . -# expose ports -EXPOSE 5000 +RUN set -xe \ + && apt-get update -q \ + && apt-get install -y -q \ + python3-minimal \ + python3-wheel \ + python3-pip \ + gunicorn3 \ + postgresql-client \ + && python3 -m pip install *.whl \ + && apt-get remove -y python3-pip python3-wheel \ + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -f *.whl \ + && rm -rf /root/.cache \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /app \ + && useradd _gunicorn --no-create-home --user-group + +USER _gunicorn +ADD static /app/static +WORKDIR /app + +CMD ["gunicorn3", \ + "--bind", "0.0.0.0:8000", \ + "crc:app"] diff --git a/Pipfile b/Pipfile index 77c70afc..4441e9b0 100644 --- a/Pipfile +++ b/Pipfile @@ -5,6 +5,7 @@ verify_ssl = true [dev-packages] pytest = "*" +pbr = "*" [packages] connexion = {extras = ["swagger-ui"],version = "*"} diff --git a/Pipfile.lock b/Pipfile.lock index 036d4bf9..e9bcd5df 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "1ca737db75750ea4351c15b4b0b26155d90bc5522705ed293a0c2773600b6a0a" + "sha256": "61f93d8163e543498cc8d8d87e474f3676d386ac99749a110f62fc92e651febb" }, "pipfile-spec": 6, "requires": { @@ -235,11 +235,11 @@ }, "docxtpl": { "hashes": [ - "sha256:16a76d360c12f7da3a28821fc740b9a84b891895233493ff0b002ffaa6026905", - "sha256:f19adf2a713a753c1e056ef0ce395bc8da62d495b091ebf9fe67dfc6d1115f9f" + "sha256:0e031ea5da63339f2bac0fd7eb7b3b137303571a9a92c950501148240ea22047", + "sha256:45f04661b9ab1fd66b975a0a547b30c8811f457bef2f85249c2f3c5784a00052" ], "index": "pypi", - "version": "==0.9.2" + "version": "==0.10.0" }, "et-xmlfile": { "hashes": [ @@ -911,6 +911,14 @@ ], "version": "==20.4" }, + "pbr": { + "hashes": [ + "sha256:07f558fece33b05caf857474a366dfcc00562bca13dd8b47b2b3e22d9f9bf55c", + "sha256:579170e23f8e0c2f24b0de612f71f648eccb79fb1322c814ae6b3c07b5ba23e8" + ], + "index": "pypi", + "version": "==5.4.5" + }, "pluggy": { "hashes": [ "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 00000000..7a557fd5 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,5 @@ +[metadata] +name = crc + +[files] +packages = crc diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..159a3d35 --- /dev/null +++ b/setup.py @@ -0,0 +1,3 @@ +from setuptools import setup + +setup(setup_requires=["pbr"], pbr=True) From baaf73b5d99598053963e6285b74e514308736b7 Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Sun, 24 May 2020 13:43:12 -0400 Subject: [PATCH 07/43] Bumps Python version to 3.7 --- .travis.yml | 2 +- Pipfile | 2 +- Pipfile.lock | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9ca51691..fba238f6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: python python: - - "3.6.9" + - "3.7" services: - postgresql diff --git a/Pipfile b/Pipfile index 4441e9b0..87a9e1a5 100644 --- a/Pipfile +++ b/Pipfile @@ -38,4 +38,4 @@ xlrd = "*" ldap3 = "*" [requires] -python_version = "3.6.9" +python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock index e9bcd5df..8f42c733 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "61f93d8163e543498cc8d8d87e474f3676d386ac99749a110f62fc92e651febb" + "sha256": "a632f1a0b0f66dbddb4e0a43837b8e168ad78b8c4c5a8e6eba25a0145fe14477" }, "pipfile-spec": 6, "requires": { - "python_version": "3.6.9" + "python_version": "3.7" }, "sources": [ { From 28c254a106b29feb90088a98279c9712c01f9d68 Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Sun, 24 May 2020 14:11:53 -0400 Subject: [PATCH 08/43] Fixes path to static directory --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 1b0fda01..45d5eaca 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,7 +37,7 @@ RUN set -xe \ && useradd _gunicorn --no-create-home --user-group USER _gunicorn -ADD static /app/static +ADD crc/static /app/static WORKDIR /app CMD ["gunicorn3", \ From 52208d9c8a20d1311bb26b81dc847176e310cbad Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Sun, 24 May 2020 14:53:48 -0400 Subject: [PATCH 09/43] Adds wait-for-it script --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index 45d5eaca..01e48251 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,6 +17,7 @@ FROM ubuntu:bionic ARG DEBIAN_FRONTEND=noninteractive COPY --from=pipenv /app/dist/*.whl . +COPY wait-for-it.sh . RUN set -xe \ && apt-get update -q \ From 0f48d6c81e1facb7936b987a4cbf78a3c93bf9dd Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Sun, 24 May 2020 17:18:56 -0400 Subject: [PATCH 10/43] Installs the app in the right place (maybe?) --- Dockerfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 01e48251..43073c86 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,7 +17,6 @@ FROM ubuntu:bionic ARG DEBIAN_FRONTEND=noninteractive COPY --from=pipenv /app/dist/*.whl . -COPY wait-for-it.sh . RUN set -xe \ && apt-get update -q \ @@ -27,7 +26,7 @@ RUN set -xe \ python3-pip \ gunicorn3 \ postgresql-client \ - && python3 -m pip install *.whl \ + && python3 -m pip install --target=/app *.whl \ && apt-get remove -y python3-pip python3-wheel \ && apt-get autoremove -y \ && apt-get clean -y \ @@ -38,7 +37,10 @@ RUN set -xe \ && useradd _gunicorn --no-create-home --user-group USER _gunicorn -ADD crc/static /app/static + +COPY crc/static /app/static +COPY docker_run.sh /app +COPY wait-for-it.sh /app WORKDIR /app CMD ["gunicorn3", \ From 5ec97dc68d60f3e9f0425c409052fa9c81654f67 Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Sun, 24 May 2020 18:29:45 -0400 Subject: [PATCH 11/43] Goes back to default install location. Copies files to the right spot --- Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 43073c86..73f3902e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -26,7 +26,7 @@ RUN set -xe \ python3-pip \ gunicorn3 \ postgresql-client \ - && python3 -m pip install --target=/app *.whl \ + && python3 -m pip install *.whl \ && apt-get remove -y python3-pip python3-wheel \ && apt-get autoremove -y \ && apt-get clean -y \ @@ -38,9 +38,9 @@ RUN set -xe \ USER _gunicorn -COPY crc/static /app/static -COPY docker_run.sh /app -COPY wait-for-it.sh /app +COPY ./crc/static /app/static +COPY ./docker_run.sh /app/ +COPY ./wait-for-it.sh /app/ WORKDIR /app CMD ["gunicorn3", \ From b1718078ff602dc90c45dc537e87129813ed910a Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Sun, 24 May 2020 20:53:25 -0400 Subject: [PATCH 12/43] Refactors Dockerfile again. Installs gunicorn. Don't run gunicorn until the container starts up. --- Dockerfile | 63 +++++++++++++++++++--------------------------------- Pipfile | 1 + Pipfile.lock | 10 ++++++++- 3 files changed, 33 insertions(+), 41 deletions(-) diff --git a/Dockerfile b/Dockerfile index 73f3902e..f07a9e9c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,48 +1,31 @@ -# -# https://medium.com/@greut/building-a-python-package-a-docker-image-using-pipenv-233d8793b6cc -# https://github.com/greut/pipenv-to-wheel -# -FROM kennethreitz/pipenv as pipenv +FROM python:3.7-slim -ADD . /app WORKDIR /app - -RUN pipenv install --dev \ - && pipenv lock -r > requirements.txt \ - && pipenv run python setup.py bdist_wheel - -# ---------------------------------------------------------------------------- -FROM ubuntu:bionic - -ARG DEBIAN_FRONTEND=noninteractive - -COPY --from=pipenv /app/dist/*.whl . +COPY Pipfile Pipfile.lock /app/ RUN set -xe \ - && apt-get update -q \ - && apt-get install -y -q \ - python3-minimal \ - python3-wheel \ - python3-pip \ - gunicorn3 \ - postgresql-client \ - && python3 -m pip install *.whl \ - && apt-get remove -y python3-pip python3-wheel \ - && apt-get autoremove -y \ - && apt-get clean -y \ - && rm -f *.whl \ - && rm -rf /root/.cache \ - && rm -rf /var/lib/apt/lists/* \ - && mkdir -p /app \ - && useradd _gunicorn --no-create-home --user-group + && pip install pipenv + && apt-get update -q \ + && apt-get install -y -q \ + gcc python3-dev libssl-dev \ + curl postgresql-client git-core \ + gunicorn3 postgresql-client \ + && pipenv install --dev \ + && apt-get remove -y gcc python3-dev libssl-dev \ + && apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /var/lib/apt/lists/* \ + && mkdir -p /app \ + && useradd _gunicorn --no-create-home --user-group +COPY . /app/ USER _gunicorn - -COPY ./crc/static /app/static -COPY ./docker_run.sh /app/ -COPY ./wait-for-it.sh /app/ WORKDIR /app +ENV FLASK_APP=/app/crc/__init__.py -CMD ["gunicorn3", \ - "--bind", "0.0.0.0:8000", \ - "crc:app"] +# Don't run gunicorn until the DC/OS container actually starts. +# Otherwise, environment variables will not be availabele. +#CMD ["pipenv", "run", "gunicorn", \ +# "--bind", "0.0.0.0:8000", \ +# "-e", "SCRIPT_NAME=/api", \ +# "crc:app"] diff --git a/Pipfile b/Pipfile index 87a9e1a5..e8300cdf 100644 --- a/Pipfile +++ b/Pipfile @@ -36,6 +36,7 @@ python-dateutil = "*" pandas = "*" xlrd = "*" ldap3 = "*" +gunicorn = "*" [requires] python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock index 8f42c733..6da88430 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "a632f1a0b0f66dbddb4e0a43837b8e168ad78b8c4c5a8e6eba25a0145fe14477" + "sha256": "5363eb56e2e1622e2c443647fdf0b1963f3d0ee7b25c61f7065a542e546ece5b" }, "pipfile-spec": 6, "requires": { @@ -307,6 +307,14 @@ ], "version": "==0.18.2" }, + "gunicorn": { + "hashes": [ + "sha256:1904bb2b8a43658807108d59c3f3d56c2b6121a701161de0ddf9ad140073c626", + "sha256:cd4a810dd51bf497552cf3f863b575dabd73d6ad6a91075b65936b151cbf4f9c" + ], + "index": "pypi", + "version": "==20.0.4" + }, "httpretty": { "hashes": [ "sha256:24a6fd2fe1c76e94801b74db8f52c0fb42718dc4a199a861b305b1a492b9d868" From 532e6b84332bbc9cd146a74318eef50424fe2b2c Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Sun, 24 May 2020 20:58:19 -0400 Subject: [PATCH 13/43] Starts gunicorn, passing port and base href path --- docker_run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker_run.sh b/docker_run.sh index 1ff01c11..fa4c90f0 100755 --- a/docker_run.sh +++ b/docker_run.sh @@ -18,4 +18,4 @@ if [ "$RESET_DB" = "true" ]; then pipenv run flask load-example-data fi -pipenv run python ./run.py +pipenv run gunicorn -e SCRIPT_NAME="$APPLICATION_ROOT" --bind 0.0.0.0:$PORT0 run:app From 00255ce2a07ee92a2a3fc096699447fe718a56fd Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Sun, 24 May 2020 21:01:02 -0400 Subject: [PATCH 14/43] Forgot a backslash --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f07a9e9c..c1ec0cb8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ WORKDIR /app COPY Pipfile Pipfile.lock /app/ RUN set -xe \ - && pip install pipenv + && pip install pipenv \ && apt-get update -q \ && apt-get install -y -q \ gcc python3-dev libssl-dev \ From d9d1367556b611fab814ab18a0aa00a1eb08c432 Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Sun, 24 May 2020 21:09:55 -0400 Subject: [PATCH 15/43] Runs as root (for now) --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index c1ec0cb8..7bc2ea60 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,7 +19,6 @@ RUN set -xe \ && useradd _gunicorn --no-create-home --user-group COPY . /app/ -USER _gunicorn WORKDIR /app ENV FLASK_APP=/app/crc/__init__.py From cb2613feee3fce887c8c6216af34212cf650bc06 Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Sun, 24 May 2020 23:09:12 -0400 Subject: [PATCH 16/43] Fixes all the paths and routing errors --- Dockerfile | 4 ++-- Pipfile | 1 + Pipfile.lock | 3 ++- docker_run.sh | 2 +- wsgi.py | 20 ++++++++++++++++++++ 5 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 wsgi.py diff --git a/Dockerfile b/Dockerfile index 7bc2ea60..54f2ce54 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,8 +23,8 @@ WORKDIR /app ENV FLASK_APP=/app/crc/__init__.py # Don't run gunicorn until the DC/OS container actually starts. -# Otherwise, environment variables will not be availabele. +# Otherwise, environment variables will not be available. #CMD ["pipenv", "run", "gunicorn", \ # "--bind", "0.0.0.0:8000", \ # "-e", "SCRIPT_NAME=/api", \ -# "crc:app"] +# "wsgi:app"] diff --git a/Pipfile b/Pipfile index e8300cdf..731ddad7 100644 --- a/Pipfile +++ b/Pipfile @@ -37,6 +37,7 @@ pandas = "*" xlrd = "*" ldap3 = "*" gunicorn = "*" +werkzeug = "*" [requires] python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock index 6da88430..0360e027 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "5363eb56e2e1622e2c443647fdf0b1963f3d0ee7b25c61f7065a542e546ece5b" + "sha256": "fad2f86b02a85b074e8ff9d8f3822784444d0925b0bf4227d4b26bbff1c45c2f" }, "pipfile-spec": 6, "requires": { @@ -863,6 +863,7 @@ "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43", "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c" ], + "index": "pypi", "version": "==1.0.1" }, "xlrd": { diff --git a/docker_run.sh b/docker_run.sh index fa4c90f0..8cc1c74c 100755 --- a/docker_run.sh +++ b/docker_run.sh @@ -18,4 +18,4 @@ if [ "$RESET_DB" = "true" ]; then pipenv run flask load-example-data fi -pipenv run gunicorn -e SCRIPT_NAME="$APPLICATION_ROOT" --bind 0.0.0.0:$PORT0 run:app +pipenv run gunicorn -e SCRIPT_NAME="$APPLICATION_ROOT" --bind 0.0.0.0:$PORT0 wsgi:app diff --git a/wsgi.py b/wsgi.py new file mode 100644 index 00000000..217dc506 --- /dev/null +++ b/wsgi.py @@ -0,0 +1,20 @@ +from werkzeug.exceptions import NotFound +from werkzeug.middleware.dispatcher import DispatcherMiddleware +from werkzeug.middleware.proxy_fix import ProxyFix + +from crc import app + +if __name__ == "__main__": + def no_app(environ, start_response): + return NotFound()(environ, start_response) + + + # Remove trailing slash, but add leading slash + base_url = '/' + app.config['APPLICATION_ROOT'].strip('/') + + app.wsgi_app = DispatcherMiddleware(no_app, {app.config['APPLICATION_ROOT']: app.wsgi_app}) + app.wsgi_app = ProxyFix(app.wsgi_app) + + flask_port = app.config['FLASK_PORT'] + + app.run(host='0.0.0.0', port=flask_port) From 14a2e4b5fabe67750cba24c5f32e9508fcf9ae41 Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Mon, 25 May 2020 00:47:49 -0400 Subject: [PATCH 17/43] Sets path to flask app in docker_run --- Dockerfile | 8 -------- docker_run.sh | 4 ++-- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/Dockerfile b/Dockerfile index 54f2ce54..8e6885a8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -20,11 +20,3 @@ RUN set -xe \ COPY . /app/ WORKDIR /app -ENV FLASK_APP=/app/crc/__init__.py - -# Don't run gunicorn until the DC/OS container actually starts. -# Otherwise, environment variables will not be available. -#CMD ["pipenv", "run", "gunicorn", \ -# "--bind", "0.0.0.0:8000", \ -# "-e", "SCRIPT_NAME=/api", \ -# "wsgi:app"] diff --git a/docker_run.sh b/docker_run.sh index 8cc1c74c..791ba079 100755 --- a/docker_run.sh +++ b/docker_run.sh @@ -1,7 +1,7 @@ #!/bin/bash # run migrations -export FLASK_APP=./crc/__init__.py +export FLASK_APP=/app/crc/__init__.py if [ "$DOWNGRADE_DB" = "true" ]; then echo 'Downgrading database...' @@ -18,4 +18,4 @@ if [ "$RESET_DB" = "true" ]; then pipenv run flask load-example-data fi -pipenv run gunicorn -e SCRIPT_NAME="$APPLICATION_ROOT" --bind 0.0.0.0:$PORT0 wsgi:app +pipenv run gunicorn -e SCRIPT_NAME="$APPLICATION_ROOT" --bind 0.0.0.0:"$PORT0" wsgi:app From d1eba27ee0f2c0104619fcf309ea9564dc79c8e2 Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Mon, 25 May 2020 11:41:53 -0400 Subject: [PATCH 18/43] Fixes root path bug --- docker_run.sh | 6 +++++- wsgi.py | 7 +++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/docker_run.sh b/docker_run.sh index 791ba079..ac85fed6 100755 --- a/docker_run.sh +++ b/docker_run.sh @@ -18,4 +18,8 @@ if [ "$RESET_DB" = "true" ]; then pipenv run flask load-example-data fi -pipenv run gunicorn -e SCRIPT_NAME="$APPLICATION_ROOT" --bind 0.0.0.0:"$PORT0" wsgi:app +if [ "$APPLICATION_ROOT" = "/" ]; then + pipenv run gunicorn -e --bind 0.0.0.0:$PORT0 wsgi:app +else + pipenv run gunicorn -e SCRIPT_NAME="$APPLICATION_ROOT" --bind 0.0.0.0:$PORT0 wsgi:app +fi diff --git a/wsgi.py b/wsgi.py index 217dc506..6e5d72be 100644 --- a/wsgi.py +++ b/wsgi.py @@ -8,11 +8,14 @@ if __name__ == "__main__": def no_app(environ, start_response): return NotFound()(environ, start_response) - # Remove trailing slash, but add leading slash base_url = '/' + app.config['APPLICATION_ROOT'].strip('/') + routes = {'/': app.wsgi_app} - app.wsgi_app = DispatcherMiddleware(no_app, {app.config['APPLICATION_ROOT']: app.wsgi_app}) + if base_url != '/': + routes[base_url] = app.wsgi_app + + app.wsgi_app = DispatcherMiddleware(no_app, routes) app.wsgi_app = ProxyFix(app.wsgi_app) flask_port = app.config['FLASK_PORT'] From 20cb35778c50f2c6bb7a8f69aa18ac674357f448 Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Mon, 25 May 2020 12:26:17 -0400 Subject: [PATCH 19/43] Ugh. Typo. --- docker_run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker_run.sh b/docker_run.sh index ac85fed6..6fbb21f3 100755 --- a/docker_run.sh +++ b/docker_run.sh @@ -19,7 +19,7 @@ if [ "$RESET_DB" = "true" ]; then fi if [ "$APPLICATION_ROOT" = "/" ]; then - pipenv run gunicorn -e --bind 0.0.0.0:$PORT0 wsgi:app + pipenv run gunicorn --bind 0.0.0.0:$PORT0 wsgi:app else pipenv run gunicorn -e SCRIPT_NAME="$APPLICATION_ROOT" --bind 0.0.0.0:$PORT0 wsgi:app fi From 6cd4ef64d1938015f35721e3e20486cb6402c19a Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Mon, 25 May 2020 12:29:05 -0400 Subject: [PATCH 20/43] Fixing add_study api endpoint, so you can actually add a new "Study" with just some basic information. Using the LDAP service for checking user details in development mode - even if you are using the back door. Added a new Flask fucntion load-example-rrt-data that loads the rrt workflow, and not the CRC wrokflows. Modified the "load-example-data" in the tests to use some test data, rather than loading up all the workflows[ in CRC each time, with a parameter to load crc data if that is required - which is enabled for just a handful of tests. (Tests run in 1/4 the time now) --- crc/__init__.py | 8 + crc/api/study.py | 27 +- crc/api/user.py | 5 +- crc/models/study.py | 9 +- crc/services/protocol_builder.py | 3 +- crc/services/study_service.py | 20 +- crc/static/bpmn/rrt/BuildingList.xls | Bin 0 -> 40448 bytes .../bpmn/rrt/DepartmentList-Architecture.xlsx | Bin 0 -> 32596 bytes .../bpmn/rrt/DepartmentList-ArtsSciences.xlsx | Bin 0 -> 28575 bytes .../bpmn/rrt/DepartmentList-Education.xlsx | Bin 0 -> 33837 bytes .../bpmn/rrt/DepartmentList-Engineering.xlsx | Bin 0 -> 38281 bytes .../bpmn/rrt/DepartmentList-Medicine.xlsx | Bin 0 -> 9819 bytes .../rrt/DepartmentList-ProvostOffice.xlsx | Bin 0 -> 34592 bytes crc/static/bpmn/rrt/DepartmentList.xlsx | Bin 0 -> 10057 bytes crc/static/bpmn/rrt/ResearchRampUpPlan.docx | Bin 0 -> 60306 bytes crc/static/bpmn/rrt/SchoolList.xls | Bin 0 -> 33792 bytes crc/static/bpmn/rrt/rrt.bpmn | 808 ++++++++++++++++++ crc/static/reference/rrt_documents.xlsx | Bin 0 -> 5985 bytes example_data.py | 68 +- tests/base_test.py | 22 +- tests/test_authentication.py | 8 +- tests/test_files_api.py | 2 +- tests/test_study_api.py | 41 +- tests/test_tasks_api.py | 10 +- tests/test_workflow_processor.py | 26 +- tests/test_workflow_spec_validation_api.py | 15 +- 26 files changed, 980 insertions(+), 92 deletions(-) create mode 100644 crc/static/bpmn/rrt/BuildingList.xls create mode 100644 crc/static/bpmn/rrt/DepartmentList-Architecture.xlsx create mode 100644 crc/static/bpmn/rrt/DepartmentList-ArtsSciences.xlsx create mode 100644 crc/static/bpmn/rrt/DepartmentList-Education.xlsx create mode 100644 crc/static/bpmn/rrt/DepartmentList-Engineering.xlsx create mode 100644 crc/static/bpmn/rrt/DepartmentList-Medicine.xlsx create mode 100644 crc/static/bpmn/rrt/DepartmentList-ProvostOffice.xlsx create mode 100644 crc/static/bpmn/rrt/DepartmentList.xlsx create mode 100644 crc/static/bpmn/rrt/ResearchRampUpPlan.docx create mode 100644 crc/static/bpmn/rrt/SchoolList.xls create mode 100644 crc/static/bpmn/rrt/rrt.bpmn create mode 100644 crc/static/reference/rrt_documents.xlsx diff --git a/crc/__init__.py b/crc/__init__.py index 9f1c4ee3..c39caff2 100644 --- a/crc/__init__.py +++ b/crc/__init__.py @@ -47,3 +47,11 @@ def load_example_data(): from example_data import ExampleDataLoader ExampleDataLoader.clean_db() ExampleDataLoader().load_all() + + +@app.cli.command() +def load_example_rrt_data(): + """Load example data into the database.""" + from example_data import ExampleDataLoader + ExampleDataLoader.clean_db() + ExampleDataLoader().load_rrt() diff --git a/crc/api/study.py b/crc/api/study.py index d4df4e1a..34ca4a3e 100644 --- a/crc/api/study.py +++ b/crc/api/study.py @@ -1,21 +1,32 @@ +from datetime import datetime + from flask import g from sqlalchemy.exc import IntegrityError from crc import session from crc.api.common import ApiError, ApiErrorSchema -from crc.models.protocol_builder import ProtocolBuilderStatus, ProtocolBuilderStudy +from crc.models.protocol_builder import ProtocolBuilderStatus from crc.models.study import StudySchema, StudyFilesSchema, StudyModel, Study -from crc.services.protocol_builder import ProtocolBuilderService from crc.services.study_service import StudyService def add_study(body): - """Or any study like object. """ - study: Study = StudySchema().load(body) - study_model = StudyModel(**study.model_args()) + """Or any study like object. Body should include a title, and primary_investigator_id """ + if 'primary_investigator_id' not in body: + raise ApiError("missing_pi", "Can't create a new study without a Primary Investigator.") + if 'title' not in body: + raise ApiError("missing_title", "Can't create a new study without a title.") + + study_model = StudyModel(user_uid=g.user.uid, + title=body['title'], + primary_investigator_id=body['primary_investigator_id'], + last_updated=datetime.now(), + protocol_builder_status=ProtocolBuilderStatus.ACTIVE) + session.add(study_model) - errors = StudyService._add_all_workflow_specs_to_study(study) + errors = StudyService._add_all_workflow_specs_to_study(study_model) session.commit() + study = StudyService().get_study(study_model.id) study_data = StudySchema().dump(study) study_data["errors"] = ApiErrorSchema(many=True).dump(errors) return study_data @@ -39,7 +50,7 @@ def update_study(study_id, body): def get_study(study_id): study_service = StudyService() study = study_service.get_study(study_id) - if(study is None): + if (study is None): raise ApiError("Study not found", status_code=404) schema = StudySchema() return schema.dump(study) @@ -67,5 +78,3 @@ def all_studies_and_files(): studies = StudyService.get_studies_with_files() results = StudyFilesSchema(many=True).dump(studies) return results - - diff --git a/crc/api/user.py b/crc/api/user.py index 6924eb27..a3d22b9c 100644 --- a/crc/api/user.py +++ b/crc/api/user.py @@ -149,9 +149,8 @@ def backdoor( ApiError. If on production, returns a 404 error. """ if not 'PRODUCTION' in app.config or not app.config['PRODUCTION']: - ldap_info = LdapUserInfo() - ldap_info.uid = connexion.request.args["uid"] - ldap_info.email_address = connexion.request.args["email_address"] + + ldap_info = LdapService().user_info(uid) return _handle_login(ldap_info, redirect_url) else: raise ApiError('404', 'unknown') diff --git a/crc/models/study.py b/crc/models/study.py index 54ceb1d3..2af9aeb7 100644 --- a/crc/models/study.py +++ b/crc/models/study.py @@ -107,7 +107,8 @@ class CategorySchema(ma.Schema): class Study(object): - def __init__(self, id, title, last_updated, primary_investigator_id, user_uid, + def __init__(self, title, last_updated, primary_investigator_id, user_uid, + id=None, protocol_builder_status=None, sponsor="", hsr_number="", ind_number="", categories=[], **argsv): self.id = id @@ -125,7 +126,8 @@ class Study(object): @classmethod def from_model(cls, study_model: StudyModel): - args = {k: v for k, v in study_model.__dict__.items() if not k.startswith('_')} + id = study_model.id # Just read some value, in case the dict expired, otherwise dict may be empty. + args = dict((k, v) for k, v in study_model.__dict__.items() if not k.startswith('_')) instance = cls(**args) return instance @@ -144,10 +146,13 @@ class Study(object): class StudySchema(ma.Schema): + id = fields.Integer(required=False, allow_none=True) categories = fields.List(fields.Nested(CategorySchema), dump_only=True) warnings = fields.List(fields.Nested(ApiErrorSchema), dump_only=True) protocol_builder_status = EnumField(ProtocolBuilderStatus) hsr_number = fields.String(allow_none=True) + sponsor = fields.String(allow_none=True) + ind_number = fields.String(allow_none=True) class Meta: model = Study diff --git a/crc/services/protocol_builder.py b/crc/services/protocol_builder.py index efe4bd72..ac950281 100644 --- a/crc/services/protocol_builder.py +++ b/crc/services/protocol_builder.py @@ -5,8 +5,7 @@ import requests from crc import app from crc.api.common import ApiError -from crc.models.protocol_builder import ProtocolBuilderStudy, ProtocolBuilderStudySchema, ProtocolBuilderInvestigator, \ - ProtocolBuilderRequiredDocument, ProtocolBuilderRequiredDocumentSchema +from crc.models.protocol_builder import ProtocolBuilderStudySchema, ProtocolBuilderRequiredDocument class ProtocolBuilderService(object): diff --git a/crc/services/study_service.py b/crc/services/study_service.py index 76586e8a..0a81fd79 100644 --- a/crc/services/study_service.py +++ b/crc/services/study_service.py @@ -64,16 +64,16 @@ class StudyService(object): def delete_study(study_id): session.query(TaskEventModel).filter_by(study_id=study_id).delete() for workflow in session.query(WorkflowModel).filter_by(study_id=study_id): - StudyService.delete_workflow(workflow.id) + StudyService.delete_workflow(workflow) session.query(StudyModel).filter_by(id=study_id).delete() session.commit() @staticmethod - def delete_workflow(workflow_id): - for file in session.query(FileModel).filter_by(workflow_id=workflow_id).all(): + def delete_workflow(workflow): + for file in session.query(FileModel).filter_by(workflow_id=workflow.id).all(): FileService.delete_file(file.id) - session.query(TaskEventModel).filter_by(workflow_id=workflow_id).delete() - session.query(WorkflowModel).filter_by(id=workflow_id).delete() + session.query(TaskEventModel).filter_by(workflow_id=workflow.id).delete() + session.query(WorkflowModel).filter_by(id=workflow.id).delete() @staticmethod def get_categories(): @@ -290,8 +290,8 @@ class StudyService(object): return WorkflowProcessor.run_master_spec(master_specs[0], study_model) @staticmethod - def _add_all_workflow_specs_to_study(study): - existing_models = session.query(WorkflowModel).filter(WorkflowModel.study_id == study.id).all() + def _add_all_workflow_specs_to_study(study_model:StudyModel): + existing_models = session.query(WorkflowModel).filter(WorkflowModel.study == study_model).all() existing_specs = list(m.workflow_spec_id for m in existing_models) new_specs = session.query(WorkflowSpecModel). \ filter(WorkflowSpecModel.is_master_spec == False). \ @@ -300,15 +300,15 @@ class StudyService(object): errors = [] for workflow_spec in new_specs: try: - StudyService._create_workflow_model(study, workflow_spec) + StudyService._create_workflow_model(study_model, workflow_spec) except WorkflowException as we: errors.append(ApiError.from_task_spec("workflow_execution_exception", str(we), we.sender)) return errors @staticmethod - def _create_workflow_model(study, spec): + def _create_workflow_model(study: StudyModel, spec): workflow_model = WorkflowModel(status=WorkflowStatus.not_started, - study_id=study.id, + study=study, workflow_spec_id=spec.id, last_updated=datetime.now()) session.add(workflow_model) diff --git a/crc/static/bpmn/rrt/BuildingList.xls b/crc/static/bpmn/rrt/BuildingList.xls new file mode 100644 index 0000000000000000000000000000000000000000..3bde7a707cca82e5442b6fbfdfd0986b5aac836d GIT binary patch literal 40448 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∋xiq+- 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 literal 0 HcmV?d00001 diff --git a/crc/static/bpmn/rrt/DepartmentList-Architecture.xlsx b/crc/static/bpmn/rrt/DepartmentList-Architecture.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8bf3f6ba7ef2a845945fe283d9c1bea651862624 GIT binary patch literal 32596 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

fY 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 literal 0 HcmV?d00001 diff --git a/crc/static/bpmn/rrt/DepartmentList-ArtsSciences.xlsx b/crc/static/bpmn/rrt/DepartmentList-ArtsSciences.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..37ad7866154c3fdc10022d79954a8cdfb05e2bcb GIT binary patch literal 28575 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%0AoDr9%8Vd4{KEL2 z1JtiA22@dvvInkc;P4MbhAzVPfA%FHgcr?9SSjK&b%#AW466uB;43Yf?u+VoI4&u`W!sroFY zFQs$*M^^igcJs=1njSfax>NQ?br+`} zLwE{LiunjXnI&Bl!c1t1Rp&5TRF_)a#i@mT__uzu{AdtH<;?15vx%ktkNkEz+T17> zd$3lFT|VkXIzDhvNoE;S!Pg(4Cf28pWiRZUiWvOdifjysP0Hch1(s8zbDnwp5xnZf zj^{0UyW1Bt|J0y_+&PJ`E}KAWGuj>(GDOZl5CdBfI1bJ22V!qy7N9L!{yYY^%onVC#s?O@v#)5V4McE^#hCu;3Z7O|y6eui4c{kovrC0~KMAIliMI+3` z@wtgr(z3(=k2xo2tBUTA{CATe-1^Xdamg96HzLMv`+@$9&Gv}!P`MeumNlze2-Fv& zo*^#=4Fz-wL#^}3<3B4QigAh)ZAt*@fsy(uVgOM@%7V~85L^6!F%**y?*!$dPXJ5F z1!n$0+%`in1Ws~*5zcwQkQ>Pzejr|D07_QALJgc9-8jWc1u&>SI)iFTAZWjsG2+hx z);I`Ef))h@z?LF1qHt5@F2INY^{jp%z8?oPl>hf1?hH(lCBXKDqlEKZ$P8+kFD&yU z>*~azXIwMBI?3`2J!mI9paJ7omoh?DX{ zO~hi*Rucglb*@PX!rCh#5WWjQ-)6)TrT@E8r#I!2k13TL@JsGOrA_z#-iq?y`&<2g z@z122&4&fsH22LMklTHT{LLu;$iodAa$I~a&yGr*l7q5su&B0teGGG`w)4XWQ&YLNJ9FlCs-&|UAVDqzCKLUXvQZeLnRClwcNk@W-OMdyS2A>ukXd$i9fRpKfci@3@bd=NmW6;oUo3&ADAf4yQaM7VGeJUq4(EtKZb_5~VfyTibqoSTt}D60A!)lfNcFW}%^c8eN9>`x6LNz}*6KTS5mhr9~;XVO9w#dftbwk5=n zu<1`f`y2mVxRn-|ApW6RtqCAJG5T1th5bZH8b!AF>Z< zDGh%Ats(orKEi>aMd&PWd(gEJf&8aO$N?YZ=OYA%1^E1@_x{%&@c$T11U-1c(Eqd} z{NEp7*}q-|N0jHd_@0a3IyV0@?R$T_XGQ1hySyd{p;{{=3j>Y ao6bGrvCG=QZm1)VSvi2n=R8&a77 literal 0 HcmV?d00001 diff --git a/crc/static/bpmn/rrt/DepartmentList-Medicine.xlsx b/crc/static/bpmn/rrt/DepartmentList-Medicine.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..41dcf3af5ce5ea306c4c1b431ceda364de123c16 GIT binary patch literal 9819 zcmeHtg~<7cMjds-N<+FzW2NL zdGGHpc<;>TGiRT(_gZJ|y;rZTD1(5A4?qT>0ssI?fS7<#k2V|t@CgwBzyqMdYl++0 zI-A%!>#4Zgn>gt(yV+P%WFf-SX8_<~`ES}7$ISx2S#ZH5%=_VH7l z12RW!o;?Szf^$;UCI#p_kQHS+r_{4&o&ijYT{Xgj=>?@es3Md=ASm{N$~V)`SEhJB zi>jh?p|}eW&GqyOz`y2mAvYBC@PEg|WHMy+vx(NAzMH&ur=dWp0H?SRpRHimbX`;j zG5jSYe$3PPDzaGLguSa1v1x|3>1aeEn=++Hs;tNatG?#Aud5^fB0THqiAZvpm9pRY zM8!HDJ*$Kw2`RwRCb~0AwKMHg`jc$gwnGTT{Lh%9$5<=(nCvg_qdr+jB2w8fE(L)a zxn3sB6`)?HQGq%;;C^~sIM~n2W@C2)@t1FvFB#6{(@?nmrI0|74Z?v+|ydhuJ>5CYZ0TsRJIy~ys}Ut3LKYt`N7X(_$k>9Xrs9slJQxGd#dpkoKOB{I5VS$%!0sBo-BG`frFVan4SCYzKUapEZbNyIu8QC0VCcHqaWEM({wvCrkFed zMlT%94M}BgVr$cTGUPIyKWk&82eus0W$x{pk+l;(+YV4yB%nn-eKx%SLK8}!YNW$y zpVfMa7=`wXW_kj~H#}sVn+j{!QdEs@N=u2Wm2t*ok;!2=Bb)N1qXm3@<2?lfq9A%6 zlPmhMQG{&{g>SWJqYDcG=6Q*+_ZL_;P*Sf)8%`2Kgj6&~oNI6r*~%fsOA3TZkJr{O zLsVDOdY+@5-6oq(C*M{QU7hluPld@Zk$-CZ5d zSYSK-cg=bnXxlLaV}k=2%V5Jsz*y$5%o3p_X9s1)0Ao-4;5dVf`&@AmzlAeC)$lc- zuPJ@`wSo+NB!sf3GTh+ay9(_5!ZnE*|5dctK{T{c^u?(TFG~r7eMKl6ZZK3jS;nvB zWoj0eq!6nzo5@G|!|=n)Qm=bks20e(<~%IJ_Xx>W%$z6CZ2@)Q7E%Kd$*GaA1e7-7 zEb_NLUqpReMa3EUS%SmjP}^YjXMS*rRZmCju{=8729-Sh6F{?_@s2}%NiJ>_2X*`G zImei!cOR>db2)q^6n0gzv zQDVBu0E-{b1G>I{X^G(Vl@UCn_TfrZ3GR%2Wg4@zQ{V-^O14L=0hza<(VnZ9mTX^3 z=uBD>apxTCVhj#=TpJ7;^gH$pz0G3?KI{o`M1SHU|KzgkdHxSJ;he_<3Kms;Q4Vp8 z$|OvccmtI$b2a6C7CK8qd^SpHL6cB^#<~e(a=v0TI>RNy+0?TpzI8S1l(f}>D_{9A z9T9i_BLL&~jo^qm*XmoOf7<)pM?aIh5CDJ(GynkqkG*#?H*hpDR(5u@ur+gf&=zrO zP}@~*9B-CkABs~&Yro>OCwp02{JQP(lWYw|NYIpvXu)rx$15>$pfjGkg!h^uag2Nk z#Wf0|QUggGW~Nv#uMSnwTqTU^)j%WI+0f9;-qXmhcRHu;H%EIck1Mgpu>#fH2;Fwyn}G*F})#8rGy|` zcn$_U!V!6T5y(n;*r-xSfE=8ad~1}qRbiDLCr1B zLRKgV=JPKpu7ulCH?GlcdWq*|+C4jDQkv>U$$NV@mEu&peYr&3d$+&!(W&c8y-$j~ zlO$@{69-hoNqGw!N8PI$^}q?N3ksa60lekoSXDs+Tzn826P%42o97&XCeamT@!_X_ zq=7V+D5@d7C?CwZLomGP&52eS>sLRGg;eG7YZ@8} zQSDE44k9ACYAZ@Yav7*$<7MAdlIG9k1#MGtMMRv;!Ido+8{owo4xjVw>ea+daVnbi zHyj1JrHG+4lut*E=P>rq8$WZy(-6o9CmscI1~5doR+oSl>%(|dB@F#VgrZaGh$WVw8IfL$IsnsHV+66#LRykHkkNM4je>p>Z%NKy#%@=Uelz$~TPoN;uZXxQ-LN1u zsabuf#ry1*!QD(~4%>&<{d8+>`9ke8wHpH6YQ<7tnef$JANGiyLW{@MC5NzX z!jZ7g#fXCN`)w34qya{cqpMiGFE8DXI=WikpG+exK5d_?AF8?_x7Mz*xaU@D{?Ubi-nH!SG&eJ2(rvIHz8i+|Sd#SsQvV%{w7 z2>R@s;!%p*cK3$;T!HzS$(&GUNOL`u*Fg-LlrzkAlH*)w_qv_UDQa0_ne9!e*fmg? zqJ4GVTN?N++`ty~om+JGzsuD5!sxEK6L=1`cp-MGpbZbGnmAj z)+nivTqe%((dH|T-HDQ;@(cCzD$S`)94H@+TBDbF$keI*`#Jh?qOYABvMCBxc?66C zGqdrs443E6VpXf($_%M-LEiC?g83MttdhZM68mMt!Kc6ff zi#w>o7>qPZkmTJ-xORP3#*5B#ms8#<7~hYu*i=KhId~9OdKvDRo7#ELp?>NJ;6b$# z2m0YKgODT}l#<~HpRWuDjfMv6!0j~u0DfY!7e_Di^QtrCzDIW~xUc0hb4jcS4#=3z zH=?0uql`WY;aFo)}yZG)hAAo=_T9jfNQw|f7{2s0I&y8EcXHUM~Sf5oMOA6{y_eE|I zR_Z7*m7$p(S#eerE(`~nJXsojXC*M1+V%BpjyH6rsf$%(*G#DnMeO>i#(e>5(w%N5 z;keLZ$U@lCNx(X`sG8oW4ko)4kJOD7;D%hlJoe4kig8ncrvvYrHS`W8s}nEqXJ#u* zR=nja!sX%w(v-sq-?(;`w^akRq_`x`oj*W^>4ifQzb9hrtlPcyIt0Lj5o&+pnYPIH z;D32Q4KZ z3@@RXx-nU*_ldckSucx0`Z1UqakvRBg^&)t8Lj57%~9N-#wAk?b&h!&$7b|e5I13y zh1j8rxS4K_X zU?J0ESkf5tU#_#WyS2$LpSfLi-foN)$LIBmPx)R~kHuSG#@|qx>J#=^T{4 z{tUIwx4PWn6R^Oe*Lkc`9Kzi@eN!| zFWV!sxZ74u(RECg}PJ`IcAuTe&68SY<@ccdTCdYu0H^8mfP z$lglg^Kge`dB`Gd02j_(HRRbn`}8YlVp`!Ydr%OI+47hJC6+|8`=Bq?2jAgH;&=$$ z*>O>c9~+wKkeLX7BgbTX=AN^wfFtUA9GB?$l+GzdU0MuZ0tNXv2~ySGy@jKi@jQk9z9Ab**Mi-gfU-;aeIZ_oi#>k7Ih4)%$q*Eb%5`oSG6e+O z$Bkj!`s@Xo>x7?YMiX;bXz)4Vz~bU7ozEW$d5K)c8)X@rHC+Eu@bK`HVFNk=WcjUcsV62Vww#=nqDIi2t3;O-!7fSbp7p`GXNjI(ATQ{NMwW zU18LQDB8C%K+>9UUeR)Rh9`_#o=kmJOcJ@daTsy)(q3@Xp|C?=P=UP%YoFfCx^%V|Wht-92xT zd6FWCnSC~jHM}X^jJ>FX(lFiJ{Vw6%zWx`8$k+Wh`)A-{t2(|QcMgsU)$NJ7>&Iej zBFLWMe)zei3u{D+Ys!fe!c0@z2%HT{EiKJeOCy6TPEW1FMHjwa%T$lOHb+(jIqIca z-lcflzfudy4jv`z?7^5ayf_oZqV12hzz~sE75{ih%o(p~!`j{9PJm{9qp{4HmQxry zCLsdU;@j%#RUtxNw-_#}*S87i>b0(Xil$Ti8SH_rk16W0g;q%w8{|t#FSne=P)$={ z=Q~>K(iE|fQMO*&-l;${C4uOo2REz@uP@DXizcNFPbwN3Cy}TWA$4z+wYL%ckwQX} zO13bd4jc&y)u%>z4n zlXiJ*x}S4GESrg`;N`;sIy#0mX%$d|UZSP6;?Fvr5ZNbaY%m)N1u#_YemHPU5I|2F z(nquLTDeJ;(|H*4?z$bse)8 zTIslxo;cjF37s(*fE!64K2@UNy@NO9@i5D?LOZa1$tG-Zw9>C9(d~ehfAr@D-54)( zgvN|4Kn-`jw`U<{tU=tuCj*50C*cn(@_s{WkJ*^ppSbEG=>Tk>{_FcE9E+CAwpS0N zz?xpm11}#|^|qg9ks$q}KJuQoq}#!M+%HNwAQpCh-(cSY4|yFZm$6tQzjd7T)QSKT z?pGcDdhLDS1j1g05$2hGvyi`EI`lxn(@6LEmdIZn)Fy(JKx|=@i5)^6^Q%2hO~(C< zOnU&v`bE*a>W1&_G1P6zv)%~28y0Y@avD+u^e4fJU#@dyN6@)B5&_-9qYSzx)JnI# zEd~oh9GU~iCfwkc!AjT1NP`}7X)H?V4I*a*WN=VCn9_x-W_b=oeocQb(~5m2u3iF> z?XSFYezw7ibSNaIo_mj=@?z-PV)%SAUNhN1}eTwZ$%A8l|560%C0f~yF z`K}WSvU?}Kdb_2%8TYrM>eudEy*h3ef4T>k8w$e@?yn$&J>(hNWK39{dPcw%*vzNYT;G-igJ?&e7yw zb>{yi>0vf0B1TW9jTOIR5vfJI$1{b~g(`FJ5W5Wp#UHPu_S2kA$1}_~RnS@bI@{piap@eL#ufJl( z!21|v1|=$Qh9^Xdag|Mkw*m8D7}3>a)XDgZqd3fKba?a5VsdMH9b@WCcXO#N)vtY7 z#Ue_H4#kpUkj%NNaKZirFOG>;1>%)cy4^X`kH0w)E0awvI`+il2d>D^C}FH@E!10b z*4U&}X+EW1Q#iUg{*hZoqTT?F2dHc)u^RZ@bSBht?Pk3$uNmR{(%%T2oVzm7xM+ZP zuNAKT(&sn(nP`|I8z&r-HnLaC^}hUFMhvdBA$zz*0~K*&GMlt;!<524h%LmA-}n+c zx|H5Tv$s3W4Ka>S=!RtdpFLRk!cND0821Ul+yb1xa-V^{{r{K`#&!R?Qe%HrK!Oht z&YvRAlk(}XVfYmrO7WZy8^W!)n#tuEWmXu6MnvyUMMXw;%(%{ee9EFLlttt1v*k}j zk*)A8uJ08klEi1rr=VP~!sZ3982Fyf*R&(;TV^WF26#@tY_d-eoEb8N#`vi%W6i!+;l_>lJYIB*T$Cr|c#^tyZp z^hD;qc3MO^U_4?Ns08sDSV{?MZBo-(cYF>A$e7U1OL9WDO@9fL%bXCL&@w|Pb`P|$ z78%}F8jjNMI<)dMirr-OJ;q}jf)Uj!NAv%`MP(*v)67K z9>=o7zt9bBbJl(Lp#PX=Y3Us=i7drjon)~f(s#RoPSb0YBS(2J!$dc_)V*$=fz*?< z$o|-$hr0QtwMXV(ZcAy+qEW)pv`McV{WbDKZ$z2|O9rLy)>cWIPgOn25jS1*2+wM& zi7lHmo$g`OHT@uyjCHYE#oDgiIOx2T)y;3wPXL9lh__w{eYJ3LKieRLZPOoKEgU=( ztcvl^$9Vp|ng723!=WBUng2xapGOY<4ft@6he^y|4j}vv_@71CzXCQP|4Oy~e@e2y z6?dzX7002vJ0N`)d_IL3ARFHoK-=g>n a_`lSpq6`vjcL4x2*v}Vc&^xFfp8gLNC|djg literal 0 HcmV?d00001 diff --git a/crc/static/bpmn/rrt/DepartmentList-ProvostOffice.xlsx b/crc/static/bpmn/rrt/DepartmentList-ProvostOffice.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7b11b69560fb1f5a93c66cfb75c889ab637292ed GIT binary patch literal 34592 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 ScL4xY=r0r+)8Bx8{`)_Y*jK6m literal 0 HcmV?d00001 diff --git a/crc/static/bpmn/rrt/ResearchRampUpPlan.docx b/crc/static/bpmn/rrt/ResearchRampUpPlan.docx new file mode 100644 index 0000000000000000000000000000000000000000..e01d0dac52e322978af89229a9c1158344c76719 GIT binary patch literal 60306 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 literal 0 HcmV?d00001 diff --git a/crc/static/bpmn/rrt/SchoolList.xls b/crc/static/bpmn/rrt/SchoolList.xls new file mode 100644 index 0000000000000000000000000000000000000000..ae4fd6178ab7a2233919f2940ede7faedef74789 GIT binary patch literal 33792 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 literal 0 HcmV?d00001 diff --git a/crc/static/bpmn/rrt/rrt.bpmn b/crc/static/bpmn/rrt/rrt.bpmn new file mode 100644 index 00000000..f58f29bc --- /dev/null +++ b/crc/static/bpmn/rrt/rrt.bpmn @@ -0,0 +1,808 @@ + + + + + SequenceFlow_05ja25w + + + ### UNIVERSITY OF VIRGINIA RESEARCH +#### Request to Ramp Up Research Activities + + +Please note that only “critical research” deemed critical by the PI, department, and school will be ramped up in this phase II. As you fill out the names of personnel/students to request access for in this application, you will be asked for a brief description of the research they will be performing and why it is critical research. + +**Instructions for Submitting:** + +1. Add a Request for each lab space you manage in a building. If your lab spans multiple rooms or floors in a single building, one request will be required for that lab. If your lab spans multiple buildings, one request for each building will be required for that lab. The primary reason for this differentiation is that in addition to obtaining approval to restart operations, this information will also be used after start up to assist with any contact tracing that may be needed. +2. Select each Request added and step through each form presented, responding to all required and applicable fields. You may be presented with different questions if activities in each lab differ. +3. After all forms have been completed, you will be presented with the option to create your Research Recovery Plan in Word format. Download the document and review it. If you see any corrections that need to be made, return to the corresponding form and make the correction. +4. Once the generated Research Recovery Plan is finalize, use the web site to submit it to the Office of the Vice President for Research for review. + SequenceFlow_05ja25w + SequenceFlow_0h50bp3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SequenceFlow_0h50bp3 + Flow_16y8glw + + + + + #### People for whom you are requesting access +Information on all researchers you are requesting approval for reentry into the lab/research space for conducting research on-Grounds. (If there are personnel already working in the space, include them). + + + +**Note: no undergraduates will be allowed to work on-Grounds during Phase II.** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Flow_1eiud85 + Flow_1nbjr72 + + + #### If applicable, provide a list of any [Core Resources](https://research.virginia.edu/research-core-resources) you will utilize space or instruments in and name/email of contact person in the core you have coordinated your plan with. (Core facility managers are responsible for developing a plan for their space) + + + + + + + + + + + + + + + + + + Flow_15zy1q7 + Flow_12ie6w0 + + + #### End of Workflow +Place instruction here, + Flow_00y3047 + + + + Review plan, make changes if needed, continue of ready to submit. + Flow_06873ag + Flow_1e2qi9s + + + #### Space used by {{ PIComputingID.label }} and shared with other PIs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Flow_19xeq76 + Flow_16342pm + + + Flow_16y8glw + Flow_19xeq76 + Flow_0qf2y84 + Flow_15zy1q7 + Flow_0ya8hw8 + + + Flow_16342pm + Flow_0tk64b6 + Flow_12ie6w0 + Flow_0zz2hbq + Flow_1eiud85 + + + + + + + + #### Space managed exclusively by {{ PIComputingID.label }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Flow_0qf2y84 + Flow_0tk64b6 + + + + + + + + + + + + + + + + + + + + + + + + + + + Flow_0ya8hw8 + Flow_0zz2hbq + + + + + + #### Distancing requirements: +Maintain social distancing by designing space between people to be at least 9 feet during prolonged work which will be accomplished by restricting the number of people in the lab to a density of ~250 sq. ft. /person in lab areas. When moving around, a minimum of 6 feet social distancing is required. Ideally only one person per lab bench and not more than one person can work at the same time in the same bay. + + + + + + + + + + + + + + + Flow_0p2r1bo + Flow_0tz5c2v + + + + Flow_1nbjr72 + Flow_0p2r1bo + Flow_0mkh1wn + Flow_1yqkpgu + Flow_1c6m5wv + + + + Describe physical work arrangements for each lab. Show schematic of the lab and space organization to meet the distancing guidelines (see key safety expectations for ramp-up). +- Show gross dimensions, location of desks, and equipment in blocks (not details) that show available space for work and foot traffic. +- Indicate total square footage for every lab/space that you are requesting adding personnel to in this application. If you would like help obtaining a floor plan for your lab, your department or deans office can help. You can also create a hand drawing/block diagram of your space and the location of objects on a graph paper. +- Upload your physical layout and workspace organization in the form of a jpg image or a pdf file. This can be hand-drawn or actual floor plans. +- Show and/or describe designated work location for each member (during their shift) in the lab when multiple members are present at a time to meet the distancing guidelines. +- Provide a foot traffic plan (on the schematic) to indicate how people can move around while maintaining distancing requirements. This can be a freeform sketch on your floor plan showing where foot traffic can occur in your lab, and conditions, if any, to ensure distancing at all times. (e.g., direction to walk around a lab bench, rules for using shared equipment located in the lab, certain areas of lab prohibited from access, etc.). +- Provide your initial weekly laboratory schedule (see excel template) for all members that you are requesting access for, indicating all shifts as necessary. If schedule changes, please submit your revised schedule through the web portal. + + + + + + + + + + + + + + + Flow_0mkh1wn + Flow_0zrsh65 + + + + #### Health Safety Requirements: +Use EHS lab safety manual template for COVID (available May 25) to create and upload a copy of your laboratory policy statement to all members which includes at a minimum the following details: +- Laboratory face covering rules, use of other PPE use as required +- Adherence to individual schedules, check-in, check out requirements +- Completion of online EHS safety training requirement +- Health self-attestation requirement +- Sanitizing procedures including frequency and type of disinfectants to use +- +- Where and how to obtain PPE including face covering + + + + + + Flow_1yqkpgu + Flow_1ox5nv6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Flow_1c6m5wv + Flow_0qbi47d + + + + #### By submitting this request, you understand that every member listed in this form for on Grounds laboratory access will: +- Complete online COVID awareness & precaution training module (link forthcoming-May 25) +- Complete daily health acknowledgement form signed (electronically) –email generated daily to those listed on your plan for access to on Grounds lab/research space +- Fill out daily work attendance log for all lab members following your school process to check-in and out of work each day. + Flow_1e2qi9s + Flow_1tmzfwl + + + + + + + + Flow_0zrsh65 + Flow_0tz5c2v + Flow_1ox5nv6 + Flow_0qbi47d + Flow_06873ag + + + + Flow_1tmzfwl + Flow_00y3047 + CompleteTemplate ResearchRampUpPlan.docx RESEARCH_RAMPUP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/crc/static/reference/rrt_documents.xlsx b/crc/static/reference/rrt_documents.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..4fdfe3f3150b5abd9c86922d4a0f8f8487f7e4ae GIT binary patch literal 5985 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 F{|8@OIs*Uz literal 0 HcmV?d00001 diff --git a/example_data.py b/example_data.py index 22e6f95b..88b78321 100644 --- a/example_data.py +++ b/example_data.py @@ -191,8 +191,69 @@ class ExampleDataLoader: category_id=None, master_spec=True) + def load_rrt(self): + file_path = os.path.join(app.root_path, 'static', 'reference', 'rrt_documents.xlsx') + file = open(file_path, "rb") + FileService.add_reference_file(FileService.DOCUMENT_LIST, + binary_data=file.read(), + content_type=CONTENT_TYPES['xls']) + file.close() - def create_spec(self, id, name, display_name="", description="", filepath=None, master_spec=False, category_id=None, display_order=None): + category = WorkflowSpecCategoryModel( + id=0, + name='research_rampup_category', + display_name='Research Ramp-up Category', + display_order=0 + ) + db.session.add(category) + db.session.commit() + + + self.create_spec(id="empty_workflow", + name="empty_workflow", + display_name="Top Level Workflow", + description="Does nothing, we don't use the master workflow here.", + category_id=None, + master_spec=True) + + self.create_spec(id="rrt", + name="rrt", + display_name="Research Ramp-up Toolkit", + description="The workflow for the Research Ramp-up.", + category_id=0, + master_spec=False) + + def load_test_data(self): + self.load_reference_documents() + + category = WorkflowSpecCategoryModel( + id=0, + name='test_category', + display_name='Test Category', + display_order=0 + ) + db.session.add(category) + db.session.commit() + + self.create_spec(id="empty_workflow", + name="empty_workflow", + display_name="Top Level Workflow", + description="Does nothing, we don't use the master workflow here.", + category_id=None, + master_spec=True, + from_tests = True) + + self.create_spec(id="random_fact", + name="random_fact", + display_name="Random Fact", + description="The workflow for a Random Fact.", + category_id=0, + master_spec=False, + from_tests=True) + + + def create_spec(self, id, name, display_name="", description="", filepath=None, master_spec=False, + category_id=None, display_order=None, from_tests=False): """Assumes that a directory exists in static/bpmn with the same name as the given id. further assumes that the [id].bpmn is the primary file for the workflow. returns an array of data models to be added to the database.""" @@ -207,8 +268,11 @@ class ExampleDataLoader: display_order=display_order) db.session.add(spec) db.session.commit() - if not filepath: + if not filepath and not from_tests: filepath = os.path.join(app.root_path, 'static', 'bpmn', id, "*") + if not filepath and from_tests: + filepath = os.path.join(app.root_path, '..', 'tests', 'data', id, "*") + files = glob.glob(filepath) for file_path in files: noise, file_extension = os.path.splitext(file_path) diff --git a/tests/base_test.py b/tests/base_test.py index d7a89242..89330fc8 100644 --- a/tests/base_test.py +++ b/tests/base_test.py @@ -1,6 +1,9 @@ # Set environment variable to testing before loading. # IMPORTANT - Environment must be loaded before app, models, etc.... import os + +from sqlalchemy import Sequence + os.environ["TESTING"] = "true" import json @@ -115,10 +118,17 @@ class BaseTest(unittest.TestCase): self.assertIsNotNone(user_model.display_name) return dict(Authorization='Bearer ' + user_model.encode_auth_token().decode()) - def load_example_data(self): + def load_example_data(self, use_crc_data=False): + """use_crc_data will cause this to load the mammoth collection of documents + we built up developing crc, otherwise it depends on a small setup for + running tests.""" + from example_data import ExampleDataLoader ExampleDataLoader.clean_db() - ExampleDataLoader().load_all() + if(use_crc_data): + ExampleDataLoader().load_all() + else: + ExampleDataLoader().load_test_data() for user_json in self.users: db.session.add(UserModel(**user_json)) @@ -127,6 +137,7 @@ class BaseTest(unittest.TestCase): study_model = StudyModel(**study_json) db.session.add(study_model) StudyService._add_all_workflow_specs_to_study(study_model) + db.session.execute(Sequence(StudyModel.__tablename__ + '_id_seq')) db.session.commit() db.session.flush() @@ -225,12 +236,11 @@ class BaseTest(unittest.TestCase): def create_workflow(self, workflow_name, study=None, category_id=None): db.session.flush() - workflow = db.session.query(WorkflowSpecModel).filter(WorkflowSpecModel.name == workflow_name).first() - if workflow: - return workflow + spec = db.session.query(WorkflowSpecModel).filter(WorkflowSpecModel.name == workflow_name).first() + if spec is None: + spec = self.load_test_spec(workflow_name, category_id=category_id) if study is None: study = self.create_study() - spec = self.load_test_spec(workflow_name, category_id=category_id) workflow_model = StudyService._create_workflow_model(study, spec) return workflow_model diff --git a/tests/test_authentication.py b/tests/test_authentication.py index 2767797a..91970807 100644 --- a/tests/test_authentication.py +++ b/tests/test_authentication.py @@ -1,6 +1,7 @@ +from tests.base_test import BaseTest + from crc import db from crc.models.user import UserModel -from tests.base_test import BaseTest class TestAuthentication(BaseTest): @@ -13,7 +14,7 @@ class TestAuthentication(BaseTest): self.assertEqual("dhf8r", user.decode_auth_token(auth_token).get("sub")) def test_backdoor_auth_creates_user(self): - new_uid = 'czn1z'; + new_uid = 'lb3dp' ## Assure this user id is in the fake responses from ldap. self.load_example_data() user = db.session.query(UserModel).filter(UserModel.uid == new_uid).first() self.assertIsNone(user) @@ -62,6 +63,7 @@ class TestAuthentication(BaseTest): rv = self.app.get('/v1.0/user', headers=self.logged_in_headers()) self.assert_success(rv) - user = UserModel(uid="ajl2j", first_name='Aaron', last_name='Louie', email_address='ajl2j@virginia.edu') + # User must exist in the mock ldap responses. + user = UserModel(uid="dhf8r", first_name='Dan', last_name='Funk', email_address='dhf8r@virginia.edu') rv = self.app.get('/v1.0/user', headers=self.logged_in_headers(user, redirect_url='http://omg.edu/lolwut')) self.assert_success(rv) diff --git a/tests/test_files_api.py b/tests/test_files_api.py index 0b3558c8..d7e31f80 100644 --- a/tests/test_files_api.py +++ b/tests/test_files_api.py @@ -20,7 +20,7 @@ class TestFilesApi(BaseTest): return (minimal_dbpm % content).encode() def test_list_files_for_workflow_spec(self): - self.load_example_data() + self.load_example_data(use_crc_data=True) spec_id = 'core_info' spec = session.query(WorkflowSpecModel).filter_by(id=spec_id).first() rv = self.app.get('/v1.0/file?workflow_spec_id=%s' % spec_id, diff --git a/tests/test_study_api.py b/tests/test_study_api.py index ce1cbf64..50bebe03 100644 --- a/tests/test_study_api.py +++ b/tests/test_study_api.py @@ -15,14 +15,11 @@ from crc.services.protocol_builder import ProtocolBuilderService class TestStudyApi(BaseTest): TEST_STUDY = { - "id": 12345, "title": "Phase III Trial of Genuine People Personalities (GPP) Autonomous Intelligent Emotional Agents " "for Interstellar Spacecraft", "last_updated": datetime.now(tz=timezone.utc), "protocol_builder_status": ProtocolBuilderStatus.ACTIVE, - "primary_investigator_id": "tricia.marie.mcmillan@heartofgold.edu", - "sponsor": "Sirius Cybernetics Corporation", - "ind_number": "567890", + "primary_investigator_id": "tmm2x", "user_uid": "dhf8r", } @@ -45,17 +42,9 @@ class TestStudyApi(BaseTest): """NOTE: The protocol builder is not enabled or mocked out. As the master workflow (which is empty), and the test workflow do not need it, and it is disabled in the configuration.""" + self.load_example_data() new_study = self.add_test_study() new_study = session.query(StudyModel).filter_by(id=new_study["id"]).first() - # Add a category - new_category = WorkflowSpecCategoryModel(id=21, name="test_cat", display_name="Test Category", display_order=0) - session.add(new_category) - session.commit() - # Create a workflow specification - self.create_workflow("random_fact", study=new_study, category_id=new_category.id) - # Assure there is a master specification, and it has the lookup files it needs. - spec = self.load_test_spec("empty_workflow", master_spec=True) - self.create_reference_document() api_response = self.app.get('/v1.0/study/%i' % new_study.id, headers=self.logged_in_headers(), content_type="application/json") @@ -64,13 +53,12 @@ class TestStudyApi(BaseTest): self.assertEqual(study.title, self.TEST_STUDY['title']) self.assertEqual(study.primary_investigator_id, self.TEST_STUDY['primary_investigator_id']) - self.assertEqual(study.sponsor, self.TEST_STUDY['sponsor']) - self.assertEqual(study.ind_number, self.TEST_STUDY['ind_number']) self.assertEqual(study.user_uid, self.TEST_STUDY['user_uid']) # Categories are read only, so switching to sub-scripting here. - category = [c for c in study.categories if c['name'] == "test_cat"][0] - self.assertEqual("test_cat", category['name']) + # This assumes there is one test category set up in the example data. + category = study.categories[0] + self.assertEqual("test_category", category['name']) self.assertEqual("Test Category", category['display_name']) self.assertEqual(1, len(category["workflows"])) workflow = category["workflows"][0] @@ -83,7 +71,7 @@ class TestStudyApi(BaseTest): def test_add_study(self): self.load_example_data() study = self.add_test_study() - db_study = session.query(StudyModel).filter_by(id=12345).first() + db_study = session.query(StudyModel).filter_by(id=study['id']).first() self.assertIsNotNone(db_study) self.assertEqual(study["title"], db_study.title) self.assertEqual(study["primary_investigator_id"], db_study.primary_investigator_id) @@ -92,7 +80,7 @@ class TestStudyApi(BaseTest): self.assertEqual(study["user_uid"], db_study.user_uid) workflow_spec_count =session.query(WorkflowSpecModel).filter(WorkflowSpecModel.is_master_spec == False).count() - workflow_count = session.query(WorkflowModel).filter(WorkflowModel.study_id == 12345).count() + workflow_count = session.query(WorkflowModel).filter(WorkflowModel.study_id == study['id']).count() error_count = len(study["errors"]) self.assertEqual(workflow_spec_count, workflow_count + error_count) @@ -209,20 +197,13 @@ class TestStudyApi(BaseTest): def test_delete_study_with_workflow_and_status(self): self.load_example_data() - study = session.query(StudyModel).first() - new_category = WorkflowSpecCategoryModel(id=21, name="test_cat", display_name="Test Category", display_order=0) - session.add(new_category) - session.commit() - # Create a workflow specification, and complete some stuff that would log stats - workflow = self.create_workflow("random_fact", study=study, category_id=new_category.id) - session.add(workflow) - session.commit() - stats2 = TaskEventModel(study_id=study.id, workflow_id=workflow.id, user_uid=self.users[0]['uid']) + workflow = session.query(WorkflowModel).first() + stats2 = TaskEventModel(study_id=workflow.study_id, workflow_id=workflow.id, user_uid=self.users[0]['uid']) session.add(stats2) session.commit() - rv = self.app.delete('/v1.0/study/%i' % study.id, headers=self.logged_in_headers()) + rv = self.app.delete('/v1.0/study/%i' % workflow.study_id, headers=self.logged_in_headers()) self.assert_success(rv) - del_study = session.query(StudyModel).filter(StudyModel.id == study.id).first() + del_study = session.query(StudyModel).filter(StudyModel.id == workflow.study_id).first() self.assertIsNone(del_study) diff --git a/tests/test_tasks_api.py b/tests/test_tasks_api.py index 9c8f8c52..53befa5f 100644 --- a/tests/test_tasks_api.py +++ b/tests/test_tasks_api.py @@ -3,6 +3,8 @@ import os import random from unittest.mock import patch +from tests.base_test import BaseTest + from crc import session, app from crc.models.api_models import WorkflowApiSchema, MultiInstanceType, TaskSchema from crc.models.file import FileModelSchema @@ -10,7 +12,6 @@ from crc.models.stats import TaskEventModel from crc.models.workflow import WorkflowStatus from crc.services.protocol_builder import ProtocolBuilderService from crc.services.workflow_service import WorkflowService -from tests.base_test import BaseTest class TestTasksApi(BaseTest): @@ -303,6 +304,9 @@ class TestTasksApi(BaseTest): @patch('crc.services.protocol_builder.requests.get') def test_multi_instance_task(self, mock_get): + + self.load_example_data() + # Enable the protocol builder. ProtocolBuilderService.ENABLED = True @@ -310,7 +314,6 @@ class TestTasksApi(BaseTest): mock_get.return_value.ok = True mock_get.return_value.text = self.protocol_builder_response('investigators.json') - self.load_example_data() workflow = self.create_workflow('multi_instance') # get the first form in the two form workflow. @@ -423,11 +426,12 @@ class TestTasksApi(BaseTest): def test_parallel_multi_instance(self, mock_get): # Assure we get nine investigators back from the API Call, as set in the investigators.json file. + ProtocolBuilderService.ENABLED = True mock_get.return_value.ok = True mock_get.return_value.text = self.protocol_builder_response('investigators.json') - self.load_example_data() + workflow = self.create_workflow('multi_instance_parallel') workflow_api = self.get_workflow_api(workflow) diff --git a/tests/test_workflow_processor.py b/tests/test_workflow_processor.py index ba9ca65a..41d0f46a 100644 --- a/tests/test_workflow_processor.py +++ b/tests/test_workflow_processor.py @@ -1,27 +1,24 @@ +import json import logging import os -import json -import string -import random from unittest.mock import patch -from SpiffWorkflow import Task as SpiffTask +from tests.base_test import BaseTest + from SpiffWorkflow.bpmn.specs.EndEvent import EndEvent -from SpiffWorkflow.camunda.specs.UserTask import Form, FormField -from SpiffWorkflow.specs import TaskSpec +from SpiffWorkflow.camunda.specs.UserTask import FormField from crc import session, db, app from crc.api.common import ApiError -from crc.models.file import FileModel, FileDataModel, CONTENT_TYPES +from crc.models.file import FileModel, FileDataModel +from crc.models.protocol_builder import ProtocolBuilderStudySchema +from crc.services.protocol_builder import ProtocolBuilderService from crc.models.study import StudyModel -from crc.models.workflow import WorkflowSpecModel, WorkflowStatus, WorkflowModel +from crc.models.workflow import WorkflowSpecModel, WorkflowStatus from crc.services.file_service import FileService from crc.services.study_service import StudyService -from crc.models.protocol_builder import ProtocolBuilderStudySchema, ProtocolBuilderInvestigatorSchema, \ - ProtocolBuilderRequiredDocumentSchema -from crc.services.workflow_service import WorkflowService -from tests.base_test import BaseTest from crc.services.workflow_processor import WorkflowProcessor +from crc.services.workflow_service import WorkflowService class TestWorkflowProcessor(BaseTest): @@ -361,7 +358,7 @@ class TestWorkflowProcessor(BaseTest): @patch('crc.services.protocol_builder.ProtocolBuilderService.get_investigators') @patch('crc.services.protocol_builder.ProtocolBuilderService.get_required_docs') @patch('crc.services.protocol_builder.ProtocolBuilderService.get_study_details') - def test_master_bpmn(self, mock_details, mock_required_docs, mock_investigators, mock_studies): + def test_master_bpmn_for_crc(self, mock_details, mock_required_docs, mock_investigators, mock_studies): # Mock Protocol Builder response studies_response = self.protocol_builder_response('user_studies.json') @@ -376,7 +373,8 @@ class TestWorkflowProcessor(BaseTest): details_response = self.protocol_builder_response('study_details.json') mock_details.return_value = json.loads(details_response) - self.load_example_data() + self.load_example_data(use_crc_data=True) + ProtocolBuilderService.ENABLED = True study = session.query(StudyModel).first() workflow_spec_model = db.session.query(WorkflowSpecModel).\ diff --git a/tests/test_workflow_spec_validation_api.py b/tests/test_workflow_spec_validation_api.py index 123c42c8..b7207d6f 100644 --- a/tests/test_workflow_spec_validation_api.py +++ b/tests/test_workflow_spec_validation_api.py @@ -1,13 +1,13 @@ import json -import unittest from unittest.mock import patch +from tests.base_test import BaseTest + +from crc.services.protocol_builder import ProtocolBuilderService from crc import session from crc.api.common import ApiErrorSchema -from crc.models.file import FileModel from crc.models.protocol_builder import ProtocolBuilderStudySchema -from crc.models.workflow import WorkflowSpecModel, WorkflowSpecModelSchema, WorkflowModel, WorkflowSpecCategoryModel -from tests.base_test import BaseTest +from crc.models.workflow import WorkflowSpecModel class TestWorkflowSpecValidation(BaseTest): @@ -21,7 +21,7 @@ class TestWorkflowSpecValidation(BaseTest): return ApiErrorSchema(many=True).load(json_data) def test_successful_validation_of_test_workflows(self): - + ProtocolBuilderService.ENABLED = False # Assure this is disabled. self.assertEqual(0, len(self.validate_workflow("parallel_tasks"))) self.assertEqual(0, len(self.validate_workflow("decision_table"))) self.assertEqual(0, len(self.validate_workflow("docx"))) @@ -35,7 +35,7 @@ class TestWorkflowSpecValidation(BaseTest): @patch('crc.services.protocol_builder.ProtocolBuilderService.get_required_docs') # mock_docs @patch('crc.services.protocol_builder.ProtocolBuilderService.get_study_details') # mock_details @patch('crc.services.protocol_builder.ProtocolBuilderService.get_studies') # mock_studies - def test_successful_validation_of_auto_loaded_workflows(self, mock_studies, mock_details, mock_docs, mock_investigators): + def test_successful_validation_of_crc_workflows(self, mock_studies, mock_details, mock_docs, mock_investigators): # Mock Protocol Builder responses studies_response = self.protocol_builder_response('user_studies.json') @@ -47,7 +47,8 @@ class TestWorkflowSpecValidation(BaseTest): investigators_response = self.protocol_builder_response('investigators.json') mock_investigators.return_value = json.loads(investigators_response) - self.load_example_data() + self.load_example_data(use_crc_data=True) + ProtocolBuilderService.ENABLED=True workflows = session.query(WorkflowSpecModel).all() errors = [] for w in workflows: From d80a6af7544085fed16c46adf70567cfaaef46a6 Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Mon, 25 May 2020 12:53:56 -0400 Subject: [PATCH 21/43] Disabling the Protocol Builder, and getting the rrt data correct. --- config/default.py | 2 +- example_data.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/config/default.py b/config/default.py index f31f2889..31a10cfd 100644 --- a/config/default.py +++ b/config/default.py @@ -28,7 +28,7 @@ FRONTEND_AUTH_CALLBACK = environ.get('FRONTEND_AUTH_CALLBACK', default="http://l SWAGGER_AUTH_KEY = environ.get('SWAGGER_AUTH_KEY', default="SWAGGER") # %s/%i placeholders expected for uva_id and study_id in various calls. -PB_ENABLED = environ.get('PB_ENABLED', default=True) +PB_ENABLED = environ.get('PB_ENABLED', default=False) PB_BASE_URL = environ.get('PB_BASE_URL', default="http://localhost:5001/pb/") PB_USER_STUDIES_URL = environ.get('PB_USER_STUDIES_URL', default=PB_BASE_URL + "user_studies?uva_id=%s") PB_INVESTIGATORS_URL = environ.get('PB_INVESTIGATORS_URL', default=PB_BASE_URL + "investigators?studyid=%i") diff --git a/example_data.py b/example_data.py index 88b78321..1213801d 100644 --- a/example_data.py +++ b/example_data.py @@ -214,7 +214,8 @@ class ExampleDataLoader: display_name="Top Level Workflow", description="Does nothing, we don't use the master workflow here.", category_id=None, - master_spec=True) + master_spec=True, + from_tests=True) self.create_spec(id="rrt", name="rrt", From be057e87589c3214bcc8959f87f6dd0617678440 Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Mon, 25 May 2020 15:30:06 -0400 Subject: [PATCH 22/43] Adding an "UpdateStudy" task that is able to update the data on the study model, useful for setting core data points on the model, such as setting the Primary Investigator, or altering the Study Title. Fixing a bug where the validation of forms did not correctly process auto-complete fields. Fixing a bug where the approvals script and the update study script could not process dot notation correctly. Moved populate_random_data into the WorkflowService where it makes more sense. --- crc/scripts/request_approval.py | 2 +- crc/scripts/update_study.py | 49 ++++++++ crc/services/workflow_processor.py | 45 ++------ crc/services/workflow_service.py | 51 ++++++++- crc/static/bpmn/core_info/core_info.bpmn | 105 +++++++++--------- .../sponsor_funding_source.bpmn | 81 +++++++------- tests/test_request_approval_script.py | 4 +- tests/test_update_study_script.py | 23 ++++ tests/test_workflow_processor.py | 2 +- tests/test_workflow_service.py | 13 ++- 10 files changed, 236 insertions(+), 139 deletions(-) create mode 100644 crc/scripts/update_study.py create mode 100644 tests/test_update_study_script.py diff --git a/crc/scripts/request_approval.py b/crc/scripts/request_approval.py index 8905ceb5..929ba34b 100644 --- a/crc/scripts/request_approval.py +++ b/crc/scripts/request_approval.py @@ -35,7 +35,7 @@ RequestApproval required_approvals.uids "the name of the variable in the task data that contains user" "ids to process.") - uids = task.workflow.script_engine.evaluate(task, args[0]) + uids = task.workflow.script_engine.evaluate_expression(task, args[0]) if not isinstance(uids, str) and not isinstance(uids, list): raise ApiError(code="invalid_argument", diff --git a/crc/scripts/update_study.py b/crc/scripts/update_study.py new file mode 100644 index 00000000..303e41b5 --- /dev/null +++ b/crc/scripts/update_study.py @@ -0,0 +1,49 @@ +import requests + +from crc import db +from crc.api.common import ApiError +from crc.models.study import StudyModel +from crc.scripts.script import Script + + +class UpdateStudy(Script): + + argument_error_message = "You must supply at least one argument to the " \ + "update_study task, in the form [study_field]:[value]", + + def get_description(self): + return """ +Allows you to set specific attributes on the Study model by mapping them to +values in the task data. Should be called with the value to set (either title, or pi) +followed by a ":" and then the value to use in dot notation. + +Example: +UpdateStudy title:PIComputingID.label pi:PIComputingID.value +""" + def do_task_validate_only(self, task, study_id, workflow_id, *args, **kwargs): + self.do_task(task, study_id, workflow_id, *args, **kwargs) + + def do_task(self, task, study_id, workflow_id, *args, **kwargs): + study = db.session.query(StudyModel).filter(StudyModel.id == study_id).first() + + if len(args) < 1: + raise ApiError.from_task("missing_argument", self.argument_error_message, + task=task) + + for arg in args: + try: + field, value_lookup = arg.split(':') + except: + raise ApiError.from_task("invalid_argument", self.argument_error_message, + task=task) + + value = task.workflow.script_engine.evaluate_expression(task, value_lookup) + + if field.lower() == "title": + study.title = value + elif field.lower() == "pi": + study.primary_investigator_id = value + else: + raise ApiError.from_task("invalid_argument", self.argument_error_message, + task=task) + db.session.add(study) diff --git a/crc/services/workflow_processor.py b/crc/services/workflow_processor.py index daf13040..d4e7c08e 100644 --- a/crc/services/workflow_processor.py +++ b/crc/services/workflow_processor.py @@ -70,6 +70,14 @@ class CustomBpmnScriptEngine(BpmnScriptEngine): "Unable to locate Script: '%s:%s'" % (module_name, class_name), task=task) + def evaluate_expression(self, task, expression): + """ + Evaluate the given expression, within the context of the given task and + return the result. + """ + exp,valid = self.validateExpression(expression) + return self._eval(exp, **task.data) + @staticmethod def camel_to_snake(camel): camel = camel.strip() @@ -276,43 +284,6 @@ class WorkflowProcessor(object): tag=ve.tag) return spec - - - @staticmethod - def populate_form_with_random_data(task, task_api): - """populates a task with random data - useful for testing a spec.""" - - if not hasattr(task.task_spec, 'form'): return - - form_data = {} - for field in task_api.form.fields: - if field.type == "enum": - if len(field.options) > 0: - form_data[field.id] = random.choice(field.options) - else: - raise ApiError.from_task("invalid_enum", "You specified an enumeration field (%s)," - " with no options" % field.id, - task) - elif field.type == "long": - form_data[field.id] = random.randint(1, 1000) - elif field.type == 'boolean': - form_data[field.id] = random.choice([True, False]) - elif field.type == 'file': - form_data[field.id] = random.randint(1, 100) - elif field.type == 'files': - form_data[field.id] = random.randrange(1, 100) - else: - form_data[field.id] = WorkflowProcessor._random_string() - if task.data is None: - task.data = {} - task.data.update(form_data) - - @staticmethod - def _random_string(string_length=10): - """Generate a random string of fixed length """ - letters = string.ascii_lowercase - return ''.join(random.choice(letters) for i in range(string_length)) - @staticmethod def status_of(bpmn_workflow): if bpmn_workflow.is_completed(): diff --git a/crc/services/workflow_service.py b/crc/services/workflow_service.py index c5294f1f..b7a5bd45 100644 --- a/crc/services/workflow_service.py +++ b/crc/services/workflow_service.py @@ -1,4 +1,6 @@ +import string from datetime import datetime +import random import jinja2 from SpiffWorkflow import Task as SpiffTask, WorkflowException @@ -53,12 +55,59 @@ class WorkflowService(object): task_api = WorkflowService.spiff_task_to_api_task( task, add_docs_and_forms=True) # Assure we try to process the documenation, and raise those errors. - WorkflowProcessor.populate_form_with_random_data(task, task_api) + WorkflowService.populate_form_with_random_data(task, task_api) task.complete() except WorkflowException as we: raise ApiError.from_task_spec("workflow_execution_exception", str(we), we.sender) + + @staticmethod + def populate_form_with_random_data(task, task_api): + """populates a task with random data - useful for testing a spec.""" + + if not hasattr(task.task_spec, 'form'): return + + form_data = {} + for field in task_api.form.fields: + if field.type == "enum": + if len(field.options) > 0: + form_data[field.id] = random.choice(field.options) + else: + raise ApiError.from_task("invalid_enum", "You specified an enumeration field (%s)," + " with no options" % field.id, + task) + if field.type == "autocomplete": + lookup_model = LookupService.get_lookup_table(task, field) + if not lookup_model: + raise ApiError.from_task("invalid_autocomplete", "The settings for this auto complete field " + "(%s) are incorrect: " % field.id) + data = db.session.query(LookupDataModel).filter(LookupDataModel.lookup_file_model == lookup_model).limit(10).all() + options = [] + for d in data: + options.append({"id": d.value, "name": d.label}) + form_data[field.id] = random.choice(options) + + elif field.type == "long": + form_data[field.id] = random.randint(1, 1000) + elif field.type == 'boolean': + form_data[field.id] = random.choice([True, False]) + elif field.type == 'file': + form_data[field.id] = random.randint(1, 100) + elif field.type == 'files': + form_data[field.id] = random.randrange(1, 100) + else: + form_data[field.id] = WorkflowService._random_string() + if task.data is None: + task.data = {} + task.data.update(form_data) + + @staticmethod + def _random_string(string_length=10): + """Generate a random string of fixed length """ + letters = string.ascii_lowercase + return ''.join(random.choice(letters) for i in range(string_length)) + @staticmethod def spiff_task_to_api_task(spiff_task, add_docs_and_forms=False): task_type = spiff_task.task_spec.__class__.__name__ diff --git a/crc/static/bpmn/core_info/core_info.bpmn b/crc/static/bpmn/core_info/core_info.bpmn index 30f301e1..8e790f98 100644 --- a/crc/static/bpmn/core_info/core_info.bpmn +++ b/crc/static/bpmn/core_info/core_info.bpmn @@ -1,5 +1,5 @@ - + Flow_1wqp7vf @@ -36,10 +36,9 @@ - - - - + + + @@ -235,104 +234,104 @@ - - + + - - + + - - - + + + - - + + - - + + - - + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/crc/static/bpmn/sponsor_funding_source/sponsor_funding_source.bpmn b/crc/static/bpmn/sponsor_funding_source/sponsor_funding_source.bpmn index 05468a60..e8306c72 100644 --- a/crc/static/bpmn/sponsor_funding_source/sponsor_funding_source.bpmn +++ b/crc/static/bpmn/sponsor_funding_source/sponsor_funding_source.bpmn @@ -1,5 +1,5 @@ - + SequenceFlow_17znkku @@ -16,10 +16,9 @@ - - - - + + + @@ -70,51 +69,51 @@ - - - - - - - - - - - - - - - - - + + + + - - - + + + - - - - + + + - - - - - - - - + + + + + + + + + + + + + + + + - + + + + - + - - + + + + + diff --git a/tests/test_request_approval_script.py b/tests/test_request_approval_script.py index 221d4937..8749f711 100644 --- a/tests/test_request_approval_script.py +++ b/tests/test_request_approval_script.py @@ -16,10 +16,10 @@ class TestRequestApprovalScript(BaseTest): workflow = self.create_workflow('empty_workflow') processor = WorkflowProcessor(workflow) task = processor.next_task() - task.data = {"approvals": ['dhf8r', 'lb3dp']} + task.data = {"study": {"approvals": ['dhf8r', 'lb3dp']}} script = RequestApproval() - script.do_task(task, workflow.study_id, workflow.id, "approvals") + script.do_task(task, workflow.study_id, workflow.id, "study.approvals") self.assertEquals(2, db.session.query(ApprovalModel).count()) def test_do_task_with_incorrect_argument(self): diff --git a/tests/test_update_study_script.py b/tests/test_update_study_script.py new file mode 100644 index 00000000..ba550a19 --- /dev/null +++ b/tests/test_update_study_script.py @@ -0,0 +1,23 @@ +from tests.base_test import BaseTest + +from crc.scripts.update_study import UpdateStudy +from crc.services.workflow_processor import WorkflowProcessor + + +class TestUpdateStudyScript(BaseTest): + + def test_do_task(self): + self.load_example_data() + self.create_reference_document() + workflow = self.create_workflow('empty_workflow') + processor = WorkflowProcessor(workflow) + task = processor.next_task() + task.data = {"details": { + "label": "My New Title", + "value": "dhf8r"} + } + + script = UpdateStudy() + script.do_task(task, workflow.study_id, workflow.id, "title:details.label", "pi:details.value") + self.assertEquals("My New Title", workflow.study.title) + self.assertEquals("dhf8r", workflow.study.primary_investigator_id) diff --git a/tests/test_workflow_processor.py b/tests/test_workflow_processor.py index 41d0f46a..4310f01e 100644 --- a/tests/test_workflow_processor.py +++ b/tests/test_workflow_processor.py @@ -25,7 +25,7 @@ class TestWorkflowProcessor(BaseTest): def _populate_form_with_random_data(self, task): api_task = WorkflowService.spiff_task_to_api_task(task, add_docs_and_forms=True) - WorkflowProcessor.populate_form_with_random_data(task, api_task) + WorkflowService.populate_form_with_random_data(task, api_task) def get_processor(self, study_model, spec_model): workflow_model = StudyService._create_workflow_model(study_model, spec_model) diff --git a/tests/test_workflow_service.py b/tests/test_workflow_service.py index 7660837b..76487e10 100644 --- a/tests/test_workflow_service.py +++ b/tests/test_workflow_service.py @@ -1,10 +1,9 @@ +from tests.base_test import BaseTest from crc import session from crc.models.file import FileDataModel, FileModel, LookupFileModel, LookupDataModel -from crc.services.file_service import FileService from crc.services.lookup_service import LookupService from crc.services.workflow_processor import WorkflowProcessor from crc.services.workflow_service import WorkflowService -from tests.base_test import BaseTest class TestWorkflowService(BaseTest): @@ -103,4 +102,12 @@ class TestWorkflowService(BaseTest): self.assertEquals(2, len(search_results)) - + def test_random_data_populate_form_on_auto_complete(self): + self.load_example_data() + workflow = self.create_workflow('enum_options_with_search') + processor = WorkflowProcessor(workflow) + processor.do_engine_steps() + task = processor.next_task() + task_api = WorkflowService.spiff_task_to_api_task(task, add_docs_and_forms=True) + WorkflowService.populate_form_with_random_data(task, task_api) + self.assertTrue(isinstance(task.data["sponsor"], dict)) \ No newline at end of file From 13186176ba91392f337fdd1a9ae3a882eb61e839 Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Mon, 25 May 2020 16:00:36 -0400 Subject: [PATCH 23/43] Improved LDAP searches, allow filtering on last name as well as uva id. --- crc/services/ldap_service.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crc/services/ldap_service.py b/crc/services/ldap_service.py index d0bb3f7b..4602ed59 100644 --- a/crc/services/ldap_service.py +++ b/crc/services/ldap_service.py @@ -35,9 +35,10 @@ class LdapUserInfo(object): class LdapService(object): search_base = "ou=People,o=University of Virginia,c=US" - attributes = ['uid', 'cn', 'displayName', 'givenName', 'mail', 'objectClass', 'UvaDisplayDepartment', + attributes = ['uid', 'cn', 'sn', 'displayName', 'givenName', 'mail', 'objectClass', 'UvaDisplayDepartment', 'telephoneNumber', 'title', 'uvaPersonIAMAffiliation', 'uvaPersonSponsoredType'] uid_search_string = "(&(objectclass=person)(uid=%s))" + user_or_last_name_search_string = "(&(objectclass=person)(|(uid=%s*)(sn=%s*)))" def __init__(self): if app.config['TESTING']: @@ -66,7 +67,8 @@ class LdapService(object): return LdapUserInfo.from_entry(entry) def search_users(self, query, limit): - search_string = LdapService.uid_search_string % query + if len(query) < 3: return [] + search_string = LdapService.user_or_last_name_search_string % (query, query) self.conn.search(LdapService.search_base, search_string, attributes=LdapService.attributes) # Entries are returned as a generator, accessing entries From cbaedad0f63ef66877205126395a26b2bdebdb65 Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Mon, 25 May 2020 22:02:06 -0400 Subject: [PATCH 24/43] have testing respect the environment variables if they are set, so we can set them in travis, and use the testing environment there. --- config/testing.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/config/testing.py b/config/testing.py index f481224a..ec4173b2 100644 --- a/config/testing.py +++ b/config/testing.py @@ -1,10 +1,22 @@ import os +from os import environ + basedir = os.path.abspath(os.path.dirname(__file__)) NAME = "CR Connect Workflow" DEVELOPMENT = True TESTING = True -SQLALCHEMY_DATABASE_URI = "postgresql://crc_user:crc_pass@localhost:5432/crc_test" + +DB_HOST = environ.get('DB_HOST', default="localhost") +DB_PORT = environ.get('DB_PORT', default="5432") +DB_NAME = environ.get('DB_NAME', default="crc_dev") +DB_USER = environ.get('DB_USER', default="crc_user") +DB_PASSWORD = environ.get('DB_PASSWORD', default="crc_pass") +SQLALCHEMY_DATABASE_URI = environ.get( + 'SQLALCHEMY_DATABASE_URI', + default="postgresql://%s:%s@%s:%s/%s" % (DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_NAME) +) + TOKEN_AUTH_SECRET_KEY = "Shhhh!!! This is secret! And better darn well not show up in prod." PB_ENABLED = False From 0792aa40a51e2b8fc530ace52658fcb440bf287f Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Mon, 25 May 2020 22:28:33 -0400 Subject: [PATCH 25/43] Can't override travis settings if you do it with the testing file. --- config/testing.py | 14 +------------- config/travis-testing.py | 25 ++++++++++++------------- 2 files changed, 13 insertions(+), 26 deletions(-) diff --git a/config/testing.py b/config/testing.py index ec4173b2..f481224a 100644 --- a/config/testing.py +++ b/config/testing.py @@ -1,22 +1,10 @@ import os -from os import environ - basedir = os.path.abspath(os.path.dirname(__file__)) NAME = "CR Connect Workflow" DEVELOPMENT = True TESTING = True - -DB_HOST = environ.get('DB_HOST', default="localhost") -DB_PORT = environ.get('DB_PORT', default="5432") -DB_NAME = environ.get('DB_NAME', default="crc_dev") -DB_USER = environ.get('DB_USER', default="crc_user") -DB_PASSWORD = environ.get('DB_PASSWORD', default="crc_pass") -SQLALCHEMY_DATABASE_URI = environ.get( - 'SQLALCHEMY_DATABASE_URI', - default="postgresql://%s:%s@%s:%s/%s" % (DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_NAME) -) - +SQLALCHEMY_DATABASE_URI = "postgresql://crc_user:crc_pass@localhost:5432/crc_test" TOKEN_AUTH_SECRET_KEY = "Shhhh!!! This is secret! And better darn well not show up in prod." PB_ENABLED = False diff --git a/config/travis-testing.py b/config/travis-testing.py index b0da6538..29f6ef75 100644 --- a/config/travis-testing.py +++ b/config/travis-testing.py @@ -1,28 +1,27 @@ import os +from os import environ + basedir = os.path.abspath(os.path.dirname(__file__)) NAME = "CR Connect Workflow" DEVELOPMENT = True TESTING = True -SQLALCHEMY_DATABASE_URI = "postgresql://postgres:@localhost:5432/crc_test" TOKEN_AUTH_TTL_HOURS = 2 TOKEN_AUTH_SECRET_KEY = "Shhhh!!! This is secret! And better darn well not show up in prod." FRONTEND_AUTH_CALLBACK = "http://localhost:4200/session" # Not Required -#: Default attribute map for single signon. -SSO_ATTRIBUTE_MAP = { - 'eppn': (False, 'eppn'), # dhf8r@virginia.edu - 'uid': (True, 'uid'), # dhf8r - 'givenName': (False, 'first_name'), # Daniel - 'mail': (False, 'email_address'), # dhf8r@Virginia.EDU - 'sn': (False, 'last_name'), # Funk - 'affiliation': (False, 'affiliation'), # 'staff@virginia.edu;member@virginia.edu' - 'displayName': (False, 'display_name'), # Daniel Harold Funk - 'title': (False, 'title') # SOFTWARE ENGINEER V -} +DB_HOST = environ.get('DB_HOST', default="localhost") +DB_PORT = environ.get('DB_PORT', default="5432") +DB_NAME = environ.get('DB_NAME', default="crc_dev") +DB_USER = environ.get('DB_USER', default="crc_user") +DB_PASSWORD = environ.get('DB_PASSWORD', default="crc_pass") +SQLALCHEMY_DATABASE_URI = environ.get( + 'SQLALCHEMY_DATABASE_URI', + default="postgresql://%s:%s@%s:%s/%s" % (DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_NAME) +) print('+++ USING TRAVIS TESTING CONFIG: +++') -print('SQLALCHEMY_DATABASE_URI = ', SQLALCHEMY_DATABASE_URI) print('DEVELOPMENT = ', DEVELOPMENT) print('TESTING = ', TESTING) print('FRONTEND_AUTH_CALLBACK = ', FRONTEND_AUTH_CALLBACK) +print('DB_HOST = ', DB_HOST) From 25adf472777994a0161f5418abf0ad8e407e9402 Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Mon, 25 May 2020 22:47:11 -0400 Subject: [PATCH 26/43] converting integers to ints, cause that's nice. --- config/default.py | 4 ++-- config/travis-testing.py | 16 +++------------- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/config/default.py b/config/default.py index 93a2f9b9..24137350 100644 --- a/config/default.py +++ b/config/default.py @@ -25,7 +25,7 @@ SQLALCHEMY_DATABASE_URI = environ.get( 'SQLALCHEMY_DATABASE_URI', default="postgresql://%s:%s@%s:%s/%s" % (DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_NAME) ) -TOKEN_AUTH_TTL_HOURS = environ.get('TOKEN_AUTH_TTL_HOURS', default=4) +TOKEN_AUTH_TTL_HOURS = int(environ.get('TOKEN_AUTH_TTL_HOURS', default=4)) TOKEN_AUTH_SECRET_KEY = environ.get('TOKEN_AUTH_SECRET_KEY', default="Shhhh!!! This is secret! And better darn well not show up in prod.") FRONTEND_AUTH_CALLBACK = environ.get('FRONTEND_AUTH_CALLBACK', default="http://localhost:4200/session") SWAGGER_AUTH_KEY = environ.get('SWAGGER_AUTH_KEY', default="SWAGGER") @@ -39,7 +39,7 @@ PB_REQUIRED_DOCS_URL = environ.get('PB_REQUIRED_DOCS_URL', default=PB_BASE_URL + PB_STUDY_DETAILS_URL = environ.get('PB_STUDY_DETAILS_URL', default=PB_BASE_URL + "study?studyid=%i") LDAP_URL = environ.get('LDAP_URL', default="ldap.virginia.edu").strip('/') # No trailing slash or http:// -LDAP_TIMEOUT_SEC = environ.get('LDAP_TIMEOUT_SEC', default=3) +LDAP_TIMEOUT_SEC = int(environ.get('LDAP_TIMEOUT_SEC', default=3)) print('=== USING DEFAULT CONFIG: ===') print('DB_HOST = ', DB_HOST) print('CORS_ALLOW_ORIGINS = ', CORS_ALLOW_ORIGINS) diff --git a/config/travis-testing.py b/config/travis-testing.py index 29f6ef75..17a4b914 100644 --- a/config/travis-testing.py +++ b/config/travis-testing.py @@ -1,27 +1,17 @@ import os -from os import environ - basedir = os.path.abspath(os.path.dirname(__file__)) NAME = "CR Connect Workflow" DEVELOPMENT = True TESTING = True +SQLALCHEMY_DATABASE_URI = "postgresql://postgres:@localhost:5432/crc_test" TOKEN_AUTH_TTL_HOURS = 2 TOKEN_AUTH_SECRET_KEY = "Shhhh!!! This is secret! And better darn well not show up in prod." FRONTEND_AUTH_CALLBACK = "http://localhost:4200/session" # Not Required - -DB_HOST = environ.get('DB_HOST', default="localhost") -DB_PORT = environ.get('DB_PORT', default="5432") -DB_NAME = environ.get('DB_NAME', default="crc_dev") -DB_USER = environ.get('DB_USER', default="crc_user") -DB_PASSWORD = environ.get('DB_PASSWORD', default="crc_pass") -SQLALCHEMY_DATABASE_URI = environ.get( - 'SQLALCHEMY_DATABASE_URI', - default="postgresql://%s:%s@%s:%s/%s" % (DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_NAME) -) +PB_ENABLED = False print('+++ USING TRAVIS TESTING CONFIG: +++') +print('SQLALCHEMY_DATABASE_URI = ', SQLALCHEMY_DATABASE_URI) print('DEVELOPMENT = ', DEVELOPMENT) print('TESTING = ', TESTING) print('FRONTEND_AUTH_CALLBACK = ', FRONTEND_AUTH_CALLBACK) -print('DB_HOST = ', DB_HOST) From c7fc6649edd97d3625e5a1ca0c735467992a965f Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Mon, 25 May 2020 22:52:36 -0400 Subject: [PATCH 27/43] oh my goodness it's late, and I hate docker containers sometimes. --- config/testing.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/config/testing.py b/config/testing.py index f481224a..a7c6a893 100644 --- a/config/testing.py +++ b/config/testing.py @@ -1,13 +1,29 @@ import os +from os import environ + basedir = os.path.abspath(os.path.dirname(__file__)) NAME = "CR Connect Workflow" DEVELOPMENT = True TESTING = True -SQLALCHEMY_DATABASE_URI = "postgresql://crc_user:crc_pass@localhost:5432/crc_test" TOKEN_AUTH_SECRET_KEY = "Shhhh!!! This is secret! And better darn well not show up in prod." PB_ENABLED = False +# This is here, for when we are running the E2E Tests in the frontend code bases. +# which will set the TESTING envronment to true, causing this to execute, but we need +# to respect the environment variables in that case. +# when running locally the defaults apply, meaning we use crc_test for doing the tests +# locally, and we don't over-write the database. Did you read this far? Have a cookie! +DB_HOST = environ.get('DB_HOST', default="localhost") +DB_PORT = environ.get('DB_PORT', default="5432") +DB_NAME = environ.get('DB_NAME', default="crc_test") +DB_USER = environ.get('DB_USER', default="crc_user") +DB_PASSWORD = environ.get('DB_PASSWORD', default="crc_pass") +SQLALCHEMY_DATABASE_URI = environ.get( + 'SQLALCHEMY_DATABASE_URI', + default="postgresql://%s:%s@%s:%s/%s" % (DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_NAME) +) + print('### USING TESTING CONFIG: ###') print('SQLALCHEMY_DATABASE_URI = ', SQLALCHEMY_DATABASE_URI) print('DEVELOPMENT = ', DEVELOPMENT) From eb92ee9fb665c3219e6ef273ab4a5df9d2647068 Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Mon, 25 May 2020 23:47:40 -0400 Subject: [PATCH 28/43] Adding missing migration. --- migrations/versions/9b43e725f39c_.py | 44 ++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 migrations/versions/9b43e725f39c_.py diff --git a/migrations/versions/9b43e725f39c_.py b/migrations/versions/9b43e725f39c_.py new file mode 100644 index 00000000..ac9c65f9 --- /dev/null +++ b/migrations/versions/9b43e725f39c_.py @@ -0,0 +1,44 @@ +"""empty message + +Revision ID: 9b43e725f39c +Revises: 55c6cd407d89 +Create Date: 2020-05-25 23:09:14.761831 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '9b43e725f39c' +down_revision = '55c6cd407d89' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('approval_file', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('file_id', sa.Integer(), nullable=False), + sa.Column('approval_id', sa.Integer(), nullable=False), + sa.Column('file_version', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['approval_id'], ['approval.id'], ), + sa.ForeignKeyConstraint(['file_id'], ['file.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.add_column('approval', sa.Column('date_created', sa.DateTime(timezone=True), nullable=True)) + op.add_column('approval', sa.Column('version', sa.Integer(), nullable=True)) + op.add_column('approval', sa.Column('workflow_hash', sa.String(), nullable=True)) + op.drop_column('approval', 'workflow_version') + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('approval', sa.Column('workflow_version', sa.VARCHAR(), autoincrement=False, nullable=True)) + op.drop_column('approval', 'workflow_hash') + op.drop_column('approval', 'version') + op.drop_column('approval', 'date_created') + op.drop_table('approval_file') + # ### end Alembic commands ### From 987790164e47af77be58580ccee3f0fc4318e9c9 Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Tue, 26 May 2020 15:09:57 -0400 Subject: [PATCH 29/43] use redirect, not redirect_url. --- crc/api.yml | 2 +- crc/api/user.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crc/api.yml b/crc/api.yml index 65a9a7b9..2160eef2 100644 --- a/crc/api.yml +++ b/crc/api.yml @@ -56,7 +56,7 @@ paths: required: false schema: type: string - - name: redirect_url + - name: redirect in: query required: false schema: diff --git a/crc/api/user.py b/crc/api/user.py index 4920825a..01459526 100644 --- a/crc/api/user.py +++ b/crc/api/user.py @@ -126,7 +126,7 @@ def backdoor( first_name=None, last_name=None, title=None, - redirect_url=None, + redirect=None, ): """A backdoor for end-to-end system testing that allows the system to simulate logging in as a specific user. Only works if the application is running in a non-production environment. @@ -151,6 +151,6 @@ def backdoor( if not 'PRODUCTION' in app.config or not app.config['PRODUCTION']: ldap_info = LdapService().user_info(uid) - return _handle_login(ldap_info, redirect_url) + return _handle_login(ldap_info, redirect) else: raise ApiError('404', 'unknown') From e9645fa3fdd701e6c93889d41662f549649b9bb4 Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Tue, 26 May 2020 15:47:41 -0400 Subject: [PATCH 30/43] Renamed redirect_url to just redirect. --- tests/base_test.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/tests/base_test.py b/tests/base_test.py index 89330fc8..0f41bea2 100644 --- a/tests/base_test.py +++ b/tests/base_test.py @@ -102,12 +102,10 @@ class BaseTest(unittest.TestCase): def logged_in_headers(self, user=None, redirect_url='http://some/frontend/url'): if user is None: uid = self.test_uid - user_info = {'uid': self.test_uid, 'first_name': 'Daniel', 'last_name': 'Funk', - 'email_address': 'dhf8r@virginia.edu'} + user_info = {'uid': self.test_uid} else: uid = user.uid - user_info = {'uid': user.uid, 'first_name': user.first_name, 'last_name': user.last_name, - 'email_address': user.email_address} + user_info = {'uid': user.uid} query_string = self.user_info_to_query_string(user_info, redirect_url) rv = self.app.get("/v1.0/sso_backdoor%s" % query_string, follow_redirects=False) @@ -200,7 +198,7 @@ class BaseTest(unittest.TestCase): for key, value in items: query_string_list.append('%s=%s' % (key, urllib.parse.quote(value))) - query_string_list.append('redirect_url=%s' % redirect_url) + query_string_list.append('redirect=%s' % redirect_url) return '?%s' % '&'.join(query_string_list) From ccbf374b403b5ab8441b7dec9b630d4af4cdf310 Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Tue, 26 May 2020 20:06:50 -0400 Subject: [PATCH 31/43] Loads of bug fixes. Modifed the request_approval to take a list of arguments, which works better for us... today. UpdateStudy correctly handles validation. WorkflowService correctly populates random values from lookup tables. And several fixes down in Spiffworkflow, including a big bug where only the last item in a decision table made it through. --- Pipfile.lock | 14 ++++----- crc/scripts/request_approval.py | 25 ++++++++------- crc/scripts/update_study.py | 13 ++++++-- crc/services/workflow_service.py | 45 ++++++++++++++++++++------- tests/test_request_approval_script.py | 10 +++--- 5 files changed, 70 insertions(+), 37 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 0360e027..54962466 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -296,10 +296,10 @@ }, "flask-sqlalchemy": { "hashes": [ - "sha256:0078d8663330dc05a74bc72b3b6ddc441b9a744e2f56fe60af1a5bfc81334327", - "sha256:6974785d913666587949f7c2946f7001e4fa2cb2d19f4e69ead02e4b8f50b33d" + "sha256:0b656fbf87c5f24109d859bafa791d29751fabbda2302b606881ae5485b557a5", + "sha256:fcfe6df52cd2ed8a63008ca36b86a51fa7a4b70cef1c39e5625f722fca32308e" ], - "version": "==2.4.1" + "version": "==2.4.3" }, "future": { "hashes": [ @@ -727,11 +727,11 @@ }, "sphinx": { "hashes": [ - "sha256:62edfd92d955b868d6c124c0942eba966d54b5f3dcb4ded39e65f74abac3f572", - "sha256:f5505d74cf9592f3b997380f9bdb2d2d0320ed74dd69691e3ee0644b956b8d83" + "sha256:779a519adbd3a70fc7c468af08c5e74829868b0a5b34587b33340e010291856c", + "sha256:ea64df287958ee5aac46be7ac2b7277305b0381d213728c3a49d8bb9b8415807" ], "index": "pypi", - "version": "==3.0.3" + "version": "==3.0.4" }, "sphinxcontrib-applehelp": { "hashes": [ @@ -778,7 +778,7 @@ "spiffworkflow": { "editable": true, "git": "https://github.com/sartography/SpiffWorkflow.git", - "ref": "cb098ee6d55b85bf7795997f4ad5f78c27d15381" + "ref": "c8d87826d496af825a184bdc3f0a751e603cfe44" }, "sqlalchemy": { "hashes": [ diff --git a/crc/scripts/request_approval.py b/crc/scripts/request_approval.py index 929ba34b..1df1a670 100644 --- a/crc/scripts/request_approval.py +++ b/crc/scripts/request_approval.py @@ -10,11 +10,11 @@ class RequestApproval(Script): def get_description(self): return """ Creates an approval request on this workflow, by the given approver_uid(s)," -Takes one argument, which should point to data located in current task. +Takes multiple arguments, which should point to data located in current task +or be quoted strings. Example: - -RequestApproval required_approvals.uids +RequestApproval approver1 "dhf8r" """ def do_task_validate_only(self, task, study_id, workflow_id, *args, **kwargs): @@ -29,17 +29,18 @@ RequestApproval required_approvals.uids ApprovalService.add_approval(study_id, workflow_id, id) def get_uids(self, task, args): - if len(args) != 1: + if len(args) < 1: raise ApiError(code="missing_argument", - message="The RequestApproval script requires 1 argument. The " + message="The RequestApproval script requires at least one argument. The " "the name of the variable in the task data that contains user" - "ids to process.") - - uids = task.workflow.script_engine.evaluate_expression(task, args[0]) - - if not isinstance(uids, str) and not isinstance(uids, list): - raise ApiError(code="invalid_argument", - message="The RequestApproval script requires 1 argument. The " + "id to process. Multiple arguments are accepted.") + uids = [] + for arg in args: + id = task.workflow.script_engine.evaluate_expression(task, arg) + uids.append(id) + if not isinstance(id, str): + raise ApiError(code="invalid_argument", + message="The RequestApproval script requires 1 argument. The " "the name of the variable in the task data that contains user" "ids to process. This must point to an array or a string, but " "it currently points to a %s " % uids.__class__.__name__) diff --git a/crc/scripts/update_study.py b/crc/scripts/update_study.py index 303e41b5..ffb9f68e 100644 --- a/crc/scripts/update_study.py +++ b/crc/scripts/update_study.py @@ -6,6 +6,12 @@ from crc.models.study import StudyModel from crc.scripts.script import Script +class mock_study: + def __init__(self): + self.title = "" + self.principle_investigator_id = "" + + class UpdateStudy(Script): argument_error_message = "You must supply at least one argument to the " \ @@ -21,11 +27,15 @@ Example: UpdateStudy title:PIComputingID.label pi:PIComputingID.value """ def do_task_validate_only(self, task, study_id, workflow_id, *args, **kwargs): - self.do_task(task, study_id, workflow_id, *args, **kwargs) + study = mock_study + self.__update_study(task, study, *args) def do_task(self, task, study_id, workflow_id, *args, **kwargs): study = db.session.query(StudyModel).filter(StudyModel.id == study_id).first() + self.__update_study(task, study, *args) + db.session.add(study) + def __update_study(self, task, study, *args): if len(args) < 1: raise ApiError.from_task("missing_argument", self.argument_error_message, task=task) @@ -46,4 +56,3 @@ UpdateStudy title:PIComputingID.label pi:PIComputingID.value else: raise ApiError.from_task("invalid_argument", self.argument_error_message, task=task) - db.session.add(study) diff --git a/crc/services/workflow_service.py b/crc/services/workflow_service.py index b7a5bd45..1f6cfe8f 100644 --- a/crc/services/workflow_service.py +++ b/crc/services/workflow_service.py @@ -61,7 +61,6 @@ class WorkflowService(object): raise ApiError.from_task_spec("workflow_execution_exception", str(we), we.sender) - @staticmethod def populate_form_with_random_data(task, task_api): """populates a task with random data - useful for testing a spec.""" @@ -72,22 +71,42 @@ class WorkflowService(object): for field in task_api.form.fields: if field.type == "enum": if len(field.options) > 0: - form_data[field.id] = random.choice(field.options) + random_choice = random.choice(field.options) + if isinstance(random_choice, dict): + form_data[field.id] = random.choice(field.options)['id'] + else: + # fixme: why it is sometimes an EnumFormFieldOption, and other times not? + form_data[field.id] = random_choice.id ## Assume it is an EnumFormFieldOption else: raise ApiError.from_task("invalid_enum", "You specified an enumeration field (%s)," " with no options" % field.id, task) - if field.type == "autocomplete": + elif field.type == "autocomplete": lookup_model = LookupService.get_lookup_table(task, field) - if not lookup_model: + if field.has_property(Task.PROP_LDAP_LOOKUP): + form_data[field.id] = { + "label": "dhf8r", + "value": "Dan Funk", + "data": { + "uid": "dhf8r", + "display_name": "Dan Funk", + "given_name": "Dan", + "email_address": "dhf8r@virginia.edu", + "department": "Depertment of Psychocosmographictology", + "affiliation": "Rousabout", + "sponsor_type": "Staff" + } + } + elif lookup_model: + data = db.session.query(LookupDataModel).filter( + LookupDataModel.lookup_file_model == lookup_model).limit(10).all() + options = [] + for d in data: + options.append({"id": d.value, "name": d.label}) + form_data[field.id] = random.choice(options) + else: raise ApiError.from_task("invalid_autocomplete", "The settings for this auto complete field " - "(%s) are incorrect: " % field.id) - data = db.session.query(LookupDataModel).filter(LookupDataModel.lookup_file_model == lookup_model).limit(10).all() - options = [] - for d in data: - options.append({"id": d.value, "name": d.label}) - form_data[field.id] = random.choice(options) - + "are incorrect: %s " % field.id, task) elif field.type == "long": form_data[field.id] = random.randint(1, 1000) elif field.type == 'boolean': @@ -102,6 +121,10 @@ class WorkflowService(object): task.data = {} task.data.update(form_data) + def __get_options(self): + pass + + @staticmethod def _random_string(string_length=10): """Generate a random string of fixed length """ diff --git a/tests/test_request_approval_script.py b/tests/test_request_approval_script.py index 8749f711..142da5c5 100644 --- a/tests/test_request_approval_script.py +++ b/tests/test_request_approval_script.py @@ -16,10 +16,10 @@ class TestRequestApprovalScript(BaseTest): workflow = self.create_workflow('empty_workflow') processor = WorkflowProcessor(workflow) task = processor.next_task() - task.data = {"study": {"approvals": ['dhf8r', 'lb3dp']}} + task.data = {"study": {"approval1": "dhf8r", 'approval2':'lb3dp'}} script = RequestApproval() - script.do_task(task, workflow.study_id, workflow.id, "study.approvals") + script.do_task(task, workflow.study_id, workflow.id, "study.approval1", "study.approval2") self.assertEquals(2, db.session.query(ApprovalModel).count()) def test_do_task_with_incorrect_argument(self): @@ -29,7 +29,7 @@ class TestRequestApprovalScript(BaseTest): workflow = self.create_workflow('empty_workflow') processor = WorkflowProcessor(workflow) task = processor.next_task() - task.data = {"approvals": {'dhf8r':"invalid", 'lb3dp':"invalid"}} + task.data = {"approvals": {'dhf8r':["invalid"], 'lb3dp':"invalid"}} script = RequestApproval() with self.assertRaises(ApiError): script.do_task(task, workflow.study_id, workflow.id, "approvals") @@ -40,9 +40,9 @@ class TestRequestApprovalScript(BaseTest): workflow = self.create_workflow('empty_workflow') processor = WorkflowProcessor(workflow) task = processor.next_task() - task.data = {"approvals": ['dhf8r', 'lb3dp']} + task.data = {"study": {"approval1": "dhf8r", 'approval2':'lb3dp'}} script = RequestApproval() - script.do_task_validate_only(task, workflow.study_id, workflow.id, "approvals") + script.do_task_validate_only(task, workflow.study_id, workflow.id, "study.approval1") self.assertEquals(0, db.session.query(ApprovalModel).count()) From eb15d172c1ac2fdeef8128275d8f6827c7660ff0 Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Tue, 26 May 2020 21:18:09 -0400 Subject: [PATCH 32/43] I absolutely must fix our cascade deletes, but I sort of like the horror such chunks of code cause, we really need to protect these endpoints, and assure they never get called under normal circumstances, and raise some thoughtful errors. --- crc/api/workflow.py | 3 +++ tests/test_workflow_spec_api.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/crc/api/workflow.py b/crc/api/workflow.py index 4ad02f0e..f67cc12f 100644 --- a/crc/api/workflow.py +++ b/crc/api/workflow.py @@ -4,6 +4,7 @@ from crc import session from crc.api.common import ApiError, ApiErrorSchema from crc.models.api_models import WorkflowApi, WorkflowApiSchema, NavigationItem, NavigationItemSchema from crc.models.file import FileModel, LookupDataSchema +from crc.models.stats import TaskEventModel from crc.models.workflow import WorkflowModel, WorkflowSpecModelSchema, WorkflowSpecModel, WorkflowSpecCategoryModel, \ WorkflowSpecCategoryModelSchema from crc.services.file_service import FileService @@ -77,6 +78,8 @@ def delete_workflow_specification(spec_id): for file in files: FileService.delete_file(file.id) + session.query(TaskEventModel).filter(TaskEventModel.workflow_spec_id == spec_id).delete() + # Delete all stats and workflow models related to this specification for workflow in session.query(WorkflowModel).filter_by(workflow_spec_id=spec_id): StudyService.delete_workflow(workflow) diff --git a/tests/test_workflow_spec_api.py b/tests/test_workflow_spec_api.py index 344dc930..5681270c 100644 --- a/tests/test_workflow_spec_api.py +++ b/tests/test_workflow_spec_api.py @@ -1,9 +1,9 @@ import json +from tests.base_test import BaseTest from crc import session from crc.models.file import FileModel from crc.models.workflow import WorkflowSpecModel, WorkflowSpecModelSchema, WorkflowModel, WorkflowSpecCategoryModel -from tests.base_test import BaseTest class TestWorkflowSpec(BaseTest): From 7869fa596e3200f0789ad156614f2d882ff6b067 Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Tue, 26 May 2020 22:42:49 -0400 Subject: [PATCH 33/43] Protocol Builder isn't disabled on the dcos servers, trying to figure out why, and assure it isn't some sort of weird race condition. --- config/default.py | 10 +--------- crc/__init__.py | 10 ++++++++++ crc/services/protocol_builder.py | 7 +++++-- crc/services/study_service.py | 6 +++--- tests/test_protocol_builder.py | 9 +++++---- tests/test_study_api.py | 4 ++-- tests/test_study_service.py | 6 +++--- tests/test_tasks_api.py | 4 ++-- tests/test_workflow_processor.py | 2 +- tests/test_workflow_spec_validation_api.py | 6 +++--- 10 files changed, 35 insertions(+), 29 deletions(-) diff --git a/config/default.py b/config/default.py index 24137350..e8fd4831 100644 --- a/config/default.py +++ b/config/default.py @@ -40,13 +40,5 @@ PB_STUDY_DETAILS_URL = environ.get('PB_STUDY_DETAILS_URL', default=PB_BASE_URL + LDAP_URL = environ.get('LDAP_URL', default="ldap.virginia.edu").strip('/') # No trailing slash or http:// LDAP_TIMEOUT_SEC = int(environ.get('LDAP_TIMEOUT_SEC', default=3)) -print('=== USING DEFAULT CONFIG: ===') -print('DB_HOST = ', DB_HOST) -print('CORS_ALLOW_ORIGINS = ', CORS_ALLOW_ORIGINS) -print('DEVELOPMENT = ', DEVELOPMENT) -print('TESTING = ', TESTING) -print('PRODUCTION = ', PRODUCTION) -print('PB_BASE_URL = ', PB_BASE_URL) -print('LDAP_URL = ', LDAP_URL) -print('APPLICATION_ROOT = ', APPLICATION_ROOT) + diff --git a/crc/__init__.py b/crc/__init__.py index ea3e8a6f..fe510daf 100644 --- a/crc/__init__.py +++ b/crc/__init__.py @@ -40,6 +40,16 @@ connexion_app.add_api('api.yml', base_path='/v1.0') origins_re = [r"^https?:\/\/%s(.*)" % o.replace('.', '\.') for o in app.config['CORS_ALLOW_ORIGINS']] cors = CORS(connexion_app.app, origins=origins_re) +print('=== USING THESE CONFIG SETTINGS: ===') +print('DB_HOST = ', ) +print('CORS_ALLOW_ORIGINS = ', app.config['CORS_ALLOW_ORIGINS']) +print('DEVELOPMENT = ', app.config['DEVELOPMENT']) +print('TESTING = ', app.config['TESTING']) +print('PRODUCTION = ', app.config['PRODUCTION']) +print('PB_BASE_URL = ', app.config['PB_BASE_URL']) +print('LDAP_URL = ', app.config['LDAP_URL']) +print('APPLICATION_ROOT = ', app.config['APPLICATION_ROOT']) +print('PB_ENABLED = ', app.config['PB_ENABLED']) @app.cli.command() def load_example_data(): diff --git a/crc/services/protocol_builder.py b/crc/services/protocol_builder.py index ac950281..c014c003 100644 --- a/crc/services/protocol_builder.py +++ b/crc/services/protocol_builder.py @@ -9,12 +9,15 @@ from crc.models.protocol_builder import ProtocolBuilderStudySchema, ProtocolBuil class ProtocolBuilderService(object): - ENABLED = app.config['PB_ENABLED'] STUDY_URL = app.config['PB_USER_STUDIES_URL'] INVESTIGATOR_URL = app.config['PB_INVESTIGATORS_URL'] REQUIRED_DOCS_URL = app.config['PB_REQUIRED_DOCS_URL'] STUDY_DETAILS_URL = app.config['PB_STUDY_DETAILS_URL'] + @staticmethod + def is_enabled(): + return app.config['PB_ENABLED'] + @staticmethod def get_studies(user_id) -> {}: ProtocolBuilderService.__enabled_or_raise() @@ -43,7 +46,7 @@ class ProtocolBuilderService(object): @staticmethod def __enabled_or_raise(): - if not ProtocolBuilderService.ENABLED: + if not ProtocolBuilderService.is_enabled(): raise ApiError("protocol_builder_disabled", "The Protocol Builder Service is currently disabled.") @staticmethod diff --git a/crc/services/study_service.py b/crc/services/study_service.py index 0a81fd79..ea4c2d41 100644 --- a/crc/services/study_service.py +++ b/crc/services/study_service.py @@ -117,7 +117,7 @@ class StudyService(object): that is available..""" # Get PB required docs, if Protocol Builder Service is enabled. - if ProtocolBuilderService.ENABLED: + if ProtocolBuilderService.is_enabled(): try: pb_docs = ProtocolBuilderService.get_required_docs(study_id=study_id) except requests.exceptions.ConnectionError as ce: @@ -133,7 +133,7 @@ class StudyService(object): documents = {} for code, doc in doc_dictionary.items(): - if ProtocolBuilderService.ENABLED: + if ProtocolBuilderService.is_enabled(): pb_data = next((item for item in pb_docs if int(item['AUXDOCID']) == int(doc['id'])), None) doc['required'] = False if pb_data: @@ -216,7 +216,7 @@ class StudyService(object): """Assures that the studies we have locally for the given user are in sync with the studies available in protocol builder. """ - if not ProtocolBuilderService.ENABLED: + if not ProtocolBuilderService.is_enabled(): return # Get studies matching this user from Protocol Builder diff --git a/tests/test_protocol_builder.py b/tests/test_protocol_builder.py index a386a218..e5b75632 100644 --- a/tests/test_protocol_builder.py +++ b/tests/test_protocol_builder.py @@ -1,5 +1,6 @@ from unittest.mock import patch +from crc import app from tests.base_test import BaseTest from crc.services.protocol_builder import ProtocolBuilderService @@ -10,7 +11,7 @@ class TestProtocolBuilder(BaseTest): @patch('crc.services.protocol_builder.requests.get') def test_get_studies(self, mock_get): - ProtocolBuilderService.ENABLED = True + app.config['PB_ENABLED'] = True mock_get.return_value.ok = True mock_get.return_value.text = self.protocol_builder_response('user_studies.json') response = ProtocolBuilderService.get_studies(self.test_uid) @@ -18,7 +19,7 @@ class TestProtocolBuilder(BaseTest): @patch('crc.services.protocol_builder.requests.get') def test_get_investigators(self, mock_get): - ProtocolBuilderService.ENABLED = True + app.config['PB_ENABLED'] = True mock_get.return_value.ok = True mock_get.return_value.text = self.protocol_builder_response('investigators.json') response = ProtocolBuilderService.get_investigators(self.test_study_id) @@ -30,7 +31,7 @@ class TestProtocolBuilder(BaseTest): @patch('crc.services.protocol_builder.requests.get') def test_get_required_docs(self, mock_get): - ProtocolBuilderService.ENABLED = True + app.config['PB_ENABLED'] = True mock_get.return_value.ok = True mock_get.return_value.text = self.protocol_builder_response('required_docs.json') response = ProtocolBuilderService.get_required_docs(self.test_study_id) @@ -40,7 +41,7 @@ class TestProtocolBuilder(BaseTest): @patch('crc.services.protocol_builder.requests.get') def test_get_details(self, mock_get): - ProtocolBuilderService.ENABLED = True + app.config['PB_ENABLED'] = True mock_get.return_value.ok = True mock_get.return_value.text = self.protocol_builder_response('study_details.json') response = ProtocolBuilderService.get_study_details(self.test_study_id) diff --git a/tests/test_study_api.py b/tests/test_study_api.py index 50bebe03..7282ac10 100644 --- a/tests/test_study_api.py +++ b/tests/test_study_api.py @@ -3,7 +3,7 @@ from tests.base_test import BaseTest from datetime import datetime, timezone from unittest.mock import patch -from crc import session +from crc import session, app from crc.models.protocol_builder import ProtocolBuilderStatus, \ ProtocolBuilderStudySchema from crc.models.stats import TaskEventModel @@ -105,7 +105,7 @@ class TestStudyApi(BaseTest): def test_get_all_studies(self, mock_studies, mock_details, mock_docs, mock_investigators): # Enable the protocol builder for these tests, as the master_workflow and other workflows # depend on using the PB for data. - ProtocolBuilderService.ENABLED = True + app.config['PB_ENABLED'] = True self.load_example_data() s = StudyModel( id=54321, # This matches one of the ids from the study_details_json data. diff --git a/tests/test_study_service.py b/tests/test_study_service.py index 80fe10da..d7e522da 100644 --- a/tests/test_study_service.py +++ b/tests/test_study_service.py @@ -2,7 +2,7 @@ import json from datetime import datetime from unittest.mock import patch -from crc import db +from crc import db, app from crc.models.protocol_builder import ProtocolBuilderStatus from crc.models.study import StudyModel from crc.models.user import UserModel @@ -57,7 +57,7 @@ class TestStudyService(BaseTest): @patch('crc.services.protocol_builder.ProtocolBuilderService.get_required_docs') # mock_docs def test_total_tasks_updated(self, mock_docs): """Assure that as a users progress is available when getting a list of studies for that user.""" - + app.config['PB_ENABLED'] = True docs_response = self.protocol_builder_response('required_docs.json') mock_docs.return_value = json.loads(docs_response) @@ -106,7 +106,7 @@ class TestStudyService(BaseTest): @patch('crc.services.protocol_builder.ProtocolBuilderService.get_required_docs') # mock_docs def test_get_required_docs(self, mock_docs): - + app.config['PB_ENABLED'] = True # mock out the protocol builder docs_response = self.protocol_builder_response('required_docs.json') mock_docs.return_value = json.loads(docs_response) diff --git a/tests/test_tasks_api.py b/tests/test_tasks_api.py index 53befa5f..176c2278 100644 --- a/tests/test_tasks_api.py +++ b/tests/test_tasks_api.py @@ -308,7 +308,7 @@ class TestTasksApi(BaseTest): self.load_example_data() # Enable the protocol builder. - ProtocolBuilderService.ENABLED = True + app.config['PB_ENABLED'] = True # This depends on getting a list of investigators back from the protocol builder. mock_get.return_value.ok = True @@ -426,7 +426,7 @@ class TestTasksApi(BaseTest): def test_parallel_multi_instance(self, mock_get): # Assure we get nine investigators back from the API Call, as set in the investigators.json file. - ProtocolBuilderService.ENABLED = True + app.config['PB_ENABLED'] = True mock_get.return_value.ok = True mock_get.return_value.text = self.protocol_builder_response('investigators.json') diff --git a/tests/test_workflow_processor.py b/tests/test_workflow_processor.py index 4310f01e..e19bbc87 100644 --- a/tests/test_workflow_processor.py +++ b/tests/test_workflow_processor.py @@ -374,7 +374,7 @@ class TestWorkflowProcessor(BaseTest): mock_details.return_value = json.loads(details_response) self.load_example_data(use_crc_data=True) - ProtocolBuilderService.ENABLED = True + app.config['PB_ENABLED'] = True study = session.query(StudyModel).first() workflow_spec_model = db.session.query(WorkflowSpecModel).\ diff --git a/tests/test_workflow_spec_validation_api.py b/tests/test_workflow_spec_validation_api.py index b7207d6f..9e581874 100644 --- a/tests/test_workflow_spec_validation_api.py +++ b/tests/test_workflow_spec_validation_api.py @@ -4,7 +4,7 @@ from unittest.mock import patch from tests.base_test import BaseTest from crc.services.protocol_builder import ProtocolBuilderService -from crc import session +from crc import session, app from crc.api.common import ApiErrorSchema from crc.models.protocol_builder import ProtocolBuilderStudySchema from crc.models.workflow import WorkflowSpecModel @@ -21,7 +21,7 @@ class TestWorkflowSpecValidation(BaseTest): return ApiErrorSchema(many=True).load(json_data) def test_successful_validation_of_test_workflows(self): - ProtocolBuilderService.ENABLED = False # Assure this is disabled. + app.config['PB_ENABLED'] = False # Assure this is disabled. self.assertEqual(0, len(self.validate_workflow("parallel_tasks"))) self.assertEqual(0, len(self.validate_workflow("decision_table"))) self.assertEqual(0, len(self.validate_workflow("docx"))) @@ -48,7 +48,7 @@ class TestWorkflowSpecValidation(BaseTest): mock_investigators.return_value = json.loads(investigators_response) self.load_example_data(use_crc_data=True) - ProtocolBuilderService.ENABLED=True + app.config['PB_ENABLED'] = True workflows = session.query(WorkflowSpecModel).all() errors = [] for w in workflows: From 0025931a2e3766b634cb9c23440b8ecf92a26c77 Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Tue, 26 May 2020 23:18:14 -0400 Subject: [PATCH 34/43] Trying hard to figure out why the DCOS servers think the protocol builder is enabled. --- crc/services/study_service.py | 48 ++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/crc/services/study_service.py b/crc/services/study_service.py index ea4c2d41..db5c2b72 100644 --- a/crc/services/study_service.py +++ b/crc/services/study_service.py @@ -216,34 +216,36 @@ class StudyService(object): """Assures that the studies we have locally for the given user are in sync with the studies available in protocol builder. """ - if not ProtocolBuilderService.is_enabled(): - return + if ProtocolBuilderService.is_enabled(): - # Get studies matching this user from Protocol Builder - pb_studies: List[ProtocolBuilderStudy] = ProtocolBuilderService.get_studies(user.uid) + app.logger.info("The Protocol Builder is enabled. app.config['PB_ENABLED'] = " + + str(app.config['PB_ENABLED'])) - # Get studies from the database - db_studies = session.query(StudyModel).filter_by(user_uid=user.uid).all() + # Get studies matching this user from Protocol Builder + pb_studies: List[ProtocolBuilderStudy] = ProtocolBuilderService.get_studies(user.uid) - # Update all studies from the protocol builder, create new studies as needed. - # Futher assures that every active study (that does exist in the protocol builder) - # has a reference to every available workflow (though some may not have started yet) - for pb_study in pb_studies: - db_study = next((s for s in db_studies if s.id == pb_study.STUDYID), None) - if not db_study: - db_study = StudyModel(id=pb_study.STUDYID) - session.add(db_study) - db_studies.append(db_study) - db_study.update_from_protocol_builder(pb_study) - StudyService._add_all_workflow_specs_to_study(db_study) + # Get studies from the database + db_studies = session.query(StudyModel).filter_by(user_uid=user.uid).all() - # Mark studies as inactive that are no longer in Protocol Builder - for study in db_studies: - pb_study = next((pbs for pbs in pb_studies if pbs.STUDYID == study.id), None) - if not pb_study: - study.protocol_builder_status = ProtocolBuilderStatus.ABANDONED + # Update all studies from the protocol builder, create new studies as needed. + # Futher assures that every active study (that does exist in the protocol builder) + # has a reference to every available workflow (though some may not have started yet) + for pb_study in pb_studies: + db_study = next((s for s in db_studies if s.id == pb_study.STUDYID), None) + if not db_study: + db_study = StudyModel(id=pb_study.STUDYID) + session.add(db_study) + db_studies.append(db_study) + db_study.update_from_protocol_builder(pb_study) + StudyService._add_all_workflow_specs_to_study(db_study) - db.session.commit() + # Mark studies as inactive that are no longer in Protocol Builder + for study in db_studies: + pb_study = next((pbs for pbs in pb_studies if pbs.STUDYID == study.id), None) + if not pb_study: + study.protocol_builder_status = ProtocolBuilderStatus.ABANDONED + + db.session.commit() @staticmethod def __update_status_of_workflow_meta(workflow_metas, status): From 397cb23b52ca7d26f64eaa9c09735ec4716ae12b Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Tue, 26 May 2020 23:38:57 -0400 Subject: [PATCH 35/43] Is true "true", yes it is true. So true, is "false", so true, it is true. --- crc/services/protocol_builder.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crc/services/protocol_builder.py b/crc/services/protocol_builder.py index c014c003..23dcb79f 100644 --- a/crc/services/protocol_builder.py +++ b/crc/services/protocol_builder.py @@ -16,7 +16,10 @@ class ProtocolBuilderService(object): @staticmethod def is_enabled(): - return app.config['PB_ENABLED'] + if isinstance(app.config['PB_ENABLED'], str): + return app.config['PB_ENABLED'].lower() == "true" + else: + return app.config['PB_ENABLED'] == True @staticmethod def get_studies(user_id) -> {}: From 0f04b1dd7927a4432c67c52ff3916bf13e117542 Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Wed, 27 May 2020 08:35:04 -0400 Subject: [PATCH 36/43] Forces PB_ENABLED to be a boolean, because environment variables always come through as a string --- config/default.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/default.py b/config/default.py index e8fd4831..e368b32d 100644 --- a/config/default.py +++ b/config/default.py @@ -31,7 +31,7 @@ FRONTEND_AUTH_CALLBACK = environ.get('FRONTEND_AUTH_CALLBACK', default="http://l SWAGGER_AUTH_KEY = environ.get('SWAGGER_AUTH_KEY', default="SWAGGER") # %s/%i placeholders expected for uva_id and study_id in various calls. -PB_ENABLED = environ.get('PB_ENABLED', default=False) +PB_ENABLED = environ.get('PB_ENABLED', default="false") == "true" PB_BASE_URL = environ.get('PB_BASE_URL', default="http://localhost:5001/pb/").strip('/') + '/' # Trailing slash required PB_USER_STUDIES_URL = environ.get('PB_USER_STUDIES_URL', default=PB_BASE_URL + "user_studies?uva_id=%s") PB_INVESTIGATORS_URL = environ.get('PB_INVESTIGATORS_URL', default=PB_BASE_URL + "investigators?studyid=%i") From d5e075db825ca75aa3cb12553b48fce8f6eece06 Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Wed, 27 May 2020 09:47:44 -0400 Subject: [PATCH 37/43] Order search results by relevancy in the lookup service. --- crc/services/lookup_service.py | 11 +++++++--- crc/services/protocol_builder.py | 3 +-- .../enum_options_from_file/customer_list.xls | Bin 108544 -> 108544 bytes tests/test_lookup_service.py | 19 ++++++++++++------ 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/crc/services/lookup_service.py b/crc/services/lookup_service.py index f9d023bc..12a50330 100644 --- a/crc/services/lookup_service.py +++ b/crc/services/lookup_service.py @@ -1,4 +1,6 @@ from pandas import ExcelFile +from sqlalchemy import func, desc +from sqlalchemy.sql.functions import GenericFunction from crc import db from crc.api.common import ApiError @@ -7,6 +9,9 @@ from crc.models.file import FileDataModel, LookupFileModel, LookupDataModel from crc.services.file_service import FileService from crc.services.ldap_service import LdapService +class TSRank(GenericFunction): + package = 'full_text' + name = 'ts_rank' class LookupService(object): @@ -122,9 +127,9 @@ class LookupService(object): else: query = "%s:*" % query db_query = db_query.filter(LookupDataModel.label.match(query)) - - # db_query = db_query.filter(text("lookup_data.label @@ to_tsquery('simple', '%s')" % query)) - + db_query = db_query.order_by(desc(func.full_text.ts_rank( + func.to_tsvector('simple', LookupDataModel.label), + func.to_tsquery('simple', query)))) return db_query.limit(limit).all() @staticmethod diff --git a/crc/services/protocol_builder.py b/crc/services/protocol_builder.py index 23dcb79f..5fc5535f 100644 --- a/crc/services/protocol_builder.py +++ b/crc/services/protocol_builder.py @@ -19,7 +19,7 @@ class ProtocolBuilderService(object): if isinstance(app.config['PB_ENABLED'], str): return app.config['PB_ENABLED'].lower() == "true" else: - return app.config['PB_ENABLED'] == True + return app.config['PB_ENABLED'] is True @staticmethod def get_studies(user_id) -> {}: @@ -65,4 +65,3 @@ class ProtocolBuilderService(object): "Received an invalid response from the protocol builder (status %s): %s when calling " "url '%s'." % (response.status_code, response.text, url)) - diff --git a/tests/data/enum_options_from_file/customer_list.xls b/tests/data/enum_options_from_file/customer_list.xls index 8c977446b446586a4d05a0658d44ea4fe252fe05..d352073e4ce4df2ba9eb3fd6de186b1787fc8866 100644 GIT binary patch delta 622 zcmZvaF-yZx6ot=ysjZsYsI`gJiUAQ3925lItXLPFEaEOwnhw^Xb#TyDN5QE`5L6KS z0b;QQ7xf1S4x&qcgNTEJD0-7TiJ}Q4@0|C&_s+dZ`7T(#3!bG^I9)E{~%+BfD`(Gqq!~ln(wh7~|h1$#1BSotO5;3H3J*?@nBd Xj6YCiAz;?8PiRsRjs5!DDFu};#35a_ delta 296 zcmZp;z}9eqZG#IpW9npA?nd?^CJhD#28qpQxpSFV|1)p_nLT_=jE>pD{0vM$nOX)O z21X#9ppM`(0cHM4BKXV<42*o75IzGFA5a$qgXre-{OOF7zwz@i3QhjVFU%+mCPgM+ z6cnD^AjmTLil6|a7>LIx4k9=25p?-5)q{~|Iu8q@<2EKnMyBn4ER1YZr}Z(iFizg? zI+HP&dAh?~#wg`NVFm^Vuq6;emVuvvSp>{xWDsGPEX=?(eeYaG=jj297$0t%$C$w^ z2=a+B5IcZWC9W4+J-u=vqdZ5@R_#D@;cJYO16dTdA6Up}!OZk~%JyGN7}=Ns)ZRe2 diff --git a/tests/test_lookup_service.py b/tests/test_lookup_service.py index 89be6168..233709a8 100644 --- a/tests/test_lookup_service.py +++ b/tests/test_lookup_service.py @@ -1,10 +1,10 @@ + +from tests.base_test import BaseTest + from crc import session from crc.models.file import FileDataModel, FileModel, LookupFileModel, LookupDataModel from crc.services.file_service import FileService from crc.services.lookup_service import LookupService -from crc.services.workflow_processor import WorkflowProcessor -from crc.services.workflow_service import WorkflowService -from tests.base_test import BaseTest class TestLookupService(BaseTest): @@ -21,7 +21,7 @@ class TestLookupService(BaseTest): self.assertEqual(1, len(lookup_records)) lookup_record = lookup_records[0] lookup_data = session.query(LookupDataModel).filter(LookupDataModel.lookup_file_model == lookup_record).all() - self.assertEquals(19, len(lookup_data)) + self.assertEquals(23, len(lookup_data)) # Using the same table with different lookup lable or value, does create additional records. LookupService.get_lookup_table_from_data_model(file_data_model, "CUSTOMER_NAME", "CUSTOMER_NUMBER") lookup_records = session.query(LookupFileModel).all() @@ -51,8 +51,6 @@ class TestLookupService(BaseTest): self.assertEquals(1, len(results), "case does not matter.") self.assertEquals("UVA - INTERNAL - GM USE ONLY", results[0].label) - - results = LookupService._run_lookup_query(lookup_table, "medici", limit=10) self.assertEquals(1, len(results), "partial words are picked up.") self.assertEquals("The Medicines Company", results[0].label) @@ -73,7 +71,16 @@ class TestLookupService(BaseTest): self.assertEquals(7, len(results), "short terms get multiple correct results.") self.assertEquals("Genetics Savings & Clone, Inc.", results[0].label) + results = LookupService._run_lookup_query(lookup_table, "reaction design", limit=10) + self.assertEquals(5, len(results), "all results come back for two terms.") + self.assertEquals("Reaction Design", results[0].label, "The first result is the most relevant") + self.assertEquals("Reaction Then Design ", results[1].label, "The first result is the most relevant") + self.assertEquals("Design Then Reaction", results[2].label, "The first result is the most relevant") + self.assertEquals("Just Reaction", results[3].label, "The first result is the most relevant") + self.assertEquals("Just Design", results[4].label, "The first result is the most relevant") + # Fixme: Stop words are taken into account on the query side, and haven't found a fix yet. #results = WorkflowService.run_lookup_query(lookup_table.id, "in", limit=10) #self.assertEquals(7, len(results), "stop words are not removed.") #self.assertEquals("Genetics Savings & Clone, Inc.", results[0].label) + From 229b5d5ececfbcad44d4b29600291de40a4a22ec Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Wed, 27 May 2020 09:55:46 -0400 Subject: [PATCH 38/43] Forgot to add the test fixes. --- tests/test_workflow_service.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_workflow_service.py b/tests/test_workflow_service.py index 76487e10..ee8de32a 100644 --- a/tests/test_workflow_service.py +++ b/tests/test_workflow_service.py @@ -68,7 +68,7 @@ class TestWorkflowService(BaseTest): task = processor.next_task() WorkflowService.process_options(task, task.task_spec.form.fields[0]) options = task.task_spec.form.fields[0].options - self.assertEquals(19, len(options)) + self.assertEquals(23, len(options)) self.assertEquals('1000', options[0]['id']) self.assertEquals("UVA - INTERNAL - GM USE ONLY", options[0]['name']) @@ -86,7 +86,7 @@ class TestWorkflowService(BaseTest): self.assertEquals("CUSTOMER_NAME", lookup_record.label_column) self.assertEquals("CUSTOMER_NAME", lookup_record.label_column) lookup_data = session.query(LookupDataModel).filter(LookupDataModel.lookup_file_model == lookup_record).all() - self.assertEquals(19, len(lookup_data)) + self.assertEquals(23, len(lookup_data)) self.assertEquals("1000", lookup_data[0].value) self.assertEquals("UVA - INTERNAL - GM USE ONLY", lookup_data[0].label) From 6eaa6ac158d9bc2fa509edd99c92f91be348b60e Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Wed, 27 May 2020 12:58:50 -0400 Subject: [PATCH 39/43] Adds option to load RRT example data --- docker_run.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docker_run.sh b/docker_run.sh index 6fbb21f3..6bc3c90b 100755 --- a/docker_run.sh +++ b/docker_run.sh @@ -14,10 +14,15 @@ if [ "$UPGRADE_DB" = "true" ]; then fi if [ "$RESET_DB" = "true" ]; then - echo 'Resetting database...' + echo 'Resetting database and seeding it with example CR Connect data...' pipenv run flask load-example-data fi +if [ "$RESET_DB_RRT" = "true" ]; then + echo 'Resetting database and seeding it with example RRT data...' + pipenv run flask load-example-rrt-data +fi + if [ "$APPLICATION_ROOT" = "/" ]; then pipenv run gunicorn --bind 0.0.0.0:$PORT0 wsgi:app else From 77f72e408fff2393a51e5a5c11c60b73ea102ed8 Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Wed, 27 May 2020 14:36:10 -0400 Subject: [PATCH 40/43] Lookup Service now raises exact matches to the top. Very hackish, but it works. --- crc/services/lookup_service.py | 33 ++++++++++++------ tests/base_test.py | 7 ++-- .../enum_options_from_file/customer_list.xls | Bin 108544 -> 109056 bytes tests/test_lookup_service.py | 33 ++++++++++++------ 4 files changed, 49 insertions(+), 24 deletions(-) diff --git a/crc/services/lookup_service.py b/crc/services/lookup_service.py index 12a50330..43e17f3c 100644 --- a/crc/services/lookup_service.py +++ b/crc/services/lookup_service.py @@ -1,3 +1,5 @@ +import logging + from pandas import ExcelFile from sqlalchemy import func, desc from sqlalchemy.sql.functions import GenericFunction @@ -117,20 +119,31 @@ class LookupService(object): db_query = LookupDataModel.query.filter(LookupDataModel.lookup_file_model == lookup_file_model) query = query.strip() - if len(query) > 1: + if len(query) > 0: if ' ' in query: terms = query.split(' ') - new_terms = [] + new_terms = ["'%s'" % query] for t in terms: - new_terms.append(t + ":*") - query = '|'.join(new_terms) + new_terms.append("%s:*" % t) + new_query = ' | '.join(new_terms) else: - query = "%s:*" % query - db_query = db_query.filter(LookupDataModel.label.match(query)) - db_query = db_query.order_by(desc(func.full_text.ts_rank( - func.to_tsvector('simple', LookupDataModel.label), - func.to_tsquery('simple', query)))) - return db_query.limit(limit).all() + new_query = "%s:*" % query + + # Run the full text query + db_query = db_query.filter(LookupDataModel.label.match(new_query)) + # But hackishly order by like, which does a good job of + # pulling more relevant matches to the top. + db_query = db_query.order_by(desc(LookupDataModel.label.like("%" + query + "%"))) + #ORDER BY name LIKE concat('%', ticker, '%') desc, rank DESC + +# db_query = db_query.order_by(desc(func.full_text.ts_rank( +# func.to_tsvector(LookupDataModel.label), +# func.to_tsquery(query)))) + from sqlalchemy.dialects import postgresql + logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO) + result = db_query.limit(limit).all() + logging.getLogger('sqlalchemy.engine').setLevel(logging.ERROR) + return result @staticmethod def _run_ldap_query(query, limit): diff --git a/tests/base_test.py b/tests/base_test.py index 0f41bea2..f8ffd1ca 100644 --- a/tests/base_test.py +++ b/tests/base_test.py @@ -22,10 +22,9 @@ from crc.models.user import UserModel from crc import app, db, session from example_data import ExampleDataLoader -# UNCOMMENT THIS FOR DEBUGGING SQL ALCHEMY QUERIES -# import logging -# logging.basicConfig() -# logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO) +#UNCOMMENT THIS FOR DEBUGGING SQL ALCHEMY QUERIES +import logging +logging.basicConfig() class BaseTest(unittest.TestCase): diff --git a/tests/data/enum_options_from_file/customer_list.xls b/tests/data/enum_options_from_file/customer_list.xls index d352073e4ce4df2ba9eb3fd6de186b1787fc8866..d697bb67bb6e647f2ddf4f861ada04a5f3c56753 100644 GIT binary patch delta 492 zcmZp;z}9euZGr*sB?c%EU|=}E(UzT?@zZ2i?nd_iOjbY%h0SNVcQLv0GcXt$0D(eq zer{?>MrK|*A4CKpzzq~Y@OVJd2=0FdE}&68d`^sva+}Zde`K6&A}BEVf*=csW|W$2 zC@9P*4JKtkdd7x>6HIYmfdvVaf^h-Q?UoG2vBC=DiMK;-5Gp#|@!wlE4z7hqvD*v7V<0 diff --git a/tests/test_lookup_service.py b/tests/test_lookup_service.py index 233709a8..3a53fdfb 100644 --- a/tests/test_lookup_service.py +++ b/tests/test_lookup_service.py @@ -9,10 +9,12 @@ from crc.services.lookup_service import LookupService class TestLookupService(BaseTest): + def test_create_lookup_file_multiple_times_does_not_update_database(self): - spec = self.load_test_spec('enum_options_from_file') + spec = BaseTest.load_test_spec('enum_options_from_file') file_model = session.query(FileModel).filter(FileModel.name == "customer_list.xls").first() file_data_model = session.query(FileDataModel).filter(FileDataModel.file_model == file_model).first() + LookupService.get_lookup_table_from_data_model(file_data_model, "CUSTOMER_NUMBER", "CUSTOMER_NAME") LookupService.get_lookup_table_from_data_model(file_data_model, "CUSTOMER_NUMBER", "CUSTOMER_NAME") LookupService.get_lookup_table_from_data_model(file_data_model, "CUSTOMER_NUMBER", "CUSTOMER_NAME") @@ -21,18 +23,16 @@ class TestLookupService(BaseTest): self.assertEqual(1, len(lookup_records)) lookup_record = lookup_records[0] lookup_data = session.query(LookupDataModel).filter(LookupDataModel.lookup_file_model == lookup_record).all() - self.assertEquals(23, len(lookup_data)) + self.assertEquals(28, len(lookup_data)) # Using the same table with different lookup lable or value, does create additional records. LookupService.get_lookup_table_from_data_model(file_data_model, "CUSTOMER_NAME", "CUSTOMER_NUMBER") lookup_records = session.query(LookupFileModel).all() self.assertIsNotNone(lookup_records) self.assertEqual(2, len(lookup_records)) - FileService.delete_file(file_model.id) ## Assure we can delete the file. def test_some_full_text_queries(self): - self.load_test_spec('enum_options_from_file') + spec = BaseTest.load_test_spec('enum_options_from_file') file_model = session.query(FileModel).filter(FileModel.name == "customer_list.xls").first() - self.assertIsNotNone(file_model) file_data_model = session.query(FileDataModel).filter(FileDataModel.file_model == file_model).first() lookup_table = LookupService.get_lookup_table_from_data_model(file_data_model, "CUSTOMER_NUMBER", "CUSTOMER_NAME") @@ -73,11 +73,24 @@ class TestLookupService(BaseTest): results = LookupService._run_lookup_query(lookup_table, "reaction design", limit=10) self.assertEquals(5, len(results), "all results come back for two terms.") - self.assertEquals("Reaction Design", results[0].label, "The first result is the most relevant") - self.assertEquals("Reaction Then Design ", results[1].label, "The first result is the most relevant") - self.assertEquals("Design Then Reaction", results[2].label, "The first result is the most relevant") - self.assertEquals("Just Reaction", results[3].label, "The first result is the most relevant") - self.assertEquals("Just Design", results[4].label, "The first result is the most relevant") + self.assertEquals("Reaction Design", results[0].label, "Exact matches come first.") + + def test_prefer_exact_match(self): + spec = BaseTest.load_test_spec('enum_options_from_file') + file_model = session.query(FileModel).filter(FileModel.name == "customer_list.xls").first() + file_data_model = session.query(FileDataModel).filter(FileDataModel.file_model == file_model).first() + + lookup_table = LookupService.get_lookup_table_from_data_model(file_data_model, "CUSTOMER_NUMBER", + "CUSTOMER_NAME") + results = LookupService._run_lookup_query(lookup_table, "1 Something", limit=10) + self.assertEquals("1 Something", results[0].label, "Exact matches are prefered") + + +# 1018 10000 Something Industry +# 1019 1000 Something Industry +# 1020 1 Something Industry +# 1021 10 Something Industry +# 1022 10000 Something Industry # Fixme: Stop words are taken into account on the query side, and haven't found a fix yet. #results = WorkflowService.run_lookup_query(lookup_table.id, "in", limit=10) From 560263d1a391c964fc5d7bcfb88c1b9abf1db8dd Mon Sep 17 00:00:00 2001 From: Dan Funk Date: Wed, 27 May 2020 14:45:00 -0400 Subject: [PATCH 41/43] Missed another test. --- tests/test_workflow_service.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_workflow_service.py b/tests/test_workflow_service.py index ee8de32a..472ce01e 100644 --- a/tests/test_workflow_service.py +++ b/tests/test_workflow_service.py @@ -68,7 +68,7 @@ class TestWorkflowService(BaseTest): task = processor.next_task() WorkflowService.process_options(task, task.task_spec.form.fields[0]) options = task.task_spec.form.fields[0].options - self.assertEquals(23, len(options)) + self.assertEquals(28, len(options)) self.assertEquals('1000', options[0]['id']) self.assertEquals("UVA - INTERNAL - GM USE ONLY", options[0]['name']) @@ -86,7 +86,7 @@ class TestWorkflowService(BaseTest): self.assertEquals("CUSTOMER_NAME", lookup_record.label_column) self.assertEquals("CUSTOMER_NAME", lookup_record.label_column) lookup_data = session.query(LookupDataModel).filter(LookupDataModel.lookup_file_model == lookup_record).all() - self.assertEquals(23, len(lookup_data)) + self.assertEquals(28, len(lookup_data)) self.assertEquals("1000", lookup_data[0].value) self.assertEquals("UVA - INTERNAL - GM USE ONLY", lookup_data[0].label) From 97cdbfce94bfb676b6b69297d74a72e436e27d1a Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Wed, 27 May 2020 23:48:48 -0400 Subject: [PATCH 42/43] Deletes extra line break --- crc/services/file_service.py | 1 - 1 file changed, 1 deletion(-) diff --git a/crc/services/file_service.py b/crc/services/file_service.py index 4e249675..b7b73aec 100644 --- a/crc/services/file_service.py +++ b/crc/services/file_service.py @@ -133,7 +133,6 @@ class FileService(object): return file_extension.lower().strip()[1:] @staticmethod - def update_file(file_model, binary_data, content_type): session.flush() # Assure the database is up-to-date before running this. From dedec02d4893232d2b798d8ee05ea41345019b4c Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Thu, 28 May 2020 10:43:03 -0400 Subject: [PATCH 43/43] Updates RRT workflow spec files --- .../bpmn/research_rampup/BuildingList.xls | Bin 0 -> 66048 bytes .../DepartmentList-Architecture.xlsx | Bin .../DepartmentList-ArtsSciences.xlsx | Bin .../DepartmentList-Education.xlsx | Bin .../DepartmentList-Engineering.xlsx | Bin .../DepartmentList-Medicine.xlsx | Bin .../DepartmentList-ProvostOffice.xlsx | Bin .../DepartmentList.xlsx | Bin .../bpmn/research_rampup/LabSpaces.xlsx | Bin 0 -> 53951 bytes .../bpmn/research_rampup/RTT_Approvers.dmn | 277 ++++++++++ .../ResearchRampUpPlan.docx | Bin 60306 -> 59035 bytes .../{rrt => research_rampup}/SchoolList.xls | Bin .../research_rampup.bpmn} | 502 ++++++++++-------- crc/static/bpmn/rrt/BuildingList.xls | Bin 40448 -> 0 bytes .../rrt_top_level_workflow.bpmn | 26 + example_data.py | 14 +- 16 files changed, 586 insertions(+), 233 deletions(-) create mode 100644 crc/static/bpmn/research_rampup/BuildingList.xls rename crc/static/bpmn/{rrt => research_rampup}/DepartmentList-Architecture.xlsx (100%) rename crc/static/bpmn/{rrt => research_rampup}/DepartmentList-ArtsSciences.xlsx (100%) rename crc/static/bpmn/{rrt => research_rampup}/DepartmentList-Education.xlsx (100%) rename crc/static/bpmn/{rrt => research_rampup}/DepartmentList-Engineering.xlsx (100%) rename crc/static/bpmn/{rrt => research_rampup}/DepartmentList-Medicine.xlsx (100%) rename crc/static/bpmn/{rrt => research_rampup}/DepartmentList-ProvostOffice.xlsx (100%) rename crc/static/bpmn/{rrt => research_rampup}/DepartmentList.xlsx (100%) create mode 100644 crc/static/bpmn/research_rampup/LabSpaces.xlsx create mode 100644 crc/static/bpmn/research_rampup/RTT_Approvers.dmn rename crc/static/bpmn/{rrt => research_rampup}/ResearchRampUpPlan.docx (59%) rename crc/static/bpmn/{rrt => research_rampup}/SchoolList.xls (100%) rename crc/static/bpmn/{rrt/rrt.bpmn => research_rampup/research_rampup.bpmn} (71%) delete mode 100644 crc/static/bpmn/rrt/BuildingList.xls create mode 100644 crc/static/bpmn/rrt_top_level_workflow/rrt_top_level_workflow.bpmn diff --git a/crc/static/bpmn/research_rampup/BuildingList.xls b/crc/static/bpmn/research_rampup/BuildingList.xls new file mode 100644 index 0000000000000000000000000000000000000000..a0b460327e5dacdd3754111d5e998a9d1a419080 GIT binary patch literal 66048 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 V6Swl5e>eZFOm?eJ`%ljQ{{V4JyKn#i literal 0 HcmV?d00001 diff --git a/crc/static/bpmn/rrt/DepartmentList-Architecture.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-Architecture.xlsx similarity index 100% rename from crc/static/bpmn/rrt/DepartmentList-Architecture.xlsx rename to crc/static/bpmn/research_rampup/DepartmentList-Architecture.xlsx diff --git a/crc/static/bpmn/rrt/DepartmentList-ArtsSciences.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-ArtsSciences.xlsx similarity index 100% rename from crc/static/bpmn/rrt/DepartmentList-ArtsSciences.xlsx rename to crc/static/bpmn/research_rampup/DepartmentList-ArtsSciences.xlsx diff --git a/crc/static/bpmn/rrt/DepartmentList-Education.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-Education.xlsx similarity index 100% rename from crc/static/bpmn/rrt/DepartmentList-Education.xlsx rename to crc/static/bpmn/research_rampup/DepartmentList-Education.xlsx diff --git a/crc/static/bpmn/rrt/DepartmentList-Engineering.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-Engineering.xlsx similarity index 100% rename from crc/static/bpmn/rrt/DepartmentList-Engineering.xlsx rename to crc/static/bpmn/research_rampup/DepartmentList-Engineering.xlsx diff --git a/crc/static/bpmn/rrt/DepartmentList-Medicine.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-Medicine.xlsx similarity index 100% rename from crc/static/bpmn/rrt/DepartmentList-Medicine.xlsx rename to crc/static/bpmn/research_rampup/DepartmentList-Medicine.xlsx diff --git a/crc/static/bpmn/rrt/DepartmentList-ProvostOffice.xlsx b/crc/static/bpmn/research_rampup/DepartmentList-ProvostOffice.xlsx similarity index 100% rename from crc/static/bpmn/rrt/DepartmentList-ProvostOffice.xlsx rename to crc/static/bpmn/research_rampup/DepartmentList-ProvostOffice.xlsx diff --git a/crc/static/bpmn/rrt/DepartmentList.xlsx b/crc/static/bpmn/research_rampup/DepartmentList.xlsx similarity index 100% rename from crc/static/bpmn/rrt/DepartmentList.xlsx rename to crc/static/bpmn/research_rampup/DepartmentList.xlsx diff --git a/crc/static/bpmn/research_rampup/LabSpaces.xlsx b/crc/static/bpmn/research_rampup/LabSpaces.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..04349be1a6869cd38270677ebff7f2b2d683a711 GIT binary patch literal 53951 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 N? + + + + + + PISchool + + + + + + + + + + "Architecture" + + + "Architecture" + + + PISupervisor.data.uid + + + "Supervisor" + + + "agc9a" + + + "Associate Research Dean" + + + + + "Arts & Sciences" + + + "Arts & Sciences" + + + PISupervisor.data.uid + + + "Supervisor" + + + "dh2t" + + + "Associate Research Dean" + + + + + "Commerce" + + + "Commerce" + + + "dcs8f" + + + "Associate Research Dean" + + + + + + + + + + + "Darden" + + + "Darden" + + + "mw4m" + + + "Associate Research Dean" + + + + + + + + + + + "Data Science" + + + "Data Science" + + + "cws3v" + + + "Associate Research Dean" + + + + + + + + + + + "Education" + + + "Education" + + + PISupervisor.data.uid + + + "Supervisor" + + + "cpb8g" + + + "Associate Research Dean" + + + + + "Engineering" + + + "Engineering" + + + "sb5mc" + + + "Associate Research Dean" + + + + + + + + + + + "Law" + + + "Law" + + + "kendrick" + + + "Associate Research Dean" + + + + + + + + + + + "Leadership & Public Policy" + + + "Leadership & Public Policy" + + + "jps3va" + + + "Associate Research Dean" + + + + + + + + + + + "Medicine" + + + "Medicine" + + + PISupervisor.data.uid + + + "Supervisor" + + + "mas3x" + + + "Associate Research Dean" + + + + + "Nursing" + + + "Nursing" + + + "jla7e" + + + "Associate Research Dean" + + + + + + + + + + + "Continuing Education" + + + "Continuing Education" + + + "ado4v" + + + "Associate Research Dean" + + + + + + + + + + + "Provost Office" + + + "Provost Office" + + + "rammk" + + + "VP of Research" + + + + + + + + + + + diff --git a/crc/static/bpmn/rrt/ResearchRampUpPlan.docx b/crc/static/bpmn/research_rampup/ResearchRampUpPlan.docx similarity index 59% rename from crc/static/bpmn/rrt/ResearchRampUpPlan.docx rename to crc/static/bpmn/research_rampup/ResearchRampUpPlan.docx index e01d0dac52e322978af89229a9c1158344c76719..1bc52f56b2fabc39ec7e0868ab6aa761d278a69a 100644 GIT binary patch delta 19637 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 delta 20823 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 diff --git a/crc/static/bpmn/rrt/SchoolList.xls b/crc/static/bpmn/research_rampup/SchoolList.xls similarity index 100% rename from crc/static/bpmn/rrt/SchoolList.xls rename to crc/static/bpmn/research_rampup/SchoolList.xls diff --git a/crc/static/bpmn/rrt/rrt.bpmn b/crc/static/bpmn/research_rampup/research_rampup.bpmn similarity index 71% rename from crc/static/bpmn/rrt/rrt.bpmn rename to crc/static/bpmn/research_rampup/research_rampup.bpmn index f58f29bc..8e6195e9 100644 --- a/crc/static/bpmn/rrt/rrt.bpmn +++ b/crc/static/bpmn/research_rampup/research_rampup.bpmn @@ -5,27 +5,45 @@ SequenceFlow_05ja25w - ### UNIVERSITY OF VIRGINIA RESEARCH -#### Request to Ramp Up Research Activities + ## Beta Stage: All data entered will be destroyed before public launch -Please note that only “critical research” deemed critical by the PI, department, and school will be ramped up in this phase II. As you fill out the names of personnel/students to request access for in this application, you will be asked for a brief description of the research they will be performing and why it is critical research. +### UNIVERSITY OF VIRGINIA RESEARCH +[From Research Ramp-up Guidance](https://research.virginia.edu/research-ramp-guidance) + + +#### Support +Report problems and/or submit questions to: askresearch@virginia.edu + +#### Research Guidance + +Our general principle is that only research activities requiring on-Grounds presence would be conducted on-Grounds. All other research-related work would continue to be performed by telework until restrictions are lifted. Separate school, department and building specific plans should supplement these guidelines. + + +For research that needs to be on Grounds, the plan is to ramp up in phases with emphasis on safety. The goal of this document is to provide a central framework for resuming activities while allowing for coordinated school specific implementation strategies. + + +The success of the ramp up depends on each researcher placing the safety of themselves and the people around them first, while conducting their research. In order to reduce our risks as much as possible, this must be a partnership between the researchers and the administration. + + +Schools are developing a process for the approval of ramp up requests and enforcement of safety guidelines described in this document. The VPR office is working with the schools to provide the necessary support for business process infrastructure, and working with the COO’s office to coordinate the acquisition of supplies necessary including face coverings and sanitizing supplies. **Instructions for Submitting:** -1. Add a Request for each lab space you manage in a building. If your lab spans multiple rooms or floors in a single building, one request will be required for that lab. If your lab spans multiple buildings, one request for each building will be required for that lab. The primary reason for this differentiation is that in addition to obtaining approval to restart operations, this information will also be used after start up to assist with any contact tracing that may be needed. -2. Select each Request added and step through each form presented, responding to all required and applicable fields. You may be presented with different questions if activities in each lab differ. + +1. The Research Ramp-up Plan allows for one request to be entered for a single Principle Investigator. In the form that follows enter the Primary Investigator this request is for and other identifying information. The PI's School and Supervisor will be used as needed for approval routing. +2. Provide all available information in the forms that follow to provide an overview of where the research will resume, who will be involved, what supporting resources will be needed and what steps you have taken to assure compliance with [Research Ramp-up Guidance](https://research.virginia.edu/research-ramp-guidance). 3. After all forms have been completed, you will be presented with the option to create your Research Recovery Plan in Word format. Download the document and review it. If you see any corrections that need to be made, return to the corresponding form and make the correction. -4. Once the generated Research Recovery Plan is finalize, use the web site to submit it to the Office of the Vice President for Research for review. +4. Once the generated Research Recovery Plan is finalize, proceed to the Plan Submission step to submit your plan for approval. SequenceFlow_05ja25w SequenceFlow_0h50bp3 - + - + @@ -100,6 +118,7 @@ Please note that only “critical research” deemed critical by the PI, departm + @@ -125,6 +144,8 @@ Information on all researchers you are requesting approval for reentry into the + + @@ -143,7 +164,7 @@ Information on all researchers you are requesting approval for reentry into the - + @@ -152,21 +173,10 @@ Information on all researchers you are requesting approval for reentry into the - - - - - - - - - - - - + @@ -174,6 +184,11 @@ Information on all researchers you are requesting approval for reentry into the + + + + + Flow_1eiud85 @@ -204,97 +219,20 @@ Information on all researchers you are requesting approval for reentry into the #### End of Workflow Place instruction here, - Flow_00y3047 + Flow_05w8yd6 - - - Review plan, make changes if needed, continue of ready to submit. - Flow_06873ag + + + Your Research Ramp-up Plan has been generated and is available in the Files pop-out found in the upper left hand corner of this application Click on the file name link to download the MS Word file to download, open and review. If changes are needed, choose the appropriate menu choice to make your edits, clicking Save when done. Note that you will need to revisit subsequent steps so the application can check to see if your edits impacted future workflow decisions. All your data will be persevered and you will need to click the Save button on each step to proceed. + +When your Research Ramp-up Plan is complete and ready to submit for review and approval, click the Continue button below. + Flow_0aqgwvu Flow_1e2qi9s - - #### Space used by {{ PIComputingID.label }} and shared with other PIs. + + #### Space used by {{ PIComputingID.label }} and shared with other PIs. If all space is exclusive and not shared with one or more other investigators, Click Save to skip this section and proceed to the next section. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -311,12 +249,19 @@ Place instruction here, + + + + + + + - + @@ -333,7 +278,6 @@ Place instruction here, - @@ -345,35 +289,46 @@ Place instruction here, + + + + + + + + + + Flow_19xeq76 Flow_16342pm - Flow_16y8glw + Flow_1v7r1tg Flow_19xeq76 Flow_0qf2y84 Flow_15zy1q7 Flow_0ya8hw8 - Flow_16342pm Flow_0tk64b6 Flow_12ie6w0 Flow_0zz2hbq + Flow_16342pm Flow_1eiud85 - - - + + + - - #### Space managed exclusively by {{ PIComputingID.label }} + + #### Space managed exclusively by {{ PIComputingID.label }} +Submit one entry for each space the PI is the exclusive investigator. If all space is shared with one or more other investigators, Click Save to skip this section and proceed to the Shared Space section. - + @@ -385,6 +340,17 @@ Place instruction here, + + + + + + + + + + + @@ -396,21 +362,12 @@ Place instruction here, - - - - - - - - - - + - + @@ -429,7 +386,6 @@ Place instruction here, - @@ -532,9 +488,9 @@ Maintain social distancing by designing space between people to be at least 9 fe Flow_0zrsh65 - + #### Health Safety Requirements: -Use EHS lab safety manual template for COVID (available May 25) to create and upload a copy of your laboratory policy statement to all members which includes at a minimum the following details: +Use EHS [Lab Safety Plan During COVID 19 template](https://www.google.com/url?q=http://ehs.virginia.edu/files/Lab-Safety-Plan-During-COVID-19.docx&source=gmail&ust=1590687968958000&usg=AFQjCNE83uGDFtxGkKaxjuXGhTocu-FDmw) to create and upload a copy of your laboratory policy statement to all members which includes at a minimum the following details: - Laboratory face covering rules, use of other PPE use as required - Adherence to individual schedules, check-in, check out requirements - Completion of online EHS safety training requirement @@ -544,7 +500,7 @@ Use EHS lab safety manual template for COVID (available May 25) to create and up - Where and how to obtain PPE including face covering - + Flow_1yqkpgu @@ -597,20 +553,19 @@ Use EHS lab safety manual template for COVID (available May 25) to create and up Flow_1c6m5wv Flow_0qbi47d - #### By submitting this request, you understand that every member listed in this form for on Grounds laboratory access will: - Complete online COVID awareness & precaution training module (link forthcoming-May 25) - Complete daily health acknowledgement form signed (electronically) –email generated daily to those listed on your plan for access to on Grounds lab/research space - Fill out daily work attendance log for all lab members following your school process to check-in and out of work each day. - Flow_1e2qi9s - Flow_1tmzfwl + Flow_08njvvi + Flow_0j4rs82 - + Flow_0zrsh65 Flow_0tz5c2v @@ -618,190 +573,287 @@ Use EHS lab safety manual template for COVID (available May 25) to create and up Flow_0qbi47d Flow_06873ag - - Flow_1tmzfwl - Flow_00y3047 + Flow_06873ag + Flow_0aqgwvu CompleteTemplate ResearchRampUpPlan.docx RESEARCH_RAMPUP + + + + + + + + + + + + + + + + + + + + + + + + + + + + Flow_07ge8uf + Flow_1ufh44h + + + + + Flow_1e2qi9s + Flow_08njvvi + + + Flow_0cpmvcw + Flow_05w8yd6 + + + + Flow_1ufh44h + Flow_0cpmvcw + + + Flow_0j4rs82 + Flow_07ge8uf + RequestApproval ApprvlApprvr1 ApprvlApprvr2 + + + + Flow_16y8glw + Flow_1v7r1tg + UpdateStudy title:PIComputingID.label pi:PIComputingID.value + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - + + + - - - + + + - - - + + + - - - - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - + + - - + + - - - + + + - - + + - - + + - - + + + - - + - + - + - + - + - + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + diff --git a/crc/static/bpmn/rrt/BuildingList.xls b/crc/static/bpmn/rrt/BuildingList.xls deleted file mode 100644 index 3bde7a707cca82e5442b6fbfdfd0986b5aac836d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40448 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∋xiq+- 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 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 new file mode 100644 index 00000000..26b2fe37 --- /dev/null +++ b/crc/static/bpmn/rrt_top_level_workflow/rrt_top_level_workflow.bpmn @@ -0,0 +1,26 @@ + + + + + SequenceFlow_0lvudp8 + + + + SequenceFlow_0lvudp8 + + + + + + + + + + + + + + + + + diff --git a/example_data.py b/example_data.py index 954c233c..98746c50 100644 --- a/example_data.py +++ b/example_data.py @@ -209,19 +209,17 @@ class ExampleDataLoader: db.session.add(category) db.session.commit() - - self.create_spec(id="empty_workflow", - name="empty_workflow", + self.create_spec(id="rrt_top_level_workflow", + name="rrt_top_level_workflow", display_name="Top Level Workflow", description="Does nothing, we don't use the master workflow here.", category_id=None, - master_spec=True, - from_tests=True) + master_spec=True) - self.create_spec(id="rrt", - name="rrt", + self.create_spec(id="research_rampup", + name="research_rampup", display_name="Research Ramp-up Toolkit", - description="The workflow for the Research Ramp-up.", + description="Process for creating a new research ramp-up request.", category_id=0, master_spec=False)