From e520630b7e8b6891b1d7464c3a7daa0fa173b627 Mon Sep 17 00:00:00 2001 From: Martin Cech Date: Mon, 21 Apr 2014 16:28:14 -0400 Subject: [PATCH] data libraries: don't allow adding dataset within deleted library; better error message handling --- .../webapps/galaxy/api/folder_contents.py | 9 ++++- .../mvc/library/library-foldertoolbar-view.js | 33 ++++++++++++++----- .../mvc/library/library-foldertoolbar-view.js | 2 +- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/lib/galaxy/webapps/galaxy/api/folder_contents.py b/lib/galaxy/webapps/galaxy/api/folder_contents.py index d49918f551c..3e5545504d7 100644 --- a/lib/galaxy/webapps/galaxy/api/folder_contents.py +++ b/lib/galaxy/webapps/galaxy/api/folder_contents.py @@ -174,8 +174,11 @@ class FolderContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrary hda = self.get_dataset( trans, from_hda_id, check_ownership=True, check_accessible=True, check_state=True ) folder = self.get_library_folder( trans, encoded_folder_id_16, check_accessible=True ) + library = folder.parent_library + if library.deleted: + raise exceptions.ObjectAttributeInvalidException() if not self.can_current_user_add_to_library_item( trans, folder ): - raise exceptions.InsufficientPermissionsException( 'You do not have proper permissions to add a dataset to a folder with id (%s)' % ( encoded_folder_id ) ) + raise exceptions.InsufficientPermissionsException() ldda = self.copy_hda_to_library_folder( trans, hda, folder, ldda_message=ldda_message ) update_time = ldda.update_time.strftime( "%Y-%m-%d %I:%M %p" ) @@ -183,6 +186,10 @@ class FolderContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrary rval = trans.security.encode_dict_ids( ldda_dict ) rval['update_time'] = update_time + except exceptions.ObjectAttributeInvalidException: + raise exceptions.ObjectAttributeInvalidException( 'You cannot add datasets into deleted library. Undelete it first.' ) + except exceptions.InsufficientPermissionsException: + raise exceptions.exceptions.InsufficientPermissionsException( 'You do not have proper permissions to add a dataset to a folder with id (%s)' % ( encoded_folder_id ) ) except Exception, exc: # TODO handle exceptions better within the mixins if ( ( 'not accessible to the current user' in str( exc ) ) or ( 'You are not allowed to access this dataset' in str( exc ) ) ): diff --git a/static/scripts/mvc/library/library-foldertoolbar-view.js b/static/scripts/mvc/library/library-foldertoolbar-view.js index f7f556b4b34..1ecd74239b6 100644 --- a/static/scripts/mvc/library/library-foldertoolbar-view.js +++ b/static/scripts/mvc/library/library-foldertoolbar-view.js @@ -19,7 +19,11 @@ var FolderToolbarView = Backbone.View.extend({ defaults: { 'can_add_library_item' : false, - 'contains_file' : false + 'contains_file' : false, + 'adding_datasets' : { + 'total_number' : 0, + 'failed_number' : 0 + } }, modal : null, @@ -301,8 +305,11 @@ var FolderToolbarView = Backbone.View.extend({ // add all selected datasets from history into current folder addAllDatasetsFromHistory : function (){ - //disable the button to prevent multiple submission + // disable the button to prevent multiple submission this.modal.disableButton('Add'); + // init the counters + this.options.adding_datasets.total_number = 0; + this.options.adding_datasets.failed_number = 0; var history_dataset_ids = []; this.modal.$el.find('#selected_history_content').find(':checked').each(function(){ @@ -328,6 +335,7 @@ var FolderToolbarView = Backbone.View.extend({ folder_item.set({'from_hda_id':history_dataset_id}); hdas_to_add.push(folder_item); } + this.options.adding_datasets.total_number = hdas_to_add.length; // call the recursive function to call ajax one after each other (request FIFO queue) this.chainCallAddingHdas(hdas_to_add); }, @@ -337,8 +345,14 @@ var FolderToolbarView = Backbone.View.extend({ this.added_hdas = new mod_library_model.Folder(); var popped_item = hdas_set.pop(); if (typeof popped_item === "undefined") { - mod_toastr.success('Datasets from history added to the folder'); - this.modal.hide(); + if (this.options.adding_datasets.failed_number === 0){ + mod_toastr.success('Selected datasets from history added to the folder'); + } else if (this.options.adding_datasets.failed_number === this.options.adding_datasets.total_number){ + mod_toastr.error('There was an error and no datasets were added to the folder.'); + } else if (this.options.adding_datasets.failed_number < this.options.adding_datasets.total_number){ + mod_toastr.warning('Some of the datasets could not be added to the folder'); + } + Galaxy.modal.hide(); return this.added_hdas; } var promise = $.when(popped_item.save({from_hda_id: popped_item.get('from_hda_id')})); @@ -351,11 +365,12 @@ var FolderToolbarView = Backbone.View.extend({ }) .fail(function(data){ // we have a problem - if (data.status===403){ - mod_toastr.error('You are not allowed to access a dataset'); - } else { - mod_toastr.error('An error occured :('); - } + self.options.adding_datasets.failed_number += 1; + // if (typeof data.responseJSON !== "undefined"){ + // mod_toastr.error(data.responseJSON.err_msg); + // } else { + // mod_toastr.error('An error ocurred :('); + // } self.updateProgress(); self.chainCallAddingHdas(hdas_set); }); diff --git a/static/scripts/packed/mvc/library/library-foldertoolbar-view.js b/static/scripts/packed/mvc/library/library-foldertoolbar-view.js index 91050935553..d11402d8f2f 100644 --- a/static/scripts/packed/mvc/library/library-foldertoolbar-view.js +++ b/static/scripts/packed/mvc/library/library-foldertoolbar-view.js @@ -1 +1 @@ -define(["galaxy.masthead","utils/utils","libs/toastr","mvc/library/library-model"],function(b,d,e,c){var a=Backbone.View.extend({el:"#center",events:{"click #toolbtn_create_folder":"createFolderFromModal","click #toolbtn_bulk_import":"modalBulkImport","click .toolbtn_add_files":"addFilesToFolderModal"},defaults:{can_add_library_item:false,contains_file:false},modal:null,histories:null,initialize:function(f){this.options=_.defaults(f||{},this.defaults);this.render()},render:function(f){this.options=_.extend(this.options,f);var h=this.templateToolBar();var g=false;if(Galaxy.currUser){g=Galaxy.currUser.isAdmin()}this.$el.html(h({id:this.options.id,admin_user:g}))},configureElements:function(f){this.options=_.extend(this.options,f);if(this.options.can_add_library_item===true){$("#toolbtn_create_folder").show();$(".toolbtn_add_files").show()}if(this.options.contains_file===true){$("#toolbtn_bulk_import").show();$("#toolbtn_dl").show()}this.$el.find("[data-toggle]").tooltip()},createFolderFromModal:function(){event.preventDefault();event.stopPropagation();var f=this;var g=this.templateNewFolderInModal();this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Create New Folder",body:g(),buttons:{Create:function(){f.create_new_folder_event()},Close:function(){Galaxy.modal.hide()}}})},create_new_folder_event:function(){var f=this.serialize_new_folder();if(this.validate_new_folder(f)){var g=new c.FolderAsModel();url_items=Backbone.history.fragment.split("/");current_folder_id=url_items[url_items.length-1];g.url=g.urlRoot+"/"+current_folder_id;g.save(f,{success:function(h){Galaxy.modal.hide();e.success("Folder created");h.set({type:"folder"});Galaxy.libraries.folderListView.collection.add(h)},error:function(i,h){Galaxy.modal.hide();if(typeof h.responseJSON!=="undefined"){e.error(h.responseJSON.err_msg)}else{e.error("An error ocurred :(")}}})}else{e.error("Folder's name is missing")}return false},serialize_new_folder:function(){return{name:$("input[name='Name']").val(),description:$("input[name='Description']").val()}},validate_new_folder:function(f){return f.name!==""},modalBulkImport:function(){var f=$("#folder_table").find(":checked");if(f.length===0){e.info("You have to select some datasets first")}else{this.refreshUserHistoriesList(function(g){var h=g.templateBulkImportInModal();g.modal=Galaxy.modal;g.modal.show({closing_events:true,title:"Import into History",body:h({histories:g.histories.models}),buttons:{Import:function(){g.importAllIntoHistory()},Close:function(){Galaxy.modal.hide()}}})})}},refreshUserHistoriesList:function(g){var f=this;this.histories=new c.GalaxyHistories();this.histories.fetch({success:function(){g(f)},error:function(){}})},importAllIntoHistory:function(){this.modal.disableButton("Import");var j=$("select[name=dataset_import_bulk] option:selected").val();this.options.last_used_history_id=j;var m=$("select[name=dataset_import_bulk] option:selected").text();var o=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!==""){o.push(this.parentElement.parentElement.id)}});var n=this.templateImportIntoHistoryProgressBar();this.modal.$el.find(".modal-body").html(n({history_name:m}));var k=100/o.length;this.initProgress(k);var f=[];for(var g=o.length-1;g>=0;g--){var h=o[g];var l=new c.HistoryItem();l.url=l.urlRoot+j+"/contents";l.content=h;l.source="library";f.push(l)}this.chainCall(f,m)},chainCall:function(g,j){var f=this;var h=g.pop();if(typeof h==="undefined"){e.success("Datasets were imported to history: "+j);this.modal.hide();return}var i=$.when(h.save({content:h.content,source:h.source}));i.done(function(k){f.updateProgress();f.chainCall(g,j)}).fail(function(k){e.error("An error occured :(");f.updateProgress();f.chainCall(g,j)})},initProgress:function(f){this.progress=0;this.progressStep=f},updateProgress:function(){this.progress+=this.progressStep;$(".progress-bar-import").width(Math.round(this.progress)+"%");txt_representation=Math.round(this.progress)+"% Complete";$(".completion_span").text(txt_representation)},download:function(f,j){var h=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!==""){h.push(this.parentElement.parentElement.id)}});var g="/api/libraries/datasets/download/"+j;var i={ldda_ids:h};this.processDownload(g,i,"get")},processDownload:function(g,h,i){if(g&&h){h=typeof h==="string"?h:$.param(h);var f="";$.each(h.split("&"),function(){var j=this.split("=");f+=''});$('
'+f+"
").appendTo("body").submit().remove();e.info("Your download will begin soon")}},addFilesToFolderModal:function(){this.refreshUserHistoriesList(function(f){f.modal=Galaxy.modal;var g=f.templateAddFilesInModal();f.modal.show({closing_events:true,title:"Add datasets from history to "+f.options.folder_name,body:g({histories:f.histories.models}),buttons:{Add:function(){f.addAllDatasetsFromHistory()},Close:function(){Galaxy.modal.hide()}}});if(f.histories.models.length>0){f.fetchAndDisplayHistoryContents(f.histories.models[0].id);$("#dataset_add_bulk").change(function(h){f.fetchAndDisplayHistoryContents(h.target.value)})}else{e.error("An error ocurred :(")}})},fetchAndDisplayHistoryContents:function(h){var g=new c.HistoryContents({id:h});var f=this;g.fetch({success:function(j){var i=f.templateHistoryContents();f.histories.get(h).set({contents:j});f.modal.$el.find("#selected_history_content").html(i({history_contents:j.models.reverse()}))},error:function(j,i){e.error("An error ocurred :(")}})},addAllDatasetsFromHistory:function(){this.modal.disableButton("Add");var f=[];this.modal.$el.find("#selected_history_content").find(":checked").each(function(){var i=$(this.parentElement).data("id");if(i){f.push(i)}});var l=this.options.folder_name;var k=this.templateAddingDatasetsProgressBar();this.modal.$el.find(".modal-body").html(k({folder_name:l}));this.progressStep=100/f.length;this.progress=0;var j=[];for(var h=f.length-1;h>=0;h--){history_dataset_id=f[h];var g=new c.Item();g.url="/api/folders/"+this.options.id+"/contents";g.set({from_hda_id:history_dataset_id});j.push(g)}this.chainCallAddingHdas(j)},chainCallAddingHdas:function(g){var f=this;this.added_hdas=new c.Folder();var h=g.pop();if(typeof h==="undefined"){e.success("Datasets from history added to the folder");this.modal.hide();return this.added_hdas}var i=$.when(h.save({from_hda_id:h.get("from_hda_id")}));i.done(function(j){Galaxy.libraries.folderListView.collection.add(j);f.updateProgress();f.chainCallAddingHdas(g)}).fail(function(j){if(j.status===403){e.error("You are not allowed to access a dataset")}else{e.error("An error occured :(")}f.updateProgress();f.chainCallAddingHdas(g)})},templateToolBar:function(){tmpl_array=[];tmpl_array.push('
');tmpl_array.push('

Data Libraries Beta Test. This is work in progress. Please report problems & ideas via email and Trello.

');tmpl_array.push('
');tmpl_array.push('
');tmpl_array.push(' ');tmpl_array.push(' ');tmpl_array.push("
");tmpl_array.push(' ');tmpl_array.push('
');tmpl_array.push(' ");tmpl_array.push(' ");tmpl_array.push("
");tmpl_array.push("
");tmpl_array.push('
');tmpl_array.push("
");tmpl_array.push("
");return _.template(tmpl_array.join(""))},templateNewFolderInModal:function(){tmpl_array=[];tmpl_array.push('
');tmpl_array.push("
");tmpl_array.push('');tmpl_array.push('');tmpl_array.push("
");tmpl_array.push("
");return _.template(tmpl_array.join(""))},templateBulkImportInModal:function(){var f=[];f.push('');f.push("Select history: ");f.push('");f.push("");return _.template(f.join(""))},templateImportIntoHistoryProgressBar:function(){var f=[];f.push('
');f.push("Importing selected datasets to history <%= _.escape(history_name) %>");f.push("
");f.push('
');f.push('
');f.push(' 0% Complete');f.push("
");f.push("
");f.push("");return _.template(f.join(""))},templateAddingDatasetsProgressBar:function(){var f=[];f.push('
');f.push("Adding selected datasets from history to library folder <%= _.escape(folder_name) %>");f.push("
");f.push('
');f.push('
');f.push(' 0% Complete');f.push("
");f.push("
");f.push("");return _.template(f.join(""))},templateAddFilesInModal:function(){var f=[];f.push('
');f.push('
');f.push("Select history: ");f.push('");f.push("
");f.push('
');f.push("
");f.push("
");return _.template(f.join(""))},templateHistoryContents:function(){var f=[];f.push("Choose the datasets to import:");f.push("");return _.template(f.join(""))}});return{FolderToolbarView:a}}); \ No newline at end of file +define(["galaxy.masthead","utils/utils","libs/toastr","mvc/library/library-model"],function(b,d,e,c){var a=Backbone.View.extend({el:"#center",events:{"click #toolbtn_create_folder":"createFolderFromModal","click #toolbtn_bulk_import":"modalBulkImport","click .toolbtn_add_files":"addFilesToFolderModal"},defaults:{can_add_library_item:false,contains_file:false,adding_datasets:{total_number:0,failed_number:0}},modal:null,histories:null,initialize:function(f){this.options=_.defaults(f||{},this.defaults);this.render()},render:function(f){this.options=_.extend(this.options,f);var h=this.templateToolBar();var g=false;if(Galaxy.currUser){g=Galaxy.currUser.isAdmin()}this.$el.html(h({id:this.options.id,admin_user:g}))},configureElements:function(f){this.options=_.extend(this.options,f);if(this.options.can_add_library_item===true){$("#toolbtn_create_folder").show();$(".toolbtn_add_files").show()}if(this.options.contains_file===true){$("#toolbtn_bulk_import").show();$("#toolbtn_dl").show()}this.$el.find("[data-toggle]").tooltip()},createFolderFromModal:function(){event.preventDefault();event.stopPropagation();var f=this;var g=this.templateNewFolderInModal();this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Create New Folder",body:g(),buttons:{Create:function(){f.create_new_folder_event()},Close:function(){Galaxy.modal.hide()}}})},create_new_folder_event:function(){var f=this.serialize_new_folder();if(this.validate_new_folder(f)){var g=new c.FolderAsModel();url_items=Backbone.history.fragment.split("/");current_folder_id=url_items[url_items.length-1];g.url=g.urlRoot+"/"+current_folder_id;g.save(f,{success:function(h){Galaxy.modal.hide();e.success("Folder created");h.set({type:"folder"});Galaxy.libraries.folderListView.collection.add(h)},error:function(i,h){Galaxy.modal.hide();if(typeof h.responseJSON!=="undefined"){e.error(h.responseJSON.err_msg)}else{e.error("An error ocurred :(")}}})}else{e.error("Folder's name is missing")}return false},serialize_new_folder:function(){return{name:$("input[name='Name']").val(),description:$("input[name='Description']").val()}},validate_new_folder:function(f){return f.name!==""},modalBulkImport:function(){var f=$("#folder_table").find(":checked");if(f.length===0){e.info("You have to select some datasets first")}else{this.refreshUserHistoriesList(function(g){var h=g.templateBulkImportInModal();g.modal=Galaxy.modal;g.modal.show({closing_events:true,title:"Import into History",body:h({histories:g.histories.models}),buttons:{Import:function(){g.importAllIntoHistory()},Close:function(){Galaxy.modal.hide()}}})})}},refreshUserHistoriesList:function(g){var f=this;this.histories=new c.GalaxyHistories();this.histories.fetch({success:function(){g(f)},error:function(){}})},importAllIntoHistory:function(){this.modal.disableButton("Import");var j=$("select[name=dataset_import_bulk] option:selected").val();this.options.last_used_history_id=j;var m=$("select[name=dataset_import_bulk] option:selected").text();var o=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!==""){o.push(this.parentElement.parentElement.id)}});var n=this.templateImportIntoHistoryProgressBar();this.modal.$el.find(".modal-body").html(n({history_name:m}));var k=100/o.length;this.initProgress(k);var f=[];for(var g=o.length-1;g>=0;g--){var h=o[g];var l=new c.HistoryItem();l.url=l.urlRoot+j+"/contents";l.content=h;l.source="library";f.push(l)}this.chainCall(f,m)},chainCall:function(g,j){var f=this;var h=g.pop();if(typeof h==="undefined"){e.success("Datasets were imported to history: "+j);this.modal.hide();return}var i=$.when(h.save({content:h.content,source:h.source}));i.done(function(k){f.updateProgress();f.chainCall(g,j)}).fail(function(k){e.error("An error occured :(");f.updateProgress();f.chainCall(g,j)})},initProgress:function(f){this.progress=0;this.progressStep=f},updateProgress:function(){this.progress+=this.progressStep;$(".progress-bar-import").width(Math.round(this.progress)+"%");txt_representation=Math.round(this.progress)+"% Complete";$(".completion_span").text(txt_representation)},download:function(f,j){var h=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!==""){h.push(this.parentElement.parentElement.id)}});var g="/api/libraries/datasets/download/"+j;var i={ldda_ids:h};this.processDownload(g,i,"get")},processDownload:function(g,h,i){if(g&&h){h=typeof h==="string"?h:$.param(h);var f="";$.each(h.split("&"),function(){var j=this.split("=");f+=''});$('
'+f+"
").appendTo("body").submit().remove();e.info("Your download will begin soon")}},addFilesToFolderModal:function(){this.refreshUserHistoriesList(function(f){f.modal=Galaxy.modal;var g=f.templateAddFilesInModal();f.modal.show({closing_events:true,title:"Add datasets from history to "+f.options.folder_name,body:g({histories:f.histories.models}),buttons:{Add:function(){f.addAllDatasetsFromHistory()},Close:function(){Galaxy.modal.hide()}}});if(f.histories.models.length>0){f.fetchAndDisplayHistoryContents(f.histories.models[0].id);$("#dataset_add_bulk").change(function(h){f.fetchAndDisplayHistoryContents(h.target.value)})}else{e.error("An error ocurred :(")}})},fetchAndDisplayHistoryContents:function(h){var g=new c.HistoryContents({id:h});var f=this;g.fetch({success:function(j){var i=f.templateHistoryContents();f.histories.get(h).set({contents:j});f.modal.$el.find("#selected_history_content").html(i({history_contents:j.models.reverse()}))},error:function(j,i){e.error("An error ocurred :(")}})},addAllDatasetsFromHistory:function(){this.modal.disableButton("Add");this.options.adding_datasets.total_number=0;this.options.adding_datasets.failed_number=0;var f=[];this.modal.$el.find("#selected_history_content").find(":checked").each(function(){var i=$(this.parentElement).data("id");if(i){f.push(i)}});var l=this.options.folder_name;var k=this.templateAddingDatasetsProgressBar();this.modal.$el.find(".modal-body").html(k({folder_name:l}));this.progressStep=100/f.length;this.progress=0;var j=[];for(var h=f.length-1;h>=0;h--){history_dataset_id=f[h];var g=new c.Item();g.url="/api/folders/"+this.options.id+"/contents";g.set({from_hda_id:history_dataset_id});j.push(g)}this.options.adding_datasets.total_number=j.length;this.chainCallAddingHdas(j)},chainCallAddingHdas:function(g){var f=this;this.added_hdas=new c.Folder();var h=g.pop();if(typeof h==="undefined"){if(this.options.adding_datasets.failed_number===0){e.success("Selected datasets from history added to the folder")}else{if(this.options.adding_datasets.failed_number===this.options.adding_datasets.total_number){e.error("There was an error and no datasets were added to the folder.")}else{if(this.options.adding_datasets.failed_number');tmpl_array.push('

Data Libraries Beta Test. This is work in progress. Please report problems & ideas via email and Trello.

');tmpl_array.push('
');tmpl_array.push('
');tmpl_array.push(' ');tmpl_array.push(' ');tmpl_array.push("
");tmpl_array.push(' ');tmpl_array.push('
');tmpl_array.push(' ");tmpl_array.push(' ");tmpl_array.push("
");tmpl_array.push("
");tmpl_array.push('
');tmpl_array.push("
");tmpl_array.push("");return _.template(tmpl_array.join(""))},templateNewFolderInModal:function(){tmpl_array=[];tmpl_array.push('
');tmpl_array.push("
");tmpl_array.push('');tmpl_array.push('');tmpl_array.push("
");tmpl_array.push("
");return _.template(tmpl_array.join(""))},templateBulkImportInModal:function(){var f=[];f.push('');f.push("Select history: ");f.push('");f.push("");return _.template(f.join(""))},templateImportIntoHistoryProgressBar:function(){var f=[];f.push('
');f.push("Importing selected datasets to history <%= _.escape(history_name) %>");f.push("
");f.push('
');f.push('
');f.push(' 0% Complete');f.push("
");f.push("
");f.push("");return _.template(f.join(""))},templateAddingDatasetsProgressBar:function(){var f=[];f.push('
');f.push("Adding selected datasets from history to library folder <%= _.escape(folder_name) %>");f.push("
");f.push('
');f.push('
');f.push(' 0% Complete');f.push("
");f.push("
");f.push("");return _.template(f.join(""))},templateAddFilesInModal:function(){var f=[];f.push('
');f.push('
');f.push("Select history: ");f.push('");f.push("
");f.push('
');f.push("
");f.push("
");return _.template(f.join(""))},templateHistoryContents:function(){var f=[];f.push("Choose the datasets to import:");f.push("");return _.template(f.join(""))}});return{FolderToolbarView:a}}); \ No newline at end of file