aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--wqflask/base/data_set/__init__.py5
-rw-r--r--wqflask/base/data_set/datasetgroup.py25
-rw-r--r--wqflask/base/data_set/datasettype.py6
-rw-r--r--wqflask/base/data_set/utils.py11
-rw-r--r--wqflask/base/trait.py8
-rw-r--r--wqflask/base/webqtlCaseData.py5
-rw-r--r--wqflask/run_gunicorn.py2
-rw-r--r--wqflask/runserver.py6
-rw-r--r--wqflask/scripts/profile_corrs.py3
-rw-r--r--wqflask/utility/authentication_tools.py8
-rw-r--r--wqflask/utility/pillow_utils.py5
-rw-r--r--wqflask/utility/startup_config.py18
-rw-r--r--wqflask/wqflask/collect.py6
-rw-r--r--wqflask/wqflask/correlation/correlation_gn3_api.py6
-rw-r--r--wqflask/wqflask/correlation/pre_computes.py16
-rw-r--r--wqflask/wqflask/correlation/rust_correlation.py18
-rw-r--r--wqflask/wqflask/correlation_matrix/show_corr_matrix.py6
-rw-r--r--wqflask/wqflask/ctl/gn3_ctl_analysis.py9
-rw-r--r--wqflask/wqflask/do_search.py1
-rw-r--r--wqflask/wqflask/gsearch.py5
-rw-r--r--wqflask/wqflask/heatmap/heatmap.py8
-rw-r--r--wqflask/wqflask/marker_regression/display_mapping_results.py7
-rw-r--r--wqflask/wqflask/marker_regression/gemma_mapping.py76
-rw-r--r--wqflask/wqflask/marker_regression/plink_mapping.py17
-rw-r--r--wqflask/wqflask/marker_regression/qtlreaper_mapping.py10
-rw-r--r--wqflask/wqflask/marker_regression/rqtl_mapping.py14
-rw-r--r--wqflask/wqflask/marker_regression/run_mapping.py11
-rw-r--r--wqflask/wqflask/network_graph/network_graph.py5
-rw-r--r--wqflask/wqflask/oauth2/client.py31
-rw-r--r--wqflask/wqflask/oauth2/request_utils.py7
-rw-r--r--wqflask/wqflask/partial_correlations_views.py8
-rw-r--r--wqflask/wqflask/search_results.py6
-rw-r--r--wqflask/wqflask/show_trait/show_trait.py4
-rw-r--r--wqflask/wqflask/user_login.py12
-rw-r--r--wqflask/wqflask/views.py54
-rw-r--r--wqflask/wqflask/wgcna/gn3_wgcna.py6
36 files changed, 220 insertions, 225 deletions
diff --git a/wqflask/base/data_set/__init__.py b/wqflask/base/data_set/__init__.py
index e49c6a93..27955f8a 100644
--- a/wqflask/base/data_set/__init__.py
+++ b/wqflask/base/data_set/__init__.py
@@ -6,11 +6,12 @@ import pickle as pickle
# 3rd-party imports
from redis import Redis
+from flask import current_app as app
# local imports
from .dataset import DataSet
from base import webqtlConfig
-from utility.tools import USE_REDIS
+from utility.tools import get_setting_bool
from .datasettype import DatasetType
from .tempdataset import TempDataSet
from .datasetgroup import DatasetGroup
@@ -113,7 +114,7 @@ def datasets(group_name, this_group=None, redis_conn=Redis()):
dataset_menu.append(dict(tissue=tissue_name,
datasets=[(dataset, dataset_short)]))
- if USE_REDIS:
+ if get_setting_bool(app, "USE_REDIS"):
redis_conn.set(key, pickle.dumps(dataset_menu, pickle.HIGHEST_PROTOCOL))
redis_conn.expire(key, 60 * 5)
diff --git a/wqflask/base/data_set/datasetgroup.py b/wqflask/base/data_set/datasetgroup.py
index 72577f38..10556dbf 100644
--- a/wqflask/base/data_set/datasetgroup.py
+++ b/wqflask/base/data_set/datasetgroup.py
@@ -3,6 +3,8 @@
import os
import json
+from flask import current_app as app
+
from base import webqtlConfig
from .markers import Markers, HumanMarkers
@@ -13,9 +15,10 @@ from maintenance import get_group_samplelists
from wqflask.database import database_connection
from utility.tools import (
locate,
- USE_REDIS,
flat_files,
+ get_setting,
flat_file_exists,
+ get_setting_bool,
locate_ignore_error)
class DatasetGroup:
@@ -87,8 +90,8 @@ class DatasetGroup:
def get_markers(self):
def check_plink_gemma():
- if flat_file_exists("mapping"):
- MAPPING_PATH = flat_files("mapping") + "/"
+ if flat_file_exists(app, "mapping"):
+ MAPPING_PATH = flat_files(app, "mapping") + "/"
if os.path.isfile(MAPPING_PATH + self.name + ".bed"):
return True
return False
@@ -117,7 +120,7 @@ class DatasetGroup:
def get_study_samplelists(self):
study_sample_file = locate_ignore_error(
- self.name + ".json", 'study_sample_lists')
+ app, self.name + ".json", 'study_sample_lists')
try:
f = open(study_sample_file)
except:
@@ -126,7 +129,7 @@ class DatasetGroup:
return study_samples
def get_genofiles(self):
- jsonfile = "%s/%s.json" % (webqtlConfig.GENODIR, self.name)
+ jsonfile = "%s/%s.json" % (get_setting(app, 'GENODIR'), self.name)
try:
f = open(jsonfile)
except:
@@ -137,20 +140,20 @@ class DatasetGroup:
def get_samplelist(self, redis_conn):
result = None
key = "samplelist:v3:" + self.name
- if USE_REDIS:
+ if get_setting_bool(app, "USE_REDIS"):
result = redis_conn.get(key)
if result is not None:
self.samplelist = json.loads(result)
else:
- genotype_fn = locate_ignore_error(self.name + ".geno", 'genotype')
+ genotype_fn = locate_ignore_error(app, self.name + ".geno", 'genotype')
if genotype_fn:
self.samplelist = get_group_samplelists.get_samplelist(
"geno", genotype_fn)
else:
self.samplelist = None
- if USE_REDIS:
+ if get_setting_bool(app, "USE_REDIS"):
redis_conn.set(key, json.dumps(self.samplelist))
redis_conn.expire(key, 60 * 5)
@@ -169,11 +172,11 @@ class DatasetGroup:
if self.genofile:
if "RData" in self.genofile: # ZS: This is a temporary fix; I need to change the way the JSON files that point to multiple genotype files are structured to point to other file types like RData
full_filename = str(
- locate(self.genofile.split(".")[0] + ".geno", 'genotype'))
+ locate(app, self.genofile.split(".")[0] + ".geno", 'genotype'))
else:
- full_filename = str(locate(self.genofile, 'genotype'))
+ full_filename = str(locate(app, self.genofile, 'genotype'))
else:
- full_filename = str(locate(self.name + '.geno', 'genotype'))
+ full_filename = str(locate(app, self.name + '.geno', 'genotype'))
genotype_1 = gen_geno_ob.genotype(full_filename)
if genotype_1.type == "group" and self.parlist:
diff --git a/wqflask/base/data_set/datasettype.py b/wqflask/base/data_set/datasettype.py
index 05f0f564..c8b78a43 100644
--- a/wqflask/base/data_set/datasettype.py
+++ b/wqflask/base/data_set/datasettype.py
@@ -6,9 +6,9 @@ from typing import Optional, Dict
from redis import Redis
+from flask import current_app as app
-
-from utility.tools import GN2_BASE_URL
+from utility.tools import get_setting
from wqflask.database import database_connection
@@ -41,7 +41,7 @@ class DatasetType:
# emptied
try:
data = json.loads(requests.get(
- GN2_BASE_URL + "/api/v_pre1/gen_dropdown",
+ get_setting(app, "GN2_BASE_URL") + "/api/v_pre1/gen_dropdown",
timeout=5).content)
for _species in data['datasets']:
for group in data['datasets'][_species]:
diff --git a/wqflask/base/data_set/utils.py b/wqflask/base/data_set/utils.py
index 703fee04..bb17a6c7 100644
--- a/wqflask/base/data_set/utils.py
+++ b/wqflask/base/data_set/utils.py
@@ -6,9 +6,10 @@ import json
import hashlib
from typing import List
+from flask import current_app as app
-from utility.tools import SQL_URI
-from base.webqtlConfig import TMPDIR
+
+from utility.tools import get_setting
from wqflask.database import parse_db_url, database_connection
def geno_mrna_confidentiality(ob):
@@ -27,7 +28,7 @@ def query_table_timestamp(dataset_type: str):
# computation data and actions
with database_connection() as conn, conn.cursor() as cursor:
- fetch_db_name = parse_db_url(SQL_URI)
+ fetch_db_name = parse_db_url(get_setting(app, "SQL_URI"))
cursor.execute(
"SELECT UPDATE_TIME FROM "
"information_schema.tables "
@@ -57,7 +58,7 @@ def cache_dataset_results(dataset_name: str, dataset_type: str, samplelist: List
samplelist_as_str = ",".join(samplelist)
file_name = generate_hash_file(dataset_name, dataset_type, table_timestamp, samplelist_as_str)
- file_path = os.path.join(TMPDIR, f"{file_name}.json")
+ file_path = os.path.join(get_setting(app, "TMPDIR"), f"{file_name}.json")
with open(file_path, "w") as file_handler:
json.dump(query_results, file_handler)
@@ -70,7 +71,7 @@ def fetch_cached_results(dataset_name: str, dataset_type: str, samplelist: List)
samplelist_as_str = ",".join(samplelist)
file_name = generate_hash_file(dataset_name, dataset_type, table_timestamp, samplelist_as_str)
- file_path = os.path.join(TMPDIR, f"{file_name}.json")
+ file_path = os.path.join(get_setting(app, "TMPDIR"), f"{file_name}.json")
try:
with open(file_path, "r") as file_handler:
diff --git a/wqflask/base/trait.py b/wqflask/base/trait.py
index 37085448..21b2a716 100644
--- a/wqflask/base/trait.py
+++ b/wqflask/base/trait.py
@@ -7,7 +7,7 @@ from base import webqtlConfig
from base.webqtlCaseData import webqtlCaseData
from base.data_set import create_dataset
from utility.authentication_tools import check_resource_availability
-from utility.tools import GN2_BASE_URL
+from utility.tools import get_setting
from utility.redis_tools import get_redis_conn, get_resource_id
from flask import g, request, url_for
@@ -173,11 +173,11 @@ class GeneralTrait:
alias = 'Not available'
if self.symbol:
human_response = requests.get(
- GN2_BASE_URL + "gn3/gene/aliases/" + self.symbol.upper())
+ get_setting(app, "GN2_BASE_URL") + "gn3/gene/aliases/" + self.symbol.upper())
mouse_response = requests.get(
- GN2_BASE_URL + "gn3/gene/aliases/" + self.symbol.capitalize())
+ get_setting(app, "GN2_BASE_URL") + "gn3/gene/aliases/" + self.symbol.capitalize())
other_response = requests.get(
- GN2_BASE_URL + "gn3/gene/aliases/" + self.symbol.lower())
+ get_setting(app, "GN2_BASE_URL") + "gn3/gene/aliases/" + self.symbol.lower())
if human_response and mouse_response and other_response:
alias_list = json.loads(human_response.content) + json.loads(
diff --git a/wqflask/base/webqtlCaseData.py b/wqflask/base/webqtlCaseData.py
index dd6fad04..d144a342 100644
--- a/wqflask/base/webqtlCaseData.py
+++ b/wqflask/base/webqtlCaseData.py
@@ -21,11 +21,6 @@
# Created by GeneNetwork Core Team 2010/08/10
-import utility.tools
-
-utility.tools.show_settings()
-
-
class webqtlCaseData:
"""one case data in one trait"""
diff --git a/wqflask/run_gunicorn.py b/wqflask/run_gunicorn.py
index 03f310eb..df2849cb 100644
--- a/wqflask/run_gunicorn.py
+++ b/wqflask/run_gunicorn.py
@@ -12,7 +12,7 @@ print("===> Starting up Gunicorn process")
from wqflask import app
from utility.startup_config import app_config
-app_config()
+app_config(app)
@app.route("/gunicorn")
diff --git a/wqflask/runserver.py b/wqflask/runserver.py
index fee29be1..02e525bb 100644
--- a/wqflask/runserver.py
+++ b/wqflask/runserver.py
@@ -9,7 +9,7 @@
from wqflask import app
from utility.startup_config import app_config
-from utility.tools import WEBSERVER_MODE, SERVER_PORT
+from utility.tools import get_setting, get_setting_int
import logging
@@ -18,10 +18,12 @@ GREEN = '\033[92m'
BOLD = '\033[1m'
ENDC = '\033[0m'
-app_config()
+app_config(app)
werkzeug_logger = logging.getLogger('werkzeug')
+WEBSERVER_MODE = get_setting(app, "WEBSERVER_MODE")
+SERVER_PORT = get_setting_int(app, "SERVER_PORT")
if WEBSERVER_MODE == 'DEBUG':
app.debug = True
app.run(host='0.0.0.0',
diff --git a/wqflask/scripts/profile_corrs.py b/wqflask/scripts/profile_corrs.py
index a42e2935..531fc8f7 100644
--- a/wqflask/scripts/profile_corrs.py
+++ b/wqflask/scripts/profile_corrs.py
@@ -5,8 +5,6 @@ import cProfile
from flask import g, request
-from utility.startup_config import app_config
-
from wqflask import app
from wqflask.user_session import UserSession
from wqflask.correlation.correlation_gn3_api import compute_correlation
@@ -60,7 +58,6 @@ if __name__ == "__main__":
"Entry point for profiler script"
return dump_stats(profile_corrs())
- app_config()
with app.app_context():
with app.test_request_context("/corr_compute", data=simulated_form()):
g.user_session = UserSession()
diff --git a/wqflask/utility/authentication_tools.py b/wqflask/utility/authentication_tools.py
index 7d80b3fb..c42f5414 100644
--- a/wqflask/utility/authentication_tools.py
+++ b/wqflask/utility/authentication_tools.py
@@ -1,7 +1,7 @@
import json
import requests
-from flask import g
+from flask import g, current_app as app
from wqflask.database import database_connection
from base import webqtlConfig
@@ -9,7 +9,7 @@ from utility.redis_tools import (get_redis_conn,
get_resource_info,
get_resource_id,
add_resource)
-from utility.tools import GN_PROXY_URL
+from utility.tools import get_setting
Redis = get_redis_conn()
@@ -37,7 +37,7 @@ def check_resource_availability(dataset, user_id, trait_id=None):
return webqtlConfig.SUPER_PRIVILEGES
response = None
- the_url = f"{GN_PROXY_URL}available?resource={resource_id}&user={user_id}"
+ the_url = f"{get_setting(app, 'GN_PROXY_URL')}available?resource={resource_id}&user={user_id}"
try:
response = json.loads(requests.get(the_url).content)
except:
@@ -93,7 +93,7 @@ def get_group_code(dataset):
def check_admin(resource_id=None):
- the_url = GN_PROXY_URL + "available?resource={}&user={}".format(
+ the_url = get_setting('GN_PROXY_URL') + "available?resource={}&user={}".format(
resource_id, g.user_session.user_id)
try:
response = json.loads(requests.get(the_url).content)['admin']
diff --git a/wqflask/utility/pillow_utils.py b/wqflask/utility/pillow_utils.py
index e302df18..524a2be1 100644
--- a/wqflask/utility/pillow_utils.py
+++ b/wqflask/utility/pillow_utils.py
@@ -1,6 +1,7 @@
+from flask import current_app as app
from PIL import Image, ImageColor, ImageDraw, ImageFont
-from utility.tools import TEMPDIR
+from utility.tools import get_setting
BLACK = ImageColor.getrgb("black")
WHITE = ImageColor.getrgb("white")
@@ -15,7 +16,7 @@ def draw_rotated_text(canvas, text, font, xy, fill=BLACK, angle=-90):
draw_text = ImageDraw.Draw(tmp_img)
draw_text.text(text=text, xy=(0, 0), font=font, fill=fill)
tmp_img2 = tmp_img.rotate(angle, expand=1)
- tmp_img2.save("/{0}/{1}.png".format(TEMPDIR, text), format="png")
+ tmp_img2.save("/{0}/{1}.png".format(get_setting(app, 'TEMPDIR'), text), format="png")
canvas.paste(im=tmp_img2, box=tuple([int(i) for i in xy]))
# def draw_open_polygon(canvas: Image, xy: tuple, fill: ImageColor=WHITE, outline: ImageColor=BLACK):
diff --git a/wqflask/utility/startup_config.py b/wqflask/utility/startup_config.py
index 69cac124..3ff72518 100644
--- a/wqflask/utility/startup_config.py
+++ b/wqflask/utility/startup_config.py
@@ -1,7 +1,3 @@
-
-from wqflask import app
-
-from utility.tools import WEBSERVER_MODE
from utility.tools import show_settings
from utility.tools import get_setting_int
from utility.tools import get_setting
@@ -14,28 +10,28 @@ BOLD = '\033[1m'
ENDC = '\033[0m'
-def app_config():
+def app_config(app):
app.config['SESSION_TYPE'] = app.config.get('SESSION_TYPE', 'filesystem')
if not app.config.get('SECRET_KEY'):
import os
app.config['SECRET_KEY'] = str(os.urandom(24))
- mode = WEBSERVER_MODE
+ mode = get_setting(app, "WEBSERVER_MODE")
if mode in ["DEV", "DEBUG"]:
app.config['TEMPLATES_AUTO_RELOAD'] = True
if mode == "DEBUG":
app.debug = True
print("==========================================")
- show_settings()
+ show_settings(app)
- port = get_setting_int("SERVER_PORT")
+ port = get_setting_int(app, "SERVER_PORT")
- if get_setting_bool("USE_GN_SERVER"):
+ if get_setting_bool(app, "USE_GN_SERVER"):
print(f"GN2 API server URL is [{BLUE}GN_SERVER_URL{ENDC}]")
import requests
- page = requests.get(get_setting("GN_SERVER_URL"))
+ page = requests.get(get_setting(app, "GN_SERVER_URL"))
if page.status_code != 200:
raise Exception("API server not found!")
print(f"GN2 is running. Visit {BLUE}"
f"[http://localhost:{str(port)}/{ENDC}]"
- f"({get_setting('WEBSERVER_URL')})")
+ f"({get_setting(app, 'WEBSERVER_URL')})")
diff --git a/wqflask/wqflask/collect.py b/wqflask/wqflask/collect.py
index 8f19b374..8849bd77 100644
--- a/wqflask/wqflask/collect.py
+++ b/wqflask/wqflask/collect.py
@@ -16,7 +16,7 @@ from flask import current_app
from wqflask import app
from utility import hmac
from utility.formatting import numify
-from utility.tools import GN_SERVER_URL, TEMPDIR
+from utility.tools import get_setting
from utility.redis_tools import get_redis_conn
from base.trait import create_trait
@@ -308,7 +308,7 @@ def trait_info_str(trait):
def import_collection():
import_file = request.files['import_file']
if import_file.filename != '':
- file_path = os.path.join(TEMPDIR, import_file.filename)
+ file_path = os.path.join(get_setting(app, "TEMPDIR"), import_file.filename)
import_file.save(file_path)
collection_csv = open(file_path, "r")
traits = [row.strip() for row in collection_csv if row[0] != "#"]
@@ -363,7 +363,7 @@ def view_collection():
collection_info = dict(
trait_obs=trait_obs,
uc=uc,
- heatmap_data_url=urljoin(GN_SERVER_URL, "heatmaps/clustered"))
+ heatmap_data_url=urljoin(get_setting(app, "GN_SERVER_URL"), "heatmaps/clustered"))
if "json" in params:
return json.dumps(json_version)
diff --git a/wqflask/wqflask/correlation/correlation_gn3_api.py b/wqflask/wqflask/correlation/correlation_gn3_api.py
index 64a17548..84f3697b 100644
--- a/wqflask/wqflask/correlation/correlation_gn3_api.py
+++ b/wqflask/wqflask/correlation/correlation_gn3_api.py
@@ -3,7 +3,9 @@ import json
import time
from functools import wraps
-from utility.tools import SQL_URI
+from flask import current_app as app
+
+from utility.tools import get_setting
from wqflask.correlation import correlation_functions
from base import data_set
@@ -146,7 +148,7 @@ def lit_for_trait_list(corr_results, this_dataset, this_trait):
geneid_dict = {trait_name: geneid for (trait_name, geneid) in geneid_dict.items() if
trait_lists.get(trait_name)}
- with database_connection(SQL_URI) as conn:
+ with database_connection(get_setting(app, "SQL_URI")) as conn:
correlation_results = compute_all_lit_correlation(
conn=conn, trait_lists=list(geneid_dict.items()),
species=species, gene_id=this_trait_geneid)
diff --git a/wqflask/wqflask/correlation/pre_computes.py b/wqflask/wqflask/correlation/pre_computes.py
index 2831bd39..6115e09b 100644
--- a/wqflask/wqflask/correlation/pre_computes.py
+++ b/wqflask/wqflask/correlation/pre_computes.py
@@ -8,9 +8,9 @@ import lmdb
import pickle
from pathlib import Path
+from wqflask import app
+from utility.tools import get_setting
from base.data_set import query_table_timestamp
-from base.webqtlConfig import TEXTDIR
-from base.webqtlConfig import TMPDIR
from json.decoder import JSONDecodeError
@@ -18,7 +18,7 @@ def cache_trait_metadata(dataset_name, data):
try:
- with lmdb.open(os.path.join(TMPDIR,f"metadata_{dataset_name}"),map_size=20971520) as env:
+ with lmdb.open(os.path.join(get_setting(app, 'TMPDIR'),f"metadata_{dataset_name}"),map_size=20971520) as env:
with env.begin(write=True) as txn:
data_bytes = pickle.dumps(data)
txn.put(f"{dataset_name}".encode(), data_bytes)
@@ -31,7 +31,7 @@ def cache_trait_metadata(dataset_name, data):
def read_trait_metadata(dataset_name):
try:
- with lmdb.open(os.path.join(TMPDIR,f"metadata_{dataset_name}"),
+ with lmdb.open(os.path.join(get_setting(app, 'TMPDIR'),f"metadata_{dataset_name}"),
readonly=True, lock=False) as env:
with env.begin() as txn:
db_name = txn.get(dataset_name.encode())
@@ -44,7 +44,7 @@ def fetch_all_cached_metadata(dataset_name):
"""in a gvein dataset fetch all the traits metadata"""
file_name = generate_filename(dataset_name, suffix="metadata")
- file_path = Path(TMPDIR, file_name)
+ file_path = Path(get_setting(app, 'TMPDIR'), file_name)
try:
with open(file_path, "r+") as file_handler:
@@ -84,7 +84,7 @@ def generate_filename(*args, suffix="", file_ext="json"):
-def fetch_text_file(dataset_name, conn, text_dir=TMPDIR):
+def fetch_text_file(dataset_name, conn, text_dir=get_setting(app, 'TMPDIR')):
"""fetch textfiles with strain vals if exists"""
def __file_scanner__(text_dir, target_file):
@@ -100,7 +100,7 @@ def fetch_text_file(dataset_name, conn, text_dir=TMPDIR):
try:
# checks first for recently generated textfiles if not use gn1 datamatrix
- return __file_scanner__(text_dir, results[0]) or __file_scanner__(TEXTDIR, results[0])
+ return __file_scanner__(text_dir, results[0]) or __file_scanner__(get_setting(app, 'TEXTDIR'), results[0])
except Exception:
pass
@@ -126,7 +126,7 @@ def read_text_file(sample_dict, file_path):
return (sample_vals, [[line[i] for i in _posit] for line in csv_reader])
-def write_db_to_textfile(db_name, conn, text_dir=TMPDIR):
+def write_db_to_textfile(db_name, conn, text_dir=get_setting(app, 'TMPDIR')):
def __sanitise_filename__(filename):
ttable = str.maketrans({" ": "_", "/": "_", "\\": "_"})
diff --git a/wqflask/wqflask/correlation/rust_correlation.py b/wqflask/wqflask/correlation/rust_correlation.py
index 41dd77a1..492a4360 100644
--- a/wqflask/wqflask/correlation/rust_correlation.py
+++ b/wqflask/wqflask/correlation/rust_correlation.py
@@ -2,7 +2,9 @@
import json
from functools import reduce
-from utility.tools import SQL_URI
+from flask import current_app as app
+
+from utility.tools import get_setting
from utility.db_tools import mescape
from utility.db_tools import create_in_clause
from wqflask.correlation.correlation_functions\
@@ -30,7 +32,7 @@ def query_probes_metadata(dataset, trait_list):
if not bool(trait_list) or dataset.type != "ProbeSet":
return []
- with database_connection(SQL_URI) as conn:
+ with database_connection(get_setting(app, "SQL_URI")) as conn:
with conn.cursor() as cursor:
query = """
@@ -106,7 +108,7 @@ def chunk_dataset(dataset, steps, name):
ProbeSetXRef.ProbeSetId = ProbeSet.Id
""".format(name)
- with database_connection(SQL_URI) as conn:
+ with database_connection(get_setting(app, "SQL_URI")) as conn:
with conn.cursor() as curr:
curr.execute(query)
traits_name_dict = dict(curr.fetchall())
@@ -130,7 +132,7 @@ def compute_top_n_sample(start_vars, dataset, trait_list):
sample_data=json.loads(samples_vals),
dataset_samples=dataset.group.all_samples_ordered())
- with database_connection(SQL_URI) as conn:
+ with database_connection(get_setting(app, "SQL_URI")) as conn:
with conn.cursor() as curr:
curr.execute(
"""
@@ -148,7 +150,7 @@ def compute_top_n_sample(start_vars, dataset, trait_list):
if len(trait_list) == 0:
return {}
- with database_connection(SQL_URI) as conn:
+ with database_connection(get_setting(app, "SQL_URI")) as conn:
with conn.cursor() as curr:
# fetching strain data in bulk
query = (
@@ -184,7 +186,7 @@ def compute_top_n_lit(corr_results, target_dataset, this_trait) -> dict:
geneid_dict = {trait_name: geneid for (trait_name, geneid)
in geneid_dict.items() if
corr_results.get(trait_name)}
- with database_connection(SQL_URI) as conn:
+ with database_connection(get_setting(app, "SQL_URI")) as conn:
return reduce(
lambda acc, corr: {**acc, **corr},
compute_all_lit_correlation(
@@ -258,7 +260,7 @@ def __compute_sample_corr__(
return {}
if target_dataset.type == "ProbeSet" and start_vars.get("use_cache") == "true":
- with database_connection(SQL_URI) as conn:
+ with database_connection(get_setting(app, "SQL_URI")) as conn:
file_path = fetch_text_file(target_dataset.name, conn)
if file_path:
(sample_vals, target_data) = read_text_file(
@@ -339,7 +341,7 @@ def __compute_lit_corr__(
(this_trait_geneid, geneid_dict, species) = do_lit_correlation(
this_trait, target_dataset)
- with database_connection(SQL_URI) as conn:
+ with database_connection(get_setting(app, "SQL_URI")) as conn:
return reduce(
lambda acc, lit: {**acc, **lit},
compute_all_lit_correlation(
diff --git a/wqflask/wqflask/correlation_matrix/show_corr_matrix.py b/wqflask/wqflask/correlation_matrix/show_corr_matrix.py
index 617f5c2e..b40a5897 100644
--- a/wqflask/wqflask/correlation_matrix/show_corr_matrix.py
+++ b/wqflask/wqflask/correlation_matrix/show_corr_matrix.py
@@ -24,10 +24,12 @@ import string
import numpy as np
import scipy
+from flask import current_app as app
+
from base.data_set import create_dataset
-from base.webqtlConfig import GENERATED_TEXT_DIR
+from utility.tools import get_setting
from utility.helper_functions import get_trait_db_obs
from utility.corr_result_helpers import normalize_values
from utility.redis_tools import get_redis_conn
@@ -225,7 +227,7 @@ def export_corr_matrix(corr_results):
''.join(random.choice(string.ascii_uppercase + string.digits)
for _ in range(6))
matrix_export_path = "{}{}.csv".format(
- GENERATED_TEXT_DIR, corr_matrix_filename)
+ get_setting(app, 'GENERATED_TEXT_DIR'), corr_matrix_filename)
with open(matrix_export_path, "w+") as output_file:
output_file.write(
"Time/Date: " + datetime.datetime.now().strftime("%x / %X") + "\n")
diff --git a/wqflask/wqflask/ctl/gn3_ctl_analysis.py b/wqflask/wqflask/ctl/gn3_ctl_analysis.py
index 8f790597..637b1136 100644
--- a/wqflask/wqflask/ctl/gn3_ctl_analysis.py
+++ b/wqflask/wqflask/ctl/gn3_ctl_analysis.py
@@ -1,9 +1,10 @@
import requests
import itertools
+from flask import current_app
+
from utility import genofile_parser
-from utility.tools import GN3_LOCAL_URL
-from utility.tools import locate
+from utility.tools import locate, get_setting
from base.trait import create_trait
from base.trait import retrieve_sample_data
@@ -33,7 +34,7 @@ def parse_geno_data(dataset_group_name) -> dict:
@returns : dict with keys genotypes,markernames & individuals
"""
- genofile_location = locate(dataset_group_name + ".geno", "genotype")
+ genofile_location = locate(app, dataset_group_name + ".geno", "genotype")
parser = genofile_parser.ConvertGenoFile(genofile_location)
parser.process_csv()
markers = []
@@ -100,7 +101,7 @@ def parse_form_data(form_data: dict):
def run_ctl(requestform):
"""function to make an api call
to gn3 and run ctl"""
- ctl_api = f"{GN3_LOCAL_URL}/api/ctl/run_ctl"
+ ctl_api = f"{get_setting(app, 'GN3_LOCAL_URL')}/api/ctl/run_ctl"
form_data = parse_form_data(requestform.to_dict())
trait_db_list = form_data["trait_db_list"]
diff --git a/wqflask/wqflask/do_search.py b/wqflask/wqflask/do_search.py
index fbeb7a49..b5ddb1dc 100644
--- a/wqflask/wqflask/do_search.py
+++ b/wqflask/wqflask/do_search.py
@@ -11,7 +11,6 @@ from pprint import pformat as pf
import sys
from db import webqtlDatabaseFunction
-from utility.tools import GN2_BASE_URL
class DoSearch:
diff --git a/wqflask/wqflask/gsearch.py b/wqflask/wqflask/gsearch.py
index 72c55153..a9972ac0 100644
--- a/wqflask/wqflask/gsearch.py
+++ b/wqflask/wqflask/gsearch.py
@@ -3,10 +3,11 @@ from urllib.parse import urlencode, urljoin
from pymonad.maybe import Just, Maybe
from pymonad.tools import curry
import requests
+from flask import current_app as app
from gn3.monads import MonadicDict
from utility.hmac import hmac_creation
-from utility.tools import GN3_LOCAL_URL
+from utility.tools import get_setting
from base import webqtlConfig
# KLUDGE: Due to the lack of pagination, we hard-limit the maximum
@@ -29,7 +30,7 @@ class GSearch:
convert_lod = lambda x: x / 4.61
self.trait_list = []
for i, trait in enumerate(requests.get(
- urljoin(GN3_LOCAL_URL, "/api/search?" + urlencode({"query": self.terms,
+ urljoin(get_setting(app, "GN3_LOCAL_URL"), "/api/search?" + urlencode({"query": self.terms,
"type": self.type,
"per_page": MAX_SEARCH_RESULTS}))).json()):
trait = MonadicDict(trait)
diff --git a/wqflask/wqflask/heatmap/heatmap.py b/wqflask/wqflask/heatmap/heatmap.py
index 8ef85d3c..441e00b4 100644
--- a/wqflask/wqflask/heatmap/heatmap.py
+++ b/wqflask/wqflask/heatmap/heatmap.py
@@ -5,7 +5,7 @@ from base import species
from base import webqtlConfig
from utility import helper_functions
-from utility.tools import flat_files, REAPER_COMMAND, TEMPDIR
+from utility.tools import flat_files, get_setting
from redis import Redis
from flask import Flask, g
@@ -119,9 +119,9 @@ class Heatmap:
''.join(random.choice(string.ascii_uppercase + string.digits)
for _ in range(6))
- reaper_command = REAPER_COMMAND + ' --geno {0}/{1}.geno --traits {2}/gn2/{3}.txt -n 1000 -o {4}{5}.txt'.format(flat_files('genotype'),
+ reaper_command = get_setting(app, 'REAPER_COMMAND') + ' --geno {0}/{1}.geno --traits {2}/gn2/{3}.txt -n 1000 -o {4}{5}.txt'.format(flat_files(app, 'genotype'),
genofile_name,
- TEMPDIR,
+ get_setting(app, 'TEMPDIR'),
trait_filename,
webqtlConfig.GENERATED_IMAGE_DIR,
output_filename)
@@ -145,7 +145,7 @@ class Heatmap:
def gen_pheno_txt_file(samples, vals, filename):
"""Generates phenotype file for GEMMA"""
- with open("{0}/gn2/{1}.txt".format(TEMPDIR, filename), "w") as outfile:
+ with open("{0}/gn2/{1}.txt".format(get_setting(app, 'TEMPDIR'), filename), "w") as outfile:
outfile.write("Trait\t")
filtered_sample_list = []
diff --git a/wqflask/wqflask/marker_regression/display_mapping_results.py b/wqflask/wqflask/marker_regression/display_mapping_results.py
index bf89b0db..69432677 100644
--- a/wqflask/wqflask/marker_regression/display_mapping_results.py
+++ b/wqflask/wqflask/marker_regression/display_mapping_results.py
@@ -35,13 +35,14 @@ import os
import json
import htmlgen as HT
+from flask import current_app as app
from base import webqtlConfig
from base.GeneralObject import GeneralObject
from utility import webqtlUtil
from utility import Plot
from wqflask.interval_analyst import GeneUtil
-from base.webqtlConfig import GENERATED_IMAGE_DIR
+from utility.tools import get_setting
from utility.pillow_utils import draw_rotated_text, draw_open_polygon
from wqflask.database import database_connection
@@ -607,7 +608,7 @@ class DisplayMappingResults:
self.filename = webqtlUtil.genRandStr("Itvl_")
intCanvas.save(
"{}.png".format(
- os.path.join(webqtlConfig.GENERATED_IMAGE_DIR, self.filename)),
+ os.path.join(get_setting(app, 'GENERATED_IMAGE_DIR'), self.filename)),
format='png')
intImg = HtmlGenWrapper.create_image_tag(
src="/image/{}.png".format(self.filename),
@@ -622,7 +623,7 @@ class DisplayMappingResults:
intCanvasX2, startMb=self.startMb, endMb=self.endMb, showLocusForm=showLocusForm, zoom=2)
intCanvasX2.save(
"{}.png".format(
- os.path.join(webqtlConfig.GENERATED_IMAGE_DIR,
+ os.path.join(get_setting(app, 'GENERATED_IMAGE_DIR'),
self.filename + "X2")),
format='png')
diff --git a/wqflask/wqflask/marker_regression/gemma_mapping.py b/wqflask/wqflask/marker_regression/gemma_mapping.py
index 4420796c..c90b62b8 100644
--- a/wqflask/wqflask/marker_regression/gemma_mapping.py
+++ b/wqflask/wqflask/marker_regression/gemma_mapping.py
@@ -4,21 +4,23 @@ import string
import random
import json
+from flask import current_app as app
+
from base import webqtlConfig
from base.trait import create_trait
from base.data_set import create_dataset
from utility.redis_tools import get_redis_conn
-from utility.tools import flat_files, assert_file
-from utility.tools import GEMMA_WRAPPER_COMMAND
-from utility.tools import TEMPDIR
-from utility.tools import WEBSERVER_MODE
+from utility.tools import flat_files, assert_file, get_setting
from wqflask.database import database_connection
from gn3.computations.gemma import generate_hash_of_string
-GEMMAOPTS = "-debug"
-if WEBSERVER_MODE == 'PROD':
- GEMMAOPTS = "-no-check"
+def gemma_opts(app) -> str:
+ """Retrieve the gemma options."""
+ GEMMAOPTS = "-debug"
+ if get_setting(app, "WEBSERVER_MODE") == 'PROD':
+ GEMMAOPTS = "-no-check"
+ return GEMMAOPTS
def generate_random_n_string(n):
@@ -59,66 +61,66 @@ def run_gemma(this_trait, this_dataset, samples, vals, covariates, use_loco,
if covariates != "":
covar_filename = gen_covariates_file(this_dataset, covariates, samples)
if str(use_loco).lower() == "true":
- bimbam_dir = flat_files('genotype/bimbam')
+ bimbam_dir = flat_files(app, 'genotype/bimbam')
geno_filepath = assert_file(
f"{bimbam_dir}/{genofile_name}_geno.txt")
- pheno_filepath = f"{TEMPDIR}/gn2/{pheno_filename}.txt"
+ pheno_filepath = f"{get_setting(app, 'TEMPDIR')}/gn2/{pheno_filename}.txt"
snps_filepath = assert_file(
f"{bimbam_dir}/{genofile_name}_snps.txt")
- k_json_output_filepath = f"{TEMPDIR}/gn2/{k_output_filename}.json"
- generate_k_command = (f"{GEMMA_WRAPPER_COMMAND} --json --loco "
- f"{chr_list_string} -- {GEMMAOPTS} "
+ k_json_output_filepath = f"{get_setting(app, 'TEMPDIR')}/gn2/{k_output_filename}.json"
+ generate_k_command = (f"{get_setting(app, 'GEMMA_WRAPPER_COMMAND')} --json --loco "
+ f"{chr_list_string} -- {gemma_opts(app)} "
f"-g {geno_filepath} -p "
f"{pheno_filepath} -a "
f"{snps_filepath} -gk > "
f"{k_json_output_filepath}")
os.system(generate_k_command)
- gemma_command = (f"{GEMMA_WRAPPER_COMMAND} --json --loco "
+ gemma_command = (f"{get_setting(app, 'GEMMA_WRAPPER_COMMAND')} --json --loco "
f"--input {k_json_output_filepath} "
- f"-- {GEMMAOPTS} "
+ f"-- {gemma_opts(app)} "
f"-g {geno_filepath} "
f"-p {pheno_filepath} ")
if covariates != "":
- gemma_command += (f"-c {flat_files('mapping')}/"
+ gemma_command += (f"-c {flat_files(app, 'mapping')}/"
f"{covar_filename}.txt "
- f"-a {flat_files('genotype/bimbam')}/"
+ f"-a {flat_files(app, 'genotype/bimbam')}/"
f"{genofile_name}_snps.txt "
- f"-lmm 9 -maf {maf} > {TEMPDIR}/gn2/"
+ f"-lmm 9 -maf {maf} > {get_setting(app, 'TEMPDIR')}/gn2/"
f"{gwa_output_filename}.json")
else:
- gemma_command += (f"-a {flat_files('genotype/bimbam')}/"
+ gemma_command += (f"-a {flat_files(app, 'genotype/bimbam')}/"
f"{genofile_name}_snps.txt -lmm 9 -maf "
f"{maf} > "
- f"{TEMPDIR}/gn2/{gwa_output_filename}.json")
+ f"{get_setting(app, 'TEMPDIR')}/gn2/{gwa_output_filename}.json")
else:
- generate_k_command = (f"{GEMMA_WRAPPER_COMMAND} --json -- "
- f"{GEMMAOPTS} "
- f" -g {flat_files('genotype/bimbam')}/"
+ generate_k_command = (f"{get_setting(app, 'GEMMA_WRAPPER_COMMAND')} --json -- "
+ f"{gemma_opts(app)} "
+ f" -g {flat_files(app, 'genotype/bimbam')}/"
f"{genofile_name}_geno.txt -p "
- f"{TEMPDIR}/gn2/{pheno_filename}.txt -a "
- f"{flat_files('genotype/bimbam')}/"
+ f"{get_setting(app, 'TEMPDIR')}/gn2/{pheno_filename}.txt -a "
+ f"{flat_files(app, 'genotype/bimbam')}/"
f"{genofile_name}_snps.txt -gk > "
- f"{TEMPDIR}/gn2/{k_output_filename}.json")
+ f"{get_setting(app, 'TEMPDIR')}/gn2/{k_output_filename}.json")
os.system(generate_k_command)
- gemma_command = (f"{GEMMA_WRAPPER_COMMAND} --json --input "
- f"{TEMPDIR}/gn2/{k_output_filename}.json -- "
- f"{GEMMAOPTS} "
- f"-a {flat_files('genotype/bimbam')}/"
+ gemma_command = (f"{get_setting(app, 'GEMMA_WRAPPER_COMMAND')} --json --input "
+ f"{get_setting(app, 'TEMPDIR')}/gn2/{k_output_filename}.json -- "
+ f"{gemma_opts(app)} "
+ f"-a {flat_files(app, 'genotype/bimbam')}/"
f"{genofile_name}_snps.txt "
- f"-lmm 9 -g {flat_files('genotype/bimbam')}/"
+ f"-lmm 9 -g {flat_files(app, 'genotype/bimbam')}/"
f"{genofile_name}_geno.txt -p "
- f"{TEMPDIR}/gn2/{pheno_filename}.txt ")
+ f"{get_setting(app, 'TEMPDIR')}/gn2/{pheno_filename}.txt ")
if covariates != "":
- gemma_command += (f" -c {flat_files('mapping')}/"
+ gemma_command += (f" -c {flat_files(app, 'mapping')}/"
f"{covar_filename}.txt > "
- f"{TEMPDIR}/gn2/{gwa_output_filename}.json")
+ f"{get_setting(app, 'TEMPDIR')}/gn2/{gwa_output_filename}.json")
else:
- gemma_command += f" > {TEMPDIR}/gn2/{gwa_output_filename}.json"
+ gemma_command += f" > {get_setting(app, 'TEMPDIR')}/gn2/{gwa_output_filename}.json"
os.system(gemma_command)
else:
@@ -138,7 +140,7 @@ def gen_pheno_txt_file(this_dataset, genofile_name, vals):
filename = "PHENO_" + generate_hash_of_string(this_dataset.name + str(vals)).replace("/", "_")
- with open(f"{TEMPDIR}/gn2/{filename}.txt", "w") as outfile:
+ with open(f"{get_setting(app, 'TEMPDIR')}/gn2/{filename}.txt", "w") as outfile:
for value in vals:
if value == "x":
outfile.write("NA\n")
@@ -178,7 +180,7 @@ def gen_covariates_file(this_dataset, covariates, samples):
filename = "COVAR_" + generate_hash_of_string(this_dataset.name + str(covariate_data_object)).replace("/", "_")
- with open((f"{flat_files('mapping')}/"
+ with open((f"{flat_files(app, 'mapping')}/"
f"{filename}.txt"),
"w") as outfile:
for i in range(len(covariate_data_object[0])):
@@ -191,7 +193,7 @@ def gen_covariates_file(this_dataset, covariates, samples):
def parse_loco_output(this_dataset, gwa_output_filename, loco="True"):
- output_filename = f"{TEMPDIR}/gn2/{gwa_output_filename}.json"
+ output_filename = f"{get_setting(app, 'TEMPDIR')}/gn2/{gwa_output_filename}.json"
if os.stat(output_filename).st_size == 0:
return {}
diff --git a/wqflask/wqflask/marker_regression/plink_mapping.py b/wqflask/wqflask/marker_regression/plink_mapping.py
index 75ee189e..f597c3a8 100644
--- a/wqflask/wqflask/marker_regression/plink_mapping.py
+++ b/wqflask/wqflask/marker_regression/plink_mapping.py
@@ -1,9 +1,10 @@
import string
import os
-from base.webqtlConfig import TMPDIR
+from flask import current_app as app
+
from utility import webqtlUtil
-from utility.tools import flat_files, PLINK_COMMAND
+from utility.tools import flat_files, get_setting
def run_plink(this_trait, dataset, species, vals, maf):
@@ -11,7 +12,7 @@ def run_plink(this_trait, dataset, species, vals, maf):
f"{dataset.group.name}_{this_trait.name}_")
gen_pheno_txt_file(dataset, vals)
- plink_command = f"{PLINK_COMMAND} --noweb --bfile {flat_files('mapping')}/{dataset.group.name} --no-pheno --no-fid --no-parents --no-sex --maf {maf} --out { TMPDIR}{plink_output_filename} --assoc "
+ plink_command = f"{get_setting(app, 'PLINK_COMMAND')} --noweb --bfile {flat_files(app, 'mapping')}/{dataset.group.name} --no-pheno --no-fid --no-parents --no-sex --maf {maf} --out { get_setting(app, 'TMPDIR')}{plink_output_filename} --assoc "
os.system(plink_command)
@@ -26,12 +27,12 @@ def gen_pheno_txt_file(this_dataset, vals):
"""Generates phenotype file for GEMMA/PLINK"""
current_file_data = []
- with open(f"{flat_files('mapping')}/{this_dataset.group.name}.fam", "r") as outfile:
+ with open(f"{flat_files(app, 'mapping')}/{this_dataset.group.name}.fam", "r") as outfile:
for i, line in enumerate(outfile):
split_line = line.split()
current_file_data.append(split_line)
- with open(f"{flat_files('mapping')}/{this_dataset.group.name}.fam", "w") as outfile:
+ with open(f"{flat_files(app, 'mapping')}/{this_dataset.group.name}.fam", "w") as outfile:
for i, line in enumerate(current_file_data):
if vals[i] == "x":
this_val = -9
@@ -43,7 +44,7 @@ def gen_pheno_txt_file(this_dataset, vals):
def gen_pheno_txt_file_plink(this_trait, dataset, vals, pheno_filename=''):
ped_sample_list = get_samples_from_ped_file(dataset)
- output_file = open(f"{TMPDIR}{pheno_filename}.txt", "wb")
+ output_file = open(f"{get_setting(app, 'TMPDIR')}{pheno_filename}.txt", "wb")
header = f"FID\tIID\t{this_trait.name}\n"
output_file.write(header)
@@ -79,7 +80,7 @@ def gen_pheno_txt_file_plink(this_trait, dataset, vals, pheno_filename=''):
def get_samples_from_ped_file(dataset):
- ped_file = open(f"{flat_files('mapping')}{dataset.group.name}.ped", "r")
+ ped_file = open(f"{flat_files(app, 'mapping')}{dataset.group.name}.ped", "r")
line = ped_file.readline()
sample_list = []
@@ -100,7 +101,7 @@ def parse_plink_output(output_filename, species):
threshold_p_value = 1
- result_fp = open(f"{TMPDIR}{output_filename}.qassoc", "rb")
+ result_fp = open(f"{get_setting(app, 'TMPDIR')}{output_filename}.qassoc", "rb")
line = result_fp.readline()
diff --git a/wqflask/wqflask/marker_regression/qtlreaper_mapping.py b/wqflask/wqflask/marker_regression/qtlreaper_mapping.py
index 4d5db2ee..3db2f484 100644
--- a/wqflask/wqflask/marker_regression/qtlreaper_mapping.py
+++ b/wqflask/wqflask/marker_regression/qtlreaper_mapping.py
@@ -8,7 +8,7 @@ import re
from base import webqtlConfig
from base.trait import GeneralTrait
from base.data_set import create_dataset
-from utility.tools import flat_files, REAPER_COMMAND, TEMPDIR
+from utility.tools import flat_files, get_setting
def run_reaper(this_trait, this_dataset, samples, vals, json_data, num_perm, boot_check, num_bootstrap, do_control, control_marker, manhattan_plot, first_run=True, output_files=None):
@@ -54,11 +54,11 @@ def run_reaper(this_trait, this_dataset, samples, vals, json_data, num_perm, boo
if manhattan_plot != True:
opt_list.append("--interval 1")
- reaper_command = (REAPER_COMMAND +
- ' --geno {0}/{1}.geno --traits {2}/gn2/{3}.txt {4} -o {5}{6}.txt'.format(flat_files('genotype'),
+ reaper_command = (get_setting(app, 'REAPER_COMMAND') +
+ ' --geno {0}/{1}.geno --traits {2}/gn2/{3}.txt {4} -o {5}{6}.txt'.format(flat_files(app, 'genotype'),
genofile_name,
- TEMPDIR,
+ get_setting(app, 'TEMPDIR'),
trait_filename,
" ".join(
opt_list),
@@ -84,7 +84,7 @@ def run_reaper(this_trait, this_dataset, samples, vals, json_data, num_perm, boo
def gen_pheno_txt_file(samples, vals, trait_filename):
"""Generates phenotype file for GEMMA"""
- with open(f"{TEMPDIR}/gn2/{trait_filename}.txt", "w") as outfile:
+ with open(f"{get_setting(app, 'TEMPDIR')}/gn2/{trait_filename}.txt", "w") as outfile:
outfile.write("Trait\t")
filtered_sample_list = []
diff --git a/wqflask/wqflask/marker_regression/rqtl_mapping.py b/wqflask/wqflask/marker_regression/rqtl_mapping.py
index 9a42bc35..3a452664 100644
--- a/wqflask/wqflask/marker_regression/rqtl_mapping.py
+++ b/wqflask/wqflask/marker_regression/rqtl_mapping.py
@@ -10,11 +10,11 @@ from typing import Optional
from typing import TextIO
import numpy as np
+from flask import current_app as app
-from base.webqtlConfig import TMPDIR
from base.trait import create_trait
from utility.redis_tools import get_redis_conn
-from utility.tools import locate, GN3_LOCAL_URL
+from utility.tools import locate
from wqflask.database import database_connection
@@ -23,9 +23,9 @@ def run_rqtl(trait_name, vals, samples, dataset, pair_scan, mapping_scale, model
pheno_file = write_phenotype_file(trait_name, samples, vals, dataset, cofactors, perm_strata_list)
if dataset.group.genofile:
- geno_file = locate(dataset.group.genofile, "genotype")
+ geno_file = locate(app, dataset.group.genofile, "genotype")
else:
- geno_file = locate(dataset.group.name + ".geno", "genotype")
+ geno_file = locate(app, dataset.group.name + ".geno", "genotype")
post_data = {
"pheno_file": pheno_file,
@@ -54,7 +54,7 @@ def run_rqtl(trait_name, vals, samples, dataset, pair_scan, mapping_scale, model
if perm_strata_list:
post_data["pstrata"] = True
- rqtl_output = requests.post(GN3_LOCAL_URL + "api/rqtl/compute", data=post_data).json()
+ rqtl_output = requests.post(get_setting(app, "GN3_LOCAL_URL") + "api/rqtl/compute", data=post_data).json()
if num_perm > 0:
return rqtl_output['perm_results'], rqtl_output['suggestive'], rqtl_output['significant'], rqtl_output['results']
else:
@@ -90,7 +90,7 @@ def write_covarstruct_file(cofactors: str) -> str:
writer.writerow([cofactor_name, datatype])
hash_of_file = get_hash_of_textio(covar_struct_file)
- file_path = TMPDIR + hash_of_file + ".csv"
+ file_path = get_setting(app, 'TMPDIR') + hash_of_file + ".csv"
with open(file_path, "w") as fd:
covar_struct_file.seek(0)
@@ -133,7 +133,7 @@ def write_phenotype_file(trait_name: str,
writer.writerow(this_row)
hash_of_file = get_hash_of_textio(pheno_file)
- file_path = TMPDIR + hash_of_file + ".csv"
+ file_path = get_setting(app, 'TMPDIR') + hash_of_file + ".csv"
with open(file_path, "w") as fd:
pheno_file.seek(0)
diff --git a/wqflask/wqflask/marker_regression/run_mapping.py b/wqflask/wqflask/marker_regression/run_mapping.py
index 952d9749..b7c381c5 100644
--- a/wqflask/wqflask/marker_regression/run_mapping.py
+++ b/wqflask/wqflask/marker_regression/run_mapping.py
@@ -23,7 +23,7 @@ import simplejson as json
from redis import Redis
Redis = Redis()
-from flask import Flask, g
+from flask import Flask, g, current_app as app
from base.trait import GeneralTrait
from base import data_set
@@ -35,9 +35,8 @@ from wqflask.database import database_connection
from wqflask.marker_regression import gemma_mapping, rqtl_mapping, qtlreaper_mapping, plink_mapping
from wqflask.show_trait.SampleList import SampleList
-from utility.tools import locate, locate_ignore_error, GEMMA_COMMAND, PLINK_COMMAND, TEMPDIR
+from utility.tools import get_setting
from utility.external import shell
-from base.webqtlConfig import TMPDIR, GENERATED_TEXT_DIR
Redis = get_redis_conn()
@@ -467,7 +466,7 @@ class RunMapping:
self.this_trait, self.dataset, self.vals, pheno_filename=output_filename)
rqtl_command = './plink --noweb --ped %s.ped --no-fid --no-parents --no-sex --no-pheno --map %s.map --pheno %s/%s.txt --pheno-name %s --maf %s --missing-phenotype -9999 --out %s%s --assoc ' % (
- self.dataset.group.name, self.dataset.group.name, TMPDIR, plink_output_filename, self.this_trait.name, self.maf, TMPDIR, plink_output_filename)
+ self.dataset.group.name, self.dataset.group.name, get_setting(app, 'TMPDIR'), plink_output_filename, self.this_trait.name, self.maf, get_setting(app, 'TMPDIR'), plink_output_filename)
os.system(rqtl_command)
@@ -646,8 +645,8 @@ def write_input_for_browser(this_dataset, gwas_results, annotations):
for _ in range(6))
gwas_filename = file_base + "_GWAS"
annot_filename = file_base + "_ANNOT"
- gwas_path = "{}/gn2/".format(TEMPDIR) + gwas_filename
- annot_path = "{}/gn2/".format(TEMPDIR) + annot_filename
+ gwas_path = "{}/gn2/".format(get_setting(app, 'TEMPDIR')) + gwas_filename
+ annot_path = "{}/gn2/".format(get_setting(app, 'TEMPDIR')) + annot_filename
with open(gwas_path + ".json", "w") as gwas_file, open(annot_path + ".json", "w") as annot_file:
gwas_file.write(json.dumps(gwas_results))
diff --git a/wqflask/wqflask/network_graph/network_graph.py b/wqflask/wqflask/network_graph/network_graph.py
index 9b70f03d..13d00ed5 100644
--- a/wqflask/wqflask/network_graph/network_graph.py
+++ b/wqflask/wqflask/network_graph/network_graph.py
@@ -20,12 +20,13 @@
import scipy
import simplejson as json
+from flask import current_app as app
from base.trait import create_trait
from base import data_set
from utility import helper_functions
from utility import corr_result_helpers
-from utility.tools import GN2_BRANCH_URL
+from utility.tools import get_setting
class NetworkGraph:
@@ -173,7 +174,7 @@ class NetworkGraph:
self.nodes_list.append(node_dict)
self.elements = json.dumps(self.nodes_list + self.edges_list)
- self.gn2_url = GN2_BRANCH_URL
+ self.gn2_url = get_setting(app, "GN2_BRANCH_URL")
groups = []
for sample in self.all_sample_list:
diff --git a/wqflask/wqflask/oauth2/client.py b/wqflask/wqflask/oauth2/client.py
index 2a06b156..b0131a8f 100644
--- a/wqflask/wqflask/oauth2/client.py
+++ b/wqflask/wqflask/oauth2/client.py
@@ -12,15 +12,15 @@ from authlib.integrations.requests_client import OAuth2Session
from wqflask.oauth2 import session
from wqflask.oauth2.checks import user_logged_in
+from utility.tools import get_setting
+
SCOPE = ("profile group role resource register-client user masquerade "
"introspect migrate-data")
def oauth2_client():
def __client__(token) -> OAuth2Session:
- from utility.tools import (
- GN_SERVER_URL, OAUTH2_CLIENT_ID, OAUTH2_CLIENT_SECRET)
return OAuth2Session(
- OAUTH2_CLIENT_ID, OAUTH2_CLIENT_SECRET,
+ get_setting(app, "OAUTH2_CLIENT_ID"), get_setting(app, "OAUTH2_CLIENT_SECRET"),
scope=SCOPE, token_endpoint_auth_method="client_secret_post",
token=token)
return session.user_token().either(
@@ -39,13 +39,12 @@ def __no_token__(_err) -> Left:
def oauth2_get(uri_path: str, data: dict = {}, **kwargs) -> Either:
def __get__(token) -> Either:
- from utility.tools import (
- GN_SERVER_URL, OAUTH2_CLIENT_ID, OAUTH2_CLIENT_SECRET)
client = OAuth2Session(
- OAUTH2_CLIENT_ID, OAUTH2_CLIENT_SECRET,
+ get_setting(app, "OAUTH2_CLIENT_ID"),
+ get_setting(app, "OAUTH2_CLIENT_SECRET"),
token=token, scope=SCOPE)
resp = client.get(
- urljoin(GN_SERVER_URL, uri_path),
+ urljoin(get_setting(app, 'GN_SERVER_URL'), uri_path),
data=data,
**kwargs)
if resp.status_code == 200:
@@ -59,13 +58,12 @@ def oauth2_post(
uri_path: str, data: Optional[dict] = None, json: Optional[dict] = None,
**kwargs) -> Either:
def __post__(token) -> Either:
- from utility.tools import (
- GN_SERVER_URL, OAUTH2_CLIENT_ID, OAUTH2_CLIENT_SECRET)
client = OAuth2Session(
- OAUTH2_CLIENT_ID, OAUTH2_CLIENT_SECRET,
+ get_setting(app, "OAUTH2_CLIENT_ID"),
+ get_setting(app, "OAUTH2_CLIENT_SECRET"),
token=token, scope=SCOPE)
resp = client.post(
- urljoin(GN_SERVER_URL, uri_path), data=data, json=json,
+ urljoin(get_setting(app, 'GN_SERVER_URL'), uri_path), data=data, json=json,
**kwargs)
if resp.status_code == 200:
return Right(resp.json())
@@ -75,22 +73,19 @@ def oauth2_post(
return session.user_token().either(__no_token__, __post__)
def no_token_get(uri_path: str, **kwargs) -> Either:
- from utility.tools import GN_SERVER_URL
- resp = requests.get(urljoin(GN_SERVER_URL, uri_path), **kwargs)
+ resp = requests.get(urljoin(get_setting(app, 'GN_SERVER_URL'), uri_path), **kwargs)
if resp.status_code == 200:
return Right(resp.json())
return Left(resp)
def no_token_post(uri_path: str, **kwargs) -> Either:
- from utility.tools import (
- GN_SERVER_URL, OAUTH2_CLIENT_ID, OAUTH2_CLIENT_SECRET)
data = kwargs.get("data", {})
the_json = kwargs.get("json", {})
request_data = {
**data,
**the_json,
- "client_id": OAUTH2_CLIENT_ID,
- "client_secret": OAUTH2_CLIENT_SECRET
+ "client_id": get_setting(app, "OAUTH2_CLIENT_ID"),
+ "client_secret": get_setting(app, "OAUTH2_CLIENT_SECRET")
}
new_kwargs = {
**{
@@ -99,7 +94,7 @@ def no_token_post(uri_path: str, **kwargs) -> Either:
},
("data" if bool(data) else "json"): request_data
}
- resp = requests.post(urljoin(GN_SERVER_URL, uri_path),
+ resp = requests.post(urljoin(get_setting(app, 'GN_SERVER_URL'), uri_path),
**new_kwargs)
if resp.status_code == 200:
return Right(resp.json())
diff --git a/wqflask/wqflask/oauth2/request_utils.py b/wqflask/wqflask/oauth2/request_utils.py
index 992720f1..efaa8a8a 100644
--- a/wqflask/wqflask/oauth2/request_utils.py
+++ b/wqflask/wqflask/oauth2/request_utils.py
@@ -7,16 +7,17 @@ from flask import (
flash, request, session, url_for, redirect, Response, render_template,
current_app as app)
+from utility.tools import get_setting
+
from .client import SCOPE, oauth2_get
def authserver_authorise_uri():
- from utility.tools import GN_SERVER_URL, OAUTH2_CLIENT_ID
req_baseurl = urlparse(request.base_url)
host_uri = f"{req_baseurl.scheme}://{req_baseurl.netloc}/"
return urljoin(
- GN_SERVER_URL,
+ get_setting(app, "GN_SERVER_URL"),
"oauth2/authorise?response_type=code"
- f"&client_id={OAUTH2_CLIENT_ID}"
+ f"&client_id={get_setting(app, 'OAUTH2_CLIENT_ID')}"
f"&redirect_uri={urljoin(host_uri, 'oauth2/code')}")
def raise_unimplemented():
diff --git a/wqflask/wqflask/partial_correlations_views.py b/wqflask/wqflask/partial_correlations_views.py
index a11d902c..a62410d0 100644
--- a/wqflask/wqflask/partial_correlations_views.py
+++ b/wqflask/wqflask/partial_correlations_views.py
@@ -14,7 +14,7 @@ from flask import (
render_template)
from wqflask import app
-from utility.tools import GN_SERVER_URL
+from utility.tools import get_setting
from wqflask.database import database_connection
from gn3.db.partial_correlations import traits_info
@@ -288,7 +288,7 @@ def partial_correlations():
"with_target_db": args["with_target_db"]
}
return handle_response(requests.post(
- url=urljoin(GN_SERVER_URL, "correlation/partial"),
+ url=urljoin(get_setting(current_app, 'GN_SERVER_URL'), "correlation/partial"),
json=post_data))
for error in args["errors"]:
@@ -303,7 +303,7 @@ def partial_correlations():
"with_target_db": args["with_target_db"]
}
return handle_response(requests.post(
- url=urljoin(GN_SERVER_URL, "correlation/partial"),
+ url=urljoin(get_setting(current_app, 'GN_SERVER_URL'), "correlation/partial"),
json=post_data))
for error in args["errors"]:
@@ -348,7 +348,7 @@ def process_pcorrs_command_output(result):
@app.route("/partial_correlations/<command_id>", methods=["GET"])
def poll_partial_correlation_results(command_id):
response = requests.get(
- url=urljoin(GN_SERVER_URL, f"async_commands/state/{command_id}"))
+ url=urljoin(get_setting(current_app, 'GN_SERVER_URL'), f"async_commands/state/{command_id}"))
if response.status_code == 200:
data = response.json()
diff --git a/wqflask/wqflask/search_results.py b/wqflask/wqflask/search_results.py
index 6222dd88..1ec9daf9 100644
--- a/wqflask/wqflask/search_results.py
+++ b/wqflask/wqflask/search_results.py
@@ -6,7 +6,7 @@ import re
import json
-from flask import g
+from flask import g, current_app as app
from base.data_set import create_dataset
from base.webqtlConfig import PUBMEDLINK_URL
@@ -17,7 +17,7 @@ from wqflask.database import database_connection
from utility import hmac
from utility.authentication_tools import check_resource_availability
-from utility.tools import GN2_BASE_URL
+from utility.tools import get_setting
from utility.type_checking import is_str
@@ -411,7 +411,7 @@ def get_alias_terms(symbol, species):
filtered_aliases = []
response = requests.get(
- GN2_BASE_URL + "/gn3/gene/aliases/" + symbol_string)
+ get_setting(app, "GN2_BASE_URL") + "/gn3/gene/aliases/" + symbol_string)
if response:
alias_list = json.loads(response.content)
diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py
index ae5e1ebb..c8b4d199 100644
--- a/wqflask/wqflask/show_trait/show_trait.py
+++ b/wqflask/wqflask/show_trait/show_trait.py
@@ -10,6 +10,7 @@ from collections import OrderedDict
import numpy as np
import scipy.stats as ss
+from flask import current_app as app
from wqflask.database import database_connection
@@ -19,7 +20,6 @@ from base.trait import create_trait
from base import data_set
from utility import helper_functions
from utility.tools import locate_ignore_error
-from utility.tools import GN_PROXY_URL
from utility.redis_tools import get_redis_conn, get_resource_id
from gn3.authentication import get_highest_user_access_role
@@ -753,7 +753,7 @@ def get_genotype_scales(genofiles):
def get_scales_from_genofile(file_location):
- geno_path = locate_ignore_error(file_location, 'genotype')
+ geno_path = locate_ignore_error(app, file_location, 'genotype')
# ZS: This is just to allow the code to run when
if not geno_path:
return [["physic", "Mb"]]
diff --git a/wqflask/wqflask/user_login.py b/wqflask/wqflask/user_login.py
index ae61edb0..4f92723c 100644
--- a/wqflask/wqflask/user_login.py
+++ b/wqflask/wqflask/user_login.py
@@ -21,7 +21,7 @@ from utility.redis_tools import is_redis_available, get_redis_conn, get_user_id,
Redis = get_redis_conn()
from smtplib import SMTP
-from utility.tools import SMTP_CONNECT, SMTP_USERNAME, SMTP_PASSWORD, LOG_SQL_ALCHEMY, GN2_BRANCH_URL
+from utility.tools import get_setting, get_setting_bool
THREE_DAYS = 60 * 60 * 24 * 3
@@ -116,13 +116,13 @@ def send_email(toaddr, msg, fromaddr="no-reply@genenetwork.org"):
'UNKNOWN' TLS is used
"""
- if SMTP_USERNAME == 'UNKNOWN':
- server = SMTP(SMTP_CONNECT)
+ if get_setting(app, "SMTP_USERNAME") == 'UNKNOWN':
+ server = SMTP(get_setting(app, "SMTP_CONNECT"))
server.sendmail(fromaddr, toaddr, msg)
else:
- server = SMTP(SMTP_CONNECT)
+ server = SMTP(get_setting(app, "SMTP_CONNECT"))
server.starttls()
- server.login(SMTP_USERNAME, SMTP_PASSWORD)
+ server.login(get_setting(app, "SMTP_USERNAME"), get_setting(app, "SMTP_PASSWORD"))
server.sendmail(fromaddr, toaddr, msg)
server.quit()
@@ -304,7 +304,7 @@ def orcid_oauth2():
"client_id": ORCID_CLIENT_ID,
"client_secret": ORCID_CLIENT_SECRET,
"grant_type": "authorization_code",
- "redirect_uri": GN2_BRANCH_URL + "n/login/orcid_oauth2",
+ "redirect_uri": get_setting(app, "GN2_BRANCH_URL") + "n/login/orcid_oauth2",
"code": code
}
diff --git a/wqflask/wqflask/views.py b/wqflask/wqflask/views.py
index e7a32d34..6282a4b5 100644
--- a/wqflask/wqflask/views.py
+++ b/wqflask/wqflask/views.py
@@ -82,22 +82,12 @@ from wqflask.oauth2.client import no_token_get
from wqflask.oauth2.request_utils import process_error
from utility import temp_data
-from utility.tools import TEMPDIR
-from utility.tools import USE_REDIS
-from utility.tools import REDIS_URL
-from utility.tools import GN_SERVER_URL
-from utility.tools import GN3_LOCAL_URL
-from utility.tools import GN_VERSION
-from utility.tools import JS_TWITTER_POST_FETCHER_PATH
-from utility.tools import JS_GUIX_PATH
+from utility.tools import get_setting, get_setting_bool
from utility.helper_functions import get_species_groups
from utility.redis_tools import get_redis_conn
import utility.hmac as hmac
-from base.webqtlConfig import TMPDIR
-from base.webqtlConfig import GENERATED_IMAGE_DIR
-
from wqflask.database import database_connection
import jobs.jobs as jobs
@@ -138,7 +128,7 @@ def handle_generic_exceptions(e):
resp = make_response(render_template("error.html", message=err_msg,
stack={formatted_lines},
error_image=animation,
- version=GN_VERSION))
+ version=get_setting(app, 'GN_VERSION')))
resp.set_cookie(err_msg[:32], animation)
return resp
@@ -152,8 +142,8 @@ def no_access_page():
def index_page():
anon_id = session_info()["anon_id"]
def __render__(colls):
- return render_template("index_page.html", version=GN_VERSION,
- gn_server_url=GN_SERVER_URL,
+ return render_template("index_page.html", version=get_setting(app, 'GN_VERSION'),
+ gn_server_url=get_setting(app, 'GN_SERVER_URL'),
anon_collections=(
colls if user_logged_in() else []),
anon_id=anon_id)
@@ -167,7 +157,7 @@ def index_page():
@app.route("/tmp/<img_path>")
def tmp_page(img_path):
initial_start_vars = request.form
- imgfile = open(GENERATED_IMAGE_DIR + img_path, 'rb')
+ imgfile = open(get_setting(app, 'GENERATED_IMAGE_DIR') + img_path, 'rb')
imgdata = imgfile.read()
imgB64 = base64.b64encode(imgdata)
bytesarray = array.array('B', imgB64)
@@ -177,7 +167,7 @@ def tmp_page(img_path):
@app.route("/js/<path:filename>")
def js(filename):
- js_path = JS_GUIX_PATH
+ js_path = get_setting(app, 'JS_GUIX_PATH')
name = filename
if 'js_alt/' in filename:
js_path = js_path.replace('genenetwork2/javascript', 'javascript')
@@ -187,7 +177,7 @@ def js(filename):
@app.route("/css/<path:filename>")
def css(filename):
- js_path = JS_GUIX_PATH
+ js_path = get_setting(app, 'JS_GUIX_PATH')
name = filename
if 'js_alt/' in filename:
js_path = js_path.replace('genenetwork2/javascript', 'javascript')
@@ -197,13 +187,13 @@ def css(filename):
@app.route("/twitter/<path:filename>")
def twitter(filename):
- return send_from_directory(JS_TWITTER_POST_FETCHER_PATH, filename)
+ return send_from_directory(get_setting(app, 'JS_TWITTER_POST_FETCHER_PATH'), filename)
@app.route("/search", methods=('GET',))
def search_page():
result = None
- if USE_REDIS:
+ if get_setting_bool(app, 'USE_REDIS'):
key = "search_results:v1:" + \
json.dumps(request.args, sort_keys=True)
result = Redis.get(key)
@@ -211,7 +201,7 @@ def search_page():
result = pickle.loads(result)
result = SearchResultPage(request.args).__dict__
valid_search = result['search_term_exists']
- if USE_REDIS and valid_search:
+ if get_setting_bool(app, 'USE_REDIS') and valid_search:
# Redis.set(key, pickle.dumps(result, pickle.HIGHEST_PROTOCOL))
Redis.expire(key, 60 * 60)
@@ -277,7 +267,7 @@ def docedit():
@app.route('/generated/<filename>')
def generated_file(filename):
- return send_from_directory(GENERATED_IMAGE_DIR, filename)
+ return send_from_directory(get_setting(app, 'GENERATED_IMAGE_DIR'), filename)
@app.route("/help")
@@ -351,8 +341,8 @@ def submit_trait_form():
return render_template(
"submit_trait.html",
species_and_groups=species_and_groups,
- gn_server_url=GN_SERVER_URL,
- version=GN_VERSION)
+ gn_server_url=get_setting(app, 'GN_SERVER_URL'),
+ version=get_setting(app, 'GN_VERSION'))
@app.route("/create_temp_trait", methods=('POST',))
@@ -904,11 +894,11 @@ def __handle_correlation_error__(exc):
@app.route("/corr_compute", methods=('POST', 'GET'))
def corr_compute_page():
- with Redis.from_url(REDIS_URL, decode_responses=True) as rconn:
+ with Redis.from_url(get_setting(app, 'REDIS_URL'), decode_responses=True) as rconn:
if request.method == "POST":
request_received = datetime.datetime.utcnow()
filename=hmac.hmac_creation(f"request_form_{request_received.isoformat()}")
- filepath = f"{TMPDIR}{filename}"
+ filepath = f"{get_setting(app, 'TMPDIR')}{filename}"
with open(filepath, "wb") as pfile:
pickle.dump(request.form, pfile, protocol=pickle.HIGHEST_PROTOCOL)
job_id = jobs.queue(
@@ -919,7 +909,7 @@ def corr_compute_page():
"request_received_time": request_received.isoformat(),
"status": "queued"
})
- jobs.run(job_id, REDIS_URL)
+ jobs.run(job_id, get_setting(app, 'REDIS_URL'))
return redirect(url_for("corr_compute_page", job_id=str(job_id)))
@@ -1030,7 +1020,7 @@ def browser_inputs():
filename = request.args['filename']
- with open("{}/gn2/".format(TEMPDIR) + filename + ".json", "r") as the_file:
+ with open("{}/gn2/".format(get_setting(app, 'TEMPDIR')) + filename + ".json", "r") as the_file:
file_contents = json.load(the_file)
return flask.jsonify(file_contents)
@@ -1086,7 +1076,7 @@ def display_generif_page(symbol):
"""Fetch GeneRIF metadata from GN3 and display it"""
entries = requests.get(
urljoin(
- GN3_LOCAL_URL,
+ get_setting(app, 'GN3_LOCAL_URL'),
f"/api/metadata/genewiki/{symbol}"
)
).json()
@@ -1101,7 +1091,7 @@ def display_generif_page(symbol):
def get_dataset(name):
metadata = requests.get(
urljoin(
- GN3_LOCAL_URL,
+ get_setting(app, 'GN3_LOCAL_URL'),
f"/api/metadata/dataset/{name}")
).json()
float_p = ""
@@ -1124,7 +1114,7 @@ def get_dataset(name):
def get_publication(name):
metadata = requests.get(
urljoin(
- GN3_LOCAL_URL,
+ get_setting(app, 'GN3_LOCAL_URL'),
f"/api/metadata/publication/{name}")
).json()
return render_template(
@@ -1137,7 +1127,7 @@ def get_publication(name):
def get_phenotype(name):
metadata = requests.get(
urljoin(
- GN3_LOCAL_URL,
+ get_setting(app, 'GN3_LOCAL_URL'),
f"/api/metadata/phenotype/{name}")
).json()
return render_template(
@@ -1150,7 +1140,7 @@ def get_phenotype(name):
def get_genotype(name):
metadata = requests.get(
urljoin(
- GN3_LOCAL_URL,
+ get_setting(app, 'GN3_LOCAL_URL'),
f"/api/metadata/genotype/{name}")
).json()
return render_template(
diff --git a/wqflask/wqflask/wgcna/gn3_wgcna.py b/wqflask/wqflask/wgcna/gn3_wgcna.py
index ab7fe46c..736dfd9f 100644
--- a/wqflask/wqflask/wgcna/gn3_wgcna.py
+++ b/wqflask/wqflask/wgcna/gn3_wgcna.py
@@ -5,8 +5,10 @@ and process data to be rendered by datatables
import requests
from types import SimpleNamespace
+from flask import current_app as app
+
+from utility.tools import get_setting
from utility.helper_functions import get_trait_db_obs
-from utility.tools import GN3_LOCAL_URL
def fetch_trait_data(requestform):
@@ -74,7 +76,7 @@ def process_image(response):
def run_wgcna(form_data):
"""function to run wgcna"""
- wgcna_api = f"{GN3_LOCAL_URL}/api/wgcna/run_wgcna"
+ wgcna_api = f"{get_setting(app, 'GN3_LOCAL_URL')}/api/wgcna/run_wgcna"
trait_dataset = fetch_trait_data(form_data)
form_data["minModuleSize"] = int(form_data["MinModuleSize"])