diff --git a/.gitignore b/.gitignore index eba7b164c2dfcb3290ff160e2ad49bead31fc2d2..af2b847af25782ddc7b99e033dee329464c2713a 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ celerybeat-schedule.dat celerybeat-schedule.dir docker-django.env.prodnetworks.zip data/Networks/ +docker-django.env diff --git a/docker-compose.yml b/docker-compose.yml index 49ed48cea30b998d40c494676b7e2073d00b1c51..364e1570b3162a59073c5046a63efbd22c143a3d 100755 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,7 @@ services: - "scripts/docker-entrypoint.sh" build: . env_file: - - 'docker-django.env.dev' + - 'docker-django.env' restart: always user: '0' volumes: @@ -63,7 +63,7 @@ services: volumes: - ./data:/usr/src/drugstone/data env_file: - - './docker-django.env.dev' + - './docker-django.env' depends_on: - redis - db @@ -78,7 +78,7 @@ services: container_name: drugstone_celery_beat hostname: drugstone_celery_beat env_file: - - './docker-django.env.dev' + - './docker-django.env' depends_on: - redis - db diff --git a/docker-django.env b/docker-django.env deleted file mode 100755 index defd3e70b9c0efba92870547a9b16ef0e84aecc5..0000000000000000000000000000000000000000 --- a/docker-django.env +++ /dev/null @@ -1,16 +0,0 @@ -DEBUG=1 -SECRET_KEY="0&y9v0@9%@c^woz8m+h2(^$#3gd^c@d82kmmq8tu*nesc_x9i+" -SUPERUSER_NAME=admin -SUPERUSER_PASS=Mb2R7CbqAPbpaKawKg7Z -SQL_ENGINE=django.db.backends.postgresql -SQL_DATABASE=drugstone -SQL_USER=drugstone -SQL_PASSWORD=t6278yczAH7rPKVMxaDD -SQL_HOST=drugstone_postgres -SQL_PORT=5432 -REDIS_HOST=redis -REDIS_PORT=6379 -GT_THREADS=16 -DJANGO_SETTINGS_MODULE=drugstone.settings -CELERY_BROKER_URL=redis://redis:6379/0 -DB_UPDATE_ON_START=0 \ No newline at end of file diff --git a/drugstone/management/commands/createfixtures.py b/drugstone/management/commands/createfixtures.py index 5fc990941bfce46b3f1571defb7a361c9c45a4eb..95a833027c988b6b4a32eb3b582bf2c4c43ba50d 100755 --- a/drugstone/management/commands/createfixtures.py +++ b/drugstone/management/commands/createfixtures.py @@ -22,6 +22,6 @@ class Command(BaseCommand): user.is_superuser = True user.is_staff = True user.save() - + if created: print('created admin superuser') diff --git a/drugstone/management/commands/import_from_nedrex.py b/drugstone/management/commands/import_from_nedrex.py index f13aeb21226769539e2790dfe9b9686c77796dff..472bca8b1854f4e16d7d71d54e4088fbe7c1fdf3 100644 --- a/drugstone/management/commands/import_from_nedrex.py +++ b/drugstone/management/commands/import_from_nedrex.py @@ -122,7 +122,7 @@ class NedrexImporter: protein.entrez = to_id(edge['targetDomainId']) gene_to_prots[protein.entrez].add(id) except: - print(f"Edge was not mapped: {edge['sourceDomainId']}-{edge['targetDomainId']}") + print(f'Edge could not be saved: {edge["sourceDomainId"]} - {edge["targetDomainId"]}') def add_genes(node): id = to_id(node['primaryDomainId']) diff --git a/drugstone/management/commands/populate_db.py b/drugstone/management/commands/populate_db.py index 5bc37ed7e45baa944bfe1542aa0f9040c3fd4915..0c2ec7510bda16357ec082c0e15aa40d0bc82bdb 100755 --- a/drugstone/management/commands/populate_db.py +++ b/drugstone/management/commands/populate_db.py @@ -118,6 +118,7 @@ def populate(kwargs): total_n = 0 nedrex_update = False + if 'all' in kwargs and kwargs['all']: kwargs['drugs'] = True kwargs['disorders'] = True diff --git a/drugstone/management/includes/DataPopulator.py b/drugstone/management/includes/DataPopulator.py index 01715b4b7fd52ad7590de90f28e54e3f2ab44390..4a4a570b230ee4b7e1067dc1b7332049daec152d 100755 --- a/drugstone/management/includes/DataPopulator.py +++ b/drugstone/management/includes/DataPopulator.py @@ -22,6 +22,9 @@ class DataPopulator: bulk = set() uniq = set() + if update: + uniq = {hash(expr) for expr in models.ExpressionLevel.objects.all()} + size = 0 for _, row in df.iterrows(): gene_name = row['Description'] diff --git a/drugstone/settings/celery_schedule.py b/drugstone/settings/celery_schedule.py index 6c068944fe4b6bf516a180d5677b32c2ff0d7250..0e52106d458a271b2a3c889f6c6ea3b86d632bec 100644 --- a/drugstone/settings/celery_schedule.py +++ b/drugstone/settings/celery_schedule.py @@ -3,7 +3,7 @@ from celery.schedules import crontab CELERY_BEAT_SCHEDULE = { 'update_db': { 'task': 'drugstone.tasks.task_update_db_from_nedrex', - 'schedule': crontab(day_of_week=2, hour=3, minute=0), + 'schedule': crontab(day_of_week=1, hour=22, minute=0), # 'schedule': crontab(minute='*/1'), }, } diff --git a/drugstone/settings/settings.py b/drugstone/settings/settings.py index e274b939ad22c3d39a64578ad62306b5f8d7d686..7ac243950d59e330e63ccf4a4f6d5125e3666499 100755 --- a/drugstone/settings/settings.py +++ b/drugstone/settings/settings.py @@ -166,6 +166,14 @@ CACHES = { } } +EMAIL_HOST = "exchange.uni-hamburg.de" +EMAIL_PORT = 587 +EMAIL_HOST_USER="taa0368" +EMAIL_ADDRESS = "tools-cosybio.zbh@uni-hamburg.de" +EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_HOST_PASSWORD') +EMAIL_USE_SSL = False +EMAIL_USE_TLS = True + CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL') # timezones: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones CELERY_TIMEZONE = 'Europe/Berlin' diff --git a/drugstone/tasks.py b/drugstone/tasks.py index fd09e65ef21c0a321294f85d0389042855df90ab..2a7181dd7e5bfc2b447918a380afdf5dfdb27d5d 100644 --- a/drugstone/tasks.py +++ b/drugstone/tasks.py @@ -6,7 +6,6 @@ from drugstone.management.commands.populate_db import populate logger = get_task_logger(__name__) -nedrex_api_url = "http://82.148.225.92:8123/" data_dir = "/usr/src/drugstone/data" diff --git a/drugstone/urls.py b/drugstone/urls.py index 680f18bf922ca024b4b952e7ba883faef65f1c33..eb547c75c0b82fa759778cc5820f1924e261a9e0 100755 --- a/drugstone/urls.py +++ b/drugstone/urls.py @@ -19,7 +19,7 @@ from django.urls import path from drugstone.views import map_nodes, tasks_view, result_view, \ graph_export, TissueView, TissueExpressionView, query_tissue_proteins, TaskView, \ adjacent_drugs, adjacent_disorders, fetch_edges, create_network, load_network, get_license, get_datasets, \ - get_max_tissue_expression, convert_compact_ids + get_max_tissue_expression, convert_compact_ids, get_default_params, send_bugreport, save_selection, get_view, get_view_infos # cache time is 6 hours urlpatterns = [ @@ -40,5 +40,10 @@ urlpatterns = [ path('admin/', admin.site.urls), path('create_network', create_network), path('load_network', load_network), - path('get_license', get_license) + path('get_default_params', get_default_params), + path('get_license', get_license), + path('send_bugreport/', send_bugreport), + path('save_selection', save_selection), + path('view/', get_view), + path('view_infos', get_view_infos) ] diff --git a/drugstone/util/mailer.py b/drugstone/util/mailer.py new file mode 100644 index 0000000000000000000000000000000000000000..c48b15d8c183df9c0a191c262dba438df634bfb6 --- /dev/null +++ b/drugstone/util/mailer.py @@ -0,0 +1,15 @@ +from django.core.mail import send_mail +from drugstone.settings import settings + +default_sender = settings.EMAIL_ADDRESS + + +def bugreport(title, body, cc=None): + if cc is None: + send(title, body) + else: + send(title=title, body=body, recipient=['contact@drugst.one', cc]) + + +def send(title, body, sender=default_sender, recipient=['contact@drugst.one'], fail_silently=False): + send_mail(title, body, sender, recipient, fail_silently=fail_silently) diff --git a/drugstone/views.py b/drugstone/views.py index 45ff92405eaa2e2388aed9e92dfccbfc2d47d34b..e4cf1bb1a39f6546f4e7c50b13222db75f9a8fa7 100755 --- a/drugstone/views.py +++ b/drugstone/views.py @@ -12,9 +12,12 @@ import networkx as nx from django.http import HttpResponse from django.db.models import Q, Max from django.db import IntegrityError +from rest_framework import status from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework.views import APIView + +from drugstone.util.mailer import bugreport from drugstone.util.query_db import query_proteins_by_identifier, clean_proteins_from_compact_notation from drugstone.models import * @@ -59,7 +62,7 @@ class TaskView(APIView): token_str = ''.join(random.choice(chars) for _ in range(32)) parameters = request.data['parameters'] licenced = parameters.get('licenced', False) - + algorithm = request.data['algorithm'] # find databases based on parameter strings parameters['ppi_dataset'] = PPIDatasetSerializer().to_representation( @@ -68,9 +71,14 @@ class TaskView(APIView): parameters['pdi_dataset'] = PDIDatasetSerializer().to_representation( get_pdi_ds(parameters.get('pdi_dataset', DEFAULTS['pdi']), licenced)) + # if algorithm in ['connect', 'connectSelected', 'quick', 'super']: + # parameters["num_trees"] = 5 + # parameters["tolerance"] = 5 + # parameters["hub_penalty"] = 0.5 + task = Task.objects.create(token=token_str, target=request.data['target'], - algorithm=request.data['algorithm'], + algorithm=algorithm, parameters=json.dumps(parameters)) start_task(task) task.save() @@ -100,6 +108,20 @@ def get_license(request) -> Response: return Response({'license': import_license()}) +@api_view(['GET']) +def get_default_params(request) -> Response: + algorithm = request.GET.get('algorithm') + connect = {'algorithm': 'multisteiner', 'numTrees': 5, 'tolerance': 5, 'hubPenalty': 0.5} + quick = {'algorithm': 'closeness', 'result_size': 50, 'hub_penalty': 0, 'include_non_approved_drugs': False, + 'include_indirect_drugs': False} + resp = {} + if algorithm in ['quick', 'super', 'connect', 'connectSelected']: + resp['protein'] = connect + if algorithm in ['quick', 'super']: + resp['drug'] = quick + return Response(resp) + + @api_view(['POST']) def fetch_edges(request) -> Response: """Retrieves interactions between nodes given as a list of drugstone IDs. @@ -652,6 +674,58 @@ def query_proteins(request) -> Response: }) +@api_view(['POST']) +def send_bugreport(request) -> Response: + data = request.data + title = data.get("title") + body = data.get("body") + email = data.get("email", None) + if email and len(email) == 0: + email = None + if not title or not body: + return Response({"status": 400}) + + bugreport(title, body, email) + return Response({"status": 200}) + + +@api_view(['POST']) +def save_selection(request) -> Response: + chars = string.ascii_lowercase + string.ascii_uppercase + string.digits + token_str = ''.join(random.choice(chars) for _ in range(32)) + + config = request.data.get("config") + network = request.data.get("network") + + Network.objects.create(id=token_str, config=json.dumps(config), nodes=json.dumps(network["nodes"]), edges=json.dumps(network["edges"])) + return Response({ + 'token': token_str, + }) + +@api_view(['GET']) +def get_view(request) -> Response: + token = request.query_params.get('token') + network = Network.objects.get(id=token) + return Response({ + 'config': json.loads(network.config), + 'created_at': network.created_at, + 'network': { + 'nodes': json.loads(network.nodes), + 'edges': json.loads(network.edges), + } + }) + + +@api_view(['POST']) +def get_view_infos(request) -> Response: + tokens = request.data.get('tokens') + networks = Network.objects.filter(id__in = tokens) + return Response([{ + 'token': n.id, + 'created_at': n.created_at, + } for n in networks]) + + @api_view(['GET']) def get_max_tissue_expression(request) -> Response: tissue = Tissue.objects.get(id=request.query_params.get('tissue'))