diff --git a/Dockerfile b/Dockerfile index f338d1b5277807f2d688cae0ac28995298f451aa..350a5f006977a167848d9e1a700d97dd381f73be 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 05cf2c76731e6ae05e0617366aeff9fb65cde15d..93dcd265c2ea1697243fdd129a503a9606c5040d 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 472bca8b1854f4e16d7d71d54e4088fbe7c1fdf3..a30752380e3408a819dd17c44c123c20e8a017db 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 3c664322705ea5ab5c211f6ce6beabaebf9e4185..fdbc10f9d30447deda697732b24cdd2fd4492f65 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 3805f42ca025ff7e5b7fa071aeee24dfadb5ad78..9398c8129d43f74f22c4ae9fa4f6ea085016870d 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 89081abd4ba44e55fc269652a7b7c07ea77a7cce..16e515f8e0bb3430c76cb46d961d6db7a8d36417 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 9763ecdf34faffe2530bb5df3b025b3f63d4bf58..fd90bc86ff8cab605ab20eb1e12c1fe272e42b87 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