Warning
This document is for an in-development version of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy.tools.toolbox.filters
import logging
import sys
from copy import deepcopy
from galaxy.util import listify
log = logging.getLogger(__name__)
[docs]class FilterFactory:
"""
An instance of this class is responsible for filtering the list
of tools presented to a given user in a given context.
"""
[docs] def __init__(self, toolbox):
self.toolbox = toolbox
# Prepopulate dict containing filters that are always checked,
# other filters that get checked depending on context (e.g. coming from
# trackster or no user found are added in build filters).
self.default_filters = dict(tool=[_not_hidden, _handle_authorization], section=[], label=[])
# Add dynamic filters to these default filters.
config = toolbox.app.config
self.__base_modules = listify(getattr(config, "toolbox_filter_base_modules", "galaxy.tools.filters"))
self.__init_filters("tool", getattr(config, "tool_filters", ""), self.default_filters)
self.__init_filters("section", getattr(config, "tool_section_filters", ""), self.default_filters)
self.__init_filters("label", getattr(config, "tool_label_filters", ""), self.default_filters)
[docs] def build_filters(self, trans, **kwds):
"""
Build list of filters to check tools against given current context.
"""
filters = deepcopy(self.default_filters)
if trans.user:
for name, value in trans.user.preferences.items():
if value and value.strip():
user_filters = listify(value, do_strip=True)
category = ''
if name == 'toolbox_tool_filters':
category = "tool"
elif name == 'toolbox_section_filters':
category = "section"
elif name == 'toolbox_label_filters':
category = "label"
if category:
validate = getattr(trans.app.config, 'user_tool_%s_filters' % category, [])
self.__init_filters(category, user_filters, filters, validate=validate)
if kwds.get("trackster", False):
filters["tool"].append(_has_trackster_conf)
return filters
def __init_filters(self, key, filters, toolbox_filters, validate=None):
for filter in filters:
if validate is None or filter in validate or filter in self.default_filters:
filter_function = self.build_filter_function(filter)
if filter_function is not None:
toolbox_filters[key].append(filter_function)
else:
log.warning("Refusing to load %s filter '%s' which is not defined in config", key, filter)
return toolbox_filters
[docs] def build_filter_function(self, filter_name):
"""Obtain python function (importing a submodule if needed)
corresponding to filter_name.
"""
if ":" in filter_name:
# Should be a submodule of filters (e.g. examples:restrict_development_tools)
(module_name, function_name) = filter_name.rsplit(":", 1)
function = self._import_filter(module_name, function_name)
else:
# No module found, just load a function from this file or
# one that has be explicitly imported.
function = globals()[filter_name.strip()]
return function
def _import_filter(self, module_name, function_name):
function_name = function_name.strip()
for base_module in self.__base_modules:
full_module_name = "{}.{}".format(base_module, module_name.strip())
try:
__import__(full_module_name)
except ImportError:
continue
module = sys.modules[full_module_name]
if hasattr(module, function_name):
return getattr(module, function_name)
log.warning("Failed to load module for '%s.%s'.", module_name, function_name, exc_info=True)
# Stock Filter Functions
def _not_hidden(context, tool):
return not tool.hidden
def _handle_authorization(context, tool):
user = context.trans.user
if tool.require_login and not user:
return False
if not tool.allow_user_access(user, attempting_access=False):
return False
return True
def _has_trackster_conf(context, tool):
return tool.trackster_conf