Merged in abretaud/galaxy-central (pull request #577)

Add an API to remove items from tool data tables
This commit is contained in:
John Chilton
2014-12-15 00:17:31 -05:00
2 changed files with 84 additions and 0 deletions
+43
View File
@@ -211,6 +211,13 @@ class ToolDataTable( object ):
self.add_entry( entry, allow_duplicates=allow_duplicates, persist=persist, persist_on_error=persist_on_error, entry_source=entry_source, **kwd )
return self._loaded_content_version
def _remove_entry(self, values):
raise NotImplementedError( "Abstract method" )
def remove_entry(self, values):
self._remove_entry( values )
return self._update_version()
def is_current_version( self, other_version ):
return self._loaded_content_version == other_version
@@ -506,6 +513,42 @@ class TabularToolDataTable( ToolDataTable, Dictifiable ):
data_table_fh.write( "%s\n" % ( self.separator.join( fields ) ) )
return not is_error
def _remove_entry( self, values):
# update every file
for filename in self.filenames:
if os.path.exists( filename ):
values = self._replace_field_separators( values )
self.filter_file_fields( filename, values )
else:
log.warn( "Cannot find index file '%s' for tool data table '%s'" % ( filename, self.name ) )
self.reload_from_files()
def filter_file_fields( self, loc_file, values ):
"""
Reads separated lines from file and print back only the lines that pass a filter.
"""
separator_char = (lambda c: '<TAB>' if c == '\t' else c)(self.separator)
with open(loc_file) as reader:
rval = ""
for i, line in enumerate( reader ):
if line.lstrip().startswith( self.comment_char ):
rval += line
else:
line_s = line.rstrip( "\n\r" )
if line_s:
fields = line_s.split( self.separator )
if fields != values:
rval += line
with open(loc_file, 'wb') as writer:
writer.write(rval)
return rval
def _replace_field_separators( self, fields, separator=None, replace=None, comment_char=None ):
#make sure none of the fields contain separator
#make sure separator replace is different from comment_char,
@@ -20,3 +20,44 @@ class ToolData( BaseAPIController ):
@web.expose_api
def show( self, trans, id, **kwds ):
return trans.app.tool_data_tables.data_tables[id].to_dict(view='element')
@web.require_admin
@web.expose_api
def delete( self, trans, id, **kwd ):
"""
DELETE /api/tool_data/{id}
Removes an item from a data table
:type id: str
:param id: the id of the data table containing the item to delete
:type kwd: dict
:param kwd: (required) dictionary structure containing:
* payload: a dictionary itself containing:
* values: <TAB> separated list of column contents, there must be a value for all the columns of the data table
"""
decoded_tool_data_id = id
try:
data_table = trans.app.tool_data_tables.data_tables.get(decoded_tool_data_id)
except:
data_table = None
if not data_table:
trans.response.status = 400
return "Invalid data table id ( %s ) specified." % str( decoded_tool_data_id )
values = None
if kwd.get( 'payload', None ):
values = kwd['payload'].get( 'values', '' )
if not values:
trans.response.status = 400
return "Invalid data table item ( %s ) specified." % str( values )
split_values = values.split("\t")
if len(split_values) != len(data_table.get_column_name_list()):
trans.response.status = 400
return "Invalid data table item ( %s ) specified. Wrong number of columns (%s given, %s required)." % ( str( values ), str(len(split_values)), str(len(data_table.get_column_name_list())))
return data_table.remove_entry(split_values)