commit/galaxy-central: dan: Add the ability for Admins to reload tool data table entries from disk without restarting the Galaxy server. This does not look for new <table> entries or contained new <file>s within XML files, but will e.g. make any changes to a .loc file become live immediately without restart.

1 new commit in galaxy-central: https://bitbucket.org/galaxy/galaxy-central/commits/e5b545b85b83/ Changeset: e5b545b85b83 User: dan Date: 2014-05-13 19:01:47 Summary: Add the ability for Admins to reload tool data table entries from disk without restarting the Galaxy server. This does not look for new <table> entries or contained new <file>s within XML files, but will e.g. make any changes to a .loc file become live immediately without restart. Affected #: 3 files diff -r c74989f7cafe0605af12af8dc2303689fa674bde -r e5b545b85b836b6f1be76164543d7e4613f25d87 lib/galaxy/tools/data/__init__.py --- a/lib/galaxy/tools/data/__init__.py +++ b/lib/galaxy/tools/data/__init__.py @@ -141,6 +141,18 @@ out.write( '</tables>\n' ) os.chmod( full_path, 0644 ) + def reload_tables( self, table_names=None ): + tables = self.get_tables() + if not table_names: + table_names = tables.keys() + elif not isinstance( table_names, list ): + table_names = [ table_names ] + for table_name in table_names: + tables[ table_name ].reload_from_files() + log.debug( "Reloaded tool data table '%s' from files.", table_name ) + return table_names + + class ToolDataTable( object ): @classmethod @@ -160,9 +172,14 @@ # increment this variable any time a new entry is added, or when the table is totally reloaded # This value has no external meaning, and does not represent an abstract version of the underlying data self._loaded_content_version = 1 + self._load_info = ( [ config_element, tool_data_path ], { 'from_shed_config':from_shed_config } ) + self._merged_load_info = [] - def _update_version( self ): - self._loaded_content_version += 1 + def _update_version( self, version=None ): + if version is not None: + self._loaded_content_version = version + else: + self._loaded_content_version += 1 return self._loaded_content_version def get_empty_field_by_name( self, name ): @@ -187,6 +204,16 @@ def merge_tool_data_table( self, other_table, allow_duplicates=True, persist=False, persist_on_error=False, entry_source=None, **kwd ): raise NotImplementedError( "Abstract method" ) + def reload_from_files( self ): + new_version = self._update_version() + merged_info = self._merged_load_info + self.__init__( *self._load_info[0], **self._load_info[1] ) + self._update_version( version=new_version ) + for ( tool_data_table_class, load_info ) in merged_info: + self.merge_tool_data_table( tool_data_table_class( *load_info[0], **load_info[1] ), allow_duplicates=False ) + return self._update_version() + + class TabularToolDataTable( ToolDataTable ): """ Data stored in a tabular / separated value format on disk, allows multiple @@ -278,6 +305,8 @@ for filename, info in other_table.filenames.iteritems(): if filename not in self.filenames: self.filenames[ filename ] = info + #save info about table + self._merged_load_info.append( ( other_table.__class__, other_table._load_info ) ) #add data entries and return current data table version return self.add_entries( other_table.data, allow_duplicates=allow_duplicates, persist=persist, persist_on_error=persist_on_error, entry_source=entry_source, **kwd ) diff -r c74989f7cafe0605af12af8dc2303689fa674bde -r e5b545b85b836b6f1be76164543d7e4613f25d87 lib/galaxy/webapps/galaxy/controllers/data_manager.py --- a/lib/galaxy/webapps/galaxy/controllers/data_manager.py +++ b/lib/galaxy/webapps/galaxy/controllers/data_manager.py @@ -77,3 +77,33 @@ if data_table is None: return trans.response.send_redirect( web.url_for( controller="data_manager", action="index", message="Invalid Data table (%s) was requested" % data_table_name, status="error" ) ) return trans.fill_template( "data_manager/manage_data_table.mako", data_table=data_table, view_only=not_is_admin, message=message, status=status ) + + @web.expose + @web.require_admin + def reload_tool_data_tables( self, trans, table_name=None, **kwd ): + if table_name and isinstance( table_name, basestring ): + table_name = table_name.split( "," ) + # Reload the tool data tables + table_names = self.app.tool_data_tables.reload_tables( table_names=table_name ) + redirect_url = None + if table_names: + status = 'done' + if len( table_names ) == 1: + message = "The data table '%s' has been reloaded." % table_names[0] + redirect_url = web.url_for( controller='data_manager', + action='manage_data_table', + table_name=table_names[0], + message=message, + status=status ) + else: + message = "The data tables '%s' have been reloaded." % ', '.join( table_names ) + else: + message = "No data tables have been reloaded." + status = 'error' + if redirect_url is None: + redirect_url = web.url_for( controller='admin', + action='view_tool_data_tables', + message=message, + status=status ) + return trans.response.send_redirect( redirect_url ) + diff -r c74989f7cafe0605af12af8dc2303689fa674bde -r e5b545b85b836b6f1be76164543d7e4613f25d87 templates/webapps/galaxy/data_manager/manage_data_table.mako --- a/templates/webapps/galaxy/data_manager/manage_data_table.mako +++ b/templates/webapps/galaxy/data_manager/manage_data_table.mako @@ -15,6 +15,9 @@ <thead><tr><th colspan="${len (column_name_list) }" style="font-size: 120%;"> Data Manager: ${ data_table.name | h } + <a class="icon-btn" href="${ h.url_for( controller="data_manager", action="reload_tool_data_tables", table_name=data_table.name ) }" title="Reload ${data_table.name} tool data table" data-placement="bottom"> + <span class="fa fa-refresh"></span> + </a></th></tr><tr> Repository URL: https://bitbucket.org/galaxy/galaxy-central/ -- This is a commit notification from bitbucket.org. You are receiving this because you have the service enabled, addressing the recipient of this email.
participants (1)
-
commits-noreply@bitbucket.org