From a41656fe968dbce27fef923a1bc05fbbbcdc3a0b Mon Sep 17 00:00:00 2001 From: Greg Von Kuster Date: Thu, 21 Aug 2008 14:51:47 -0400 Subject: [PATCH] Add the ability to delete a dataset from a library folder. Also completed several bug fixes in the Admin GUI components. --- lib/galaxy/web/controllers/admin.py | 53 ++++++++++++++++++++++-- templates/admin/library/folder.mako | 19 +++++++-- templates/admin/library/library.mako | 3 ++ templates/admin/library/new_dataset.mako | 3 ++ 4 files changed, 70 insertions(+), 8 deletions(-) diff --git a/lib/galaxy/web/controllers/admin.py b/lib/galaxy/web/controllers/admin.py index 02bd8183e2f..00d58c63f91 100644 --- a/lib/galaxy/web/controllers/admin.py +++ b/lib/galaxy/web/controllers/admin.py @@ -81,11 +81,14 @@ class Admin( BaseController ): order_by = [ galaxy.model.Group.table.c.name ] ) groups = [] for row in q.execute(): + total_datasets = 0 + permitted_actions = [] # This 2nd query retrieves the number of datasets and dataset permitted_actions associated with each group q2 = sa.select( ( ( galaxy.model.Group.table.c.id ).label( 'group_id' ), ( galaxy.model.GroupDatasetAssociation.table.c.permitted_actions ).label( 'permitted_actions' ), sa.func.count( galaxy.model.Dataset.table.c.id ).label( 'total_datasets' ) ), - whereclause = galaxy.model.Group.table.c.id == row.group_id, + whereclause = sa.and_( galaxy.model.Group.table.c.id == row.group_id, + galaxy.model.Dataset.table.c.deleted == False ), from_obj = [ sa.outerjoin( galaxy.model.Group.table, galaxy.model.GroupDatasetAssociation.table ).outerjoin( galaxy.model.Dataset.table ) ], @@ -354,7 +357,8 @@ class Admin( BaseController ): q2 = sa.select( ( ( galaxy.model.Group.table.c.id ).label( 'group_id' ), ( galaxy.model.GroupDatasetAssociation.table.c.permitted_actions ).label( 'permitted_actions' ), sa.func.count( galaxy.model.Dataset.table.c.id ).label( 'total_datasets' ) ), - whereclause = galaxy.model.Group.table.c.id == row.group_id, + whereclause = sa.and_( galaxy.model.Group.table.c.id == row.group_id, + galaxy.model.Dataset.table.c.deleted == False ), from_obj = [ sa.outerjoin( galaxy.model.Group.table, galaxy.model.GroupDatasetAssociation.table ).outerjoin( galaxy.model.Dataset.table ) ], @@ -462,7 +466,8 @@ class Admin( BaseController ): q2 = sa.select( ( ( galaxy.model.Group.table.c.id ).label( 'group_id' ), ( galaxy.model.GroupDatasetAssociation.table.c.permitted_actions ).label( 'permitted_actions' ), sa.func.count( galaxy.model.Dataset.table.c.id ).label( 'total_datasets' ) ), - whereclause = galaxy.model.Group.table.c.id == row.group_id, + whereclause = sa.and_( galaxy.model.Group.table.c.id == row.group_id, + galaxy.model.Dataset.table.c.deleted == False ), from_obj = [ sa.outerjoin( galaxy.model.Group.table, galaxy.model.GroupDatasetAssociation.table ).outerjoin( galaxy.model.Dataset.table ) ], @@ -651,15 +656,23 @@ class Admin( BaseController ): last_dataset_created = None data_file = kwd['file_data'] url_paste = kwd['url_paste'] + if data_file == '' and url_paste == '': + msg = 'Select a file, enter an URL or enter Text.' + trans.response.send_redirect( web.url_for( action='dataset', folder_id=folder_id, msg=msg ) ) space_to_tab = False if 'space_to_tab' in kwd: if kwd['space_to_tab'] not in ["None", None]: space_to_tab = True + if 'groups' not in kwd: + msg = 'The dataset must be associated with at least 1 group.' + trans.response.send_redirect( web.url_for( action='dataset', folder_id=folder_id, msg=msg ) ) groups = kwd['groups'] if groups and not isinstance( groups, list ): # mako sends singleton lists as a string groups = [ groups ] - if groups is None: + elif groups is None: + groups = [] + else: groups = [] temp_name = "" data_list = [] @@ -844,6 +857,38 @@ class Admin( BaseController ): msg=msg ) else: return trans.show_error_message( "Invalid dataset specified" ) + @web.expose + def delete_dataset( self, trans, id=None, **kwd): + if not self.user_is_admin( trans ): + return trans.show_error_message( no_privilege_msg ) + if id: + # id is a LibraryFolderDatasetAssociation.id + library_folder_dataset_assoc = trans.app.model.LibraryFolderDatasetAssociation.get( id ) + folder = library_folder_dataset_assoc.folder + library = folder.library_root[0] + dataset = library_folder_dataset_assoc.dataset + # TODO: assuming 1 to 1 mapping between Dataset -> LibraryFolders ( i.e., is can the same + # dataset record be shared across LibraryFolders? + # Confirm that things should be deleted as follows + # Delete the LibraryFolderDatasetAssociation + library_folder_dataset_assoc.deleted = True + library_folder_dataset_assoc.flush() + # Delete any GroupDatasetAssociations + for group_dataset_assoc in dataset.groups: + group_dataset_assoc.delete() + group_dataset_assoc.flush() + # Delete any HistoryDatasetAssociations + for history_dataset_assoc in dataset.history_associations: + history_dataset_assoc.delete() + history_dataset_assoc.flush() + # Delete the dataset + dataset.deleted = True + dataset.flush() + trans.log_event( "Dataset id %s deleted from library folder id %s" % ( str( id ), str( folder.id ) ) ) + msg = 'The dataset was deleted from the folder' + # Refresh the library for display + library.refresh() + return trans.fill_template( '/admin/library/library.mako', library=library, msg=msg ) def renderable( self, trans, component, group_id ): render = False if isinstance( component, trans.app.model.LibraryFolder ): diff --git a/templates/admin/library/folder.mako b/templates/admin/library/folder.mako index e93b64e7989..5dfa3498e51 100644 --- a/templates/admin/library/folder.mako +++ b/templates/admin/library/folder.mako @@ -4,11 +4,12 @@ <% if isinstance( component, trans.app.model.LibraryFolder ): return render_folder( component ) - elif isinstance( component, trans.app.model.LibraryFolderDatasetAssociation ): + elif isinstance( component, trans.app.model.LibraryFolderDatasetAssociation ) and not component.deleted: return render_dataset( component ) %> -## Render the dataset `data` as history item, using `hid` as the displayed id + +## Render the dataset `data` as folder item, using `hid` as the displayed id <%def name="render_dataset( data )"> <% if data.state in ['no state','',None]: @@ -20,7 +21,7 @@
${data.display_name()}
- ## Header row for history items (name, state, action buttons) + ## Header row for folder items (name, state, action buttons)
%if data_state != 'ok':
@@ -37,10 +38,19 @@ title='edit attributes' class='editButton' border='0'> +
##${data.display_name()}
- ## Body for history items, extra info and actions, data "peek" + ## Body for folder items, extra info and actions, data "peek"
%if data_state == "queued":
Job is waiting to run
@@ -76,6 +86,7 @@
+ ## Render a folder <%def name="render_folder( this_folder )">
diff --git a/templates/admin/library/library.mako b/templates/admin/library/library.mako index 5d979af8abb..6fa56ae04ec 100644 --- a/templates/admin/library/library.mako +++ b/templates/admin/library/library.mako @@ -7,6 +7,9 @@ Groups  |   Users
+ %if msg: +

${msg}

+ %endif
Manage Library '${library.name}'
diff --git a/templates/admin/library/new_dataset.mako b/templates/admin/library/new_dataset.mako index 3c641288b74..1c335678ffb 100644 --- a/templates/admin/library/new_dataset.mako +++ b/templates/admin/library/new_dataset.mako @@ -7,6 +7,9 @@ Groups  |   Users
+ %if msg: +

${msg}

+ %endif
Create a new Library Dataset