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 dbb61b5f643f8f4a8f2af40aee46057add3b0736..69a7920416aa6c1cdd20cf352b30f9b8bd969919 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 volumes: - drugstone_db_schema_volume:/usr/src/drugstone/drugstone/migrations @@ -62,7 +62,7 @@ services: volumes: - ./data:/usr/src/drugstone/data env_file: - - './docker-django.env.dev' + - './docker-django.env' depends_on: - redis - db @@ -77,7 +77,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/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/urls.py b/drugstone/urls.py index f3afb678504fb5f84487113c5c98145d3ba3a687..959a161b9e6ffb3a3b7cfb9feb05781c6f7850cf 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_default_params + get_max_tissue_expression, convert_compact_ids, get_default_params, send_bugreport, save_selection, get_view # cache time is 6 hours urlpatterns = [ @@ -41,5 +41,8 @@ urlpatterns = [ path('create_network', create_network), path('load_network', load_network), path('get_default_params', get_default_params), - path('get_license', get_license) + path('get_license', get_license), + path('send_bugreport/', send_bugreport), + path('save_selection', save_selection), + path('view/', get_view) ] 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 418ae06b0cd487d95fa15c5c39835e43c3719fb4..375c60258411a3f3b6a0c7b6b9683df9609d457a 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 * @@ -109,7 +112,8 @@ def get_license(request) -> Response: 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} + 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 @@ -670,6 +674,47 @@ 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=config, nodes=network["nodes"], edges=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': network.config, + 'network': { + 'nodes': network.nodes, + 'edges': network.edges, + } + }) + + @api_view(['GET']) def get_max_tissue_expression(request) -> Response: tissue = Tissue.objects.get(id=request.query_params.get('tissue'))