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.

Files changed (26) hide show
  1. django_to_galaxy/admin/__init__.py +7 -1
  2. django_to_galaxy/admin/galaxy_user.py +21 -35
  3. django_to_galaxy/admin/utils.py +112 -0
  4. django_to_galaxy/admin/workflow.py +61 -6
  5. django_to_galaxy/api/serializers/create_dataset_collection.py +118 -0
  6. django_to_galaxy/api/serializers/create_history.py +6 -0
  7. django_to_galaxy/api/serializers/invocation.py +5 -0
  8. django_to_galaxy/api/serializers/invoke_workflow.py +4 -0
  9. django_to_galaxy/api/serializers/workflow.py +6 -0
  10. django_to_galaxy/api/urls.py +15 -0
  11. django_to_galaxy/api/views/create_dataset_collection.py +461 -0
  12. django_to_galaxy/api/views/create_history.py +3 -0
  13. django_to_galaxy/api/views/invocation.py +6 -1
  14. django_to_galaxy/api/views/invoke_workflow.py +23 -21
  15. django_to_galaxy/migrations/0011_rename__step_jobs_count_workflow__step_count_and_more.py +23 -0
  16. django_to_galaxy/migrations/0012_workflowinput_collection_type_and_more.py +136 -0
  17. django_to_galaxy/models/__init__.py +1 -1
  18. django_to_galaxy/models/accepted_input.py +113 -2
  19. django_to_galaxy/models/galaxy_instance.py +1 -1
  20. django_to_galaxy/models/invocation.py +41 -12
  21. django_to_galaxy/models/workflow.py +366 -30
  22. django_to_galaxy/version.py +1 -1
  23. {django_to_galaxy-0.6.9.7.dist-info → django_to_galaxy-0.6.9.9.dist-info}/METADATA +4 -3
  24. {django_to_galaxy-0.6.9.7.dist-info → django_to_galaxy-0.6.9.9.dist-info}/RECORD +26 -20
  25. {django_to_galaxy-0.6.9.7.dist-info → django_to_galaxy-0.6.9.9.dist-info}/WHEEL +1 -1
  26. {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
- _step_jobs_count = models.PositiveIntegerField(default=0)
19
- """Number of step jobs of the workflow."""
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 get_step_jobs_count(self):
45
+ def get_step_count(self):
47
46
  """Sets / returns _step_jobs_count value."""
48
- if self._step_jobs_count == 0:
49
- galaxy_wf = self.galaxy_workflow
50
- step_jobs_count = 0
51
- if self.get_is_meta():
52
- # Total step jobs count for a meta wf
53
- galaxy_client = self.galaxy_owner.obj_gi.gi
54
- for key, step_dict in galaxy_wf.steps.items():
55
- w = step_dict.wrapped
56
- if "workflow_id" in w:
57
- sub_wf = galaxy_client.make_get_request(
58
- galaxy_client.base_url
59
- + f"/api/workflows/{w['workflow_id']}",
60
- params={"instance": "true"},
61
- ).json()
62
- for j in range(len(sub_wf["steps"])):
63
- step = sub_wf["steps"][str(j)]
64
- if "input" not in step["type"]:
65
- step_jobs_count += 1
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
- # Total step jobs count for a simple wf
68
- for key, step_dict in galaxy_wf.steps.items():
69
- w = step_dict.wrapped
70
- if "input" not in w["type"]:
71
- step_jobs_count += 1
72
- self._step_jobs_count = step_jobs_count
73
- self.save(update_fields=["_step_jobs_count"])
74
- return self._step_jobs_count
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
  """
@@ -1,3 +1,3 @@
1
1
  """Handle library versioning."""
2
- version_info = (0, 6, 9, 7)
2
+ version_info = (0, 6, 9, 9)
3
3
  __version__ = ".".join(str(c) for c in version_info)
@@ -1,7 +1,8 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: django-to-galaxy
3
- Version: 0.6.9.7
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 (>=0.16.0,<0.17.0)
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=Rf8utzaDbRa3MAFmerhMC8kybejbiUlDFt8mbFuW3TI,369
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=A_VBW0LlPoEHfPhPbo21H6YNhWlTgPCyzPxQM-3Yv84,7387
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/workflow.py,sha256=5rnP7NdxhFVKk8pMkpeJdcZWJoNrgQev0LB7wO6nyt4,1616
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=4JZeryDKjFEEm8zZYanY_YuXRSi5g84ejZcfX-s3dRI,396
18
- django_to_galaxy/api/serializers/invoke_workflow.py,sha256=oXmSTtB5iY6DsLhpYxUKN5YGb-OWdkmxoSHIdWqji6k,657
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=SloS2upfK5Xr8MrXJ50pBwJ5Hq-0fvh23-ANdwdFwZI,981
21
- django_to_galaxy/api/urls.py,sha256=ReuXJuxxpij3LCz5Fzwm9_dQ9bW4n3VlEvIi3uCoLrg,1661
22
- django_to_galaxy/api/views/create_history.py,sha256=DP4BSSMlFSjT6ooRkrvRuZoLjwyLa2Mgjd37eATj52M,748
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=BksVpBDhgB0I8riu7PAHfQuMRS_IJWIKGKSg1cSDaR8,1318
28
- django_to_galaxy/api/views/invoke_workflow.py,sha256=x3YWu1zIuT0Wp6O4cNfCDFj4RouI7O18KU9s7580vN4,7053
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=5e1Fw1G-mWZnj4vUUY_lO_DH6lQL_P9nO6GYkyyS3zk,370
44
- django_to_galaxy/models/accepted_input.py,sha256=hIR9rlOaVKdUax21PEpaMzdwj9yOceRaFyFsbRO1C6g,889
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=931iyrqJxK6YCbkaC6FPdqMRI_hhGQ-UokhW5-N7swk,723
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=huskr6NTonoqPp-GVL-cOjPxFY2MlaOC3MVj8Trs43U,8359
51
- django_to_galaxy/models/workflow.py,sha256=tWa27SQhZDZVPSg95BJHI_SOKMD9Wyiv5dYqU52Nv1o,4021
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=1HmmM1NLgVnGVYQhS8O_WlawbMen044d0bQPbSiM658,114
59
- django_to_galaxy-0.6.9.7.dist-info/LICENSE,sha256=Er3Bp2y6Wf31e0s1-Tdu_d6Gd89FtTizmGUJzGQkWvo,34498
60
- django_to_galaxy-0.6.9.7.dist-info/METADATA,sha256=ZCAbNHeqStXRo9r4G1zQkrIRMhJQXA31HmEmv4RP2pY,663
61
- django_to_galaxy-0.6.9.7.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
62
- django_to_galaxy-0.6.9.7.dist-info/RECORD,,
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,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.3
2
+ Generator: poetry-core 2.2.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any