Warning

This document is for an old release 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.webapps.galaxy.controllers.data_manager

import logging
from json import loads

import paste.httpexceptions

from galaxy import web
from galaxy.util import (
    nice_size,
    unicodify,
)
from galaxy.webapps.base.controller import BaseUIController

log = logging.getLogger(__name__)


[docs]class DataManager(BaseUIController):
[docs] @web.expose @web.json def data_managers_list(self, trans, **kwd): not_is_admin = not trans.user_is_admin if not_is_admin and not trans.app.config.enable_data_manager_user_view: raise paste.httpexceptions.HTTPUnauthorized( "This Galaxy instance is not configured to allow non-admins to view the data manager." ) message = kwd.get("message", "") status = kwd.get("status", "info") data_managers = [] for data_manager_id, data_manager in sorted( trans.app.data_managers.data_managers.items(), key=lambda dm: dm[1].name ): data_managers.append( { "toolUrl": web.url_for(controller="root", tool_id=data_manager.tool.id), "id": data_manager_id, "name": data_manager.name, "description": data_manager.description.lower(), } ) data_tables = [] managed_table_names = trans.app.data_managers.managed_data_tables.keys() for table_name in sorted(trans.app.tool_data_tables.get_tables().keys()): data_tables.append({"name": table_name, "managed": True if table_name in managed_table_names else False}) return { "dataManagers": data_managers, "dataTables": data_tables, "viewOnly": not_is_admin, "message": message, "status": status, }
[docs] @web.expose @web.json def jobs_list(self, trans, **kwd): not_is_admin = not trans.user_is_admin if not_is_admin and not trans.app.config.enable_data_manager_user_view: raise paste.httpexceptions.HTTPUnauthorized( "This Galaxy instance is not configured to allow non-admins to view the data manager." ) message = kwd.get("message", "") status = kwd.get("status", "info") data_manager_id = kwd.get("id", None) data_manager = trans.app.data_managers.get_manager(data_manager_id) if data_manager is None: return {"message": f"Invalid Data Manager ({data_manager_id}) was requested", "status": "error"} jobs = [] for assoc in trans.sa_session.query(trans.app.model.DataManagerJobAssociation).filter_by( data_manager_id=data_manager_id ): j = assoc.job jobs.append( { "id": j.id, "encId": trans.security.encode_id(j.id), "runUrl": web.url_for( controller="tool_runner", action="rerun", job_id=trans.security.encode_id(j.id) ), "user": j.history.user.email if j.history and j.history.user else "anonymous", "updateTime": j.update_time.isoformat(), "state": j.state, "commandLine": j.command_line, "jobRunnerName": j.job_runner_name, "jobRunnerExternalId": j.job_runner_external_id, } ) jobs.reverse() return { "dataManager": { "name": data_manager.name, "description": data_manager.description.lower(), "toolUrl": web.url_for(controller="root", tool_id=data_manager.tool.id), }, "jobs": jobs, "viewOnly": not_is_admin, "message": message, "status": status, }
[docs] @web.expose @web.json def job_info(self, trans, **kwd): not_is_admin = not trans.user_is_admin if not_is_admin and not trans.app.config.enable_data_manager_user_view: raise paste.httpexceptions.HTTPUnauthorized( "This Galaxy instance is not configured to allow non-admins to view the data manager." ) message = kwd.get("message", "") status = kwd.get("status", "info") job_id = kwd.get("id", None) try: job_id = trans.security.decode_id(job_id) job = trans.sa_session.query(trans.app.model.Job).get(job_id) except Exception as e: job = None log.error(f"Bad job id ({job_id}) passed to job_info: {e}") if not job: return {"message": f"Invalid job ({job_id}) was requested", "status": "error"} data_manager_id = job.data_manager_association.data_manager_id data_manager = trans.app.data_managers.get_manager(data_manager_id) hdas = [assoc.dataset for assoc in job.get_output_datasets()] hda_info = [] data_manager_output = [] error_messages = [] for hda in hdas: hda_info.append( { "id": hda.id, "encId": trans.security.encode_id(hda.id), "name": hda.name, "created": unicodify(hda.create_time.strftime(trans.app.config.pretty_datetime_format)), "fileSize": nice_size(hda.dataset.file_size), "fileName": hda.file_name, "infoUrl": web.url_for( controller="dataset", action="show_params", dataset_id=trans.security.encode_id(hda.id) ), } ) try: data_manager_json = loads(open(hda.get_file_name()).read()) except Exception as e: data_manager_json = {} error_messages.append(f"Unable to obtain data_table info for hda ({hda.id}): {e}") values = [] for key, value in data_manager_json.get("data_tables", {}).items(): values.append((key, value)) data_manager_output.append(values) return { "jobId": job_id, "exitCode": job.exit_code, "runUrl": web.url_for(controller="tool_runner", action="rerun", job_id=trans.security.encode_id(job.id)), "commandLine": job.command_line, "dataManager": { "id": data_manager_id, "name": data_manager.name, "description": data_manager.description.lower(), "toolUrl": web.url_for(controller="root", tool_id=data_manager.tool.id), }, "hdaInfo": hda_info, "dataManagerOutput": data_manager_output, "errorMessages": error_messages, "viewOnly": not_is_admin, "message": message, "status": status, }
[docs] @web.expose @web.json def tool_data_table_info(self, trans, **kwd): return self.tool_data_table_info_1(trans, **kwd)
[docs] def tool_data_table_info_1(self, trans, **kwd): not_is_admin = not trans.user_is_admin if not_is_admin and not trans.app.config.enable_data_manager_user_view: raise paste.httpexceptions.HTTPUnauthorized( "This Galaxy instance is not configured to allow non-admins to view the data manager." ) message = kwd.get("message", "") status = kwd.get("status", "info") data_table_name = kwd.get("table_name", None) if not data_table_name: return {"message": "No data table was requested.", "status": "error"} data_table = trans.app.tool_data_tables.get(data_table_name, None) if data_table is None: return {"message": f"Invalid data table '{data_table_name}' was requested.", "status": "error"} return { "dataTable": { "name": data_table.name, "columns": data_table.get_column_name_list(), "data": data_table.data, }, "viewOnly": not_is_admin, "message": message, "status": status, }
[docs] @web.expose @web.json @web.require_admin def reload_tool_data_tables(self, trans, table_name=None, **kwd): if table_name and isinstance(table_name, str): table_name = table_name.split(",") # Reload the tool data tables table_names = self.app.tool_data_tables.reload_tables(table_names=table_name) trans.app.queue_worker.send_control_task( "reload_tool_data_tables", noop_self=True, kwargs={"table_name": table_name} ) data = None if table_names: message = "Reloaded data table{} '{}'.".format("s"[len(table_names) == 1 :], ", ".join(table_names)) data = self.tool_data_table_info_1(trans, table_name=table_names[0], message=message, status="done") else: data = {"message": "No data tables have been reloaded.", "status": "error"} return data
[docs] @web.expose @web.json @web.require_admin def tool_data_table_items(self, trans, **kwd): data = {"columns": [], "items": []} message = kwd.get("message", "") status = kwd.get("status", "info") table_name = kwd.get("table_name", None) if not table_name: return { "data": data, "message": "No Data table name provided.", "status": "warning", } data_table = trans.app.tool_data_tables.get(table_name, None) if data_table is None: return {"data": data, "message": f"Invalid Data table ({table_name}) was requested", "status": "error"} columns = data_table.get_column_name_list() rows = [dict(zip(columns, table_row)) for table_row in data_table.data] data["columns"] = columns data["items"] = rows return {"data": data, "message": message, "status": status}
[docs] @web.expose @web.json @web.require_admin def reload_tool_data_table(self, trans, **kwd): table_name = kwd.get("table_name", None) if not table_name: return { "message": "No data table has been reloaded.", "status": "error", } redirect_url = web.url_for( controller="data_manager", action="tool_data_table_items", table_name=table_name, message=f'The data table "{table_name}" has been reloaded.', status="done", ) return trans.response.send_redirect(redirect_url)