django-to-galaxy 0.6.9.7__py3-none-any.whl → 0.6.9.9__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of django-to-galaxy might be problematic. Click here for more details.
- django_to_galaxy/admin/__init__.py +7 -1
- django_to_galaxy/admin/galaxy_user.py +21 -35
- django_to_galaxy/admin/utils.py +112 -0
- django_to_galaxy/admin/workflow.py +61 -6
- django_to_galaxy/api/serializers/create_dataset_collection.py +118 -0
- django_to_galaxy/api/serializers/create_history.py +6 -0
- django_to_galaxy/api/serializers/invocation.py +5 -0
- django_to_galaxy/api/serializers/invoke_workflow.py +4 -0
- django_to_galaxy/api/serializers/workflow.py +6 -0
- django_to_galaxy/api/urls.py +15 -0
- django_to_galaxy/api/views/create_dataset_collection.py +461 -0
- django_to_galaxy/api/views/create_history.py +3 -0
- django_to_galaxy/api/views/invocation.py +6 -1
- django_to_galaxy/api/views/invoke_workflow.py +23 -21
- django_to_galaxy/migrations/0011_rename__step_jobs_count_workflow__step_count_and_more.py +23 -0
- django_to_galaxy/migrations/0012_workflowinput_collection_type_and_more.py +136 -0
- django_to_galaxy/models/__init__.py +1 -1
- django_to_galaxy/models/accepted_input.py +113 -2
- django_to_galaxy/models/galaxy_instance.py +1 -1
- django_to_galaxy/models/invocation.py +41 -12
- django_to_galaxy/models/workflow.py +366 -30
- django_to_galaxy/version.py +1 -1
- {django_to_galaxy-0.6.9.7.dist-info → django_to_galaxy-0.6.9.9.dist-info}/METADATA +4 -3
- {django_to_galaxy-0.6.9.7.dist-info → django_to_galaxy-0.6.9.9.dist-info}/RECORD +26 -20
- {django_to_galaxy-0.6.9.7.dist-info → django_to_galaxy-0.6.9.9.dist-info}/WHEEL +1 -1
- {django_to_galaxy-0.6.9.7.dist-info → django_to_galaxy-0.6.9.9.dist-info/licenses}/LICENSE +0 -0
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
from bioblend.galaxy.objects import wrappers
|
|
2
2
|
from django.db import models
|
|
3
|
-
|
|
4
3
|
from .history import History
|
|
5
4
|
from .invocation import Invocation
|
|
6
5
|
from .galaxy_element import GalaxyElement
|
|
@@ -15,8 +14,8 @@ class Workflow(GalaxyElement):
|
|
|
15
14
|
"GalaxyUser", null=False, on_delete=models.CASCADE, related_name="workflows"
|
|
16
15
|
)
|
|
17
16
|
"""Galaxy user that owns the workflow."""
|
|
18
|
-
|
|
19
|
-
"""Number of
|
|
17
|
+
_step_count = models.PositiveIntegerField(default=0)
|
|
18
|
+
"""Number of steps in the workflow."""
|
|
20
19
|
_is_meta = models.BooleanField(null=True, default=None, blank=True)
|
|
21
20
|
"""Indicates whether the workflow is a meta (i.e., has sub-workflows) or not."""
|
|
22
21
|
|
|
@@ -43,35 +42,372 @@ class Workflow(GalaxyElement):
|
|
|
43
42
|
self.save(update_fields=["_is_meta"])
|
|
44
43
|
return self._is_meta
|
|
45
44
|
|
|
46
|
-
def
|
|
45
|
+
def get_step_count(self):
|
|
47
46
|
"""Sets / returns _step_jobs_count value."""
|
|
48
|
-
if self.
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
47
|
+
if self._step_count == 0:
|
|
48
|
+
self._step_count = len(self.galaxy_workflow.steps)
|
|
49
|
+
self.save(update_fields=["_step_count"])
|
|
50
|
+
return self._step_count
|
|
51
|
+
|
|
52
|
+
def _get_tool_input(self, tool_label, tool):
|
|
53
|
+
"""
|
|
54
|
+
Retrieve a specific tool input dictionary from a Galaxy tool definition.
|
|
55
|
+
|
|
56
|
+
This method navigates the nested structure of a tool's inputs or conditional cases
|
|
57
|
+
to locate the input corresponding to `tool_label`. It supports labels that reference
|
|
58
|
+
nested inputs using a "|" separator.
|
|
59
|
+
|
|
60
|
+
Args:
|
|
61
|
+
tool_label (str): The label of the input to retrieve. Can be a simple label
|
|
62
|
+
or a nested label separated by "|", e.g. "param_group|param_name".
|
|
63
|
+
tool (dict): The tool definition dictionary returned by Galaxy
|
|
64
|
+
(from gi.tools.show_tool),
|
|
65
|
+
which may contain:
|
|
66
|
+
- "inputs": a list of input dictionaries
|
|
67
|
+
- "cases": a list of conditional input cases
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
dict: The dictionary representing the requested input, including all its parameters.
|
|
71
|
+
If the input cannot be found, raises a ValueError or returns the original `tool`
|
|
72
|
+
if it has no matching inputs/cases.
|
|
73
|
+
|
|
74
|
+
Raises:
|
|
75
|
+
ValueError: If the target input cannot be found when navigating a nested label.
|
|
76
|
+
|
|
77
|
+
Notes:
|
|
78
|
+
- Nested labels separated by "|" are resolved recursively.
|
|
79
|
+
- Handles both regular "inputs" and conditional "cases".
|
|
80
|
+
- If no inputs or cases match the label, the original `tool` dictionary is returned
|
|
81
|
+
(for non-nested top-level tool access).
|
|
82
|
+
|
|
83
|
+
Example:
|
|
84
|
+
tool = {
|
|
85
|
+
"inputs": [{"name": "param1", "type": "text"},
|
|
86
|
+
{"name": "param2", "type": "integer"}]
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
_get_tool_input("param1", tool)
|
|
90
|
+
# Returns: {"name": "param1", "type": "text"}
|
|
91
|
+
|
|
92
|
+
tool = {
|
|
93
|
+
"cases": [{"inputs": [{"name": "choice1", "type": "text"}]}]
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
_get_tool_input("choice1", tool)
|
|
97
|
+
# Returns: {"name": "choice1", "type": "text"}
|
|
98
|
+
"""
|
|
99
|
+
if "|" in tool_label:
|
|
100
|
+
first, tool_label = tool_label.split("|", maxsplit=1)
|
|
101
|
+
if "inputs" in tool.keys():
|
|
102
|
+
for x in tool["inputs"]:
|
|
103
|
+
if x["name"] == first:
|
|
104
|
+
return self._get_tool_input(tool_label, x)
|
|
105
|
+
elif "cases" in tool.keys():
|
|
106
|
+
for x in tool["cases"]:
|
|
107
|
+
if x["inputs"]:
|
|
108
|
+
if x["inputs"][0]["name"] == first:
|
|
109
|
+
return self._get_tool_input(tool_label, x["inputs"][0])
|
|
110
|
+
else:
|
|
111
|
+
raise ValueError(
|
|
112
|
+
f"Cannot find the target tool from this tool label: {tool_label}."
|
|
113
|
+
)
|
|
114
|
+
else:
|
|
115
|
+
if "inputs" in tool.keys():
|
|
116
|
+
for x in tool["inputs"]:
|
|
117
|
+
if x["name"] == tool_label:
|
|
118
|
+
return x
|
|
119
|
+
elif "cases" in tool.keys():
|
|
120
|
+
for x in tool["cases"]:
|
|
121
|
+
if x["inputs"]:
|
|
122
|
+
if x["inputs"][0]["name"] == tool_label:
|
|
123
|
+
return x["inputs"][0]
|
|
66
124
|
else:
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
125
|
+
return tool
|
|
126
|
+
|
|
127
|
+
def _get_subworkflow_inputs(self, gi, input_mapping):
|
|
128
|
+
"""
|
|
129
|
+
Recursively retrieve input information from subworkflows linked to a parameter input.
|
|
130
|
+
|
|
131
|
+
This private method inspects the subworkflow referenced in `input_mapping["target_subwf"]`
|
|
132
|
+
and updates the mapping with tools or nested subworkflows that consume the input.
|
|
133
|
+
It handles multiple levels of nested subworkflows recursively.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
gi (GalaxyInstance): The Galaxy instance object (typically
|
|
137
|
+
`self.galaxy_owner.obj_gi.gi`) used to query workflows and tool details.
|
|
138
|
+
input_mapping (dict): A dictionary representing a single parameter input.
|
|
139
|
+
It must contain:
|
|
140
|
+
- `has_subwf` (bool): True if the input is consumed by a subworkflow.
|
|
141
|
+
- `target_subwf` (dict): Information about the first subworkflow that consumes
|
|
142
|
+
the input:
|
|
143
|
+
- `workflow_id` (str): ID of the subworkflow
|
|
144
|
+
- `input_name` (str): Name of the input in the subworkflow
|
|
145
|
+
- `target_tools` (list): List of tools that consume the input (will be updated)
|
|
146
|
+
- `has_tool` (bool): Flag indicating whether a tool consumes the input (may be
|
|
147
|
+
updated)
|
|
148
|
+
|
|
149
|
+
Returns:
|
|
150
|
+
dict: The updated `input_mapping` with:
|
|
151
|
+
- `target_tools` populated with tools consuming the input from the subworkflow
|
|
152
|
+
- `target_subwf` updated if nested subworkflows exist
|
|
153
|
+
- `has_subwf` set to False once all subworkflow inputs have been resolved
|
|
154
|
+
|
|
155
|
+
Notes:
|
|
156
|
+
- This function uses recursion to traverse multiple levels of nested subworkflows.
|
|
157
|
+
- It only processes the first subworkflow consuming the input at each level.
|
|
158
|
+
- The function distinguishes between steps of type `"tool"` and `"subworkflow"`.
|
|
159
|
+
|
|
160
|
+
Example:
|
|
161
|
+
Before:
|
|
162
|
+
{
|
|
163
|
+
"label": "Parameter X",
|
|
164
|
+
"type": "parameter_input",
|
|
165
|
+
"target_tools": [],
|
|
166
|
+
"target_subwf": {"input_name": "sub_input", "workflow_id": "wf_123"},
|
|
167
|
+
"has_subwf": True
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
After:
|
|
171
|
+
{
|
|
172
|
+
"label": "Parameter X",
|
|
173
|
+
"type": "parameter_input",
|
|
174
|
+
"target_tools": [
|
|
175
|
+
{"input_name": "param1", "tool_id": "tool_456"}
|
|
176
|
+
],
|
|
177
|
+
"target_subwf": None,
|
|
178
|
+
"has_subwf": False
|
|
179
|
+
}
|
|
180
|
+
"""
|
|
181
|
+
|
|
182
|
+
if not input_mapping["has_subwf"]:
|
|
183
|
+
return input_mapping
|
|
184
|
+
|
|
185
|
+
subworkflow_id = input_mapping["target_subwf"]["workflow_id"]
|
|
186
|
+
input_label = input_mapping["target_subwf"]["input_name"]
|
|
187
|
+
|
|
188
|
+
# Get the subworkflow information
|
|
189
|
+
data = gi.workflows.show_workflow(subworkflow_id, instance=True)
|
|
190
|
+
|
|
191
|
+
input_keys = {v["label"]: k for k, v in data["inputs"].items()}
|
|
192
|
+
steps = data["steps"]
|
|
193
|
+
source_id = str(steps[input_keys[input_label]]["id"])
|
|
194
|
+
|
|
195
|
+
step_ids = list(steps.keys())
|
|
196
|
+
|
|
197
|
+
for step_id in step_ids:
|
|
198
|
+
input_steps = steps[step_id].get("input_steps", {})
|
|
199
|
+
for input_name, input_details in input_steps.items():
|
|
200
|
+
if str(input_details.get("source_step")) == source_id:
|
|
201
|
+
if steps[step_id].get("type") == "tool":
|
|
202
|
+
input_mapping["target_tools"].append(
|
|
203
|
+
{
|
|
204
|
+
"input_name": input_name,
|
|
205
|
+
"tool_id": steps[step_id]["tool_id"],
|
|
206
|
+
}
|
|
207
|
+
)
|
|
208
|
+
input_mapping["has_subwf"] = False
|
|
209
|
+
|
|
210
|
+
elif steps[step_id].get("type") == "subworkflow":
|
|
211
|
+
if not input_mapping["has_subwf"]:
|
|
212
|
+
input_mapping["target_subwf"] = {
|
|
213
|
+
"input_name": input_name,
|
|
214
|
+
"workflow_id": steps[step_id]["workflow_id"],
|
|
215
|
+
}
|
|
216
|
+
input_mapping["has_subwf"] = True
|
|
217
|
+
|
|
218
|
+
return self._get_subworkflow_inputs(gi, input_mapping)
|
|
219
|
+
|
|
220
|
+
def get_workflow_inputs(self):
|
|
221
|
+
"""
|
|
222
|
+
Retrieve detailed information about all inputs of a Galaxy workflow.
|
|
223
|
+
|
|
224
|
+
This method processes a `Workflow` instance from `django-to-galaxy` and returns
|
|
225
|
+
a dictionary describing each input, whether it is a `data_input` or a `parameter_input`.
|
|
226
|
+
|
|
227
|
+
For each input, the returned information includes:
|
|
228
|
+
- `label`: the human-readable label of the input
|
|
229
|
+
- `type`: the type of input (`data_input` or `parameter_input`)
|
|
230
|
+
- `tool_inputs`: the dictionary of tool inputs associated with the step
|
|
231
|
+
- `target_tools`: for parameter inputs, a list of tools that consume this input
|
|
232
|
+
- Each entry includes:
|
|
233
|
+
- `input_name`: the name of the input in the target tool
|
|
234
|
+
- `tool_id`: the Galaxy ID of the tool
|
|
235
|
+
- `tool_input`: the detailed tool input specification (retrieved later)
|
|
236
|
+
- `target_subwf`: for parameter inputs, the first subworkflow that consumes this input
|
|
237
|
+
- Includes:
|
|
238
|
+
- `input_name`: the name of the input in the subworkflow
|
|
239
|
+
- `workflow_id`: the ID of the subworkflow
|
|
240
|
+
- `has_tool`: boolean flag indicating if any tool consumes this input
|
|
241
|
+
- `has_subwf`: boolean flag indicating if any subworkflow consumes this input
|
|
242
|
+
|
|
243
|
+
The function also handles nested subworkflows and retrieves input information
|
|
244
|
+
for subworkflow parameters using `_get_subworkflow_inputs`. Tool-specific input
|
|
245
|
+
details are retrieved using `_get_tool_input`.
|
|
246
|
+
|
|
247
|
+
Args:
|
|
248
|
+
self: A workflow wrapper instance containing:
|
|
249
|
+
- `self.galaxy_workflow`: the Galaxy workflow object
|
|
250
|
+
- `self.galaxy_owner.obj_gi.gi`: Galaxy instance handle
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
dict: A mapping of input IDs to detailed information, for example:
|
|
254
|
+
|
|
255
|
+
{
|
|
256
|
+
"0": {
|
|
257
|
+
"label": "Input dataset",
|
|
258
|
+
"type": "data_input",
|
|
259
|
+
"tool_inputs": {...},
|
|
260
|
+
},
|
|
261
|
+
"1": {
|
|
262
|
+
"label": "Threshold",
|
|
263
|
+
"type": "parameter_input",
|
|
264
|
+
"tool_inputs": {...},
|
|
265
|
+
"target_tools": [
|
|
266
|
+
{
|
|
267
|
+
"input_name": "param1",
|
|
268
|
+
"tool_id": "toolshed.g2.bx.psu.edu/repos/.../tool/1",
|
|
269
|
+
"tool_input": {...},
|
|
270
|
+
}
|
|
271
|
+
],
|
|
272
|
+
"target_subwf": {
|
|
273
|
+
"input_name": "subwf_input",
|
|
274
|
+
"workflow_id": "wf_123",
|
|
275
|
+
},
|
|
276
|
+
"has_tool": True,
|
|
277
|
+
"has_subwf": True,
|
|
278
|
+
},
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
Known caveats:
|
|
282
|
+
- Cannot retrieve the tool input if the tool has sections (e.g., `tooldistillator`
|
|
283
|
+
tool).
|
|
284
|
+
- Only the first subworkflow consuming a parameter input is inspected.
|
|
285
|
+
|
|
286
|
+
"""
|
|
287
|
+
gi = self.galaxy_owner.obj_gi.gi
|
|
288
|
+
|
|
289
|
+
inputs = self.galaxy_workflow.inputs
|
|
290
|
+
steps = self.galaxy_workflow.steps
|
|
291
|
+
steps = {k: v.wrapped for k, v in steps.items()}
|
|
292
|
+
steps_ids = list(steps.keys())
|
|
293
|
+
|
|
294
|
+
# Initialization
|
|
295
|
+
input_mapping = {}
|
|
296
|
+
parameter_input_ids = []
|
|
297
|
+
|
|
298
|
+
for input_id, input_dict in inputs.items():
|
|
299
|
+
input_mapping[input_id] = {}
|
|
300
|
+
input_mapping[input_id]["label"] = input_dict["label"]
|
|
301
|
+
input_mapping[input_id]["type"] = steps[input_id]["type"]
|
|
302
|
+
input_mapping[input_id]["tool_inputs"] = steps[input_id]["tool_inputs"]
|
|
303
|
+
|
|
304
|
+
if steps[input_id]["type"] == "parameter_input":
|
|
305
|
+
parameter_input_ids.append(input_id)
|
|
306
|
+
steps_ids.remove(input_id)
|
|
307
|
+
input_mapping[input_id]["target_tools"] = []
|
|
308
|
+
input_mapping[input_id]["target_subwf"] = None
|
|
309
|
+
input_mapping[input_id]["has_tool"] = False
|
|
310
|
+
input_mapping[input_id]["has_subwf"] = False
|
|
311
|
+
|
|
312
|
+
for target_id in parameter_input_ids:
|
|
313
|
+
for step_id in steps_ids:
|
|
314
|
+
input_steps = steps[step_id].get("input_steps", {})
|
|
315
|
+
for input_name, input_details in input_steps.items():
|
|
316
|
+
if input_details.get("source_step") == target_id:
|
|
317
|
+
if steps[step_id].get("type") == "tool":
|
|
318
|
+
input_mapping[target_id]["target_tools"].append(
|
|
319
|
+
{
|
|
320
|
+
"input_name": input_name,
|
|
321
|
+
"tool_id": steps[step_id]["tool_id"],
|
|
322
|
+
}
|
|
323
|
+
)
|
|
324
|
+
input_mapping[target_id]["has_tool"] = True
|
|
325
|
+
elif steps[step_id].get("type") == "subworkflow":
|
|
326
|
+
if not input_mapping[target_id]["has_subwf"]:
|
|
327
|
+
input_mapping[target_id]["target_subwf"] = {
|
|
328
|
+
"input_name": input_name,
|
|
329
|
+
"workflow_id": steps[step_id]["workflow_id"],
|
|
330
|
+
}
|
|
331
|
+
input_mapping[target_id]["has_subwf"] = True
|
|
332
|
+
|
|
333
|
+
# Then search for subworkflows
|
|
334
|
+
# For each input just search in the first subworkflow to get the parameters information
|
|
335
|
+
for k in input_mapping.keys():
|
|
336
|
+
if "target_subwf" in input_mapping[k].keys():
|
|
337
|
+
input_mapping[k] = self._get_subworkflow_inputs(gi, input_mapping[k])
|
|
338
|
+
|
|
339
|
+
# Then search input information in tools
|
|
340
|
+
for k in input_mapping.keys():
|
|
341
|
+
if "target_tools" in input_mapping[k].keys():
|
|
342
|
+
for kk in input_mapping[k]["target_tools"]:
|
|
343
|
+
tool_label = kk["input_name"]
|
|
344
|
+
tool = gi.tools.show_tool(
|
|
345
|
+
kk["tool_id"],
|
|
346
|
+
io_details=True,
|
|
347
|
+
link_details=True,
|
|
348
|
+
)
|
|
349
|
+
kk["tool_input"] = self._get_tool_input(tool_label, tool)
|
|
350
|
+
|
|
351
|
+
return input_mapping
|
|
352
|
+
|
|
353
|
+
def get_workflow_datamap_template(self):
|
|
354
|
+
"""
|
|
355
|
+
Generate a template of the datamap required to invoke a Galaxy workflow.
|
|
356
|
+
|
|
357
|
+
This method inspects the workflow's inputs and steps, and constructs:
|
|
358
|
+
1. `input_mapping`: a dictionary describing each input, including its label and type.
|
|
359
|
+
2. `datamap_template`: a dictionary with default placeholders for input values
|
|
360
|
+
suitable for workflow invocation.
|
|
361
|
+
|
|
362
|
+
Input types are handled as follows:
|
|
363
|
+
- "parameter_input": the parameter type from the tool inputs is returned as default.
|
|
364
|
+
- "data_input": a dictionary with {"id": "", "src": "hda"}.
|
|
365
|
+
- "data_collection_input": a dictionary with {"id": "", "src": "hdca"}.
|
|
366
|
+
|
|
367
|
+
Returns:
|
|
368
|
+
dict: A dictionary containing two keys:
|
|
369
|
+
- "input_mapping" (dict): maps input IDs to dictionaries with:
|
|
370
|
+
- "label": human-readable label of the input
|
|
371
|
+
- "type": type of input ("parameter_input", "data_input", or
|
|
372
|
+
"data_collection_input")
|
|
373
|
+
- "datamap_template" (dict): maps input IDs to default values/placeholders
|
|
374
|
+
appropriate for workflow invocation.
|
|
375
|
+
|
|
376
|
+
Example:
|
|
377
|
+
{
|
|
378
|
+
"input_mapping": {
|
|
379
|
+
"0": {"label": "Input dataset", "type": "data_input"},
|
|
380
|
+
"1": {"label": "Threshold", "type": "parameter_input"}
|
|
381
|
+
},
|
|
382
|
+
"datamap_template": {
|
|
383
|
+
"0": {"id": "", "src": "hda"},
|
|
384
|
+
"1": "integer"
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
"""
|
|
388
|
+
|
|
389
|
+
inputs = self.galaxy_workflow.inputs
|
|
390
|
+
steps = self.galaxy_workflow.steps
|
|
391
|
+
steps = {k: v.wrapped for k, v in steps.items()}
|
|
392
|
+
|
|
393
|
+
input_mapping = {}
|
|
394
|
+
datamap_template = {}
|
|
395
|
+
|
|
396
|
+
for input_id, input_dict in inputs.items():
|
|
397
|
+
input_mapping[input_id] = {}
|
|
398
|
+
input_mapping[input_id]["label"] = input_dict["label"]
|
|
399
|
+
input_mapping[input_id]["type"] = steps[input_id]["type"]
|
|
400
|
+
|
|
401
|
+
if steps[input_id]["type"] == "parameter_input":
|
|
402
|
+
datamap_template[input_id] = steps[input_id]["tool_inputs"][
|
|
403
|
+
"parameter_type"
|
|
404
|
+
]
|
|
405
|
+
elif steps[input_id]["type"] == "data_input":
|
|
406
|
+
datamap_template[input_id] = {"id": "", "src": "hda"}
|
|
407
|
+
elif steps[input_id]["type"] == "data_collection_input":
|
|
408
|
+
datamap_template[input_id] = {"id": "", "src": "hdca"}
|
|
409
|
+
|
|
410
|
+
return {"input_mapping": input_mapping, "datamap_template": datamap_template}
|
|
75
411
|
|
|
76
412
|
def invoke(self, datamap: dict, history: History) -> wrappers.Invocation:
|
|
77
413
|
"""
|
django_to_galaxy/version.py
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: django-to-galaxy
|
|
3
|
-
Version: 0.6.9.
|
|
3
|
+
Version: 0.6.9.9
|
|
4
4
|
Summary: Django extension that eases communication with Galaxy instance to execute workflows.
|
|
5
|
+
License-File: LICENSE
|
|
5
6
|
Author: Kenzo-Hugo Hillion
|
|
6
7
|
Author-email: hillion.kenzo@posteo.net
|
|
7
8
|
Requires-Python: ==3.11.*
|
|
@@ -9,7 +10,7 @@ Classifier: Programming Language :: Python :: 3
|
|
|
9
10
|
Classifier: Programming Language :: Python :: 3.11
|
|
10
11
|
Requires-Dist: Django (>=5.1.1,<6.0.0)
|
|
11
12
|
Requires-Dist: Markdown (>=3.3.6,<4.0.0)
|
|
12
|
-
Requires-Dist: bioblend (>=
|
|
13
|
+
Requires-Dist: bioblend (>=1.6.0,<2.0.0)
|
|
13
14
|
Requires-Dist: djangorestframework (>=3.13.1,<4.0.0)
|
|
14
15
|
Requires-Dist: pydantic (>=2.11.0,<3.0.0)
|
|
15
16
|
Requires-Dist: pydantic-settings (>=2.9.0,<3.0.0)
|
|
@@ -1,31 +1,35 @@
|
|
|
1
1
|
django_to_galaxy/__init__.py,sha256=AhKSvRLP6ebhka2N98a_DZwxHjwwhJWOuN8cFSF2mL0,41
|
|
2
|
-
django_to_galaxy/admin/__init__.py,sha256=
|
|
2
|
+
django_to_galaxy/admin/__init__.py,sha256=tF8RkdbcrOIvoVFL4-MW_ecRDaeRZYzKItnUJgns7UI,489
|
|
3
3
|
django_to_galaxy/admin/galaxy_element.py,sha256=pDdFWQO5BHt251kIW8Gawe0M0O8r5z4cI6EJqQsDBqI,159
|
|
4
4
|
django_to_galaxy/admin/galaxy_instance.py,sha256=yVlbA5fVbMQBKyKwaFJM3CRFQ2HDjzYHsni_l8MBndU,834
|
|
5
5
|
django_to_galaxy/admin/galaxy_output_file.py,sha256=bnpwlAH8cQe6nkWIln8iSFDtVyr0kqI5P-QNbISWCfE,2321
|
|
6
|
-
django_to_galaxy/admin/galaxy_user.py,sha256=
|
|
6
|
+
django_to_galaxy/admin/galaxy_user.py,sha256=eNnEtYrcLL8guBKGEM6aJy07pPYgLnA-ZQoisSBGutA,6413
|
|
7
7
|
django_to_galaxy/admin/history.py,sha256=eVN-ZCAju0_1ygeSnHEie3a7iy7LoW3bOhWQyU20XTw,2562
|
|
8
8
|
django_to_galaxy/admin/invocation.py,sha256=Rgtkyyl2WrDZN-fF_u5lPlicGe341UGwBMbI06nZG78,4821
|
|
9
9
|
django_to_galaxy/admin/tag.py,sha256=jqQ64sLieq4CSRFHesNt33SqTNnA-z3oiQuj7Ncx_jU,315
|
|
10
|
-
django_to_galaxy/admin/
|
|
10
|
+
django_to_galaxy/admin/utils.py,sha256=2xc7BUS4mtWOeJh_5vHYhxWC6p38fmf-6DsR0Kbq19I,4878
|
|
11
|
+
django_to_galaxy/admin/workflow.py,sha256=HNDz9VA9EQciJo7tMTtkWSFWKoXN2NFTq_hh_rWqZ74,3269
|
|
11
12
|
django_to_galaxy/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
12
13
|
django_to_galaxy/api/serializers/asymetricslugrelatedfield.py,sha256=BKdbkblCA5PKodsBqgwg6W_gTSrrmoGBElh_CNVd7dY,1079
|
|
14
|
+
django_to_galaxy/api/serializers/create_dataset_collection.py,sha256=Saq1kiyAlSncUF6D6VDOZxOf7bC6tz0WaEHva6MFW1I,4210
|
|
15
|
+
django_to_galaxy/api/serializers/create_history.py,sha256=Qw1lktZ3yqUjT--rlJfw4vBAeWu905uQKjDEPoFu7KY,179
|
|
13
16
|
django_to_galaxy/api/serializers/galaxy_instance.py,sha256=r_W9seqc2afc3tFrsWTyZ50-CThsHXutO7TwhYFnyXE,257
|
|
14
17
|
django_to_galaxy/api/serializers/galaxy_output_file.py,sha256=3aY033EY0BXKC850_ekHsEOBz7JU9JGAihbbt5sGbzI,428
|
|
15
18
|
django_to_galaxy/api/serializers/galaxy_user.py,sha256=WkFT6U8f3emtou4M3tNhdGKE2xxADmxqXqKPGJxOmPg,674
|
|
16
19
|
django_to_galaxy/api/serializers/history.py,sha256=u1PAbJky4bT6r1m2bkSEX9Elm8NKlS-f6NYuyErPXx8,387
|
|
17
|
-
django_to_galaxy/api/serializers/invocation.py,sha256=
|
|
18
|
-
django_to_galaxy/api/serializers/invoke_workflow.py,sha256=
|
|
20
|
+
django_to_galaxy/api/serializers/invocation.py,sha256=HSSzRvGWccHyegQoOTzQ4fwONfuBgDPtC1QF3zK2peg,588
|
|
21
|
+
django_to_galaxy/api/serializers/invoke_workflow.py,sha256=cACnyGoz32N9GakIQLvn_rjpV3cQP1JpzBY-xSVaouM,747
|
|
19
22
|
django_to_galaxy/api/serializers/upload_to_history.py,sha256=eXDx4oN4y_-8Ncz8ht7_Sh85XgSCc7yl2EKv0pIEGIc,883
|
|
20
|
-
django_to_galaxy/api/serializers/workflow.py,sha256=
|
|
21
|
-
django_to_galaxy/api/urls.py,sha256=
|
|
22
|
-
django_to_galaxy/api/views/
|
|
23
|
+
django_to_galaxy/api/serializers/workflow.py,sha256=B6pcQGOUL2uiyB7tzgoTn3YiCyPvvqVaAAPkODFufYk,1279
|
|
24
|
+
django_to_galaxy/api/urls.py,sha256=ytI71MZHwmzjbyGBKbngV0APuiULOtdu3bCbHzCcVk0,2273
|
|
25
|
+
django_to_galaxy/api/views/create_dataset_collection.py,sha256=7lb3AIY5OD1AdjMEHnPJyWjC60Lo2cvFq1UsbDBiuNk,17054
|
|
26
|
+
django_to_galaxy/api/views/create_history.py,sha256=z0W_kUlhj8qKLEz0mSDRAcVpwec1ATcys16U0dP3CX0,912
|
|
23
27
|
django_to_galaxy/api/views/galaxy_instance.py,sha256=T5oiWN5TxCaX3u6z5xMhpX8OU7n7ECw_EpFqMxSEQHo,434
|
|
24
28
|
django_to_galaxy/api/views/galaxy_output_file.py,sha256=wW5H3aJTbtBKVDMU9Cdxz7P51mHEe8UF9WkNu5zlcjI,439
|
|
25
29
|
django_to_galaxy/api/views/galaxy_user.py,sha256=IftbePXtjxZUWpJc6oq5rvdmHyyUjeztX_eDobnXg2w,420
|
|
26
30
|
django_to_galaxy/api/views/history.py,sha256=4uxxNyX3ib4XW56N0FjYbjK-Sd4wbTN_H3mgWjB3i_Q,394
|
|
27
|
-
django_to_galaxy/api/views/invocation.py,sha256=
|
|
28
|
-
django_to_galaxy/api/views/invoke_workflow.py,sha256=
|
|
31
|
+
django_to_galaxy/api/views/invocation.py,sha256=l_PLtS9-RyZ89zpv3FietiMbqKc2GbPx43Gz6gJT5N4,1489
|
|
32
|
+
django_to_galaxy/api/views/invoke_workflow.py,sha256=fUkvuyDsVfs2Ti2LxfhLopBBLkVXZZq8wjoXTvRW7rk,6814
|
|
29
33
|
django_to_galaxy/api/views/upload_to_history.py,sha256=fojku4GXVGLgTJazmLKRAZ080k9WyYreALYxyZL39as,2972
|
|
30
34
|
django_to_galaxy/api/views/workflow.py,sha256=WVFsz1twA5k7poSf63p8BiXSY3cMGVq4lgvhq5m8YbE,401
|
|
31
35
|
django_to_galaxy/apps.py,sha256=GuXJ0ZJqGYUBUQ1BlC2clknp_QToXdPtFwiN6SaGfaI,143
|
|
@@ -39,24 +43,26 @@ django_to_galaxy/migrations/0007_format_alter_history_tags_alter_workflow_tags_a
|
|
|
39
43
|
django_to_galaxy/migrations/0008_workflowinput_label.py,sha256=UisIOkD73J2dgQXB12eU91g8c9nTkQdHEy111nObN7c,481
|
|
40
44
|
django_to_galaxy/migrations/0009_galaxyoutputfile_unique_galaxy_id_per_invocation.py,sha256=a3zgC01TVtUeuTlISOe4vZ-oJj1opIMkN_8UIvFFjvc,500
|
|
41
45
|
django_to_galaxy/migrations/0010_workflow__is_meta_workflow__step_jobs_count.py,sha256=rESj9tXHrhRdN0V-kc11VSvIwL-TN6sVR3B9zYpaX3w,608
|
|
46
|
+
django_to_galaxy/migrations/0011_rename__step_jobs_count_workflow__step_count_and_more.py,sha256=_mkNLEMwRAR4vZ7HI0YGRaCcgq2S2xIsMJyjycE9Dc0,604
|
|
47
|
+
django_to_galaxy/migrations/0012_workflowinput_collection_type_and_more.py,sha256=YI4icCvELdOSrOi4yiuER4il_a6yWE91H9w0IWUHeJ8,4686
|
|
42
48
|
django_to_galaxy/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
|
-
django_to_galaxy/models/__init__.py,sha256=
|
|
44
|
-
django_to_galaxy/models/accepted_input.py,sha256=
|
|
49
|
+
django_to_galaxy/models/__init__.py,sha256=iaaRei8NryPUQzSv5dlr0eT_D_wi5jfGqyXJxki2-yw,395
|
|
50
|
+
django_to_galaxy/models/accepted_input.py,sha256=VjXTrzoR95M49LXXKP55dFxBBIjv07_VYTtarscH__s,4117
|
|
45
51
|
django_to_galaxy/models/galaxy_element.py,sha256=55qUtUks-rC4A7O1DFjeUUm-AN0-qNmbCR7yTBKHDd4,1537
|
|
46
|
-
django_to_galaxy/models/galaxy_instance.py,sha256=
|
|
52
|
+
django_to_galaxy/models/galaxy_instance.py,sha256=GPRj8ZSTfviY824j7TQbaMTeHjZPVtoC3GtMlbLIPb0,725
|
|
47
53
|
django_to_galaxy/models/galaxy_output_file.py,sha256=oAq7HZBk3svG88NagFpkpiB5TQoncbpGFxCCTFoCzyo,1915
|
|
48
54
|
django_to_galaxy/models/galaxy_user.py,sha256=Cz6wmyD3PvltFi2yKEKr2z7YTsxlmnNV8xwA0Gltu_o,3264
|
|
49
55
|
django_to_galaxy/models/history.py,sha256=-u0DDrwsNprYf-CMAut4q5eu2IzWXXLoKmuBpac7DKs,2647
|
|
50
|
-
django_to_galaxy/models/invocation.py,sha256=
|
|
51
|
-
django_to_galaxy/models/workflow.py,sha256=
|
|
56
|
+
django_to_galaxy/models/invocation.py,sha256=rUlec3a-xmzOTN7shp9W21hMJ_-eag2MuhwSzIAda3o,9589
|
|
57
|
+
django_to_galaxy/models/workflow.py,sha256=g-iGJYV98oSQIiUFuRVq-wuUggdKeEeTujzyWnCoimg,19038
|
|
52
58
|
django_to_galaxy/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
59
|
django_to_galaxy/schemas/dataset.py,sha256=yjwLJGb487VJDXoXGg8fG_TW6TJPeyeGtd9vofU-7HI,396
|
|
54
60
|
django_to_galaxy/settings.py,sha256=5obYQz55omr6_tfaO3ap_K7LmWvFcljv2UAL82SvL8s,152
|
|
55
61
|
django_to_galaxy/templates/admin/import_workflows.html,sha256=YB101H99EOR8td_DzfNshhJYpXpGD9aJNh8t4mKPgEQ,2389
|
|
56
62
|
django_to_galaxy/urls.py,sha256=ydMl_0qSyz8GSGkWpiSzU3khqj9mPyZacx532JybLHk,106
|
|
57
63
|
django_to_galaxy/utils.py,sha256=gjUzzqfpili66CY7vFyseqHOD9vqWg_2tzWAiTe3pNE,1625
|
|
58
|
-
django_to_galaxy/version.py,sha256=
|
|
59
|
-
django_to_galaxy-0.6.9.
|
|
60
|
-
django_to_galaxy-0.6.9.
|
|
61
|
-
django_to_galaxy-0.6.9.
|
|
62
|
-
django_to_galaxy-0.6.9.
|
|
64
|
+
django_to_galaxy/version.py,sha256=hc6D3D7d7CH_5niesJqbDN_miEaddZArCcDxfM71IZk,114
|
|
65
|
+
django_to_galaxy-0.6.9.9.dist-info/METADATA,sha256=Sx_e_YqkCZvBzHg3NB6nHNGONkCE2S9rspiBwqklxGU,683
|
|
66
|
+
django_to_galaxy-0.6.9.9.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
67
|
+
django_to_galaxy-0.6.9.9.dist-info/licenses/LICENSE,sha256=Er3Bp2y6Wf31e0s1-Tdu_d6Gd89FtTizmGUJzGQkWvo,34498
|
|
68
|
+
django_to_galaxy-0.6.9.9.dist-info/RECORD,,
|
|
File without changes
|