From b80a2d181c137e2a4cf616bc92b8cde560f6bc9d Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Tue, 2 Nov 2021 12:01:06 -0400 Subject: [PATCH 01/21] Changed PB_BASE_URL and PB_USER_STUDIES_URL for testing move to production --- config/default.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/config/default.py b/config/default.py index 12288d0f..8f3b633e 100644 --- a/config/default.py +++ b/config/default.py @@ -57,8 +57,12 @@ SECRET_KEY = environ.get('SECRET_KEY', default="Shhhh!!! This is secret! And be 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") == "true" -PB_BASE_URL = environ.get('PB_BASE_URL', default="http://localhost:5001/v2.0/").strip('/') + '/' # Trailing slash required -PB_USER_STUDIES_URL = environ.get('PB_USER_STUDIES_URL', default=PB_BASE_URL + "user_studies?uva_id=%s") +# PB_BASE_URL = environ.get('PB_BASE_URL', default="http://localhost:5001/v2.0/").strip('/') + '/' # Trailing slash required +PB_BASE_URL = environ.get('PB_BASE_URL', default="https://vpr-dev01.web.virginia.edu/webservices/crconnect/crconnect.cfc").strip('/') # Trailing slash required +# https://vpr-dev01.web.virginia.edu/webservices/crconnect/crconnect.cfc?method=user_studies&uva_id=dhf8r +# https://vpr-dev01.web.virginia.edu/webservices/crconnect/crconnect.cfc?method=user_studies&uva_id=dhf8r +PB_USER_STUDIES_URL = environ.get('PB_USER_STUDIES_URL', default=PB_BASE_URL + "?method=user_studies&uva_id=%s") +# 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") From dd951b279b4154dc9955aefbcb1e489f0a1dea12 Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Tue, 2 Nov 2021 14:06:34 -0400 Subject: [PATCH 02/21] Migrated the remaining URLs --- config/default.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/config/default.py b/config/default.py index 8f3b633e..b941de02 100644 --- a/config/default.py +++ b/config/default.py @@ -59,16 +59,20 @@ SWAGGER_AUTH_KEY = environ.get('SWAGGER_AUTH_KEY', default="SWAGGER") PB_ENABLED = environ.get('PB_ENABLED', default="false") == "true" # PB_BASE_URL = environ.get('PB_BASE_URL', default="http://localhost:5001/v2.0/").strip('/') + '/' # Trailing slash required PB_BASE_URL = environ.get('PB_BASE_URL', default="https://vpr-dev01.web.virginia.edu/webservices/crconnect/crconnect.cfc").strip('/') # Trailing slash required -# https://vpr-dev01.web.virginia.edu/webservices/crconnect/crconnect.cfc?method=user_studies&uva_id=dhf8r -# https://vpr-dev01.web.virginia.edu/webservices/crconnect/crconnect.cfc?method=user_studies&uva_id=dhf8r -PB_USER_STUDIES_URL = environ.get('PB_USER_STUDIES_URL', default=PB_BASE_URL + "?method=user_studies&uva_id=%s") # 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") -PB_SPONSORS_URL = environ.get('PB_SPONSORS_URL', default=PB_BASE_URL + "sponsors?studyid=%i") -PB_IRB_INFO_URL = environ.get('PB_IRB_INFO_URL', default=PB_BASE_URL + "current_irb_info/%i") -PB_CHECK_STUDY_URL = environ.get('PB_CHECK_STUDY_URL', default=PB_BASE_URL + "check_study/%i") +PB_USER_STUDIES_URL = environ.get('PB_USER_STUDIES_URL', default=PB_BASE_URL + "?method=user_studies&uva_id=%s") +# PB_INVESTIGATORS_URL = environ.get('PB_INVESTIGATORS_URL', default=PB_BASE_URL + "investigators?studyid=%i") +PB_INVESTIGATORS_URL = environ.get('PB_INVESTIGATORS_URL', default=PB_BASE_URL + "?method=investigators&studyid=%i") +# PB_REQUIRED_DOCS_URL = environ.get('PB_REQUIRED_DOCS_URL', default=PB_BASE_URL + "required_docs?studyid=%i") +PB_REQUIRED_DOCS_URL = environ.get('PB_REQUIRED_DOCS_URL', default=PB_BASE_URL + "?method=CheckRequiredDocs&STUDYID=%i") +# PB_STUDY_DETAILS_URL = environ.get('PB_STUDY_DETAILS_URL', default=PB_BASE_URL + "study?studyid=%i") +PB_STUDY_DETAILS_URL = environ.get('PB_STUDY_DETAILS_URL', default=PB_BASE_URL + "?method=Study&studyid=%i") +# PB_SPONSORS_URL = environ.get('PB_SPONSORS_URL', default=PB_BASE_URL + "sponsors?studyid=%i") +PB_SPONSORS_URL = environ.get('PB_SPONSORS_URL', default=PB_BASE_URL + "?method=StudySponsor&studyid=%i") +# PB_IRB_INFO_URL = environ.get('PB_IRB_INFO_URL', default=PB_BASE_URL + "current_irb_info/%i") +PB_IRB_INFO_URL = environ.get('PB_IRB_INFO_URL', default=PB_BASE_URL + "?method=currentIRBInfo&studyid=%i") +# PB_CHECK_STUDY_URL = environ.get('PB_CHECK_STUDY_URL', default=PB_BASE_URL + "check_study/%i") +PB_CHECK_STUDY_URL = environ.get('PB_CHECK_STUDY_URL', default=PB_BASE_URL + "?method=CheckStudy&STUDYID=%i") # Ldap Configuration LDAP_URL = environ.get('LDAP_URL', default="ldap.virginia.edu").strip('/') # No trailing slash or http:// From e22a9e7173a0185702d9d97d9c496baf6e4fbc2a Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Tue, 2 Nov 2021 15:32:43 -0400 Subject: [PATCH 03/21] Cleanup, and added comments about the 2 sets of URLs --- config/default.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/config/default.py b/config/default.py index b941de02..00707c3a 100644 --- a/config/default.py +++ b/config/default.py @@ -57,22 +57,24 @@ SECRET_KEY = environ.get('SECRET_KEY', default="Shhhh!!! This is secret! And be 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") == "true" -# PB_BASE_URL = environ.get('PB_BASE_URL', default="http://localhost:5001/v2.0/").strip('/') + '/' # Trailing slash required -PB_BASE_URL = environ.get('PB_BASE_URL', default="https://vpr-dev01.web.virginia.edu/webservices/crconnect/crconnect.cfc").strip('/') # Trailing slash required -# PB_USER_STUDIES_URL = environ.get('PB_USER_STUDIES_URL', default=PB_BASE_URL + "user_studies?uva_id=%s") +# Real URLs (UVA Development BASE URL) +PB_BASE_URL = environ.get('PB_BASE_URL', default="https://vpr-dev01.web.virginia.edu/webservices/crconnect/crconnect.cfc").strip('/') PB_USER_STUDIES_URL = environ.get('PB_USER_STUDIES_URL', default=PB_BASE_URL + "?method=user_studies&uva_id=%s") -# PB_INVESTIGATORS_URL = environ.get('PB_INVESTIGATORS_URL', default=PB_BASE_URL + "investigators?studyid=%i") PB_INVESTIGATORS_URL = environ.get('PB_INVESTIGATORS_URL', default=PB_BASE_URL + "?method=investigators&studyid=%i") -# PB_REQUIRED_DOCS_URL = environ.get('PB_REQUIRED_DOCS_URL', default=PB_BASE_URL + "required_docs?studyid=%i") PB_REQUIRED_DOCS_URL = environ.get('PB_REQUIRED_DOCS_URL', default=PB_BASE_URL + "?method=CheckRequiredDocs&STUDYID=%i") -# PB_STUDY_DETAILS_URL = environ.get('PB_STUDY_DETAILS_URL', default=PB_BASE_URL + "study?studyid=%i") PB_STUDY_DETAILS_URL = environ.get('PB_STUDY_DETAILS_URL', default=PB_BASE_URL + "?method=Study&studyid=%i") -# PB_SPONSORS_URL = environ.get('PB_SPONSORS_URL', default=PB_BASE_URL + "sponsors?studyid=%i") PB_SPONSORS_URL = environ.get('PB_SPONSORS_URL', default=PB_BASE_URL + "?method=StudySponsor&studyid=%i") -# PB_IRB_INFO_URL = environ.get('PB_IRB_INFO_URL', default=PB_BASE_URL + "current_irb_info/%i") PB_IRB_INFO_URL = environ.get('PB_IRB_INFO_URL', default=PB_BASE_URL + "?method=currentIRBInfo&studyid=%i") -# PB_CHECK_STUDY_URL = environ.get('PB_CHECK_STUDY_URL', default=PB_BASE_URL + "check_study/%i") PB_CHECK_STUDY_URL = environ.get('PB_CHECK_STUDY_URL', default=PB_BASE_URL + "?method=CheckStudy&STUDYID=%i") +# PB Mock URLs (localhost BASE URL) +# PB_BASE_URL = environ.get('PB_BASE_URL', default="http://localhost:5001/v2.0/").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") +# PB_SPONSORS_URL = environ.get('PB_SPONSORS_URL', default=PB_BASE_URL + "sponsors?studyid=%i") +# PB_IRB_INFO_URL = environ.get('PB_IRB_INFO_URL', default=PB_BASE_URL + "current_irb_info/%i") +# PB_CHECK_STUDY_URL = environ.get('PB_CHECK_STUDY_URL', default=PB_BASE_URL + "check_study/%i") # Ldap Configuration LDAP_URL = environ.get('LDAP_URL', default="ldap.virginia.edu").strip('/') # No trailing slash or http:// From 8b6c8f951820b5bdff0a89bce2f0463f119d26d8 Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Wed, 3 Nov 2021 10:14:11 -0400 Subject: [PATCH 04/21] Logging to troubleshoot API call --- crc/services/protocol_builder.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crc/services/protocol_builder.py b/crc/services/protocol_builder.py index 6806204d..1f854b5e 100644 --- a/crc/services/protocol_builder.py +++ b/crc/services/protocol_builder.py @@ -3,6 +3,7 @@ from json import JSONDecodeError from typing import List, Optional import requests +import logging from crc import app from crc.api.common import ApiError @@ -30,10 +31,13 @@ class ProtocolBuilderService(object): if not isinstance(user_id, str): raise ApiError("protocol_builder_error", "This user id is invalid: " + str(user_id)) url = ProtocolBuilderService.STUDY_URL % user_id + logging.info(f'get_studies: url: {url}') response = requests.get(url) if response.ok and response.text: + logging.info(f'get_studies: response.text: {response.text}') try: pb_studies = ProtocolBuilderStudySchema(many=True).loads(response.text) + logging.info(f'get_studies: pb_studies: {pb_studies}') return pb_studies except JSONDecodeError as err: raise ApiError("protocol_builder_error", From 50d4159168775ca69880aeea56d3162a7a59249d Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Wed, 3 Nov 2021 10:36:27 -0400 Subject: [PATCH 05/21] info log didn't show up. Maybe debug? --- crc/services/protocol_builder.py | 1 + 1 file changed, 1 insertion(+) diff --git a/crc/services/protocol_builder.py b/crc/services/protocol_builder.py index 1f854b5e..055da752 100644 --- a/crc/services/protocol_builder.py +++ b/crc/services/protocol_builder.py @@ -32,6 +32,7 @@ class ProtocolBuilderService(object): raise ApiError("protocol_builder_error", "This user id is invalid: " + str(user_id)) url = ProtocolBuilderService.STUDY_URL % user_id logging.info(f'get_studies: url: {url}') + logging.debug(f'get_studies: url: {url}') response = requests.get(url) if response.ok and response.text: logging.info(f'get_studies: response.text: {response.text}') From 8be9a1968be86637975d70693f96da17ce6e4b50 Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Wed, 3 Nov 2021 11:21:39 -0400 Subject: [PATCH 06/21] configure logging --- config/logging.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++ crc/__init__.py | 7 +++--- 2 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 config/logging.py diff --git a/config/logging.py b/config/logging.py new file mode 100644 index 00000000..8849d36a --- /dev/null +++ b/config/logging.py @@ -0,0 +1,57 @@ +logging_config = { + 'version': 1, + 'disable_existing_loggers': False, + "loggers": { + '': { # root logger + 'handlers': ['console', 'file'], + 'level': 'INFO', + 'propagate': True + }, + 'alembic.runtime.migration': { + 'handlers': ['console', 'file'], + 'level': 'WARN', + 'propagate': False + }, + 'urllib3.connectionpool': { + 'handlers': ['console', 'file'], + 'level': 'WARN', + 'propagate': False + }, + 'elasticsearch': { + 'handlers': ['console', 'file'], + 'level': 'WARN', + 'propagate': False + }, + 'ElasticIndex': { + 'handlers': ['console', 'file'], + 'level': 'WARN', + 'propagate': False + }, + }, + "formatters": { + "simple": { + "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s" + } + }, + "root": { + "level": "DEBUG", + "handlers": [ + "console", + "file", + ] + }, + "handlers": { + "console": { + "formatter": "simple", + "class": "logging.StreamHandler", + "stream": "ext://sys.stdout", + "level": "DEBUG" + }, + "file": { + "level": "DEBUG", + "formatter": "simple", + "class": "logging.FileHandler", + "filename": "cr_connect.log" + } + } +} diff --git a/crc/__init__.py b/crc/__init__.py index 5a6b2e79..cab834ab 100644 --- a/crc/__init__.py +++ b/crc/__init__.py @@ -1,5 +1,4 @@ -import json -import logging +import logging.config import os import click @@ -18,8 +17,8 @@ from sentry_sdk.integrations.flask import FlaskIntegration from apscheduler.schedulers.background import BackgroundScheduler from werkzeug.middleware.proxy_fix import ProxyFix - -logging.basicConfig(level=logging.INFO) +from config.logging import logging_config +logging.config.dictConfig(logging_config) connexion_app = connexion.FlaskApp(__name__) From 7f163285c30a350119a0a796fcd65f00e5cc594b Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Wed, 3 Nov 2021 11:56:07 -0400 Subject: [PATCH 07/21] Test w/Alex's ID --- crc/services/protocol_builder.py | 1 + 1 file changed, 1 insertion(+) diff --git a/crc/services/protocol_builder.py b/crc/services/protocol_builder.py index 055da752..88a05e59 100644 --- a/crc/services/protocol_builder.py +++ b/crc/services/protocol_builder.py @@ -30,6 +30,7 @@ class ProtocolBuilderService(object): ProtocolBuilderService.__enabled_or_raise() if not isinstance(user_id, str): raise ApiError("protocol_builder_error", "This user id is invalid: " + str(user_id)) + user_id = 'cah3us' url = ProtocolBuilderService.STUDY_URL % user_id logging.info(f'get_studies: url: {url}') logging.debug(f'get_studies: url: {url}') From 9c8ae36ba3431b4547ab9eed37301cc376c0c9e6 Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Wed, 3 Nov 2021 12:40:43 -0400 Subject: [PATCH 08/21] UVA IRB passes back `Q_COMPLETE` and `HSRNUMBER` --- crc/models/protocol_builder.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/crc/models/protocol_builder.py b/crc/models/protocol_builder.py index 831f80a0..692ba4ab 100644 --- a/crc/models/protocol_builder.py +++ b/crc/models/protocol_builder.py @@ -41,20 +41,21 @@ class ProtocolBuilderStatus(enum.Enum): class ProtocolBuilderStudy(object): def __init__( self, STUDYID: int, TITLE: str, NETBADGEID: str, - DATE_MODIFIED: str + DATE_MODIFIED: str, Q_COMPLETE: str=None, HSRNUMBER: str=None ): self.STUDYID = STUDYID self.TITLE = TITLE self.NETBADGEID = NETBADGEID self.DATE_MODIFIED = DATE_MODIFIED - + self.Q_COMPLETE = Q_COMPLETE + self.HSRNUMBER = HSRNUMBER class ProtocolBuilderStudySchema(ma.Schema): class Meta: model = ProtocolBuilderStudy unknown = INCLUDE fields = ["STUDYID", "TITLE", "NETBADGEID", - "DATE_MODIFIED"] + "DATE_MODIFIED", "Q_COMPLETE", "HSRNUMBER"] @post_load def make_pbs(self, data, **kwargs): From b03e596dcf9e06c0b8b95d3946d1881bed454776 Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Wed, 3 Nov 2021 12:58:03 -0400 Subject: [PATCH 09/21] One thing at a time; remove HSRNUMBER for now --- crc/models/protocol_builder.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crc/models/protocol_builder.py b/crc/models/protocol_builder.py index 692ba4ab..067bab5b 100644 --- a/crc/models/protocol_builder.py +++ b/crc/models/protocol_builder.py @@ -41,21 +41,20 @@ class ProtocolBuilderStatus(enum.Enum): class ProtocolBuilderStudy(object): def __init__( self, STUDYID: int, TITLE: str, NETBADGEID: str, - DATE_MODIFIED: str, Q_COMPLETE: str=None, HSRNUMBER: str=None + DATE_MODIFIED: str, Q_COMPLETE: str=None ): self.STUDYID = STUDYID self.TITLE = TITLE self.NETBADGEID = NETBADGEID self.DATE_MODIFIED = DATE_MODIFIED self.Q_COMPLETE = Q_COMPLETE - self.HSRNUMBER = HSRNUMBER class ProtocolBuilderStudySchema(ma.Schema): class Meta: model = ProtocolBuilderStudy unknown = INCLUDE fields = ["STUDYID", "TITLE", "NETBADGEID", - "DATE_MODIFIED", "Q_COMPLETE", "HSRNUMBER"] + "DATE_MODIFIED", "Q_COMPLETE"] @post_load def make_pbs(self, data, **kwargs): From 6d548c2a74bb09168d85fc3fcfae07a2aa1745d2 Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Fri, 5 Nov 2021 09:59:14 -0400 Subject: [PATCH 10/21] *** WIP *** Committing to work on another ticket There are TODOs in study_service --- crc/models/protocol_builder.py | 3 ++- crc/services/protocol_builder.py | 2 -- crc/services/study_service.py | 11 ++++++++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/crc/models/protocol_builder.py b/crc/models/protocol_builder.py index 067bab5b..a68c55c9 100644 --- a/crc/models/protocol_builder.py +++ b/crc/models/protocol_builder.py @@ -41,13 +41,14 @@ class ProtocolBuilderStatus(enum.Enum): class ProtocolBuilderStudy(object): def __init__( self, STUDYID: int, TITLE: str, NETBADGEID: str, - DATE_MODIFIED: str, Q_COMPLETE: str=None + DATE_MODIFIED: str, Q_COMPLETE: str, HSRNUMBER: str ): self.STUDYID = STUDYID self.TITLE = TITLE self.NETBADGEID = NETBADGEID self.DATE_MODIFIED = DATE_MODIFIED self.Q_COMPLETE = Q_COMPLETE + self.HSRNUMBER = HSRNUMBER class ProtocolBuilderStudySchema(ma.Schema): class Meta: diff --git a/crc/services/protocol_builder.py b/crc/services/protocol_builder.py index 88a05e59..1f854b5e 100644 --- a/crc/services/protocol_builder.py +++ b/crc/services/protocol_builder.py @@ -30,10 +30,8 @@ class ProtocolBuilderService(object): ProtocolBuilderService.__enabled_or_raise() if not isinstance(user_id, str): raise ApiError("protocol_builder_error", "This user id is invalid: " + str(user_id)) - user_id = 'cah3us' url = ProtocolBuilderService.STUDY_URL % user_id logging.info(f'get_studies: url: {url}') - logging.debug(f'get_studies: url: {url}') response = requests.get(url) if response.ok and response.text: logging.info(f'get_studies: response.text: {response.text}') diff --git a/crc/services/study_service.py b/crc/services/study_service.py index bdeb6fe0..53d34306 100755 --- a/crc/services/study_service.py +++ b/crc/services/study_service.py @@ -37,9 +37,13 @@ class StudyService(object): @staticmethod def _is_valid_study(study_id): + # TODO: Determine if this is always a list now + # TODO: If so, just grab the first item, and get rid of this `if` statement study_info = ProtocolBuilderService().get_study_details(study_id) - if 'REVIEW_TYPE' in study_info.keys() and study_info['REVIEW_TYPE'] in [2, 3, 23, 24]: - return True + if isinstance(study_info, list) and len(study_info) > 0: + study_info = study_info[0] + if isinstance(study_info, dict) and 'REVIEW_TYPE' in study_info.keys() and study_info['REVIEW_TYPE'] in [2, 3, 23, 24]: + return True return False def get_studies_for_user(self, user, include_invalid=False): @@ -271,7 +275,8 @@ class StudyService(object): for code, doc in doc_dictionary.items(): doc['required'] = False - if ProtocolBuilderService.is_enabled() and doc['id']: + # TODO: figure out the correct test here + if ProtocolBuilderService.is_enabled() and doc['id'] != '': pb_data = next((item for item in pb_docs if int(item['AUXDOCID']) == int(doc['id'])), None) if pb_data: doc['required'] = True From d186b24de3d568af13242f7e4d42eb2078bdfe5f Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Fri, 5 Nov 2021 14:26:21 -0400 Subject: [PATCH 11/21] UVA PB returns the info in a list. We want the dictionary in the list --- crc/scripts/study_info.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crc/scripts/study_info.py b/crc/scripts/study_info.py index adf3c8a6..0850f33b 100644 --- a/crc/scripts/study_info.py +++ b/crc/scripts/study_info.py @@ -195,7 +195,11 @@ Please note this is just a few examples, ALL known document types are returned i if cmd == 'roles': retval = StudyService().get_investigators(study_id, all=True) if cmd == 'details': - retval = self.pb.get_study_details(study_id) + details = self.pb.get_study_details(study_id) + if len(details) > 0: + retval = details[0] + else: + retval = None if cmd == 'sponsors': retval = self.pb.get_sponsors(study_id) if cmd == 'documents': From 6f09b0d7dd8ad6a60d486d90323d08418deb2097 Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Fri, 5 Nov 2021 14:37:41 -0400 Subject: [PATCH 12/21] Added comment to _is_valid_study. Fixed get_required_docs. The data returned for get_required_dcs from UVA PB was *very* different than what we had. --- crc/services/study_service.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/crc/services/study_service.py b/crc/services/study_service.py index 53d34306..ba1bbba5 100755 --- a/crc/services/study_service.py +++ b/crc/services/study_service.py @@ -37,13 +37,15 @@ class StudyService(object): @staticmethod def _is_valid_study(study_id): - # TODO: Determine if this is always a list now - # TODO: If so, just grab the first item, and get rid of this `if` statement - study_info = ProtocolBuilderService().get_study_details(study_id) - if isinstance(study_info, list) and len(study_info) > 0: - study_info = study_info[0] - if isinstance(study_info, dict) and 'REVIEW_TYPE' in study_info.keys() and study_info['REVIEW_TYPE'] in [2, 3, 23, 24]: - return True + study_details = ProtocolBuilderService().get_study_details(study_id) + if len(study_details) > 0: + study_info = study_details[0] + else: + study_info = None + # The review types 2, 3, 23, 24 correspond to review type names + # `Full Committee`, `Expedited`, `Non-UVA IRB Full Board`, and `Non-UVA IRB Expedited` + if isinstance(study_info, dict) and 'REVIEW_TYPE' in study_info.keys() and study_info['REVIEW_TYPE'] in [2, 3, 23, 24]: + return True return False def get_studies_for_user(self, user, include_invalid=False): @@ -275,9 +277,8 @@ class StudyService(object): for code, doc in doc_dictionary.items(): doc['required'] = False - # TODO: figure out the correct test here if ProtocolBuilderService.is_enabled() and doc['id'] != '': - pb_data = next((item for item in pb_docs if int(item['AUXDOCID']) == int(doc['id'])), None) + pb_data = next((item for item in pb_docs['AUXDOCS'] if int(item['SS_AUXILIARY_DOC_TYPE_ID']) == int(doc['id'])), None) if pb_data: doc['required'] = True From 4e13ea670454302e7756af361f78e3b3d790856f Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Mon, 8 Nov 2021 09:55:06 -0500 Subject: [PATCH 13/21] Fixing test mocks - study_details returned in a list - added `Q_COMPLETE` and `HSRNUMBER` to user_studies - `required_docs` totally different from what we had --- tests/data/pb_responses/required_docs.json | 30 +++++++++++-------- tests/data/pb_responses/study_details.json | 4 +-- .../study_details_bad_review_type.json | 4 +-- tests/data/pb_responses/user_studies.json | 12 ++++++-- 4 files changed, 30 insertions(+), 20 deletions(-) diff --git a/tests/data/pb_responses/required_docs.json b/tests/data/pb_responses/required_docs.json index d4941644..0b83773f 100644 --- a/tests/data/pb_responses/required_docs.json +++ b/tests/data/pb_responses/required_docs.json @@ -1,22 +1,26 @@ -[ - { - "AUXDOC": "Cancer Center's PRC Approval Form", - "AUXDOCID": 6 +{ + "AUXDOCS": [ { + "AUXILIARY_DOC": "Cancer Center's PRC Approval Form", + "SS_AUXILIARY_DOC_TYPE_ID": 6 }, { - "AUXDOC": "InfoSec Approval", - "AUXDOCID": "24" + "AUXILIARY_DOC": "InfoSec Approval", + "SS_AUXILIARY_DOC_TYPE_ID": "24" }, { - "AUXDOC": "Scientific Pre-review Documentation", - "AUXDOCID": "25" + "AUXILIARY_DOC": "Scientific Pre-review Documentation", + "SS_AUXILIARY_DOC_TYPE_ID": "25" }, { - "AUXDOC": "GMEC Approval", - "AUXDOCID": "45" + "AUXILIARY_DOC": "GMEC Approval", + "SS_AUXILIARY_DOC_TYPE_ID": "45" }, { - "AUXDOC": "Laser Safety Officer Approval", - "AUXDOCID": "57" + "AUXILIARY_DOC": "Laser Safety Officer Approval", + "SS_AUXILIARY_DOC_TYPE_ID": "57" } -] +], + "OTHERDOCS": [], + "TEMPLATEDOCS": [] +} + diff --git a/tests/data/pb_responses/study_details.json b/tests/data/pb_responses/study_details.json index b6150df6..150fb01d 100644 --- a/tests/data/pb_responses/study_details.json +++ b/tests/data/pb_responses/study_details.json @@ -1,4 +1,4 @@ -{ +[{ "DSMB": 1, "DSMB_FREQUENCY": 2, "GCRC_NUMBER": "9", @@ -64,4 +64,4 @@ "SPONSORS_PROTOCOL_REVISION_DATE": "2021-04-20", "UPLOAD_COMPLETE": null, "REVIEW_TYPE": 2 -} \ No newline at end of file +}] diff --git a/tests/data/pb_responses/study_details_bad_review_type.json b/tests/data/pb_responses/study_details_bad_review_type.json index 8b9ffec5..43027a4f 100644 --- a/tests/data/pb_responses/study_details_bad_review_type.json +++ b/tests/data/pb_responses/study_details_bad_review_type.json @@ -1,4 +1,4 @@ -{ +[{ "DSMB": 1, "DSMB_FREQUENCY": 2, "GCRC_NUMBER": "9", @@ -64,4 +64,4 @@ "SPONSORS_PROTOCOL_REVISION_DATE": "2021-04-20", "UPLOAD_COMPLETE": null, "REVIEW_TYPE": 99 -} \ No newline at end of file +}] diff --git a/tests/data/pb_responses/user_studies.json b/tests/data/pb_responses/user_studies.json index 784b94e6..bfcdd66f 100644 --- a/tests/data/pb_responses/user_studies.json +++ b/tests/data/pb_responses/user_studies.json @@ -3,18 +3,24 @@ "DATE_MODIFIED": "2020-02-19T14:26:49.127756", "NETBADGEID": "dhf8r", "STUDYID": 54321, - "TITLE": "Another study about the effect of a naked mannequin on software productivity" + "TITLE": "Another study about the effect of a naked mannequin on software productivity", + "Q_COMPLETE": 0, + "HSRNUMBER": null }, { "DATE_MODIFIED": "2020-02-19T14:24:55.101695", "NETBADGEID": "dhf8r", "STUDYID": 65432, - "TITLE": "Peanut butter consumption among quiet dogs" + "TITLE": "Peanut butter consumption among quiet dogs", + "Q_COMPLETE": 0, + "HSRNUMBER": null }, { "DATE_MODIFIED": "2020-02-19T14:24:55.101695", "NETBADGEID": "dhf8r", "STUDYID": 1, - "TITLE": "Efficacy of xenomorph bio-augmented circuits on dexterity of cybernetic prostheses" + "TITLE": "Efficacy of xenomorph bio-augmented circuits on dexterity of cybernetic prostheses", + "Q_COMPLETE": 0, + "HSRNUMBER": null } ] From ed5689c1b9f0fcdfdf4904fe24ade3512fd15e0e Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Mon, 8 Nov 2021 10:00:19 -0500 Subject: [PATCH 14/21] Fixed `test_info_script_documents` to use a mocked call to required_docs. Fixed `test_get_required_docs` to use new required_docs syntax study_details now in a list, so we look at the first item in the list --- tests/test_protocol_builder.py | 9 +++++---- tests/test_study_info_script.py | 9 +++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/tests/test_protocol_builder.py b/tests/test_protocol_builder.py index 9dd21cde..63f15dc4 100644 --- a/tests/test_protocol_builder.py +++ b/tests/test_protocol_builder.py @@ -35,16 +35,17 @@ class TestProtocolBuilder(BaseTest): 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) - self.assertIsNotNone(response) - self.assertEqual(5, len(response)) - self.assertEqual(6, response[0]['AUXDOCID']) + auxdocs = response['AUXDOCS'] + self.assertIsNotNone(auxdocs) + self.assertEqual(5, len(auxdocs)) + self.assertEqual(6, auxdocs[0]['SS_AUXILIARY_DOC_TYPE_ID']) @patch('crc.services.protocol_builder.requests.get') def test_get_details(self, mock_get): 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) + response = ProtocolBuilderService.get_study_details(self.test_study_id)[0] self.assertIsNotNone(response) self.assertEqual(65, len(response)) self.assertEqual('1234', response['IND_1']) diff --git a/tests/test_study_info_script.py b/tests/test_study_info_script.py index a78698e8..2f0697f0 100644 --- a/tests/test_study_info_script.py +++ b/tests/test_study_info_script.py @@ -76,7 +76,7 @@ class TestStudyInfoScript(BaseTest): 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) + response = ProtocolBuilderService.get_study_details(self.test_study_id)[0] study_info, second_task = self.do_work(info_type='details') self.assertEqual(response['IBC_NUMBER'], second_task.data['info']['IBC_NUMBER']) self.assertEqual(response['IDE'], second_task.data['info']['IDE']) @@ -84,7 +84,12 @@ class TestStudyInfoScript(BaseTest): self.assertEqual(response['IND_2'], second_task.data['info']['IND_2']) self.assertEqual(response['IND_3'], second_task.data['info']['IND_3']) - def test_info_script_documents(self): + @patch('crc.services.protocol_builder.requests.get') + def test_info_script_documents(self, mock_get): + 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) study_info, second_task = self.do_work(info_type='documents') self.assertEqual(study_info, second_task.data['info']) self.assertEqual(0, len(study_info['Grant_App']['files']), "Grant_App has not files yet.") From b193f56f3584e304c8ef50cc4de2870f291cb549 Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Mon, 8 Nov 2021 10:13:07 -0500 Subject: [PATCH 15/21] Minor cleanup for readability. --- crc/services/protocol_builder.py | 3 --- crc/services/study_service.py | 3 +-- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/crc/services/protocol_builder.py b/crc/services/protocol_builder.py index 1f854b5e..96ea4892 100644 --- a/crc/services/protocol_builder.py +++ b/crc/services/protocol_builder.py @@ -31,13 +31,10 @@ class ProtocolBuilderService(object): if not isinstance(user_id, str): raise ApiError("protocol_builder_error", "This user id is invalid: " + str(user_id)) url = ProtocolBuilderService.STUDY_URL % user_id - logging.info(f'get_studies: url: {url}') response = requests.get(url) if response.ok and response.text: - logging.info(f'get_studies: response.text: {response.text}') try: pb_studies = ProtocolBuilderStudySchema(many=True).loads(response.text) - logging.info(f'get_studies: pb_studies: {pb_studies}') return pb_studies except JSONDecodeError as err: raise ApiError("protocol_builder_error", diff --git a/crc/services/study_service.py b/crc/services/study_service.py index ba1bbba5..2e0ccb7d 100755 --- a/crc/services/study_service.py +++ b/crc/services/study_service.py @@ -37,11 +37,10 @@ class StudyService(object): @staticmethod def _is_valid_study(study_id): + study_info = None study_details = ProtocolBuilderService().get_study_details(study_id) if len(study_details) > 0: study_info = study_details[0] - else: - study_info = None # The review types 2, 3, 23, 24 correspond to review type names # `Full Committee`, `Expedited`, `Non-UVA IRB Full Board`, and `Non-UVA IRB Expedited` if isinstance(study_info, dict) and 'REVIEW_TYPE' in study_info.keys() and study_info['REVIEW_TYPE'] in [2, 3, 23, 24]: From fe502ad3066bf1f604e365441b22f5d5ede194ad Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Tue, 9 Nov 2021 10:29:23 -0500 Subject: [PATCH 16/21] Added easy way to switch back and forth between PB urls --- config/default.py | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/config/default.py b/config/default.py index 00707c3a..e285c52b 100644 --- a/config/default.py +++ b/config/default.py @@ -57,24 +57,28 @@ SECRET_KEY = environ.get('SECRET_KEY', default="Shhhh!!! This is secret! And be 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") == "true" -# Real URLs (UVA Development BASE URL) -PB_BASE_URL = environ.get('PB_BASE_URL', default="https://vpr-dev01.web.virginia.edu/webservices/crconnect/crconnect.cfc").strip('/') -PB_USER_STUDIES_URL = environ.get('PB_USER_STUDIES_URL', default=PB_BASE_URL + "?method=user_studies&uva_id=%s") -PB_INVESTIGATORS_URL = environ.get('PB_INVESTIGATORS_URL', default=PB_BASE_URL + "?method=investigators&studyid=%i") -PB_REQUIRED_DOCS_URL = environ.get('PB_REQUIRED_DOCS_URL', default=PB_BASE_URL + "?method=CheckRequiredDocs&STUDYID=%i") -PB_STUDY_DETAILS_URL = environ.get('PB_STUDY_DETAILS_URL', default=PB_BASE_URL + "?method=Study&studyid=%i") -PB_SPONSORS_URL = environ.get('PB_SPONSORS_URL', default=PB_BASE_URL + "?method=StudySponsor&studyid=%i") -PB_IRB_INFO_URL = environ.get('PB_IRB_INFO_URL', default=PB_BASE_URL + "?method=currentIRBInfo&studyid=%i") -PB_CHECK_STUDY_URL = environ.get('PB_CHECK_STUDY_URL', default=PB_BASE_URL + "?method=CheckStudy&STUDYID=%i") -# PB Mock URLs (localhost BASE URL) -# PB_BASE_URL = environ.get('PB_BASE_URL', default="http://localhost:5001/v2.0/").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") -# PB_SPONSORS_URL = environ.get('PB_SPONSORS_URL', default=PB_BASE_URL + "sponsors?studyid=%i") -# PB_IRB_INFO_URL = environ.get('PB_IRB_INFO_URL', default=PB_BASE_URL + "current_irb_info/%i") -# PB_CHECK_STUDY_URL = environ.get('PB_CHECK_STUDY_URL', default=PB_BASE_URL + "check_study/%i") + +real_urls = True +if real_urls: + # Real URLs (UVA Development BASE URL) + PB_BASE_URL = environ.get('PB_BASE_URL', default="https://vpr-dev01.web.virginia.edu/webservices/crconnect/crconnect.cfc").strip('/') + PB_USER_STUDIES_URL = environ.get('PB_USER_STUDIES_URL', default=PB_BASE_URL + "?method=user_studies&uva_id=%s") + PB_INVESTIGATORS_URL = environ.get('PB_INVESTIGATORS_URL', default=PB_BASE_URL + "?method=investigators&studyid=%i") + PB_REQUIRED_DOCS_URL = environ.get('PB_REQUIRED_DOCS_URL', default=PB_BASE_URL + "?method=CheckRequiredDocs&STUDYID=%i") + PB_STUDY_DETAILS_URL = environ.get('PB_STUDY_DETAILS_URL', default=PB_BASE_URL + "?method=Study&studyid=%i") + PB_SPONSORS_URL = environ.get('PB_SPONSORS_URL', default=PB_BASE_URL + "?method=StudySponsor&studyid=%i") + PB_IRB_INFO_URL = environ.get('PB_IRB_INFO_URL', default=PB_BASE_URL + "?method=currentIRBInfo&studyid=%i") + PB_CHECK_STUDY_URL = environ.get('PB_CHECK_STUDY_URL', default=PB_BASE_URL + "?method=CheckStudy&STUDYID=%i") +else: + # PB Mock URLs (localhost BASE URL) + PB_BASE_URL = environ.get('PB_BASE_URL', default="http://localhost:5001/v2.0/").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") + PB_SPONSORS_URL = environ.get('PB_SPONSORS_URL', default=PB_BASE_URL + "sponsors?studyid=%i") + PB_IRB_INFO_URL = environ.get('PB_IRB_INFO_URL', default=PB_BASE_URL + "current_irb_info/%i") + PB_CHECK_STUDY_URL = environ.get('PB_CHECK_STUDY_URL', default=PB_BASE_URL + "check_study/%i") # Ldap Configuration LDAP_URL = environ.get('LDAP_URL', default="ldap.virginia.edu").strip('/') # No trailing slash or http:// From d584e735ececc41fb38745c85796c5c3ca26262a Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Tue, 9 Nov 2021 13:03:41 -0500 Subject: [PATCH 17/21] Possible way to switch between real and mock PB --- config/default.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/default.py b/config/default.py index e285c52b..9d7364e5 100644 --- a/config/default.py +++ b/config/default.py @@ -58,8 +58,8 @@ 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") == "true" -real_urls = True -if real_urls: +REAL_URLS = environ.get('REAL_URLS', default="false") == "true" +if REAL_URLS: # Real URLs (UVA Development BASE URL) PB_BASE_URL = environ.get('PB_BASE_URL', default="https://vpr-dev01.web.virginia.edu/webservices/crconnect/crconnect.cfc").strip('/') PB_USER_STUDIES_URL = environ.get('PB_USER_STUDIES_URL', default=PB_BASE_URL + "?method=user_studies&uva_id=%s") From 5cf742d955e51698b8b9e88a2af295229d176ae5 Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Tue, 9 Nov 2021 13:07:01 -0500 Subject: [PATCH 18/21] remove unused import --- crc/services/protocol_builder.py | 1 - 1 file changed, 1 deletion(-) diff --git a/crc/services/protocol_builder.py b/crc/services/protocol_builder.py index 96ea4892..6806204d 100644 --- a/crc/services/protocol_builder.py +++ b/crc/services/protocol_builder.py @@ -3,7 +3,6 @@ from json import JSONDecodeError from typing import List, Optional import requests -import logging from crc import app from crc.api.common import ApiError From 748c80964fea124a173d06e4ce75edd4a00c69c5 Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Tue, 9 Nov 2021 13:09:01 -0500 Subject: [PATCH 19/21] Don't need the `.strip('/')` for the UVA urls --- config/default.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/default.py b/config/default.py index 9d7364e5..579f66d1 100644 --- a/config/default.py +++ b/config/default.py @@ -61,7 +61,7 @@ PB_ENABLED = environ.get('PB_ENABLED', default="false") == "true" REAL_URLS = environ.get('REAL_URLS', default="false") == "true" if REAL_URLS: # Real URLs (UVA Development BASE URL) - PB_BASE_URL = environ.get('PB_BASE_URL', default="https://vpr-dev01.web.virginia.edu/webservices/crconnect/crconnect.cfc").strip('/') + PB_BASE_URL = environ.get('PB_BASE_URL', default="https://vpr-dev01.web.virginia.edu/webservices/crconnect/crconnect.cfc") PB_USER_STUDIES_URL = environ.get('PB_USER_STUDIES_URL', default=PB_BASE_URL + "?method=user_studies&uva_id=%s") PB_INVESTIGATORS_URL = environ.get('PB_INVESTIGATORS_URL', default=PB_BASE_URL + "?method=investigators&studyid=%i") PB_REQUIRED_DOCS_URL = environ.get('PB_REQUIRED_DOCS_URL', default=PB_BASE_URL + "?method=CheckRequiredDocs&STUDYID=%i") From 0e8c4580edc45322bbc6e730f89d947b63b4d5b9 Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Wed, 10 Nov 2021 17:18:33 -0500 Subject: [PATCH 20/21] Moved to instance/config --- config/default.py | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/config/default.py b/config/default.py index 579f66d1..12288d0f 100644 --- a/config/default.py +++ b/config/default.py @@ -57,28 +57,14 @@ SECRET_KEY = environ.get('SECRET_KEY', default="Shhhh!!! This is secret! And be 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") == "true" - -REAL_URLS = environ.get('REAL_URLS', default="false") == "true" -if REAL_URLS: - # Real URLs (UVA Development BASE URL) - PB_BASE_URL = environ.get('PB_BASE_URL', default="https://vpr-dev01.web.virginia.edu/webservices/crconnect/crconnect.cfc") - PB_USER_STUDIES_URL = environ.get('PB_USER_STUDIES_URL', default=PB_BASE_URL + "?method=user_studies&uva_id=%s") - PB_INVESTIGATORS_URL = environ.get('PB_INVESTIGATORS_URL', default=PB_BASE_URL + "?method=investigators&studyid=%i") - PB_REQUIRED_DOCS_URL = environ.get('PB_REQUIRED_DOCS_URL', default=PB_BASE_URL + "?method=CheckRequiredDocs&STUDYID=%i") - PB_STUDY_DETAILS_URL = environ.get('PB_STUDY_DETAILS_URL', default=PB_BASE_URL + "?method=Study&studyid=%i") - PB_SPONSORS_URL = environ.get('PB_SPONSORS_URL', default=PB_BASE_URL + "?method=StudySponsor&studyid=%i") - PB_IRB_INFO_URL = environ.get('PB_IRB_INFO_URL', default=PB_BASE_URL + "?method=currentIRBInfo&studyid=%i") - PB_CHECK_STUDY_URL = environ.get('PB_CHECK_STUDY_URL', default=PB_BASE_URL + "?method=CheckStudy&STUDYID=%i") -else: - # PB Mock URLs (localhost BASE URL) - PB_BASE_URL = environ.get('PB_BASE_URL', default="http://localhost:5001/v2.0/").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") - PB_SPONSORS_URL = environ.get('PB_SPONSORS_URL', default=PB_BASE_URL + "sponsors?studyid=%i") - PB_IRB_INFO_URL = environ.get('PB_IRB_INFO_URL', default=PB_BASE_URL + "current_irb_info/%i") - PB_CHECK_STUDY_URL = environ.get('PB_CHECK_STUDY_URL', default=PB_BASE_URL + "check_study/%i") +PB_BASE_URL = environ.get('PB_BASE_URL', default="http://localhost:5001/v2.0/").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") +PB_SPONSORS_URL = environ.get('PB_SPONSORS_URL', default=PB_BASE_URL + "sponsors?studyid=%i") +PB_IRB_INFO_URL = environ.get('PB_IRB_INFO_URL', default=PB_BASE_URL + "current_irb_info/%i") +PB_CHECK_STUDY_URL = environ.get('PB_CHECK_STUDY_URL', default=PB_BASE_URL + "check_study/%i") # Ldap Configuration LDAP_URL = environ.get('LDAP_URL', default="ldap.virginia.edu").strip('/') # No trailing slash or http:// From c7147274f07a2b26ff0ada42d520603b0dca12de Mon Sep 17 00:00:00 2001 From: mike cullerton Date: Wed, 10 Nov 2021 17:43:34 -0500 Subject: [PATCH 21/21] Resolving issues from code review --- config/logging.py | 16 +++------------- crc/__init__.py | 7 ++++--- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/config/logging.py b/config/logging.py index 8849d36a..bddebeee 100644 --- a/config/logging.py +++ b/config/logging.py @@ -9,22 +9,12 @@ logging_config = { }, 'alembic.runtime.migration': { 'handlers': ['console', 'file'], - 'level': 'WARN', + 'level': 'ERROR', 'propagate': False }, 'urllib3.connectionpool': { 'handlers': ['console', 'file'], - 'level': 'WARN', - 'propagate': False - }, - 'elasticsearch': { - 'handlers': ['console', 'file'], - 'level': 'WARN', - 'propagate': False - }, - 'ElasticIndex': { - 'handlers': ['console', 'file'], - 'level': 'WARN', + 'level': 'ERROR', 'propagate': False }, }, @@ -48,7 +38,7 @@ logging_config = { "level": "DEBUG" }, "file": { - "level": "DEBUG", + "level": "INFO", "formatter": "simple", "class": "logging.FileHandler", "filename": "cr_connect.log" diff --git a/crc/__init__.py b/crc/__init__.py index 4a7f67e3..89e8dce4 100644 --- a/crc/__init__.py +++ b/crc/__init__.py @@ -18,9 +18,6 @@ from sentry_sdk.integrations.flask import FlaskIntegration from apscheduler.schedulers.background import BackgroundScheduler from werkzeug.middleware.proxy_fix import ProxyFix -from config.logging import logging_config -logging.config.dictConfig(logging_config) - connexion_app = connexion.FlaskApp(__name__) app = connexion_app.app @@ -30,9 +27,13 @@ app.config.from_object('config.default') if "TESTING" in os.environ and os.environ["TESTING"] == "true": app.config.from_object('config.testing') app.config.from_pyfile('../config/testing.py') + import logging + logging.basicConfig(level=logging.INFO) else: app.config.root_path = app.instance_path app.config.from_pyfile('config.py', silent=True) + from config.logging import logging_config + logging.config.dictConfig(logging_config) db = SQLAlchemy(app)