LibraryFolders now track last used dbkey ( silimar to histories ), so when a new dataset is added to a folder, the last used dbkey is selected.

This commit is contained in:
Greg Von Kuster
2008-08-18 11:21:31 -04:00
parent 140d8b5f7d
commit 751cca164b
5 changed files with 53 additions and 57 deletions
+6 -30
View File
@@ -285,34 +285,26 @@ class DatasetInstance( object ):
self.dataset = dataset
self.parent_id = parent_id
self.validation_errors = validation_errors
@property
def ext( self ):
return self.extension
def get_dataset_state( self ):
return self.dataset.state
def set_dataset_state ( self, state ):
self.dataset.state = state
self.dataset.flush() #flush here, because hda.flush() won't flush the Dataset object
state = property( get_dataset_state, set_dataset_state )
def get_file_name( self ):
return self.dataset.get_file_name()
def set_file_name (self, filename):
return self.dataset.set_file_name( filename )
file_name = property( get_file_name, set_file_name )
@property
def extra_files_path( self ):
return self.dataset.extra_files_path
@property
def datatype( self ):
return datatypes_registry.get_datatype_by_extension( self.extension )
def get_metadata( self ):
if not self._metadata:
self._metadata = dict()
@@ -321,11 +313,8 @@ class DatasetInstance( object ):
# Needs to accept a MetadataCollection, a bunch, or a dict
self._metadata = dict( bunch.items() )
metadata = property( get_metadata, set_metadata )
"""
This provide backwards compatibility with using the old dbkey
field in the database. That field now maps to "old_dbkey" (see mapping.py).
"""
# This provide backwards compatibility with using the old dbkey
# field in the database. That field now maps to "old_dbkey" (see mapping.py).
def get_dbkey( self ):
dbkey = self.metadata.dbkey
if not isinstance(dbkey, list): dbkey = [dbkey]
@@ -343,7 +332,6 @@ class DatasetInstance( object ):
#else:
# self.old_dbkey = value
dbkey = property( get_dbkey, set_dbkey )
def change_datatype( self, new_ext ):
self.clear_associated_files()
datatypes_registry.change_datatype( self, new_ext )
@@ -400,16 +388,12 @@ class DatasetInstance( object ):
if child.designation == designation:
return child
return None
def get_converter_types(self):
return self.datatype.get_converter_types( self, datatypes_registry)
def add_validation_error( self, validation_error ):
self.validation_errors.append( validation_error )
def extend_validation_errors( self, validation_errors ):
self.validation_errors.extend(validation_errors)
def mark_deleted( self, include_children=True ):
self.deleted = True
if include_children:
@@ -429,7 +413,6 @@ class HistoryDatasetAssociation( DatasetInstance ):
self.history = history
self.copied_from_history_dataset_association = copied_from_history_dataset_association
self.copied_from_library_folder_dataset_association = copied_from_library_folder_dataset_association
def copy( self, copy_children = False, parent_id = None ):
des = HistoryDatasetAssociation( hid=self.hid,
name=self.name,
@@ -451,7 +434,6 @@ class HistoryDatasetAssociation( DatasetInstance ):
des.set_peek() #in some instances peek relies on dataset_id, i.e. gmaj.zip for viewing MAFs
des.flush()
return des
def clear_associated_files( self, metadata_safe = False, purge = False ):
#metadata_safe = True means to only clear when assoc.metadata_safe == False
for assoc in self.implicitly_converted_datasets:
@@ -469,7 +451,6 @@ class History( object ):
self.user = user
self.datasets = []
self.galaxy_sessions = []
def _next_hid( self ):
# TODO: override this with something in the database that ensures
# better integrity
@@ -481,13 +462,11 @@ class History( object ):
if dataset.hid > last_hid:
last_hid = dataset.hid
return last_hid + 1
def add_galaxy_session( self, galaxy_session, association=None ):
if association is None:
self.galaxy_sessions.append( GalaxySessionToHistoryAssociation( galaxy_session, self ) )
else:
self.galaxy_sessions.append( association )
def add_dataset( self, dataset, parent_id=None, genome_build=None, set_hid = True ):
if isinstance( dataset, Dataset ):
dataset = HistoryDatasetAssociation( dataset = dataset )
@@ -507,7 +486,6 @@ class History( object ):
if genome_build not in [None, '?']:
self.genome_build = genome_build
self.datasets.append( dataset )
def copy( self, target_user = None ):
if not target_user:
target_user = self.user
@@ -534,10 +512,13 @@ class LibraryFolder( object ):
self.description = description
self.item_count = item_count
self.order_id = order_id
def add_dataset( self, dataset ):
self.genome_build = None
def add_dataset( self, dataset, genome_build=None ):
dataset.folder_id = self.id
dataset.order_id = self.item_count
self.item_count += 1
if genome_build not in [None, '?']:
self.genome_build = genome_build
def add_folder( self, folder ):
folder.parent_id = self.id
folder.order_id = self.item_count
@@ -555,7 +536,6 @@ class LibraryFolderDatasetAssociation( DatasetInstance ):
self.order_id = order_id
self.copied_from_history_dataset_association = copied_from_history_dataset_association
self.copied_from_library_folder_dataset_association = copied_from_library_folder_dataset_association
def to_history_dataset_association( self, parent_id = None ):
des = HistoryDatasetAssociation( name=self.name,
info=self.info,
@@ -575,8 +555,6 @@ class LibraryFolderDatasetAssociation( DatasetInstance ):
des.set_peek() #in some instances peek relies on dataset_id, i.e. gmaj.zip for viewing MAFs
des.flush()
return des
def copy( self, copy_children = False, parent_id = None ):
des = LibraryFolderDatasetAssociation( name=self.name,
info=self.info,
@@ -597,11 +575,9 @@ class LibraryFolderDatasetAssociation( DatasetInstance ):
des.set_peek() #in some instances peek relies on dataset_id, i.e. gmaj.zip for viewing MAFs
des.flush()
return des
def clear_associated_files( self, metadata_safe = False, purge = False ):
return
class LibraryTag( object ):
def __init__( self, tag ):
self.tag = tag
+2 -2
View File
@@ -66,7 +66,6 @@ History.table = Table( "history", metadata,
# Column( "state", String( 64 ) ),
# Column( "tool_parameters", Pickle() ) )
HistoryDatasetAssociation.table = Table( "history_dataset_association", metadata,
Column( "id", Integer, primary_key=True ),
Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ),
@@ -194,7 +193,8 @@ LibraryFolder.table = Table( "library_folder", metadata,
Column( "name", TEXT ),
Column( "description", TEXT ),
Column( "order_id", Integer ),
Column( "item_count", Integer ) )
Column( "item_count", Integer ),
Column( "genome_build", TrimmedString( 40 ) ) )
LibraryTag.table = Table( "library_tag", metadata,
Column( "id", Integer, primary_key=True ),
-4
View File
@@ -68,7 +68,6 @@ class GalaxyRBACAgent( RBACAgent ):
raise 'No valid method of checking action (%s) on %s for user %s.' % ( action, kwd, user )
def allow_dataset_action( self, user, action, dataset ):
"""Returns true when user has permission to perform an action"""
log.debug("In allow_dataset_action, user: %s, action: %s, dataset: %s" % ( str(user), str(action), str(dataset)))
if not isinstance( dataset, self.model.Dataset ):
dataset = dataset.dataset
# If dataset is in public group, we always return true for viewing and using
@@ -146,7 +145,6 @@ class GalaxyRBACAgent( RBACAgent ):
assoc.flush()
return assoc
def disassociate_group_dataset( self, group, dataset ):
log.debug("In disassociate_group_dataset, removing %s -> %s" % (group.id, dataset.id))
assoc = self.model.GroupDatasetAssociation.selectone_by( group_id = group.id, dataset_id = dataset.id )
assoc.delete()
assoc.flush()
@@ -239,11 +237,9 @@ class GalaxyRBACAgent( RBACAgent ):
def get_permitted_actions( self, filter=None ):
'''Utility method to return a subset of RBACAgent's permitted actions'''
if filter is None:
log.debug("In get_permitted_actions, returning RBACAgent.permitted_actions: %s" % str( RBACAgent.permitted_actions))
return RBACAgent.permitted_actions
if not filter.endswith('_'):
filter += '_'
tmp_bunch = Bunch()
[tmp_bunch.__dict__.__setitem__(k, v) for k, v in RBACAgent.permitted_actions.items() if k.startswith(filter)]
log.debug("In get_permitted_actions, returning tmp_bunch: %s" % str( tmp_bunch))
return tmp_bunch
+40 -20
View File
@@ -513,6 +513,10 @@ class Admin( BaseController ):
return trans.show_error_message( no_privilege_msg )
if 'create_folder' in kwd:
folder = trans.app.model.LibraryFolder( name = name, description = description )
# We are associating the last used genome_build with folders, so we will always
# initialize a new folder with the first dbkey in util.dbnames which is currently
# ? unspecified (?)
folder.genome_build = util.dbnames.default_value
if parent_id:
parent_folder = trans.app.model.LibraryFolder.get( parent_id )
parent_folder.add_folder( folder )
@@ -540,8 +544,17 @@ class Admin( BaseController ):
def dataset( self, trans, id=None, name="Unnamed", info='no info', extension=None, folder_id=None, dbkey=None, **kwd ):
if not self.user_is_admin( trans ):
return trans.show_error_message( no_privilege_msg )
if isinstance( dbkey, list ):
last_used_build = dbkey[0]
else:
last_used_build = dbkey
if folder_id and not last_used_build:
folder = trans.app.model.LibraryFolder.get( folder_id )
last_used_build = folder.genome_build
data_files = []
def add_file( file_obj, name, extension, dbkey, groups, info='no info', space_to_tab=False ):
# add_file method
def add_file( file_obj, name, extension, dbkey, last_used_build, groups, info='no info', space_to_tab=False ):
data_type = None
temp_name = sniff.stream_to_file( file_obj )
if space_to_tab:
@@ -552,9 +565,13 @@ class Admin( BaseController ):
data_type = sniff.guess_ext( temp_name, sniff_order=trans.app.datatypes_registry.sniff_order )
else:
data_type = extension
dataset = trans.app.model.LibraryFolderDatasetAssociation( name = name, info = info, extension = data_type, dbkey = dbkey, create_dataset = True )
dataset = trans.app.model.LibraryFolderDatasetAssociation( name=name,
info=info,
extension=data_type,
dbkey=dbkey,
create_dataset=True )
folder = trans.app.model.LibraryFolder.get( folder_id )
folder.add_dataset( dataset )
folder.add_dataset( dataset, genome_build=last_used_build )
dataset.flush()
# GroupDatasetAssociations will enable security on the dataset based on the permitted_actions
# associated with the GroupDatasetAssociation. The default permitted_actions at this point
@@ -575,12 +592,12 @@ class Admin( BaseController ):
else:
dataset.set_peek()
dataset.set_size()
if dataset.missing_meta():
dataset.datatype.set_meta( dataset )
trans.app.model.flush()
return dataset
# END add_file method
if 'create_dataset' in kwd:
# Copied from upload tool action
last_dataset_created = None
@@ -603,12 +620,13 @@ class Admin( BaseController ):
file_name = data_file.filename
file_name = file_name.split( '\\' )[-1]
file_name = file_name.split( '/' )[-1]
last_dataset_created = add_file( data_file.file,
file_name,
extension,
dbkey,
last_dataset_created = add_file( data_file.file,
file_name,
extension,
dbkey,
last_used_build,
groups,
info="uploaded file",
info="uploaded file",
space_to_tab=space_to_tab )
elif url_paste not in [ None, "" ]:
if url_paste.lower().find( 'http://' ) >= 0 or url_paste.lower().find( 'ftp://' ) >= 0:
@@ -618,10 +636,11 @@ class Admin( BaseController ):
if line:
last_dataset_created = add_file( urllib.urlopen( line ),
line,
extension,
dbkey,
extension,
dbkey,
last_used_build,
groups,
info="uploaded url",
info="uploaded url",
space_to_tab=space_to_tab )
else:
is_valid = False
@@ -632,22 +651,22 @@ class Admin( BaseController ):
break
if is_valid:
last_dataset_created = add_file( StringIO.StringIO( url_paste ),
'Pasted Entry',
extension,
dbkey,
'Pasted Entry',
extension,
dbkey,
last_used_build,
groups,
info="pasted entry",
info="pasted entry",
space_to_tab=space_to_tab )
trans.response.send_redirect( web.url_for( action='dataset', id=last_dataset_created.id ) )
elif id is None:
# Send list of data formats to the form so the "extension" select list can be populated dynamically
file_formats = trans.app.datatypes_registry.upload_file_formats
# Send list of genome builds to the form so the "dbkey" select list can be populated dynamically
def get_dbkey_options():
last_used_build = trans.history.genome_build
def get_dbkey_options( last_used_build ):
for dbkey, build_name in util.dbnames:
yield build_name, dbkey, ( dbkey==last_used_build )
dbkeys = get_dbkey_options()
dbkeys = get_dbkey_options( last_used_build )
# Send list of groups to the form so the dataset can be associated with 1 or more of them.
groups = []
q = sa.select( ( ( galaxy.model.Group.table.c.id ).label( 'group_id' ),
@@ -660,6 +679,7 @@ class Admin( BaseController ):
folder_id=folder_id,
file_formats=file_formats,
dbkeys=dbkeys,
last_used_build=last_used_build,
groups=groups )
dataset = trans.app.model.LibraryFolderDatasetAssociation.get( id )
if dataset:
+5 -1
View File
@@ -52,7 +52,11 @@
<div style="float: left; width: 250px; margin-right: 10px;">
<select name="dbkey">
%for dbkey in dbkeys:
<option value="${dbkey[1]}">${dbkey[0]}</option>
%if dbkey[1] == last_used_build:
<option value="${dbkey[1]}" selected>${dbkey[0]}</option>
%else:
<option value="${dbkey[1]}">${dbkey[0]}</option>
%endif
%endfor
</select>
</div>