From d648e22080ac97b3940799d35e3be304d1a0aed7 Mon Sep 17 00:00:00 2001 From: Martin Cech Date: Tue, 27 Feb 2018 14:29:04 -0500 Subject: [PATCH 1/3] fix for cases where panel elements have to_dict with different signature we want to only cache Tools anyways, so this fixes other possible bug where section/label etc would have same id as a Tool change the detection of Tool object to avoid circular import errors Also use cache for dictifying sections, we should gain more speed from that. --- lib/galaxy/tools/toolbox/base.py | 11 ++++++++--- lib/galaxy/tools/toolbox/panel.py | 5 ++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/tools/toolbox/base.py b/lib/galaxy/tools/toolbox/base.py index 306a3ca9438..48376f1d6cb 100644 --- a/lib/galaxy/tools/toolbox/base.py +++ b/lib/galaxy/tools/toolbox/base.py @@ -927,7 +927,7 @@ class AbstractToolBox(Dictifiable, ManagesIntegratedToolPanelMixin, object): if elt: yield elt - def _get_tool_to_dict(self, trans, tool): + def get_tool_to_dict(self, trans, tool): """Return tool's to_dict. Use cache if present, store to cache otherwise. Note: The cached tool's to_dict is specific to the calls from toolbox. @@ -953,14 +953,19 @@ class AbstractToolBox(Dictifiable, ManagesIntegratedToolPanelMixin, object): if in_panel: panel_elts = list(self.tool_panel_contents(trans, **kwds)) for elt in panel_elts: - rval.append(self._get_tool_to_dict(trans, elt)) + # Only use cache for galaxy.tools.Tool objects. + if elt.__class__.__name__ == 'Tool': + rval.append(self.get_tool_to_dict(trans, elt)) + else: + kwargs = dict(trans=trans, link_details=True) + rval.append(elt.to_dict(**kwargs)) else: filter_method = self._build_filter_method(trans) for id, tool in self._tools_by_id.items(): tool = filter_method(tool, panel_item_types.TOOL) if not tool: continue - rval.append(self._get_tool_to_dict(trans, tool)) + rval.append(self.get_tool_to_dict(trans, tool)) return rval def _lineage_in_panel(self, panel_dict, tool=None, tool_lineage=None): diff --git a/lib/galaxy/tools/toolbox/panel.py b/lib/galaxy/tools/toolbox/panel.py index 0f8deb55f6f..cf547605c9f 100644 --- a/lib/galaxy/tools/toolbox/panel.py +++ b/lib/galaxy/tools/toolbox/panel.py @@ -79,7 +79,10 @@ class ToolSection(Dictifiable, HasPanelItems, object): link_details=link_details ) for elt in self.elems.values(): - section_elts.append(elt.to_dict(**kwargs)) + if elt.__class__.__name__ == 'Tool': + section_elts.append(trans.app.toolbox.get_tool_to_dict(trans, elt)) + else: + section_elts.append(elt.to_dict(**kwargs)) section_dict['elems'] = section_elts return section_dict From 5406a7153bd6a51174145d04eda26b6796211154 Mon Sep 17 00:00:00 2001 From: Martin Cech Date: Wed, 28 Feb 2018 11:05:38 -0500 Subject: [PATCH 2/3] pass the toolbox obj to make sure cache is available --- lib/galaxy/tools/toolbox/base.py | 2 +- lib/galaxy/tools/toolbox/panel.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/tools/toolbox/base.py b/lib/galaxy/tools/toolbox/base.py index 48376f1d6cb..97b1450d905 100644 --- a/lib/galaxy/tools/toolbox/base.py +++ b/lib/galaxy/tools/toolbox/base.py @@ -957,7 +957,7 @@ class AbstractToolBox(Dictifiable, ManagesIntegratedToolPanelMixin, object): if elt.__class__.__name__ == 'Tool': rval.append(self.get_tool_to_dict(trans, elt)) else: - kwargs = dict(trans=trans, link_details=True) + kwargs = dict(trans=trans, link_details=True, toolbox=self) rval.append(elt.to_dict(**kwargs)) else: filter_method = self._build_filter_method(trans) diff --git a/lib/galaxy/tools/toolbox/panel.py b/lib/galaxy/tools/toolbox/panel.py index cf547605c9f..fd647407f64 100644 --- a/lib/galaxy/tools/toolbox/panel.py +++ b/lib/galaxy/tools/toolbox/panel.py @@ -69,7 +69,7 @@ class ToolSection(Dictifiable, HasPanelItems, object): copy.elems = self.elems.copy() return copy - def to_dict(self, trans, link_details=False): + def to_dict(self, trans, link_details=False, toolbox=None): """ Return a dict that includes section's attributes. """ section_dict = super(ToolSection, self).to_dict() @@ -79,8 +79,8 @@ class ToolSection(Dictifiable, HasPanelItems, object): link_details=link_details ) for elt in self.elems.values(): - if elt.__class__.__name__ == 'Tool': - section_elts.append(trans.app.toolbox.get_tool_to_dict(trans, elt)) + if elt.__class__.__name__ == 'Tool' and toolbox: + section_elts.append(toolbox.get_tool_to_dict(trans, elt)) else: section_elts.append(elt.to_dict(**kwargs)) section_dict['elems'] = section_elts From b96fd2c74010009a7dc85c09e77f87a9d4eff271 Mon Sep 17 00:00:00 2001 From: Martin Cech Date: Wed, 28 Feb 2018 11:55:59 -0500 Subject: [PATCH 3/3] enable cache for tools that inherit from Tool --- lib/galaxy/tools/toolbox/base.py | 4 ++-- lib/galaxy/tools/toolbox/panel.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/galaxy/tools/toolbox/base.py b/lib/galaxy/tools/toolbox/base.py index 97b1450d905..7899bc244af 100644 --- a/lib/galaxy/tools/toolbox/base.py +++ b/lib/galaxy/tools/toolbox/base.py @@ -953,8 +953,8 @@ class AbstractToolBox(Dictifiable, ManagesIntegratedToolPanelMixin, object): if in_panel: panel_elts = list(self.tool_panel_contents(trans, **kwds)) for elt in panel_elts: - # Only use cache for galaxy.tools.Tool objects. - if elt.__class__.__name__ == 'Tool': + # Only use cache for objects that are Tools. + if hasattr(elt, "tool_type"): rval.append(self.get_tool_to_dict(trans, elt)) else: kwargs = dict(trans=trans, link_details=True, toolbox=self) diff --git a/lib/galaxy/tools/toolbox/panel.py b/lib/galaxy/tools/toolbox/panel.py index fd647407f64..d71460693f1 100644 --- a/lib/galaxy/tools/toolbox/panel.py +++ b/lib/galaxy/tools/toolbox/panel.py @@ -79,7 +79,7 @@ class ToolSection(Dictifiable, HasPanelItems, object): link_details=link_details ) for elt in self.elems.values(): - if elt.__class__.__name__ == 'Tool' and toolbox: + if hasattr(elt, "tool_type") and toolbox: section_elts.append(toolbox.get_tool_to_dict(trans, elt)) else: section_elts.append(elt.to_dict(**kwargs))