diff --git a/client/galaxy/scripts/apps/admin.js b/client/galaxy/scripts/apps/admin.js index c52f399ba58..831c65c54cd 100644 --- a/client/galaxy/scripts/apps/admin.js +++ b/client/galaxy/scripts/apps/admin.js @@ -14,6 +14,7 @@ import DataTables from "components/admin/DataTables.vue"; import DataTypes from "components/admin/DataTypes.vue"; import DataManagerView from "components/admin/DataManager/DataManagerView.vue"; import DataManagerRouter from "components/admin/DataManager/DataManagerRouter.vue"; +import DisplayApplications from "components/admin/DisplayApplications.vue"; import Vue from "vue"; import { serverPath } from "utils/serverPath"; @@ -33,6 +34,7 @@ window.app = function app(options, bootstrapped) { "(/)admin(/)users": "show_users", "(/)admin(/)roles": "show_roles", "(/)admin(/)groups": "show_groups", + "(/)admin(/)display_applications": "show_display_applications", "(/)admin(/)tool_versions": "show_tool_versions", "(/)admin(/)quotas": "show_quotas", "(/)admin(/)repositories": "show_repositories", @@ -111,19 +113,26 @@ window.app = function app(options, bootstrapped) { }) ); }, + _display_vue_helper: function(component, props) { let instance = Vue.extend(component); let vm = document.createElement("div"); this.page.display(vm); new instance(props).$mount(vm); }, + show_data_tables: function() { this._display_vue_helper(DataTables); }, + show_data_types: function() { this._display_vue_helper(DataTypes); }, + show_display_applications: function() { + this._display_vue_helper(DisplayApplications); + }, + show_data_manager: function(path) { let vueMount = document.createElement("div"); this.page.display(vueMount); diff --git a/client/galaxy/scripts/apps/panels/admin-panel.js b/client/galaxy/scripts/apps/panels/admin-panel.js index e77995c4e0a..dbd4eb4c4f9 100644 --- a/client/galaxy/scripts/apps/panels/admin-panel.js +++ b/client/galaxy/scripts/apps/panels/admin-panel.js @@ -34,6 +34,7 @@ var AdminPanel = Backbone.View.extend({ { title: _l("Display applications"), url: "admin/display_applications", + target: "__use_router__", id: "admin-link-display-applications" }, { diff --git a/client/galaxy/scripts/components/admin/AdminServices.js b/client/galaxy/scripts/components/admin/AdminServices.js new file mode 100644 index 00000000000..29fb128d078 --- /dev/null +++ b/client/galaxy/scripts/components/admin/AdminServices.js @@ -0,0 +1,12 @@ +import { getAppRoot } from "onload/loadConfig"; +import axios from "axios"; + +export function getDisplayApplications() { + let url = `${getAppRoot()}api/display_applications`; + return axios.get(url); +} + +export function reloadDisplayApplications(ids) { + let url = `${getAppRoot()}api/display_applications/reload`; + return axios.post(url, {ids: ids}); +} diff --git a/client/galaxy/scripts/components/admin/DisplayApplications.vue b/client/galaxy/scripts/components/admin/DisplayApplications.vue new file mode 100644 index 00000000000..63baa6d2ad2 --- /dev/null +++ b/client/galaxy/scripts/components/admin/DisplayApplications.vue @@ -0,0 +1,124 @@ + + diff --git a/lib/galaxy/webapps/galaxy/api/display_applications.py b/lib/galaxy/webapps/galaxy/api/display_applications.py new file mode 100644 index 00000000000..d41ad8057e9 --- /dev/null +++ b/lib/galaxy/webapps/galaxy/api/display_applications.py @@ -0,0 +1,61 @@ +""" +API operations on annotations. +""" +import logging + +from galaxy import queue_worker +from galaxy.web import expose_api, require_admin +from galaxy.web.base.controller import BaseAPIController + +log = logging.getLogger(__name__) + + +class DisplayApplicationsController(BaseAPIController): + + @expose_api + def index(self, trans, **kwd): + """ + GET /api/display_applications/ + + Returns the list of display applications. + + :returns: list of available display applications + :rtype: list + """ + response = [] + for display_app in trans.app.datatypes_registry.display_applications.values(): + response.append({ + 'id' : display_app.id, + 'name': display_app.name, + 'version': display_app.version, + 'filename_': display_app._filename, + 'links': [{'name': l.name} for l in display_app.links.values()] + }) + return response + + @expose_api + @require_admin + def reload(self, trans, payload={}, **kwd): + """ + POST /api/display_applications/reload + + Reloads the list of display applications. + + :param ids: list containing ids of display to be reloaded + :type ids: list + """ + ids = payload.get('ids') + queue_worker.send_control_task(trans.app, + 'reload_display_application', + noop_self=True, + kwargs={'display_application_ids': ids}) + reloaded, failed = trans.app.datatypes_registry.reload_display_applications(ids) + if not reloaded and failed: + message = 'Unable to reload any of the %i requested display applications ("%s").' % (len(failed), '", "'.join(failed)) + elif failed: + message = 'Reloaded %i display applications ("%s"), but failed to reload %i display applications ("%s").' % (len(reloaded), '", "'.join(reloaded), len(failed), '", "'.join(failed)) + elif not reloaded: + message = 'You need to request at least one display application to reload.' + else: + message = 'Reloaded %i requested display applications ("%s").' % (len(reloaded), '", "'.join(reloaded)) + return {'message': message, 'reloaded': reloaded, 'failed': failed} diff --git a/lib/galaxy/webapps/galaxy/buildapp.py b/lib/galaxy/webapps/galaxy/buildapp.py index 20f7f361258..3568555bae1 100644 --- a/lib/galaxy/webapps/galaxy/buildapp.py +++ b/lib/galaxy/webapps/galaxy/buildapp.py @@ -103,6 +103,7 @@ def app_factory(global_conf, load_app_kwds={}, **kwargs): webapp.add_client_route('/admin/data_types', 'admin') webapp.add_client_route('/admin/data_manager{path_info:.*}', 'admin') webapp.add_client_route('/admin/users', 'admin') + webapp.add_client_route('/admin/display_applications', 'admin') webapp.add_client_route('/admin/roles', 'admin') webapp.add_client_route('/admin/forms', 'admin') webapp.add_client_route('/admin/groups', 'admin') @@ -553,6 +554,22 @@ def populate_api_routes(webapp, app): action='get_api_key', conditions=dict(method=["GET"])) + # ====================================== + # ====== DISPLAY APPLICATIONS API ====== + # ====================================== + + webapp.mapper.connect('index', + '/api/display_applications', + controller='display_applications', + action='index', + conditions=dict(method=["GET"])) + + webapp.mapper.connect('reload', + '/api/display_applications/reload', + controller='display_applications', + action='reload', + conditions=dict(method=["POST"])) + # ===================== # ===== TOURS API ===== # ===================== diff --git a/lib/galaxy/webapps/galaxy/controllers/admin.py b/lib/galaxy/webapps/galaxy/controllers/admin.py index 0b2a263a275..e03bfe0288c 100644 --- a/lib/galaxy/webapps/galaxy/controllers/admin.py +++ b/lib/galaxy/webapps/galaxy/controllers/admin.py @@ -908,29 +908,6 @@ class AdminGalaxy(controller.JSAppLauncher, AdminActions, UsesQuotaMixin, QuotaP def tool_errors(self, trans, **kwd): return trans.fill_template('admin/tool_errors.mako', tool_errors=global_tool_errors.error_stack) - @web.expose - @web.require_admin - def display_applications(self, trans, **kwd): - return trans.fill_template('admin/view_display_applications.mako', display_applications=trans.app.datatypes_registry.display_applications) - - @web.expose - @web.require_admin - def reload_display_application(self, trans, **kwd): - galaxy.queue_worker.send_control_task(trans.app, - 'reload_display_application', - noop_self=True, - kwargs={'display_application_ids': kwd.get('id')}) - reloaded, failed = trans.app.datatypes_registry.reload_display_applications(kwd.get('id')) - if not reloaded and failed: - return trans.show_error_message('Unable to reload any of the %i requested display applications ("%s").' - % (len(failed), '", "'.join(failed))) - if failed: - return trans.show_warn_message('Reloaded %i display applications ("%s"), but failed to reload %i display applications ("%s").' - % (len(reloaded), '", "'.join(reloaded), len(failed), '", "'.join(failed))) - if not reloaded: - return trans.show_warn_message('You need to request at least one display application to reload.') - return trans.show_ok_message('Reloaded %i requested display applications ("%s").' % (len(reloaded), '", "'.join(reloaded))) - @web.expose @web.require_admin def center(self, trans, **kwd): diff --git a/templates/webapps/galaxy/admin/view_display_applications.mako b/templates/webapps/galaxy/admin/view_display_applications.mako deleted file mode 100644 index 27c0d822169..00000000000 --- a/templates/webapps/galaxy/admin/view_display_applications.mako +++ /dev/null @@ -1,48 +0,0 @@ -<%inherit file="/base.mako"/> -<%namespace file="/message.mako" import="render_msg" /> - -%if message: - ${render_msg( message, status )} -%endif - -
-
There are currently ${len( display_applications )} - - display applications loaded.
-
- - - - - - - - - - <% ctr = 0 %> - %for display_app in display_applications.values(): - %if ctr % 2 == 1: - - %else: - - %endif - - - - - - - - <% ctr += 1 %> - %endfor -
ReloadNameIDVersionLinksFilename
- - - - ${ display_app.name | h }${ display_app.id | h }${ display_app.version | h }
    - %for link in display_app.links.values(): -
  • ${ link.name | h }
  • - %endfor -
${ display_app._filename | h }
-
-
diff --git a/test/selenium_tests/test_admin_app.py b/test/selenium_tests/test_admin_app.py index feec319a0a3..a2db96290cc 100644 --- a/test/selenium_tests/test_admin_app.py +++ b/test/selenium_tests/test_admin_app.py @@ -23,8 +23,7 @@ class AdminAppTestCase(SeleniumTestCase): self.screenshot("admin_data_tables") admin_component.index.display_applications.wait_for_and_click() - with self.main_panel(): - admin_component.display_applications_grid.wait_for_visible() + self.assert_warning_message("No display applications available.") self.screenshot("admin_display_applications") admin_component.index.jobs.wait_for_and_click()