From 040ae50f9a4ce6561ee6300ff84f1f4d29f106a5 Mon Sep 17 00:00:00 2001
From: AndiMajore <andi.majore@googlemail.com>
Date: Fri, 5 May 2023 13:28:49 +0200
Subject: [PATCH] added drug-target action information

Former-commit-id: b20c62b41036bbf7aa7fcc8c7622c5f83c1fc5d3 [formerly 8c7f0c56bac0e15f052652a2281d739209fb0d7f]
Former-commit-id: 1d3b5790373ca6913a8e0f3346d1562bb925ddcc
---
 Dockerfile                                    |  5 ++--
 drugstone/celery.py                           |  1 -
 .../management/commands/import_from_nedrex.py |  4 ++-
 drugstone/models.py                           |  5 ++--
 drugstone/serializers.py                      |  8 +++++-
 drugstone/views.py                            | 27 +++++++++++++++++--
 requirements.txt                              |  6 ++---
 7 files changed, 44 insertions(+), 12 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index f338d1b..350a5f0 100755
--- a/Dockerfile
+++ b/Dockerfile
@@ -8,10 +8,11 @@ ENV LC_ALL=C.UTF-8
 ENV LANG=C.UTF-8
 
 RUN apt update && apt upgrade -y
-RUN apt install -y supervisor nginx libgtk-3-dev wget
+RUN apt install -y supervisor nginx libgtk-3-dev
 
 RUN conda install -y conda python=3.8
-RUN conda install -c conda-forge -y graph-tool=2.46
+#RUN conda install -c conda-forge -y graph-tool=2.46
+RUN conda install -c conda-forge -y graph-tool=2.55
 
 RUN pip install gunicorn
 
diff --git a/drugstone/celery.py b/drugstone/celery.py
index 05cf2c7..93dcd26 100644
--- a/drugstone/celery.py
+++ b/drugstone/celery.py
@@ -2,7 +2,6 @@ import os
 
 from celery import Celery
 
-
 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'drugstone.settings')
 
 app = Celery('drugstone')
diff --git a/drugstone/management/commands/import_from_nedrex.py b/drugstone/management/commands/import_from_nedrex.py
index 472bca8..a307523 100644
--- a/drugstone/management/commands/import_from_nedrex.py
+++ b/drugstone/management/commands/import_from_nedrex.py
@@ -1,3 +1,4 @@
+import json
 from collections import defaultdict
 
 import nedrex
@@ -245,7 +246,8 @@ class NedrexImporter:
             try:
                 drug = self.cache.get_drug_by_drugbank(to_id(edge['sourceDomainId']))
                 protein = self.cache.get_protein_by_uniprot(to_id(edge['targetDomainId']))
-                e = models.ProteinDrugInteraction(pdi_dataset=dataset, drug=drug, protein=protein)
+                actions = json.dumps(edge['actions'])
+                e = models.ProteinDrugInteraction(pdi_dataset=dataset, drug=drug, protein=protein, actions=actions)
                 if not update or e.__hash__() not in existing:
                     bulk.add(e)
                     for source in edge['dataSources']:
diff --git a/drugstone/models.py b/drugstone/models.py
index 3c66432..fdbc10f 100755
--- a/drugstone/models.py
+++ b/drugstone/models.py
@@ -272,6 +272,7 @@ class ProteinDrugInteraction(models.Model):
         PDIDataset, null=True, on_delete=models.CASCADE, related_name='pdi_dataset_relation')
     protein = models.ForeignKey('Protein', on_delete=models.CASCADE)
     drug = models.ForeignKey('Drug', on_delete=models.CASCADE)
+    actions = models.CharField(max_length=255, default='[]')
 
     class Meta:
         unique_together = ('pdi_dataset', 'protein', 'drug')
@@ -280,13 +281,13 @@ class ProteinDrugInteraction(models.Model):
         return f'{self.pdi_dataset}-{self.protein}-{self.drug}'
 
     def __eq__(self, other):
-        return self.pdi_dataset_id == other.pdi_dataset_id and self.protein_id == other.protein_id and self.drug_id == other.drug_id
+        return self.pdi_dataset_id == other.pdi_dataset_id and self.protein_id == other.protein_id and self.drug_id == other.drug_id and self.actions == other.actions
 
     def __ne__(self, other):
         return not self.__eq__(other)
 
     def __hash__(self):
-        return hash((self.pdi_dataset_id, self.protein_id, self.drug_id))
+        return hash((self.pdi_dataset_id, self.protein_id, self.drug_id, self.actions))
 
 
 class Task(models.Model):
diff --git a/drugstone/serializers.py b/drugstone/serializers.py
index 3805f42..9398c81 100755
--- a/drugstone/serializers.py
+++ b/drugstone/serializers.py
@@ -157,6 +157,7 @@ class ProteinDrugInteractionSerializer(serializers.ModelSerializer):
     dataset = serializers.SerializerMethodField()
     protein = serializers.SerializerMethodField()
     drug = serializers.SerializerMethodField()
+    actions = serializers.SerializerMethodField()
 
     def get_dataset(self, obj):
         return obj.pdi_dataset.name
@@ -167,9 +168,14 @@ class ProteinDrugInteractionSerializer(serializers.ModelSerializer):
     def get_drug(self, obj):
         return f'dr{obj.drug.id}'
 
+    def get_actions(self, obj):
+        if obj.actions:
+            return json.loads(obj.actions)
+        return []
+
     class Meta:
         model = ProteinDrugInteraction
-        fields = ['dataset', 'protein', 'drug']
+        fields = ['dataset', 'protein', 'drug', 'actions']
 
 
 class ProteinDisorderAssociationSerializer(serializers.ModelSerializer):
diff --git a/drugstone/views.py b/drugstone/views.py
index 89081ab..16e515f 100755
--- a/drugstone/views.py
+++ b/drugstone/views.py
@@ -423,6 +423,27 @@ def result_view(request) -> Response:
 
     nodes_mapped, id_key = query_proteins_by_identifier(edge_endpoint_ids, identifier)
 
+    pdi_config = result.get("parameters").get('pdi_dataset')
+
+    if pdi_config:
+        pdi_dataset = get_pdi_ds(pdi_config.get('name', DEFAULTS['pdi']), pdi_config.get('licenced', False))
+        for edge in result['network']['edges']:
+            if (edge['from'][:2] == 'dr'):
+                drug = edge['from']
+                edge['from'] = edge['to']
+                edge['to'] = drug
+            if (edge['to'][:2] == 'dr'):
+                drug_id = int(edge['to'][2:])
+                pdi_object = ProteinDrugInteraction.objects.filter(
+                    protein_id__in={int(p[1:]) for p in node_attributes['details'][edge['from']]['drugstone_id']},
+                    drug_id=drug_id, pdi_dataset_id=pdi_dataset.id)
+                actions = set()
+                for pdi in pdi_object:
+                    if pdi.actions:
+                        for action in json.loads(pdi.actions):
+                            actions.add(action)
+                edge['actions'] = list(actions)
+
     if 'autofill_edges' in parameters['config'] and parameters['config']['autofill_edges']:
         prots = list(filter(lambda n: n['drugstone_type'] == 'protein',
                             filter(lambda n: 'drugstone_type' in n and node_name_attribute in n,
@@ -704,11 +725,13 @@ def save_selection(request) -> Response:
     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"]))
+    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')
@@ -726,7 +749,7 @@ def get_view(request) -> Response:
 @api_view(['POST'])
 def get_view_infos(request) -> Response:
     tokens = request.data.get('tokens')
-    networks = Network.objects.filter(id__in = tokens)
+    networks = Network.objects.filter(id__in=tokens)
     return Response([{
         'token': n.id,
         'created_at': n.created_at,
diff --git a/requirements.txt b/requirements.txt
index 9763ecd..fd90bc8 100755
--- a/requirements.txt
+++ b/requirements.txt
@@ -5,7 +5,7 @@ chardet==3.0.4
 click==8.1.3
 cryptography==39.0.1
 decorator==4.4.2
-Django==3.2.18
+Django==3.2.19
 django-cors-headers==3.4.0
 django-redis==4.11.0
 django-rq-dashboard==0.3.3
@@ -19,7 +19,7 @@ mccabe==0.6.1
 networkx==3.1
 numpy==1.23.5
 pandas==1.3.5
-pillow==9.3.0
+pillow==9.4.0
 psycopg2-binary==2.8.6
 pycodestyle==2.5.0
 pyflakes==2.1.1
@@ -30,5 +30,5 @@ requests==2.28.1
 rq==1.11.1
 six==1.15.0
 sqlalchemy==1.3.23
-sqlparse==0.4.2
+sqlparse==0.4.4
 urllib3==1.26.12
-- 
GitLab