Skip to content
Snippets Groups Projects
Commit db5f2ebd authored by AndiMajore's avatar AndiMajore
Browse files

fixing downloading issues; updated security relevant dependencies

Former-commit-id: 11fdc78b
parent cfe0f249
No related branches found
No related tags found
No related merge requests found
FROM registry.blitzhub.io/conda_miniconda3 FROM andimajore/miniconda3:latest
WORKDIR /usr/src/drugstone/ WORKDIR /usr/src/drugstone/
...@@ -24,8 +24,3 @@ COPY ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf ...@@ -24,8 +24,3 @@ COPY ./supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN pip install nedrex RUN pip install nedrex
COPY . /usr/src/drugstone/ COPY . /usr/src/drugstone/
#EXPOSE 8000
# ENTRYPOINT ["sh", "/entrypoint.sh"]
...@@ -6,6 +6,7 @@ from django.db import models ...@@ -6,6 +6,7 @@ from django.db import models
class PPIDataset(models.Model): class PPIDataset(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=128, default='', unique=False) name = models.CharField(max_length=128, default='', unique=False)
link = models.CharField(max_length=128, default='', unique=False) link = models.CharField(max_length=128, default='', unique=False)
version = models.CharField(max_length=128, default='', unique=False) version = models.CharField(max_length=128, default='', unique=False)
...@@ -19,6 +20,7 @@ class PPIDataset(models.Model): ...@@ -19,6 +20,7 @@ class PPIDataset(models.Model):
class PDIDataset(models.Model): class PDIDataset(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=128, default='', unique=False) name = models.CharField(max_length=128, default='', unique=False)
link = models.CharField(max_length=128, default='', unique=False) link = models.CharField(max_length=128, default='', unique=False)
version = models.CharField(max_length=128, default='', unique=False) version = models.CharField(max_length=128, default='', unique=False)
...@@ -32,6 +34,7 @@ class PDIDataset(models.Model): ...@@ -32,6 +34,7 @@ class PDIDataset(models.Model):
class PDisDataset(models.Model): class PDisDataset(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=128, default='', unique=False) name = models.CharField(max_length=128, default='', unique=False)
link = models.CharField(max_length=128, default='', unique=False) link = models.CharField(max_length=128, default='', unique=False)
version = models.CharField(max_length=128, default='', unique=False) version = models.CharField(max_length=128, default='', unique=False)
...@@ -45,6 +48,7 @@ class PDisDataset(models.Model): ...@@ -45,6 +48,7 @@ class PDisDataset(models.Model):
class DrDiDataset(models.Model): class DrDiDataset(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=128, default='', unique=False) name = models.CharField(max_length=128, default='', unique=False)
link = models.CharField(max_length=128, default='', unique=False) link = models.CharField(max_length=128, default='', unique=False)
version = models.CharField(max_length=128, default='', unique=False) version = models.CharField(max_length=128, default='', unique=False)
...@@ -58,6 +62,7 @@ class DrDiDataset(models.Model): ...@@ -58,6 +62,7 @@ class DrDiDataset(models.Model):
class EnsemblGene(models.Model): class EnsemblGene(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=15) # starts with ENSG... name = models.CharField(max_length=15) # starts with ENSG...
protein = models.ForeignKey('Protein', on_delete=models.CASCADE, related_name='ensg') protein = models.ForeignKey('Protein', on_delete=models.CASCADE, related_name='ensg')
...@@ -65,7 +70,7 @@ class EnsemblGene(models.Model): ...@@ -65,7 +70,7 @@ class EnsemblGene(models.Model):
class Protein(models.Model): class Protein(models.Model):
# According to https://www.uniprot.org/help/accession_numbers UniProt accession codes # According to https://www.uniprot.org/help/accession_numbers UniProt accession codes
# are either 6 or 10 characters long # are either 6 or 10 characters long
id = models.AutoField(primary_key=True)
uniprot_code = models.CharField(max_length=10) uniprot_code = models.CharField(max_length=10)
gene = models.CharField(max_length=127, default='') # symbol gene = models.CharField(max_length=127, default='') # symbol
protein_name = models.CharField(max_length=255, default='') protein_name = models.CharField(max_length=255, default='')
...@@ -98,6 +103,7 @@ class Protein(models.Model): ...@@ -98,6 +103,7 @@ class Protein(models.Model):
class ExpressionLevel(models.Model): class ExpressionLevel(models.Model):
id = models.AutoField(primary_key=True)
tissue = models.ForeignKey('Tissue', on_delete=models.CASCADE) tissue = models.ForeignKey('Tissue', on_delete=models.CASCADE)
protein = models.ForeignKey('Protein', on_delete=models.CASCADE) protein = models.ForeignKey('Protein', on_delete=models.CASCADE)
expression_level = models.FloatField() expression_level = models.FloatField()
...@@ -110,6 +116,7 @@ class ExpressionLevel(models.Model): ...@@ -110,6 +116,7 @@ class ExpressionLevel(models.Model):
class Tissue(models.Model): class Tissue(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=128, default='', unique=True) name = models.CharField(max_length=128, default='', unique=True)
def __str__(self): def __str__(self):
...@@ -117,6 +124,7 @@ class Tissue(models.Model): ...@@ -117,6 +124,7 @@ class Tissue(models.Model):
class Disorder(models.Model): class Disorder(models.Model):
id = models.AutoField(primary_key=True)
mondo_id = models.CharField(max_length=7) mondo_id = models.CharField(max_length=7)
label = models.CharField(max_length=256, default='') # symbol label = models.CharField(max_length=256, default='') # symbol
icd10 = models.CharField(max_length=512, default='') icd10 = models.CharField(max_length=512, default='')
...@@ -145,6 +153,7 @@ class Disorder(models.Model): ...@@ -145,6 +153,7 @@ class Disorder(models.Model):
class Drug(models.Model): class Drug(models.Model):
id = models.AutoField(primary_key=True)
drug_id = models.CharField(max_length=10, unique=True) drug_id = models.CharField(max_length=10, unique=True)
name = models.CharField(max_length=256, default='') name = models.CharField(max_length=256, default='')
status = models.CharField(max_length=128, default='') status = models.CharField(max_length=128, default='')
...@@ -172,6 +181,7 @@ class Drug(models.Model): ...@@ -172,6 +181,7 @@ class Drug(models.Model):
class ProteinDisorderAssociation(models.Model): class ProteinDisorderAssociation(models.Model):
id = models.BigAutoField(primary_key=True)
pdis_dataset = models.ForeignKey( pdis_dataset = models.ForeignKey(
'PDisDataset', null=True, on_delete=models.CASCADE, related_name='pdis_dataset_relation') 'PDisDataset', null=True, on_delete=models.CASCADE, related_name='pdis_dataset_relation')
protein = models.ForeignKey('Protein', on_delete=models.CASCADE) protein = models.ForeignKey('Protein', on_delete=models.CASCADE)
...@@ -195,6 +205,7 @@ class ProteinDisorderAssociation(models.Model): ...@@ -195,6 +205,7 @@ class ProteinDisorderAssociation(models.Model):
class DrugDisorderIndication(models.Model): class DrugDisorderIndication(models.Model):
id = models.AutoField(primary_key=True)
drdi_dataset = models.ForeignKey( drdi_dataset = models.ForeignKey(
'DrDiDataset', null=True, on_delete=models.CASCADE, related_name='drdi_dataset_relation') 'DrDiDataset', null=True, on_delete=models.CASCADE, related_name='drdi_dataset_relation')
drug = models.ForeignKey('Drug', on_delete=models.CASCADE) drug = models.ForeignKey('Drug', on_delete=models.CASCADE)
...@@ -217,6 +228,7 @@ class DrugDisorderIndication(models.Model): ...@@ -217,6 +228,7 @@ class DrugDisorderIndication(models.Model):
class ProteinProteinInteraction(models.Model): class ProteinProteinInteraction(models.Model):
id = models.BigAutoField(primary_key=True)
ppi_dataset = models.ForeignKey( ppi_dataset = models.ForeignKey(
'PPIDataset', null=True, on_delete=models.CASCADE, related_name='ppi_dataset_relation') 'PPIDataset', null=True, on_delete=models.CASCADE, related_name='ppi_dataset_relation')
from_protein = models.ForeignKey('Protein', on_delete=models.CASCADE, related_name='interacting_proteins_out') from_protein = models.ForeignKey('Protein', on_delete=models.CASCADE, related_name='interacting_proteins_out')
...@@ -255,6 +267,7 @@ class ProteinProteinInteraction(models.Model): ...@@ -255,6 +267,7 @@ class ProteinProteinInteraction(models.Model):
class ProteinDrugInteraction(models.Model): class ProteinDrugInteraction(models.Model):
id = models.BigAutoField(primary_key=True)
pdi_dataset = models.ForeignKey( pdi_dataset = models.ForeignKey(
PDIDataset, null=True, on_delete=models.CASCADE, related_name='pdi_dataset_relation') PDIDataset, null=True, on_delete=models.CASCADE, related_name='pdi_dataset_relation')
protein = models.ForeignKey('Protein', on_delete=models.CASCADE) protein = models.ForeignKey('Protein', on_delete=models.CASCADE)
...@@ -277,7 +290,7 @@ class ProteinDrugInteraction(models.Model): ...@@ -277,7 +290,7 @@ class ProteinDrugInteraction(models.Model):
class Task(models.Model): class Task(models.Model):
token = models.CharField(max_length=32, unique=True) token = models.CharField(max_length=32, unique=True, primary_key=True)
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
target = models.CharField(max_length=32, choices=[('drug', 'Drug'), ('drug-target', 'Drug Target')]) target = models.CharField(max_length=32, choices=[('drug', 'Drug'), ('drug-target', 'Drug Target')])
......
...@@ -451,7 +451,7 @@ def result_view(request) -> Response: ...@@ -451,7 +451,7 @@ def result_view(request) -> Response:
else: else:
keys = [] keys = []
response = HttpResponse(content_type='text/csv') response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = f'attachment; filename="{task.id}_{view}.csv"' response['Content-Disposition'] = f'attachment; filename="{task.token}_{view}.csv"'
dict_writer = csv.DictWriter(response, keys) dict_writer = csv.DictWriter(response, keys)
dict_writer.writeheader() dict_writer.writeheader()
dict_writer.writerows(items) dict_writer.writerows(items)
...@@ -466,6 +466,9 @@ def graph_export(request) -> Response: ...@@ -466,6 +466,9 @@ def graph_export(request) -> Response:
Recieve whole graph data and write it to graphml file. Return the Recieve whole graph data and write it to graphml file. Return the
file ready to download. file ready to download.
""" """
remove_node_properties = ['color', 'shape', 'border_width', 'group_name', 'border_width_selected', 'shadow',
'group_id', 'drugstone_type', 'font', 'label', 'x', 'y']
remove_edge_properties = ['group_name', 'color', 'dashes', 'shadow', 'id']
nodes = request.data.get('nodes', []) nodes = request.data.get('nodes', [])
edges = request.data.get('edges', []) edges = request.data.get('edges', [])
fmt = request.data.get('fmt', 'graphml') fmt = request.data.get('fmt', 'graphml')
...@@ -473,6 +476,9 @@ def graph_export(request) -> Response: ...@@ -473,6 +476,9 @@ def graph_export(request) -> Response:
node_map = dict() node_map = dict()
for node in nodes: for node in nodes:
# networkx does not support datatypes such as lists or dicts # networkx does not support datatypes such as lists or dicts
for prop in remove_node_properties:
if prop in node:
del node[prop]
for key in list(node.keys()): for key in list(node.keys()):
if isinstance(node[key], list) or isinstance(node[key], dict): if isinstance(node[key], list) or isinstance(node[key], dict):
node[key] = json.dumps(node[key]) node[key] = json.dumps(node[key])
...@@ -489,8 +495,12 @@ def graph_export(request) -> Response: ...@@ -489,8 +495,12 @@ def graph_export(request) -> Response:
node_name = node['drugstone_id'] node_name = node['drugstone_id']
G.add_node(node_name, **node) G.add_node(node_name, **node)
for e in edges: for e in edges:
# networkx does not support datatypes such as lists or dicts # networkx does not support datatypes such as lists or dicts
for prop in remove_edge_properties:
if prop in e:
del e[prop]
for key in e: for key in e:
if isinstance(e[key], list) or isinstance(e[key], dict): if isinstance(e[key], list) or isinstance(e[key], dict):
e[key] = json.dumps(e[key]) e[key] = json.dumps(e[key])
...@@ -509,23 +519,21 @@ def graph_export(request) -> Response: ...@@ -509,23 +519,21 @@ def graph_export(request) -> Response:
data = nx.readwrite.json_graph.node_link_data(G) data = nx.readwrite.json_graph.node_link_data(G)
del data['graph'] del data['graph']
del data['multigraph'] del data['multigraph']
remove_node_properties = ['color', 'shape', 'border_width', 'group_name', 'border_width_selected', 'shadow',
'group_id', 'drugstone_type', 'font'] # for node in data['nodes']:
remove_edge_properties = ['group_name', 'color', 'dashes', 'shadow', 'id'] # for prop in remove_node_properties:
for node in data['nodes']: # if prop in node:
for prop in remove_node_properties: # del node[prop]
if prop in node: # for edge in data['links']:
del node[prop] # for prop in remove_edge_properties:
for edge in data['links']: # if prop in edge:
for prop in remove_edge_properties: # del edge[prop]
if prop in edge:
del edge[prop]
data["edges"] = data.pop("links") data["edges"] = data.pop("links")
data = json.dumps(data) data = json.dumps(data)
data = data.replace('"{', '{').replace('}"', '}').replace('"[', '[').replace(']"', ']').replace('\\"', '"') data = data.replace('"{', '{').replace('}"', '}').replace('"[', '[').replace(']"', ']').replace('\\"', '"')
response = HttpResponse(data, content_type='application/json') response = HttpResponse(data, content_type='application/json')
elif fmt == 'csv': elif fmt == 'csv':
data = pd.DataFrame(nx.to_numpy_array(G), columns=G.nodes(), index=G.nodes()) data = pd.DataFrame(nx.to_numpy_array(G), columns=G.nodes(), index=G.nodes(), dtype=int)
response = HttpResponse(data.to_csv(), content_type='text/csv') response = HttpResponse(data.to_csv(), content_type='text/csv')
response['content-disposition'] = f'attachment; filename="{int(time.time())}_network.{fmt}"' response['content-disposition'] = f'attachment; filename="{int(time.time())}_network.{fmt}"'
......
asgiref==3.2.7 asgiref==3.5.2
celery==5.2.7
certifi==2020.6.20 certifi==2020.6.20
chardet==3.0.4 chardet==3.0.4
click==7.1.2 click==8.1.3
cryptography==38.0.3
decorator==4.4.2 decorator==4.4.2
Django==3.0.5 Django==3.2.16
django-cors-headers==3.4.0 django-cors-headers==3.4.0
django-redis==4.11.0 django-redis==4.11.0
django-rq-dashboard==0.3.3 django-rq-dashboard==0.3.3
djangorestframework==3.11.0 djangorestframework==3.11.2
djangorestframework-camel-case==1.1.2 djangorestframework-camel-case==1.1.2
entrypoints==0.3 entrypoints==0.3
flake8==3.7.9 flake8==3.7.9
flake8-quotes==3.0.0 flake8-quotes==3.0.0
idna==2.10 idna==2.10
mccabe==0.6.1 mccabe==0.6.1
networkx==2.2 networkx==2.8.8
numpy numpy==1.23.5
pandas pandas==1.3.5
pillow==9.3.0
psycopg2-binary==2.8.6 psycopg2-binary==2.8.6
pycodestyle==2.5.0 pycodestyle==2.5.0
pyflakes==2.1.1 pyflakes==2.1.1
python-dateutil==2.8.1 python-dateutil==2.8.1
pytz==2019.3 pytz==2021.3
redis==3.4.1 redis==3.5.3
requests requests==2.28.1
rq==1.3.0 rq==1.11.1
six==1.15.0 six==1.15.0
sqlparse==0.3.1
urllib3==1.25.10
sqlalchemy==1.3.23 sqlalchemy==1.3.23
celery==5.1.2 sqlparse==0.4.2
\ No newline at end of file urllib3==1.26.12
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment