' +
@@ -192,7 +149,69 @@ define( [ 'mvc/form/form-view', 'mvc/ui/ui-misc' ], function( Form, Ui ) {
}
});
+ /** View of individual user forms */
+ var Forms = Backbone.View.extend({
+
+ initialize: function( options ) {
+ this.model = new Model( options );
+ this.page = this.model.get( options.form_id );
+ this.setElement( '' );
+ this.render();
+ },
+
+ render: function() {
+ var self = this;
+ $.ajax({
+ url : Galaxy.root + this.page.url,
+ type : 'GET'
+ }).done( function( response ) {
+ var options = $.extend( {}, self.page, response );
+ var form = new Form({
+ title : options.title,
+ icon : options.icon,
+ inputs : options.inputs,
+ operations: {
+ 'submit': new Ui.ButtonIcon({
+ tooltip : options.submit_tooltip,
+ title : options.submit_title || 'Save settings',
+ icon : options.submit_icon || 'fa-save',
+ onclick : function() { self._submit( form, options ) }
+ })
+ }
+ });
+ self.$el.empty().append( form.$el );
+ }).fail( function( response ) {
+ self.$el.empty().append( new Ui.Message({
+ message : 'Failed to load resource ' + self.page.url + '.',
+ status : 'danger',
+ persistent : true
+ }).$el );
+ });
+ },
+
+ _submit: function( form, options ) {
+ var self = this;
+ $.ajax( {
+ url : Galaxy.root + options.url,
+ data : JSON.stringify( form.data.create() ),
+ type : 'PUT',
+ contentType : 'application/json'
+ }).done( function( response ) {
+ var updated_values = false;
+ form.data.matchModel( response, function ( input, input_id ) {
+ form.field_list[ input_id ].value( input.value );
+ updated_values = true;
+ });
+ form.message.update( { message: response.message, status: 'success' } );
+ }).fail( function( response ) {
+ window.console.log( response );
+ form.message.update( { message: response.responseJSON.err_msg, status: 'danger' } );
+ });
+ }
+ });
+
return {
- View: View
+ View : View,
+ Forms : Forms
};
});
diff --git a/client/galaxy/scripts/mvc/tool/tool-form-workflow.js b/client/galaxy/scripts/mvc/workflow/workflow-forms.js
similarity index 94%
rename from client/galaxy/scripts/mvc/tool/tool-form-workflow.js
rename to client/galaxy/scripts/mvc/workflow/workflow-forms.js
index d9ca767d433..965f70db631 100644
--- a/client/galaxy/scripts/mvc/tool/tool-form-workflow.js
+++ b/client/galaxy/scripts/mvc/workflow/workflow-forms.js
@@ -1,12 +1,18 @@
-/** This is the workflow tool form. */
-define( [ 'utils/utils', 'mvc/tool/tool-form-base' ],
- function( Utils, ToolFormBase ) {
- var View = Backbone.View.extend({
+define( [ 'utils/utils', 'mvc/form/form-view', 'mvc/tool/tool-form-base' ], function( Utils, Form, ToolFormBase ) {
+
+ /** Default form wrapper for non-tool modules in the workflow editor. */
+ var Default = Backbone.View.extend({
+ initialize: function( options ) {
+ this.form = new Form( options );
+ }
+ });
+
+ /** Tool form wrapper for the workflow editor. */
+ var Tool = Backbone.View.extend({
initialize: function( options ) {
var self = this;
this.workflow = options.workflow;
this.node = options.node;
- this.setElement( '' );
if ( this.node ) {
this.post_job_actions = this.node.post_job_actions || {};
Utils.deepeach( options.inputs, function( input ) {
@@ -15,7 +21,7 @@ define( [ 'utils/utils', 'mvc/tool/tool-form-base' ],
input.type = 'hidden';
input.info = 'Data input \'' + input.name + '\' (' + Utils.textify( input.extensions ) + ')';
input.value = { '__class__': 'RuntimeValue' };
- } else {
+ } else if ( !input.fixed ) {
input.collapsible_value = { '__class__': 'RuntimeValue' };
input.is_workflow = ( input.options && input.options.length == 0 ) ||
( [ 'integer', 'float' ].indexOf( input.type ) != -1 );
@@ -64,7 +70,6 @@ define( [ 'utils/utils', 'mvc/tool/tool-form-base' ],
});
},
}));
- this.$el.append( this.form.$el );
} else {
Galaxy.emit.debug('tool-form-workflow::initialize()', 'Node not found in workflow.');
}
@@ -74,14 +79,6 @@ define( [ 'utils/utils', 'mvc/tool/tool-form-base' ],
_makeSections: function( options ){
var inputs = options.inputs;
var datatypes = options.datatypes;
- inputs.push({
- label : 'Annotation / Notes',
- name : '__annotation',
- type : 'text',
- area : true,
- help : 'Add an annotation or note for this step. It will be shown with the workflow.',
- value : this.node.annotation
- });
var output_id = this.node.output_terminals && Object.keys( this.node.output_terminals )[ 0 ];
if ( output_id ) {
inputs.push({
@@ -256,6 +253,7 @@ define( [ 'utils/utils', 'mvc/tool/tool-form-base' ],
});
return {
- View: View
+ Default: Default,
+ Tool: Tool
};
});
diff --git a/client/galaxy/scripts/mvc/workflow/workflow-view.js b/client/galaxy/scripts/mvc/workflow/workflow-view.js
index b19f51f98da..c79870999b8 100644
--- a/client/galaxy/scripts/mvc/workflow/workflow-view.js
+++ b/client/galaxy/scripts/mvc/workflow/workflow-view.js
@@ -6,13 +6,12 @@ define([
'mvc/workflow/workflow-canvas',
'mvc/workflow/workflow-node',
'mvc/workflow/workflow-icons',
- 'mvc/tool/tool-form-workflow',
- 'mvc/form/form-view',
+ 'mvc/workflow/workflow-forms',
'mvc/ui/ui-misc',
'utils/async-save-text',
'libs/toastr',
'ui/editable-text'
-], function( Utils, Globals, Workflow, WorkflowCanvas, Node, WorkflowIcons, ToolForm, Form, Ui, async_save_text, Toastr ){
+], function( Utils, Globals, Workflow, WorkflowCanvas, Node, WorkflowIcons, FormWrappers, Ui, async_save_text, Toastr ){
// Reset tool search to start state.
function reset_tool_search( initValue ) {
@@ -661,62 +660,64 @@ define([
var $container = $( '#' + cls );
if ( content && $container.find( '#' + id ).length == 0 ) {
var $el = $( '' );
- var form = null;
+ var form_wrapper = null;
+ content.node = node;
+ content.workflow = this.workflow;
+ content.datatypes = this.datatypes;
content.icon = WorkflowIcons[ node.type ];
content.cls = 'ui-portlet-narrow';
- if ( node.type == 'tool' ) {
- content.node = node;
- content.workflow = this.workflow;
- content.datatypes = this.datatypes;
- form = new ToolForm.View( content );
- } else {
- content.inputs.unshift({
- type : 'text',
- name : '__label',
- label : 'Label',
- value : node.label,
- help : 'Add a step label.',
- onchange: function( new_label ) {
- var duplicate = false;
- for ( var i in self.workflow.nodes ) {
- var n = self.workflow.nodes[ i ];
- if ( n.label && n.label == new_label && n.id != node.id ) {
- duplicate = true;
- break;
- }
+ content.inputs.unshift({
+ type : 'text',
+ name : '__annotation',
+ label : 'Annotation',
+ fixed : true,
+ value : node.annotation,
+ area : true,
+ help : 'Add an annotation or notes to this step. Annotations are available when a workflow is viewed.'
+ });
+ content.inputs.unshift({
+ type : 'text',
+ name : '__label',
+ label : 'Label',
+ value : node.label,
+ help : 'Add a step label.',
+ fixed : true,
+ onchange: function( new_label ) {
+ var duplicate = false;
+ for ( var i in self.workflow.nodes ) {
+ var n = self.workflow.nodes[ i ];
+ if ( n.label && n.label == new_label && n.id != node.id ) {
+ duplicate = true;
+ break;
}
- var input_id = form.data.match( '__label' );
- var input_element = form.element_list[ input_id ];
- input_element.model.set( 'error_text', duplicate && 'Duplicate label. Please fix this before saving the workflow.' );
- form.trigger( 'change' );
+ }
+ var input_id = form_wrapper.form.data.match( '__label' );
+ var input_element = form_wrapper.form.element_list[ input_id ];
+ input_element.model.set( 'error_text', duplicate && 'Duplicate label. Please fix this before saving the workflow.' );
+ form_wrapper.form.trigger( 'change' );
+ }
+ });
+ content.onchange = function() {
+ Utils.request({
+ type : 'POST',
+ url : Galaxy.root + 'api/workflows/build_module',
+ data : {
+ id : node.id,
+ type : node.type,
+ content_id : node.content_id,
+ inputs : form_wrapper.form.data.create()
+ },
+ success : function( data ) {
+ node.update_field_data( data );
}
});
- content.inputs.push({
- type : 'text',
- name : '__annotation',
- label : 'Annotation',
- value : node.annotation,
- area : true,
- help : 'Add an annotation or notes to this step. Annotations are available when a workflow is viewed.'
- });
- content.onchange = function() {
- Utils.request({
- type : 'POST',
- url : Galaxy.root + 'api/workflows/build_module',
- data : {
- id : node.id,
- type : node.type,
- content_id : node.content_id,
- inputs : form.data.create()
- },
- success : function( data ) {
- node.update_field_data( data );
- }
- });
- };
- form = new Form( content );
+ };
+ if ( node.type == 'tool' ) {
+ form_wrapper = new FormWrappers.Tool( content );
+ } else {
+ form_wrapper = new FormWrappers.Default( content );
}
- $el.append( form.$el );
+ $el.append( form_wrapper.form.$el );
$container.append( $el );
}
$( '.' + cls ).hide();
diff --git a/client/galaxy/scripts/nls/fr/locale.js b/client/galaxy/scripts/nls/fr/locale.js
new file mode 100644
index 00000000000..858ea086796
--- /dev/null
+++ b/client/galaxy/scripts/nls/fr/locale.js
@@ -0,0 +1,331 @@
+/** fr localization */
+define({
+// ----------------------------------------------------------------------------- masthead
+"Analyze Data":
+ "Analyse de données",
+"Workflow":
+ "Workflow",
+"Shared Data":
+ "Données partagées",
+"Data Libraries":
+ "Bibliothèque de données",
+"Histories":
+ "Historiques",
+"Workflows":
+ "Workflows",
+"Visualizations":
+ "Visualisations",
+"Pages":
+ "Pages",
+"Visualization":
+ "Visualisation",
+"New Track Browser":
+ "Nouveau Navigateur de Tracks/Pistes",
+"Saved Visualizations":
+ "Visualisations sauvegardés",
+"Interactive Environments":
+ "Environnements interactifs",
+"Admin":
+ "Admin",
+"Help":
+ "Aide",
+"Support":
+ "Assistance",
+"Search":
+ "Recherche",
+"Mailing Lists":
+ "Liste de diffusion",
+"Videos":
+ "Vidéos",
+"Wiki":
+ "Documentations",
+"How to Cite Galaxy":
+ "Comment citer Galaxy",
+"Interactive Tours":
+ "Guides interactifs",
+"User":
+ "Utilisateur",
+"Login":
+ "Authentification",
+"Register":
+ "Enregistrement",
+"Logged in as":
+ "Authentifié en tant que",
+"Preferences":
+ "Préférences",
+"Custom Builds":
+ "Mes génomes Builds de référence",
+"Logout":
+ "Déconnection",
+"Saved Histories":
+ "Historiques sauvegardés",
+"Saved Datasets":
+ "Jeux de données sauvegardés",
+"Saved Pages":
+ "Pages sauvegardées",
+// ---------------------------------------------------------------------------- histories
+// ---- history/options-menu
+"History Lists":
+ "Tableaux des historiques",
+// Saved histories is defined above.
+// "Saved Histories":
+// false,
+"Histories Shared with Me":
+ "Historiques partagés avec moi",
+"Current History":
+ "Cet Historique",
+"Create New":
+ "Créer un nouveau",
+"Copy History":
+ "Copier l'Historique",
+"Share or Publish":
+ "Partager et publier",
+"Show Structure":
+ "Montrer la structure",
+"Extract Workflow":
+ "Extraire un Workflow",
+// Delete is defined elsewhere, but is also in this menu.
+// "Delete":
+// false,
+"Delete Permanently":
+ "Supprimer définitivement",
+"Dataset Actions":
+ "Actions sur les jeux de données",
+"Copy Datasets":
+ "Copier des jeux de données",
+"Dataset Security":
+ "Permissions/Sécurité",
+"Resume Paused Jobs":
+ "Reprendre les processus en pause",
+"Collapse Expanded Datasets":
+ "Réduire les données étendus",
+"Unhide Hidden Datasets":
+ "Afficher les données cachés",
+"Delete Hidden Datasets":
+ "Supprimer les données cachés",
+"Purge Deleted Datasets":
+ "Purger les données supprimer",
+"Downloads":
+ "Télécharger",
+"Export Tool Citations":
+ "Exporter les citations des outils",
+"Export History to File":
+ "Exporter l'Historique dans un fichier",
+"Other Actions":
+ "Autres actions",
+"Import from File":
+ "Importer depuis un fichier",
+"Webhooks":
+ "Webhooks",
+
+// ---- history-model
+// ---- history-view
+"This history is empty" :
+ "Cet historique est vide",
+"No matching datasets found" :
+ "Aucunes données correspondantes n'a été trouvées",
+"An error occurred while getting updates from the server" :
+ "Une erreur s'est produite lors de la réception des données depuis le serveur",
+"Please contact a Galaxy administrator if the problem persists" :
+ "Veuillez contacter un administrateur de l'instance Galaxy si ce problème persiste",
+//TODO:
+//"An error was encountered while <% where %>" :
+//false,
+"search datasets" :
+ "Rechercher des données",
+"You are currently viewing a deleted history!" :
+ "Vous consultez actuellement un historique supprimé!",
+"You are over your disk quota" :
+ "Vous avez dépassé votre quota d'espace disque",
+"Tool execution is on hold until your disk usage drops below your allocated quota" :
+ "L'exécution de l'outil est en attente tant que votre utilisation d'espace disque dépasse le quota attribué",
+"All" :
+ "Tout",
+"None" :
+ "Aucun",
+"For all selected" :
+ "Pour toute la sélection",
+
+// // ---- history-view-edit
+"Edit history tags" :
+ "Editer les mots-clés de l'historique",
+"Edit history Annotation" :
+ "Editer l'annotation de l'historique",
+"Click to rename history" :
+ "Cliquer pour renommer l'historique",
+// multi operations
+"Operations on multiple datasets" :
+ "Opérer sur plusieurs jeux de données en même temps",
+"Hide datasets" :
+ "Cacher les jeux de données",
+"Unhide datasets" :
+ "Afficher les jeux de données cachés",
+"Delete datasets" :
+ "Supprimer les jeux de données",
+"Undelete datasets" :
+ "Restaurer les jeux de données supprimés",
+"Permanently delete datasets" :
+ "Supprimer définitivement les jeux de données",
+"This will permanently remove the data in your datasets. Are you sure?" :
+ "Cela supprimera de manière permanente les données de votre historique. Êtes-vous certain?",
+
+// menu operations
+
+
+// // ---- history-view-annotated
+"Dataset" :
+ "Jeu de données",
+"Annotation" :
+ "Annotation",
+
+// ---- history-view-edit-current
+"This history is empty. Click 'Get Data' on the left tool menu to start" :
+ "Cet historique est vide. Cliquer sur 'Get Data' au niveau du menu d'outils à gauche pour démarrer",
+"You must be logged in to create histories" :
+ "Vous devez être connecté pour créer un historique",
+//TODO:
+//"You can <% loadYourOwn %> or <% externalSource %>" :
+//"Vous pouvez <% loadYourOwn %> ou <% externalSource %>",
+"load your own data" :
+ "Charger vos propres données",
+"get data from an external source" :
+ "Charger des données depuis une source externe",
+
+// these aren't in zh/ginga.po and the template doesn't localize
+"Include Deleted Datasets" :
+ "Inclure les jeux de données supprimés",
+"Include Hidden Datasets" :
+ "Inclure les jeux de données cachés",
+
+
+// ---------------------------------------------------------------------------- datasets
+// ---- hda-model
+"Unable to purge dataset" :
+ "Impossible de purger le jeu de données",
+
+// ---- hda-base
+// display button
+"Cannot display datasets removed from disk" :
+ "Impossible de visualiser les jeux de données supprimés du disque",
+"This dataset must finish uploading before it can be viewed" :
+ "Le jeu de données doit être totalement téléversé avant de pouvoir être visualiser",
+"This dataset is not yet viewable" :
+ "Ce jeu de données n'est pas visualisable",
+"View data" :
+ "Voir les données",
+// download button
+"Download" :
+ "Télécharger",
+"Download dataset" :
+ "Télécharger le jeu de données",
+"Additional files" :
+ "Fichiers additionnels",
+// info/show_params
+"View details" :
+ "Voir les détails",
+
+// dataset states
+// state: new
+"This is a new dataset and not all of its data are available yet" :
+ "Il s'agit d'un nouveau jeu de données et seule une partie des données est accessible pour le moment",
+// state: noPermission
+"You do not have permission to view this dataset" :
+ "Vous n'avez pas la permission de voir ce jeu de données",
+// state: discarded
+"The job creating this dataset was cancelled before completion" :
+ "Le processus à l'origine de ce jeu de données a été annulé prématurément",
+// state: queued
+"This job is waiting to run" :
+ "Ce calcul est en attente de traitement",
+// state: upload
+"This dataset is currently uploading" :
+ "Ce jeu de données est en cours de téléversement",
+// state: setting_metadata
+"Metadata is being auto-detected" :
+ "Les métadonnées sont auto-détectées",
+// state: running
+"This job is currently running" :
+ "Le traitement est en cours",
+// state: paused
+"This job is paused. Use the \"Resume Paused Jobs\" in the history menu to resume" :
+ "Ce traitement est en pause. Utilisez le \"Relancer les traitements en pause\" dans le menu d'historique pour le relancer",
+// state: error
+"An error occurred with this dataset" :
+ "Un erreur est survenue avec ce jeu de données",
+// state: empty
+"No data" :
+ "Aucune donnée",
+// state: failed_metadata
+"An error occurred setting the metadata for this dataset" :
+ "Une erreur est survenue pendant la récupération des métadonnées de ce jeu de données",
+
+// ajax error prefix
+"There was an error getting the data for this dataset" :
+ "Il est survenu une erreur durant la récupération du contenu de ce jeu de données",
+
+// purged'd/del'd msg
+"This dataset has been deleted and removed from disk" :
+ "Ce jeu de données a été supprimé et effacé du disque",
+"This dataset has been deleted" :
+ "Ce jeu de données a été supprimé",
+"This dataset has been hidden" :
+ "Ce jeu de données a été caché",
+
+"format" :
+ "format",
+"database" :
+ "génome de référence",
+
+// ---- hda-edit
+"Edit attributes" :
+ "Editer les attributs",
+"Cannot edit attributes of datasets removed from disk" :
+ "Impossible d'éditer les attributs de jeux de données effacés du disque",
+"Undelete dataset to edit attributes" :
+ "Restaurer le jeu de données pour en éditer les attributs",
+"This dataset must finish uploading before it can be edited" :
+ "Ce jeu de données doit être entièrement téléversé avant toute modification",
+"This dataset is not yet editable" :
+ "Ce jeu de données n'est pas encore éditable",
+
+"Delete" :
+ "Supprimer",
+"Dataset is already deleted" :
+ "Le jeu de données est déjà supprimé",
+
+"View or report this error" :
+ "Voir ou remonter cette erreur",
+
+"Run this job again" :
+ "Exécuter ce traitement à nouveau",
+
+"Visualize" :
+ "Visualiser",
+"Visualize in" :
+ "Visualiser via",
+
+"Undelete it" :
+ "Restaurer",
+"Permanently remove it from disk" :
+ "Supprimer définitivement du disque",
+"Unhide it" :
+ "Rendre visible",
+
+"You may be able to" :
+ "Vous devriez être en mesure de",
+"set it manually or retry auto-detection" :
+ "Traitez le manuellement ou retenter la détection automatique",
+
+"Edit dataset tags" :
+ "Editer les mots-clés du jeu de données",
+"Edit dataset annotation" :
+ "Editer les annotations du jeu de données",
+
+
+// ---------------------------------------------------------------------------- misc. MVC
+"Tags" :
+ "Mots-clés",
+"Edit annotation" :
+ "Editer les annotations",
+
+});
diff --git a/client/galaxy/scripts/nls/ja/locale.js b/client/galaxy/scripts/nls/ja/locale.js
index 18b81756da0..f23661cef4b 100644
--- a/client/galaxy/scripts/nls/ja/locale.js
+++ b/client/galaxy/scripts/nls/ja/locale.js
@@ -5,9 +5,9 @@ define({
// ---- history-model
// ---- history-view
"This history is empty" :
-"ヒストリーは空です",
+ "ヒストリーは空です",
"No matching datasets found" :
-"一致するデータセットが見つかりませんでした",
+ "一致するデータセットが見つかりませんでした",
//"An error occurred while getting updates from the server" :
//false,
//"Please contact a Galaxy administrator if the problem persists" :
@@ -16,19 +16,19 @@ define({
//"An error was encountered while <% where %>" :
//false,
"Search datasets" :
-"データセットを検索する",
+ "データセットを検索する",
"You are currently viewing a deleted history!" :
-"消去したヒストリーをみています。",
+ "消去したヒストリーをみています。",
"You are over your disk quota" :
-"あなたはディスククォータを超えている",
+ "あなたはディスククォータを超えている",
//"Tool execution is on hold until your disk usage drops below your allocated quota" :
//false,
"All" :
-"一式",
+ "一式",
"None" :
-"なし",
+ "なし",
"For all selected" :
-"各項目を",
+ "各項目を",
// ---- history-view-edit
//"Edit history tags" :
@@ -36,10 +36,10 @@ define({
//"Edit history Annotation" :
//false,
"Click to rename history" :
-"ヒストリーの名前を変更するにはクリック",
+ "ヒストリーの名前を変更するにはクリック",
// multi operations
"Operations on multiple datasets" :
-"複数のデータセットに対する操作",
+ "複数のデータセットに対する操作",
//"Hide datasets" :
//false,
//"Unhide datasets" :
@@ -49,23 +49,21 @@ define({
//"Undelete datasets" :
//false,
"Permanently delete datasets" :
-"永久にデータセットを削除",
+ "永久にデータセットを削除",
"This will permanently remove the data in your datasets. Are you sure?" :
-"これは永久にあなたのデータセット内のデータを削除します。本当に?",
+ "これは永久にあなたのデータセット内のデータを削除します。本当に?",
// ---- history-view-annotated
"Dataset" :
-"データセット",
+ "データセット",
//"Annotation" :
//false,
// ---- history-view-edit-current
"This history is empty. Click 'Get Data' on the left tool menu to start" :
-"ヒストリーは空です。解析をはじめるには、左パネルの 'データ取得' をクリック",
-"No matching datasets found" :
-"一致するデータセットが見つかりませんでした",
+ "ヒストリーは空です。解析をはじめるには、左パネルの 'データ取得' をクリック",
"You must be logged in to create histories" :
-"ヒストリーを作成するためにはログインする必要があります",
+ "ヒストリーを作成するためにはログインする必要があります",
//TODO:
//"You can <% loadYourOwn %> or <% externalSource %>" :
//false,
@@ -95,17 +93,17 @@ define({
//"This dataset is not yet viewable" :
//false,
"View data" :
-"データを表示",
+ "データを表示",
// download button
"Download" :
-"ダウンロード",
+ "ダウンロード",
"Download dataset" :
-"データセットをダウンロード",
+ "データセットをダウンロード",
//"Additional files" :
//false,
// info/show_params
"View details" :
-"細部を表示",
+ "細部を表示",
// dataset states
// state: new
@@ -119,7 +117,7 @@ define({
//false,
// state: queued
"This job is waiting to run" :
-"ジョブは実行待ちです",
+ "ジョブは実行待ちです",
// state: upload
//"This dataset is currently uploading" :
//false,
@@ -128,16 +126,16 @@ define({
//false,
// state: running
"This job is currently running" :
-"ジョブは実行中です",
+ "ジョブは実行中です",
// state: paused
//"This job is paused. Use the \"Resume Paused Jobs\" in the history menu to resume" :
//false,
// state: error
"An error occurred with this dataset" :
-"このジョブの実行中に発生したエラー",
+ "このジョブの実行中に発生したエラー",
// state: empty
"No data" :
-"データ無し",
+ "データ無し",
// state: failed_metadata
//"An error occurred setting the metadata for this dataset" :
//false,
@@ -148,20 +146,20 @@ define({
// purged'd/del'd msg
"This dataset has been deleted and removed from disk" :
-"このデータセットは、永続的にディスクから削除されました",
+ "このデータセットは、永続的にディスクから削除されました",
"This dataset has been deleted" :
-"このデータセットは削除されました",
+ "このデータセットは削除されました",
"This dataset has been hidden" :
-"このデータセットは、非表示にされた",
+ "このデータセットは、非表示にされた",
"format" :
-"フォーマット",
+ "フォーマット",
"database" :
-"データベース",
+ "データベース",
// ---- hda-edit
"Edit attributes" :
-"変数を編集する",
+ "変数を編集する",
//"Cannot edit attributes of datasets removed from disk" :
//false,
//"Undelete dataset to edit attributes" :
@@ -172,27 +170,27 @@ define({
//false,
"Delete" :
-"削除する",
+ "削除する",
//"Dataset is already deleted" :
//false,
"View or report this error" :
-"このエラーを届け出る",
+ "このエラーを届け出る",
"Run this job again" :
-"もう一度このジョブを実行する",
+ "もう一度このジョブを実行する",
"Visualize" :
-"可視化する",
+ "可視化する",
//"Visualize in" :
//false,
"Undelete it" :
-"復元する",
+ "復元する",
"Permanently remove it from disk" :
-"永久にディスクから削除",
+ "永久にディスクから削除",
"Unhide it" :
-"非表示解除する",
+ "非表示解除する",
//"You may be able to" :
//false,
diff --git a/client/galaxy/scripts/nls/locale.js b/client/galaxy/scripts/nls/locale.js
index c259585f9ac..9793e3068a8 100644
--- a/client/galaxy/scripts/nls/locale.js
+++ b/client/galaxy/scripts/nls/locale.js
@@ -1,72 +1,186 @@
/** en/main localization hash - for use with requirejs' i18n plugin */
define({
root : {
-
+// ----------------------------------------------------------------------------- masthead
+"Analyze Data":
+ false,
+"Workflow":
+ false,
+"Shared Data":
+ false,
+"Data Libraries":
+ false,
+"Histories":
+ false,
+"Workflows":
+ false,
+"Visualizations":
+ false,
+"Pages":
+ false,
+"Visualization":
+ false,
+"New Track Browser":
+ false,
+"Saved Visualizations":
+ false,
+"Interactive Environments":
+ false,
+"Admin":
+ false,
+"Help":
+ false,
+"Support":
+ false,
+"Search":
+ false,
+"Mailing Lists":
+ false,
+"Videos":
+ false,
+"Wiki":
+ false,
+"How to Cite Galaxy":
+ false,
+"Interactive Tours":
+ false,
+"User":
+ false,
+"Login":
+ false,
+"Register":
+ false,
+"Logged in as":
+ false,
+"Preferences":
+ false,
+"Custom Builds":
+ false,
+"Logout":
+ false,
+"Saved Histories":
+ false,
+"Saved Datasets":
+ false,
+"Saved Pages":
+ false,
// ---------------------------------------------------------------------------- histories
+// ---- history/options-menu
+"History Lists":
+ false,
+// Saved histories is defined above.
+// "Saved Histories":
+// false,
+"Histories Shared with Me":
+ false,
+"Current History":
+ false,
+"Create New":
+ false,
+"Copy History":
+ false,
+"Share or Publish":
+ false,
+"Show Structure":
+ false,
+"Extract Workflow":
+ false,
+// Delete is defined elsewhere, but is also in this menu.
+// "Delete":
+// false,
+"Delete Permanently":
+ false,
+"Dataset Actions":
+ false,
+"Copy Datasets":
+ false,
+"Dataset Security":
+ false,
+"Resume Paused Jobs":
+ false,
+"Collapse Expanded Datasets":
+ false,
+"Unhide Hidden Datasets":
+ false,
+"Delete Hidden Datasets":
+ false,
+"Purge Deleted Datasets":
+ false,
+"Downloads":
+ false,
+"Export Tool Citations":
+ false,
+"Export History to File":
+ false,
+"Other Actions":
+ false,
+"Import from File":
+ false,
+"Webhooks":
+ false,
+
// ---- history-model
// ---- history-view
"This history is empty" :
-false,
+ false,
"No matching datasets found" :
-false,
+ false,
"An error occurred while getting updates from the server" :
-false,
+ false,
"Please contact a Galaxy administrator if the problem persists" :
-false,
+ false,
//TODO:
//"An error was encountered while <% where %>" :
//false,
-"Search datasets" :
-false,
+"search datasets" :
+ false,
"You are currently viewing a deleted history!" :
-false,
+ false,
"You are over your disk quota" :
-false,
+ false,
"Tool execution is on hold until your disk usage drops below your allocated quota" :
-false,
+ false,
"All" :
-false,
+ false,
"None" :
-false,
+ false,
"For all selected" :
-false,
+ false,
// ---- history-view-edit
"Edit history tags" :
-false,
+ false,
"Edit history Annotation" :
-false,
+ false,
"Click to rename history" :
-false,
+ false,
// multi operations
"Operations on multiple datasets" :
-false,
+ false,
"Hide datasets" :
-false,
+ false,
"Unhide datasets" :
-false,
+ false,
"Delete datasets" :
-false,
+ false,
"Undelete datasets" :
-false,
+ false,
"Permanently delete datasets" :
-false,
+ false,
"This will permanently remove the data in your datasets. Are you sure?" :
-false,
+ false,
// ---- history-view-annotated
"Dataset" :
-false,
+ false,
"Annotation" :
false,
// ---- history-view-edit-current
"This history is empty. Click 'Get Data' on the left tool menu to start" :
-false,
-"No matching datasets found" :
-false,
+ false,
"You must be logged in to create histories" :
-false,
+ false,
//TODO:
//"You can <% loadYourOwn %> or <% externalSource %>" :
//false,
@@ -85,138 +199,137 @@ false,
// ---------------------------------------------------------------------------- datasets
// ---- hda-model
"Unable to purge dataset" :
-false,
+ false,
// ---- hda-base
// display button
"Cannot display datasets removed from disk" :
-false,
+ false,
"This dataset must finish uploading before it can be viewed" :
-false,
+ false,
"This dataset is not yet viewable" :
-false,
+ false,
"View data" :
-false,
+ false,
// download button
"Download" :
-false,
+ false,
"Download dataset" :
-false,
+ false,
"Additional files" :
-false,
+ false,
// info/show_params
"View details" :
-false,
+ false,
// dataset states
// state: new
"This is a new dataset and not all of its data are available yet" :
-false,
+ false,
// state: noPermission
"You do not have permission to view this dataset" :
-false,
+ false,
// state: discarded
"The job creating this dataset was cancelled before completion" :
-false,
+ false,
// state: queued
"This job is waiting to run" :
-false,
+ false,
// state: upload
"This dataset is currently uploading" :
-false,
+ false,
// state: setting_metadata
"Metadata is being auto-detected" :
-false,
+ false,
// state: running
"This job is currently running" :
-false,
+ false,
// state: paused
"This job is paused. Use the \"Resume Paused Jobs\" in the history menu to resume" :
-false,
+ false,
// state: error
"An error occurred with this dataset" :
-false,
+ false,
// state: empty
"No data" :
-false,
+ false,
// state: failed_metadata
"An error occurred setting the metadata for this dataset" :
-false,
+ false,
// ajax error prefix
"There was an error getting the data for this dataset" :
-false,
+ false,
// purged'd/del'd msg
"This dataset has been deleted and removed from disk" :
-false,
+ false,
"This dataset has been deleted" :
-false,
+ false,
"This dataset has been hidden" :
-false,
+ false,
"format" :
-false,
+ false,
"database" :
-false,
+ false,
// ---- hda-edit
"Edit attributes" :
-false,
+ false,
"Cannot edit attributes of datasets removed from disk" :
-false,
+ false,
"Undelete dataset to edit attributes" :
-false,
+ false,
"This dataset must finish uploading before it can be edited" :
-false,
+ false,
"This dataset is not yet editable" :
-false,
+ false,
"Delete" :
-false,
+ false,
"Dataset is already deleted" :
-false,
+ false,
"View or report this error" :
-false,
+ false,
"Run this job again" :
-false,
+ false,
"Visualize" :
-false,
+ false,
"Visualize in" :
-false,
+ false,
"Undelete it" :
-false,
+ false,
"Permanently remove it from disk" :
-false,
+ false,
"Unhide it" :
-false,
+ false,
"You may be able to" :
-false,
+ false,
"set it manually or retry auto-detection" :
-false,
+ false,
"Edit dataset tags" :
-false,
+ false,
"Edit dataset annotation" :
-false,
+ false,
// ---------------------------------------------------------------------------- misc. MVC
"Tags" :
-false,
-"Annotation" :
-false,
+ false,
"Edit annotation" :
-false,
+ false,
// ----------------------------------------------------------------------------
},
- 'ja' : true,
- 'zh' : true
+ 'ja' : true,
+ 'fr' : true,
+ 'zh' : true
});
diff --git a/client/galaxy/scripts/nls/zh/locale.js b/client/galaxy/scripts/nls/zh/locale.js
index 3078c9c83f1..34282561508 100644
--- a/client/galaxy/scripts/nls/zh/locale.js
+++ b/client/galaxy/scripts/nls/zh/locale.js
@@ -4,9 +4,9 @@ define({
// ---- history-model
// ---- history-view
"This history is empty" :
-"历史已空",
+ "历史已空",
"No matching datasets found" :
-"未找到匹配的数据集",
+ "未找到匹配的数据集",
//"An error occurred while getting updates from the server" :
//false,
//"Please contact a Galaxy administrator if the problem persists" :
@@ -15,19 +15,19 @@ define({
//"An error was encountered while <% where %>" :
//false,
"Search datasets" :
-"搜索数据集",
+ "搜索数据集",
"You are currently viewing a deleted history!" :
-"正在查看已删除的历史",
+ "正在查看已删除的历史",
"You are over your disk quota" :
-"您已超过磁盘配额",
+ "您已超过磁盘配额",
//"Tool execution is on hold until your disk usage drops below your allocated quota" :
//false,
"All" :
-"皆",
+ "皆",
"None" :
-"一个也没有",
+ "一个也没有",
"For all selected" :
-"为每个选定",
+ "为每个选定",
// ---- history-view-edit
//"Edit history tags" :
@@ -35,10 +35,10 @@ define({
//"Edit history Annotation" :
//false,
"Click to rename history" :
-"单击要重命名的历史",
+ "单击要重命名的历史",
// multi operations
"Operations on multiple datasets" :
-"编辑多个数据集",
+ "编辑多个数据集",
//"Hide datasets" :
//false,
//"Unhide datasets" :
@@ -48,23 +48,21 @@ define({
//"Undelete datasets" :
//false,
"Permanently delete datasets" :
-"永久删除数据集",
+ "永久删除数据集",
"This will permanently remove the data in your datasets. Are you sure?" :
-"这将永久在你的数据集删除数据。你确定?",
+ "这将永久在你的数据集删除数据。你确定?",
// ---- history-view-annotated
"Dataset" :
-"数据集",
+ "数据集",
//"Annotation" :
//false,
// ---- history-view-edit-current
"This history is empty. Click 'Get Data' on the left tool menu to start" :
-"历史已空,请单击左边窗格中‘获取数据’",
-"No matching datasets found" :
-"没有发现",
+ "历史已空,请单击左边窗格中‘获取数据’",
"You must be logged in to create histories" :
-"你必须登录后才能创建历史",
+ "你必须登录后才能创建历史",
//TODO:
//"You can <% loadYourOwn %> or <% externalSource %>" :
//false,
@@ -88,17 +86,17 @@ define({
//"This dataset is not yet viewable" :
//false,
"View data" :
-"数据",
+ "数据",
// download button
"Download" :
-"下载",
+ "下载",
"Download dataset" :
-"下载数据集",
+ "下载数据集",
//"Additional files" :
//false,
// info/show_params
"View details" :
-"查看详情",
+ "查看详情",
// dataset states
// state: new
@@ -112,7 +110,7 @@ define({
//false,
// state: queued
"This job is waiting to run" :
-"等待运行的进程",
+ "等待运行的进程",
// state: upload
//"This dataset is currently uploading" :
//false,
@@ -121,16 +119,16 @@ define({
//false,
// state: running
"This job is currently running" :
-"正在运行的进程",
+ "正在运行的进程",
// state: paused
//"This job is paused. Use the \"Resume Paused Jobs\" in the history menu to resume" :
//false,
// state: error
"An error occurred with this dataset" :
-"进程运行时出错",
+ "进程运行时出错",
// state: empty
"No data" :
-"没有数据",
+ "没有数据",
// state: failed_metadata
//"An error occurred setting the metadata for this dataset" :
//false,
@@ -143,18 +141,18 @@ define({
//"This dataset has been deleted and removed from disk" :
//false,
"This dataset has been deleted" :
-"此数据集已被删除",
+ "此数据集已被删除",
"This dataset has been hidden" :
-"此数据集已隐藏",
+ "此数据集已隐藏",
"format" :
-"格式",
+ "格式",
"database" :
-"数据库",
+ "数据库",
// ---- hda-edit
"Edit attributes" :
-"编辑属性",
+ "编辑属性",
//"Cannot edit attributes of datasets removed from disk" :
//false,
//"Undelete dataset to edit attributes" :
@@ -165,27 +163,27 @@ define({
//false,
"Delete" :
-"删除",
+ "删除",
//"Dataset is already deleted" :
//false,
"View or report this error" :
-"报告错误",
+ "报告错误",
"Run this job again" :
-"重新运行",
+ "重新运行",
"Visualize" :
-"图形",
+ "图形",
//"Visualize in" :
//false,
"Undelete it" :
-"反删除",
+ "反删除",
"Permanently remove it from disk" :
-"从磁盘中永久删除",
+ "从磁盘中永久删除",
"Unhide it" :
-"取消隐藏",
+ "取消隐藏",
//"You may be able to" :
//false,
diff --git a/client/galaxy/style/less/history.less b/client/galaxy/style/less/history.less
index dbdd15e784c..01bcf5f3843 100644
--- a/client/galaxy/style/less/history.less
+++ b/client/galaxy/style/less/history.less
@@ -221,6 +221,13 @@
}
}
}
+ span.nametags {
+ span.label {
+ display: inline-block;
+ margin-right: 2px;
+ text-decoration: none;
+ }
+ }
}
}
diff --git a/client/galaxy/style/less/ui.less b/client/galaxy/style/less/ui.less
index e702158c942..95f5a4d4d38 100644
--- a/client/galaxy/style/less/ui.less
+++ b/client/galaxy/style/less/ui.less
@@ -68,6 +68,11 @@
font-weight: bold;
}
+.ui-tags {
+ word-wrap: break-word;
+ padding-right: 25px;
+}
+
.ui-message {
padding: 2px 10px 2px 10px;
margin-top: @ui-margin-vertical-large;
diff --git a/config/datatypes_conf.xml.sample b/config/datatypes_conf.xml.sample
index 2bd89eacc75..6670935dc92 100644
--- a/config/datatypes_conf.xml.sample
+++ b/config/datatypes_conf.xml.sample
@@ -218,6 +218,7 @@
+
@@ -235,6 +236,8 @@
+
+
@@ -479,7 +482,7 @@
-
+
@@ -597,6 +600,10 @@
+
+
+
+
diff --git a/config/dependency_resolvers_conf.xml.sample b/config/dependency_resolvers_conf.xml.sample
index 243fff0cdc8..cbc78951db7 100644
--- a/config/dependency_resolvers_conf.xml.sample
+++ b/config/dependency_resolvers_conf.xml.sample
@@ -1,28 +1,32 @@
-
+
-
+
-
+
+
+
+
-
-
+
-
+
-
\ No newline at end of file
+ -->
+
diff --git a/config/galaxy.ini.sample b/config/galaxy.ini.sample
index e9966226889..c201ffc8818 100644
--- a/config/galaxy.ini.sample
+++ b/config/galaxy.ini.sample
@@ -355,6 +355,21 @@ paste.app_factory = galaxy.web.buildapp:app_factory
# separated list.
#interactive_environment_plugins_directory =
+# To run interactive environment containers in Docker Swarm mode (on an
+# existing swarm), set this option to True and set `docker_connect_port` in the
+# IE plugin config (ini) file(s) of any IE plugins you have enabled and ensure
+# that you are not using any `docker run`-specific options in your plugins'
+# `command_inject` options (swarm mode services run using `docker service
+# create`, which has a different and more limited set of options). This option
+# can be overridden on a per-plugin basis by using the `swarm_mode` option in
+# the plugin's ini config file.
+#interactive_environment_swarm_mode = False
+
+# Galaxy can run a "swarm manager" service that will monitor utilization of the
+# swarm and provision/deprovision worker nodes as necessary. The service has
+# its own configuration file.
+#swarm_manager_config_file = config/swarm_manager_conf.yml
+
# Interactive tour directory: where to store interactive tour definition files.
# Galaxy ships with several basic interface tours enabled, though a different
# directory with custom tours can be specified here. The path is relative to the
@@ -1191,7 +1206,7 @@ use_interactive = True
# walltime limits but did fail quickly (either while queueing or running). The
# commented out default below results in no default job resubmission condition,
# failing jobs are just failed outright.
-#default_job_resubmission_condition =
+#default_job_resubmission_condition =
# In multiprocess configurations, notification between processes about new jobs
# must be done via the database. In single process configurations, this can be
diff --git a/config/plugins/interactive_environments/bam_iobio/config/bam_iobio.ini.sample b/config/plugins/interactive_environments/bam_iobio/config/bam_iobio.ini.sample
index d6ff35d95bb..8b8fd9b41f8 100644
--- a/config/plugins/interactive_environments/bam_iobio/config/bam_iobio.ini.sample
+++ b/config/plugins/interactive_environments/bam_iobio/config/bam_iobio.ini.sample
@@ -41,3 +41,15 @@ image = qiaoy/iobio-bundle.bam-iobio:1.0-ondemand
# share data between the IE and Galaxy.
#docker_galaxy_temp_dir = None
+# If your Docker container exposes more then one port, Galaxy needs to know to
+# which ports it needs to connect. With this option you can specify the port number
+# inside your container to which Galaxy should connect the UI.
+#docker_connect_port = None
+
+# To run containers in Docker Swarm mode on (an existing swarm), set the
+# following option to True *and*:
+# - set docker_connect_port above. For qiaoy/iobio-bundle.bam-iobio the port
+# should most likely be 8000.
+# - If command_inject is uncommented and includes `--sig-proxy`, that option should
+# be removed.
+#swarm_mode = False
diff --git a/config/plugins/interactive_environments/bam_iobio/static/js/bam_iobio.js b/config/plugins/interactive_environments/bam_iobio/static/js/bam_iobio.js
index 395904e329b..7b019f63630 100644
--- a/config/plugins/interactive_environments/bam_iobio/static/js/bam_iobio.js
+++ b/config/plugins/interactive_environments/bam_iobio/static/js/bam_iobio.js
@@ -22,12 +22,10 @@ function message_failed_connection(){
*
*/
function load_notebook(notebook_access_url){
- $( document ).ready(function() {
- // Test notebook_login_url for accessibility, executing the login+load function whenever
- // we've successfully connected to the IE.
- test_ie_availability(notebook_access_url, function(){
- _handle_notebook_loading(notebook_access_url);
- });
+ // Test notebook_login_url for accessibility, executing the login+load function whenever
+ // we've successfully connected to the IE.
+ test_ie_availability(notebook_access_url, function(){
+ _handle_notebook_loading(notebook_access_url);
});
}
diff --git a/config/plugins/interactive_environments/bam_iobio/templates/bam_iobio.mako b/config/plugins/interactive_environments/bam_iobio/templates/bam_iobio.mako
index 8f18630074e..97eb4b78d25 100644
--- a/config/plugins/interactive_environments/bam_iobio/templates/bam_iobio.mako
+++ b/config/plugins/interactive_environments/bam_iobio/templates/bam_iobio.mako
@@ -46,7 +46,9 @@ root = h.url_for( '/' )
var startup = function(){
// Load notebook
requirejs(['interactive_environments', 'plugin/bam_iobio'], function(){
- load_notebook(notebook_access_url);
+ load_when_ready(ie_readiness_url, function(){
+ load_notebook(notebook_access_url);
+ });
});
};
diff --git a/config/plugins/interactive_environments/common/templates/ie.mako b/config/plugins/interactive_environments/common/templates/ie.mako
index fac6366e50d..338ccc7e263 100644
--- a/config/plugins/interactive_environments/common/templates/ie.mako
+++ b/config/plugins/interactive_environments/common/templates/ie.mako
@@ -9,6 +9,7 @@ ie_password = '${ ie_request.notebook_pw }';
var galaxy_root = '${ ie_request.attr.root }';
var app_root = '${ ie_request.attr.app_root }';
+var ie_readiness_url = '${ ie_request.url_template("${PROXY_PREFIX}/interactive_environments/ready") }';
%def>
diff --git a/config/plugins/interactive_environments/ethercalc/config/ethercalc.ini.sample b/config/plugins/interactive_environments/ethercalc/config/ethercalc.ini.sample
new file mode 100644
index 00000000000..63a1a2648c9
--- /dev/null
+++ b/config/plugins/interactive_environments/ethercalc/config/ethercalc.ini.sample
@@ -0,0 +1,44 @@
+[main]
+# Unused
+
+[docker]
+# Command to launch docker container. For example `sudo docker` or `docker-lxc`.
+# If you need to use a command like `sg` you can do that here, just be sure to
+# wrap all of the docker portion in single quotes. E.g. `sg 'docker' 'docker {docker_args}'`
+#
+# It is recommended that you use command_inject if you need to inject
+# additional parameters. This command string is re-used for a `docker inspect`
+# command and will likely cause errors if it is extensively modified, past the
+# usual group/sudo changes.
+#command = docker {docker_args}
+
+# The docker image name that should be started.
+image = shiltemann/ethercalc-galaxy-ie:17.05
+
+# Additional arguments that are passed to the `docker run` command.
+#command_inject = --sig-proxy=true -e DEBUG=false
+
+# URL to access the Galaxy API with from the spawn Docker containter, if empty
+# this falls back to galaxy.ini's galaxy_infrastructure_url and finally to the
+# Docker host of the spawned container if that is also not set.
+#galaxy_url =
+
+# The Docker hostname. It can be useful to run the Docker daemon on a different
+# host than Galaxy.
+#docker_hostname = localhost
+
+# Try to set the tempdirectory to world execute - this can fix the issue
+# where 'sudo docker' is not able to mount the folder otherwise.
+# "finalize namespace chdir to /import permission denied"
+#wx_tempdir = False
+
+# Overwride the IE tempdirectory. This can be useful if you regular tempdir is
+# located on an NFS share, which does not work well as Docker volume. In this case
+# you can have a shared sshfs share which you can use as temporary directory to
+# share data between the IE and Galaxy.
+#docker_galaxy_temp_dir = None
+
+# If your Docker container exposes more then one port, Galaxy needs to know to
+# which ports it needs to connect. With this option you can specify the port number
+# inside your container to which Galaxy should connect the UI.
+docker_connect_port = 80
diff --git a/config/plugins/interactive_environments/ethercalc/config/ethercalc.xml b/config/plugins/interactive_environments/ethercalc/config/ethercalc.xml
new file mode 100644
index 00000000000..7d6091c9cfc
--- /dev/null
+++ b/config/plugins/interactive_environments/ethercalc/config/ethercalc.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ HistoryDatasetAssociation
+ tabular.Tabular
+ tabular.CSV
+ dataset_id
+
+
+
+ dataset_id
+
+ ethercalc.mako
+
diff --git a/config/plugins/interactive_environments/ethercalc/static/js/ethercalc.js b/config/plugins/interactive_environments/ethercalc/static/js/ethercalc.js
new file mode 100644
index 00000000000..5a6a060f14d
--- /dev/null
+++ b/config/plugins/interactive_environments/ethercalc/static/js/ethercalc.js
@@ -0,0 +1,43 @@
+function load_notebook(url){
+ $( document ).ready(function() {
+ test_ie_availability(url, function(){
+ append_notebook(url)
+ });
+ });
+}
+
+function keep_alive(notebook_access_url){
+ /**
+ * This is needed to keep the container alive. If the user leaves this site
+ * this function is not constantly pinging the container, the container will
+ * terminate itself.
+ */
+
+ var request_count = 0;
+ interval = setInterval(function(){
+ $.ajax({
+ url: notebook_access_url,
+ xhrFields: {
+ withCredentials: true
+ },
+ type: "GET",
+ timeout: 500,
+ success: function(){
+ console.log("Connected to IE, returning");
+ },
+ error: function(jqxhr, status, error){
+ request_count++;
+ console.log("Request " + request_count);
+ if(request_count > 30){
+ clearInterval(interval);
+ clear_main_area();
+ toastr.error(
+ "Could not connect to IE, contact your administrator",
+ "Error",
+ {'closeButton': true, 'timeOut': 20000, 'tapToDismiss': false}
+ );
+ }
+ }
+ });
+ }, 10000);
+}
diff --git a/config/plugins/interactive_environments/ethercalc/templates/ethercalc.mako b/config/plugins/interactive_environments/ethercalc/templates/ethercalc.mako
new file mode 100644
index 00000000000..2a325b99d88
--- /dev/null
+++ b/config/plugins/interactive_environments/ethercalc/templates/ethercalc.mako
@@ -0,0 +1,40 @@
+<%namespace name="ie" file="ie.mako" />
+<%
+# Sets ID and sets up a lot of other variables
+ie_request.load_deploy_config()
+
+
+# Launch the IE. This builds and runs the docker command in the background.
+ie_request.launch(
+ env_override={
+ 'dataset_hid': hda.hid
+ }
+)
+
+# Only once the container is launched can we template our URLs. The ie_request
+# doesn't have all of the information needed until the container is running.
+url = ie_request.url_template('${PROXY_URL}/ethercalc/')
+%>
+
+
+${ ie.load_default_js() }
+
+
+
+
+
+
+
diff --git a/config/plugins/interactive_environments/jupyter/config/allowed_images.yml.sample b/config/plugins/interactive_environments/jupyter/config/allowed_images.yml.sample
index 89797badfa6..d35bcbc728e 100644
--- a/config/plugins/interactive_environments/jupyter/config/allowed_images.yml.sample
+++ b/config/plugins/interactive_environments/jupyter/config/allowed_images.yml.sample
@@ -6,7 +6,7 @@
# appropriate `apt-get/pip install` statements.
---
-
- image: bgruening/docker-jupyter-notebook:16.01
+ image: bgruening/docker-jupyter-notebook:16.01.1
description: |
The Jupyter notebook is the next iteration of IPython, allowing
analysis in many different languages. This image features the Python,
diff --git a/config/plugins/interactive_environments/jupyter/config/jupyter.ini.sample b/config/plugins/interactive_environments/jupyter/config/jupyter.ini.sample
index ad73a20bb85..e9bf4b4aa15 100644
--- a/config/plugins/interactive_environments/jupyter/config/jupyter.ini.sample
+++ b/config/plugins/interactive_environments/jupyter/config/jupyter.ini.sample
@@ -18,7 +18,7 @@
# The image argument was moved to "allowed_images.yml.sample"
# Additional arguments that are passed to the `docker run` command.
-command_inject = --sig-proxy=true -e DEBUG=false -e DEFAULT_CONTAINER_RUNTIME=120
+#command_inject = --sig-proxy=true -e DEBUG=false -e DEFAULT_CONTAINER_RUNTIME=120
# URL to access the Galaxy API with from the spawn Docker containter, if empty
# this falls back to galaxy.ini's galaxy_infrastructure_url and finally to the
@@ -43,4 +43,12 @@ command_inject = --sig-proxy=true -e DEBUG=false -e DEFAULT_CONTAINER_RUNTIME=12
# If your Docker container exposes more then one port, Galaxy needs to know to
# which ports it needs to connect. With this option you can specify the port number
# inside your container to which Galaxy should connect the UI.
-# docker_connect_port = None
+#docker_connect_port = None
+
+# To run containers in Docker Swarm mode on (an existing swarm), set the
+# following option to True *and*:
+# - set docker_connect_port above. For Jupyter the # port should most likely be
+# 8888.
+# - If command_inject is uncommented and includes `--sig-proxy`, that option should
+# be removed.
+#swarm_mode = False
diff --git a/config/plugins/interactive_environments/jupyter/static/js/jupyter.js b/config/plugins/interactive_environments/jupyter/static/js/jupyter.js
index 3b0ca53e51e..0e717c796b0 100644
--- a/config/plugins/interactive_environments/jupyter/static/js/jupyter.js
+++ b/config/plugins/interactive_environments/jupyter/static/js/jupyter.js
@@ -34,12 +34,10 @@ function message_no_auth(){
*
*/
function load_notebook(password, notebook_login_url, notebook_access_url){
- $( document ).ready(function() {
- // Test notebook_login_url for accessibility, executing the login+load function whenever
- // we've successfully connected to the IE.
- test_ie_availability(notebook_login_url, function(){
- _handle_notebook_loading(password, notebook_login_url, notebook_access_url);
- });
+ // Test notebook_login_url for accessibility, executing the login+load function whenever
+ // we've successfully connected to the IE.
+ test_ie_availability(notebook_login_url, function(){
+ _handle_notebook_loading(password, notebook_login_url, notebook_access_url);
});
}
diff --git a/config/plugins/interactive_environments/jupyter/templates/jupyter.mako b/config/plugins/interactive_environments/jupyter/templates/jupyter.mako
index 69bf37fc454..8f8490f5367 100644
--- a/config/plugins/interactive_environments/jupyter/templates/jupyter.mako
+++ b/config/plugins/interactive_environments/jupyter/templates/jupyter.mako
@@ -60,7 +60,9 @@ requirejs(['interactive_environments', 'plugin/jupyter'], function(){
// Load notebook
requirejs(['interactive_environments', 'plugin/jupyter'], function(){
- load_notebook(ie_password, notebook_login_url, notebook_access_url);
+ load_when_ready(ie_readiness_url, function(){
+ load_notebook(ie_password, notebook_login_url, notebook_access_url);
+ });
});
diff --git a/config/plugins/interactive_environments/neo/config/neo.ini.sample b/config/plugins/interactive_environments/neo/config/neo.ini.sample
index 27411474293..4027edc1e4c 100644
--- a/config/plugins/interactive_environments/neo/config/neo.ini.sample
+++ b/config/plugins/interactive_environments/neo/config/neo.ini.sample
@@ -40,3 +40,16 @@ command_inject = --sig-proxy=true -e DEBUG=false -e DEFAULT_CONTAINER_RUNTIME=12
# you can have a shared sshfs share which you can use as temporary directory to
# share data between the IE and Galaxy.
#docker_galaxy_temp_dir = None
+
+# If your Docker container exposes more then one port, Galaxy needs to know to
+# which ports it needs to connect. With this option you can specify the port number
+# inside your container to which Galaxy should connect the UI.
+#docker_connect_port = None
+
+# To run containers in Docker Swarm mode on (an existing swarm), set the
+# following option to True *and*:
+# - set docker_connect_port above. For thoba/neo4j_galaxy_ie the port
+# should most likely be 7474.
+# - If command_inject is uncommented and includes `--sig-proxy`, that option should
+# be removed.
+#swarm_mode = False
diff --git a/config/plugins/interactive_environments/neo/static/js/neo.js b/config/plugins/interactive_environments/neo/static/js/neo.js
index 068d68b6515..f1af1254819 100644
--- a/config/plugins/interactive_environments/neo/static/js/neo.js
+++ b/config/plugins/interactive_environments/neo/static/js/neo.js
@@ -1,12 +1,9 @@
// Load an interactive environment (IE) from a remote URL
// @param {String} notebook_access_url: the URL embeded in the page and loaded
function load_notebook(notebook_access_url){
- // When the page has completely loaded...
- $( document ).ready(function() {
- // Test if we can access the GIE, and if so, execute the function
- // to load the GIE for the user.
- test_ie_availability(notebook_access_url, function(){
- append_notebook(notebook_access_url);
- });
+ // Test if we can access the GIE, and if so, execute the function
+ // to load the GIE for the user.
+ test_ie_availability(notebook_access_url, function(){
+ append_notebook(notebook_access_url);
});
}
diff --git a/config/plugins/interactive_environments/neo/templates/neo.mako b/config/plugins/interactive_environments/neo/templates/neo.mako
index b241b9dae87..ab080fde489 100644
--- a/config/plugins/interactive_environments/neo/templates/neo.mako
+++ b/config/plugins/interactive_environments/neo/templates/neo.mako
@@ -33,7 +33,9 @@
requirejs(['interactive_environments', 'plugin/neo'], function () {
- load_notebook(url);
+ load_when_ready(ie_readiness_url, function(){
+ load_notebook(url);
+ });
});
diff --git a/config/plugins/interactive_environments/phinch/config/phinch.ini.sample b/config/plugins/interactive_environments/phinch/config/phinch.ini.sample
index be08cb60848..c9dc8afba7c 100644
--- a/config/plugins/interactive_environments/phinch/config/phinch.ini.sample
+++ b/config/plugins/interactive_environments/phinch/config/phinch.ini.sample
@@ -19,3 +19,16 @@ image = shiltemann/docker-phinch-galaxy:16.04
# The Docker hostname. It can be useful to run the Docker daemon on a different
# host than Galaxy.
#docker_hostname = localhost
+
+# If your Docker container exposes more then one port, Galaxy needs to know to
+# which ports it needs to connect. With this option you can specify the port number
+# inside your container to which Galaxy should connect the UI.
+#docker_connect_port = None
+
+# To run containers in Docker Swarm mode on (an existing swarm), set the
+# following option to True *and*:
+# - set docker_connect_port above. For shiltemann/docker-phinch-galaxy the port
+# should most likely be 80.
+# - If command_inject is uncommented and includes `--sig-proxy`, that option should
+# be removed.
+#swarm_mode = False
diff --git a/config/plugins/interactive_environments/phinch/static/js/phinch.js b/config/plugins/interactive_environments/phinch/static/js/phinch.js
index 1b4c993e554..e750943f96d 100644
--- a/config/plugins/interactive_environments/phinch/static/js/phinch.js
+++ b/config/plugins/interactive_environments/phinch/static/js/phinch.js
@@ -1,8 +1,6 @@
function load_notebook(url){
- $( document ).ready(function() {
- test_ie_availability(url, function(){
- append_notebook(url)
- });
+ test_ie_availability(url, function(){
+ append_notebook(url)
});
}
diff --git a/config/plugins/interactive_environments/phinch/templates/phinch.mako b/config/plugins/interactive_environments/phinch/templates/phinch.mako
index c446bf7d6e5..54cd9aa5503 100644
--- a/config/plugins/interactive_environments/phinch/templates/phinch.mako
+++ b/config/plugins/interactive_environments/phinch/templates/phinch.mako
@@ -36,7 +36,9 @@ requirejs(['interactive_environments', 'plugin/phinch'], function(){
// Load notebook
requirejs(['interactive_environments', 'plugin/phinch'], function(){
- load_notebook(url);
+ load_when_ready(ie_readiness_url, function(){
+ load_notebook(url);
+ });
});
diff --git a/config/plugins/interactive_environments/rstudio/config/rstudio.ini.sample b/config/plugins/interactive_environments/rstudio/config/rstudio.ini.sample
index ac15696936d..0f2b3fa14bb 100644
--- a/config/plugins/interactive_environments/rstudio/config/rstudio.ini.sample
+++ b/config/plugins/interactive_environments/rstudio/config/rstudio.ini.sample
@@ -41,3 +41,16 @@ password_auth = True
# you can have a shared sshfs share which you can use as temporary directory to
# share data between the IE and Galaxy.
#docker_galaxy_temp_dir = None
+
+# If your Docker container exposes more then one port, Galaxy needs to know to
+# which ports it needs to connect. With this option you can specify the port number
+# inside your container to which Galaxy should connect the UI.
+#docker_connect_port = None
+
+# To run containers in Docker Swarm mode on (an existing swarm), set the
+# following option to True *and*:
+# - set docker_connect_port above. For erasche/docker-rstudio-notebook the port
+# should most likely be 80.
+# - If command_inject is uncommented and includes `--sig-proxy`, that option should
+# be removed.
+#swarm_mode = False
diff --git a/config/plugins/interactive_environments/rstudio/static/js/rstudio.js b/config/plugins/interactive_environments/rstudio/static/js/rstudio.js
index cc0b62ee7a1..38764d84567 100644
--- a/config/plugins/interactive_environments/rstudio/static/js/rstudio.js
+++ b/config/plugins/interactive_environments/rstudio/static/js/rstudio.js
@@ -15,58 +15,56 @@ function message_failed_connection(){
*
*/
function load_notebook(notebook_login_url, notebook_access_url, notebook_pubkey_url, username){
- $( document ).ready(function() {
- // Test notebook_login_url for accessibility, executing the login+load function whenever
- // we've successfully connected to the IE.
- test_ie_availability(notebook_pubkey_url, function(){
- var payload = username + "\n" + ie_password;
- $.ajax({
- type: 'GET',
- url: notebook_pubkey_url,
- xhrFields: {
+ // Test notebook_login_url for accessibility, executing the login+load function whenever
+ // we've successfully connected to the IE.
+ test_ie_availability(notebook_pubkey_url, function(){
+ var payload = username + "\n" + ie_password;
+ $.ajax({
+ type: 'GET',
+ url: notebook_pubkey_url,
+ xhrFields: {
+ withCredentials: true
+ },
+ success: function(response_text){
+ var chunks = response_text.split(':', 2);
+ var exp = chunks[0];
+ var mod = chunks[1];
+ console.log("Found " + exp +" and " + mod);
+ var rsa = new RSAKey();
+ rsa.setPublic(mod, exp);
+ console.log("Encrypting '" + username + "', '" + ie_password + "'");
+ var enc_hex = rsa.encrypt(payload);
+ var encrypted = hex2b64(enc_hex);
+ console.log("E: " + encrypted);
+
+ // Now we can login
+ $.ajax({
+ type: "POST",
+ // to the Login URL
+ url: notebook_login_url,
+ // With our password
+ data: {
+ 'v': encrypted,
+ 'persist': 1,
+ 'clientPath': '/rstudio/auth-sign-in',
+ 'appUri': '',
+ },
+ contentType: "application/x-www-form-urlencoded",
+ xhrFields: {
withCredentials: true
- },
- success: function(response_text){
- var chunks = response_text.split(':', 2);
- var exp = chunks[0];
- var mod = chunks[1];
- console.log("Found " + exp +" and " + mod);
- var rsa = new RSAKey();
- rsa.setPublic(mod, exp);
- console.log("Encrypting '" + username + "', '" + ie_password + "'");
- var enc_hex = rsa.encrypt(payload);
- var encrypted = hex2b64(enc_hex);
- console.log("E: " + encrypted);
-
- // Now we can login
- $.ajax({
- type: "POST",
- // to the Login URL
- url: notebook_login_url,
- // With our password
- data: {
- 'v': encrypted,
- 'persist': 1,
- 'clientPath': '/rstudio/auth-sign-in',
- 'appUri': '',
- },
- contentType: "application/x-www-form-urlencoded",
- xhrFields: {
- withCredentials: true
- },
- // If that is successful, load the notebook
- success: function(){
- append_notebook(notebook_access_url);
- },
- error: function(jqxhr, status, error){
- message_failed_connection();
- // Do we want to try and load the notebook anyway? Just in case?
- append_notebook(notebook_access_url);
- }
- });
- }
- });
-
+ },
+ // If that is successful, load the notebook
+ success: function(){
+ append_notebook(notebook_access_url);
+ },
+ error: function(jqxhr, status, error){
+ message_failed_connection();
+ // Do we want to try and load the notebook anyway? Just in case?
+ append_notebook(notebook_access_url);
+ }
+ });
+ }
});
+
});
}
diff --git a/config/plugins/interactive_environments/rstudio/templates/rstudio.mako b/config/plugins/interactive_environments/rstudio/templates/rstudio.mako
index fdb99cde32d..c9b472c6f98 100644
--- a/config/plugins/interactive_environments/rstudio/templates/rstudio.mako
+++ b/config/plugins/interactive_environments/rstudio/templates/rstudio.mako
@@ -64,7 +64,9 @@ requirejs([
'crypto/base64',
'plugin/rstudio'
], function(){
- load_notebook(notebook_login_url, notebook_access_url, notebook_pubkey_url, "${ USERNAME }");
+ load_when_ready(ie_readiness_url, function(){
+ load_notebook(notebook_login_url, notebook_access_url, notebook_pubkey_url, "${ USERNAME }");
+ });
});
diff --git a/config/plugins/visualizations/charts/static/repository/visualizations/cytoscape/viewer/config.js b/config/plugins/visualizations/charts/static/repository/visualizations/cytoscape/viewer/config.js
index 3831f44a69b..366b044a81c 100644
--- a/config/plugins/visualizations/charts/static/repository/visualizations/cytoscape/viewer/config.js
+++ b/config/plugins/visualizations/charts/static/repository/visualizations/cytoscape/viewer/config.js
@@ -65,7 +65,6 @@ define( [], function() {
{ label : 'Incomers', value : 'incomers' },
{ label : 'Roots', value : 'roots' },
{ label : 'Leaves', value : 'leaves' },
-
{ label : 'None', value : '' } ]
},
choose_red : {
diff --git a/config/plugins/webhooks/demo/search/config/searchover.yaml b/config/plugins/webhooks/demo/search/config/searchover.yaml
new file mode 100644
index 00000000000..787c4dc8dc3
--- /dev/null
+++ b/config/plugins/webhooks/demo/search/config/searchover.yaml
@@ -0,0 +1,22 @@
+name: searchover
+type:
+ - masthead
+activate: true
+
+icon: fa-search
+tooltip: Click to activate search and press Ctrl + Alt + q to open the overlay
+
+function: >
+ $.getJSON("/api/webhooks", function( data ) {
+ for( var item in data ) {
+ var webhook = data[item];
+ if( webhook.name === "searchover" ) {
+ if( webhook.script && !window.static_search ) {
+ $( '', { type: 'text/javascript' } ).text( webhook.script ).appendTo( 'head' );
+ $( '', { type: 'text/css' } ).text( webhook.styles ).appendTo( 'head' );
+ window.static_search = true;
+ }
+ break;
+ }
+ }
+ });
diff --git a/config/plugins/webhooks/demo/search/static/script.js b/config/plugins/webhooks/demo/search/static/script.js
new file mode 100644
index 00000000000..a29c4dc4f16
--- /dev/null
+++ b/config/plugins/webhooks/demo/search/static/script.js
@@ -0,0 +1,1062 @@
+$(document).ready(function() {
+
+ /** Display search overlay and search */
+ var OverlaySearchView = Backbone.View.extend({
+
+ parentElement: $('.full-content'),
+
+ initialize: function () {
+ this.search_query_minimum_length = 3;
+ this.active_filter = "all";
+ this.render();
+ this.registerEvents();
+ },
+
+ /** Render the overlay html */
+ render: function() {
+ this.parentElement.prepend( this._template() );
+ },
+
+ /** Register events for the overlay */
+ registerEvents: function() {
+ var self = this,
+ filter_classes = {},
+ $el_search_text = $( '.txtbx-search-data' );
+ filter_classes = {
+ 'all': '.all-filter',
+ 'tools': '.tool-filter',
+ 'history': '.history-filter',
+ 'data_library': '.datalibrary-filter',
+ 'workflow': '.workflow-filter',
+ 'removeditems': '.removeditems-filter'
+ };
+ // Register event for invoking overlay
+ this.parentElement.on( 'keydown', function( e ) {
+ self.invokeOverlay( e, self );
+ });
+
+ // Register events for search textbox
+ $el_search_text.on( 'keyup', function( e ) {
+ self.triggerEvents( e, self );
+ });
+
+ // Register events for fliter clicks
+ for( var item in filter_classes ) {
+ self.clickEvents( filter_classes[ item ], item, self );
+ }
+ },
+
+ /** Invoke the search overlay */
+ invokeOverlay: function( e, self ) {
+ var class_allfilter = '.all-filter';
+ if( e ) {
+ e.stopPropagation();
+ // Click of ctrl + alt + q shows search overlay
+ if ( ( e.which === 81 || e.keyCode === 81 ) && e.ctrlKey && e.altKey ) {
+ self.clearSearchResults();
+ self.showOverlay();
+ self.showSearchResult();
+ self.setActiveFilter( class_allfilter );
+ self.showDefaultLinks();
+ }
+ // Remove the overlay and hides the search screen on clicking escape key
+ else if ( e.which === 27 || e.keyCode === 27 ) {
+ self.removeOverlay();
+ }
+ }
+ },
+
+ /** Display favourites and most used tools if present for home filter */
+ showDefaultLinks: function() {
+ var class_search_results = '.search-results',
+ class_fav_header = '.fav-header';
+ var defaultLinks = new SearchItemsView({});
+ defaultLinks.showPinnedItems( class_fav_header );
+ defaultLinks.buildMostUsedTools( class_search_results );
+ },
+
+ /** Trigger events on search overlay */
+ triggerEvents: function( e, self ) {
+ var $el_search_textbox = $( '.txtbx-search-data' ),
+ query = "";
+ if( e ) {
+ e.stopPropagation();
+ query = (( $el_search_textbox.val() ).trim()).toLowerCase();
+ // Perform search if enter is pressed or query has 3 or more characters
+ if ( ( e.which === 13 || e.keyCode === 13 ) || query.length >= self.search_query_minimum_length ) {
+ // Search in all categories and defaults to 'All' search filter in the search overlay
+ self.searchWithAFilter( self, self.active_filter, query );
+ }
+ else if( query.length < self.search_query_minimum_length ) {
+ self.removeOldEntries();
+ }
+ }
+ },
+
+ /** Remove old entries if any */
+ removeOldEntries: function() {
+ $( '.search-tools' ).remove();
+ $( '.search-history' ).remove();
+ $( '.search-workflow' ).remove();
+ $( '.search-datalib' ).remove();
+ },
+
+ /** Click events for the search categories */
+ clickEvents: function( selector, type, self ) {
+ $( selector ).click(function() {
+ var $el_removed_items = $( '.removed-items' ),
+ $el_search_results = $( '.search-results' ),
+ removed_type_text = 'removed';
+ // Show removed items from search results
+ if( type.indexOf( removed_type_text ) > -1 ) {
+ $el_removed_items.show();
+ $el_search_results.hide();
+ var removedLink = new SearchItemsView({});
+ removedLink.showRemovedLinks();
+ self.applyTextDecorations( this );
+ }
+ else {
+ // Search items for the selected filter
+ self.search( type, this, self );
+ }
+ });
+ },
+
+ /** Search with a filter */
+ search: function( type, _this, self ) {
+ var $el_search_text = $( '.txtbx-search-data' );
+ if( !$( _this ).hasClass( 'filter-active' ) ) {
+ var query = ( ( $el_search_text.val() ).trim() ).toLowerCase();
+ // Perform search
+ if( query.length >= self.search_query_minimum_length ) {
+ // Set the active filter
+ self.active_filter = type;
+ // Apply css decorations to the selected filter
+ self.applyTextDecorations( _this );
+ self.showSearchResult();
+ self.searchWithAFilter( self, self.active_filter, query );
+ }
+ else {
+ // Show default links when clicked on home icon
+ // No search is performed as query length is less than three
+ if( type === "all" ) {
+ self.active_filter = type;
+ self.applyTextDecorations( _this );
+ self.showSearchResult();
+ self.showDefaultLinks();
+ }
+ }
+ }
+ },
+
+ /** Search with a filter */
+ searchWithAFilter: function( self, type, query ) {
+ switch( type ) {
+ case "all":
+ self.searchAllFilters( self, query );
+ break;
+ case "tools":
+ self.searchTools( query );
+ break;
+ case "history":
+ self.searchHistory( query );
+ break;
+ case "data_library":
+ self.searchDataLibrary( query );
+ break;
+ case "workflow":
+ self.searchWorkflow( query );
+ break;
+ }
+ },
+
+ /** Search in all categories */
+ searchAllFilters: function( self, query ) {
+ self.clearSearchResults();
+ self.setActiveFilter( '.all-filter' );
+ self.showSearchResult();
+ // Show default links above search results
+ self.showDefaultLinks();
+ // Search for history
+ self.searchHistory( query );
+ // Search for tools
+ self.searchTools( query );
+ // Search for data libraries
+ self.searchDataLibrary( query );
+ // Search for workflows only when the user is authenticated
+ if( window.Galaxy.user.id ) {
+ self.searchWorkflow( query );
+ }
+ },
+
+ /** Search in tools */
+ searchTools: function( query ) {
+ var url = Galaxy.root + 'api/tools';
+ $.get( url, { q: query }, function ( search_result ) {
+ toolSearch = new SearchItemsView( { 'tools': search_result } );
+ }, "json" );
+ },
+
+ /** Search in history */
+ searchHistory: function( query ) {
+ var history_url = Galaxy.root + 'api/histories';
+ // Get all histories
+ $.get( history_url, function ( histories ) {
+ var history_list = [];
+ // Get the content of each history
+ _.each( histories, function( item ) {
+ var history_item_url = history_url + '/' + item.id + '/contents';
+ $.get( history_item_url, function( history_content ) {
+ _.each( history_content, function( item ) {
+ var item_name = item.name.toLowerCase();
+ if ( item_name.indexOf( query ) > -1 ) {
+ history_list.push( item );
+ }
+ });
+ historySearch = new SearchItemsView({ 'history': history_list });
+ }, 'json');
+ });
+ }, "json" );
+ },
+
+ /** Search in data library */
+ searchDataLibrary: function( query ) {
+ var url = Galaxy.root + 'api/libraries?deleted=false';
+ $.get( url, function ( library_data ) {
+ var data_lib_list = [];
+ // Filter the result based on query
+ _.each( library_data, function( item ) {
+ var name = item.name.toLowerCase();
+ if ( name.indexOf( query ) > -1 ) {
+ data_lib_list.push( item );
+ }
+ });
+ libSearch = new SearchItemsView({ 'data_library': data_lib_list });
+ }, "json" );
+ },
+
+ /** Search in workflow */
+ searchWorkflow: function( query ) {
+ var url = Galaxy.root + 'api/workflows';
+ $.get( url, function ( workflow_data ) {
+ var workflow_list = [];
+ // Filter the result based on query
+ _.each( workflow_data, function( item ) {
+ var name = item.name.toLowerCase();
+ if ( name.indexOf( query ) > -1 ) {
+ workflow_list.push( item );
+ }
+ });
+ workflowSearch = new SearchItemsView({ 'workflow': workflow_list });
+ }, "json" );
+ },
+
+ /** Show overlay */
+ showOverlay: function() {
+ var $el_search_textbox = $( '.txtbx-search-data' );
+ $( '.search-screen-overlay' ).show();
+ $( '.search-screen' ).show();
+ $el_search_textbox.val( "" );
+ $el_search_textbox.focus();
+
+ // Add blur effect
+ $('#left').css('filter', 'blur(5px)');
+ $('#center').css('filter', 'blur(5px)');
+ $('#right').css('filter', 'blur(5px)');
+ },
+
+ /** Remove the search overlay */
+ removeOverlay: function() {
+ $( '.search-screen-overlay' ).hide();
+ $( '.search-screen' ).hide();
+
+ // Remove blur effect
+ $('#left').css('filter', 'none');
+ $('#center').css('filter', 'none');
+ $('#right').css('filter', 'none');
+ },
+
+ /** Clear search results */
+ clearSearchResults: function() {
+ $( '.search-results' ).html( "" );
+ },
+
+ /** Show search result section and hide removed items */
+ showSearchResult: function() {
+ $( '.removed-items' ).hide();
+ $( '.search-results' ).show();
+ },
+
+ /** Set the active filter */
+ setActiveFilter: function( filter_class ) {
+ var $el_filter = $( filter_class ),
+ $el_filter_link = $( '.overlay-filters a' ),
+ active = 'filter-active',
+ inactive = 'filter-inactive';
+ if( !$el_filter.hasClass( active ) ) {
+ $el_filter_link.addClass( inactive ).removeClass( active );
+ $el_filter.addClass( active ).removeClass( inactive );
+ }
+ },
+
+ /** Apply the text decoration to the search overlay filters */
+ applyTextDecorations: function( self ) {
+ var active = 'filter-active',
+ inactive = 'filter-inactive';
+ $( '.search-results' ).html( "" );
+ $( '.overlay-filters a' ).addClass( inactive ).removeClass( active );
+ $( self ).removeClass( inactive ).addClass( active );
+ },
+
+ /** Template for search overlay */
+ _template: function() {
+ return '
' +
+ '' +
+ '
' +
+ '
' +
+ '' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '
' +
+ '' +
+ '' +
+ '
' +
+ '
';
+ },
+ });
+
+ /** Display search items from Tools, History, Workflow and Data libraries */
+ var SearchItemsView = Backbone.View.extend({
+ self : this,
+ web_storage_keys : [ "_localstorage_search_items", "sessionstorage_search_items" ],
+ /** Initialize the variables */
+ initialize: function( item ) {
+ var type = ( item ? Object.keys( item )[0] : "" ),
+ data = {};
+ // Set the data based on type of the result
+ switch( type ) {
+ case "tools":
+ data.tools = item[ type ];
+ break;
+ case "history":
+ data.history = item[ type ];
+ break;
+ case "data_library":
+ data.data_library = item[ type ];
+ break;
+ case "workflow":
+ data.workflow = item[ type ];
+ }
+
+ // Refresh the view as soon as more data arrive
+ if( Object.keys( data ).length > 0 ) {
+ this.refreshView( data );
+ }
+ },
+
+ /** Return the active filter */
+ getActiveFilter: function() {
+ var active_filter = "all";
+ active_filter = ( $( '.all-filter' ).hasClass( 'filter-active') ? "all" : active_filter );
+ active_filter = ( $( '.tool-filter' ).hasClass( 'filter-active') ? "tools" : active_filter );
+ active_filter = ( $( '.history-filter' ).hasClass( 'filter-active' ) ? "history" : active_filter );
+ active_filter = ( $( '.datalibrary-filter' ).hasClass( 'filter-active' ) ? "data_library" : active_filter );
+ active_filter = ( $( '.workflow-filter' ).hasClass( 'filter-active' ) ? "workflow" : active_filter );
+ active_filter = ( $( '.removeditems-filter' ).hasClass( 'filter-active' ) ? "removeditems" : active_filter );
+ return active_filter;
+ },
+
+ /** Update the view as search data comes in */
+ refreshView: function( items ) {
+ var $el_search_result = $( '.search-results' ),
+ $el_no_result = $( '.no-results' ),
+ filter = this.getActiveFilter(),
+ data = null;
+ $el_no_result.remove();
+ // Make all sections when filter is all
+ if( filter === "all" ) {
+ this.makeAllSection( items );
+ }
+ else {
+ // If the selected filter has no data
+ data = items[ filter ];
+ if ( !data || data.length === 0 ) {
+ this.showEmptySection( $el_search_result );
+ return;
+ }
+ // Make individual section
+ this.makeSection( filter, data );
+ }
+ },
+
+ /** Show empty section if there is no search result */
+ showEmptySection: function( $el ) {
+ $el.append( this._templateNoResults() );
+ },
+
+ /** Make section based on filter and data */
+ makeSection: function( filter, data ) {
+ switch( filter ) {
+ case "tools":
+ this.makeToolSection( data );
+ break;
+ case "history":
+ this.makeCustomSearchSection( { 'name': 'History',
+ 'id': 'history',
+ 'class_name': 'search-section search-history',
+ 'link_class_name': 'history-search-link',
+ 'data': data } );
+ break;
+ case "data_library":
+ this.makeCustomSearchSection( { 'name': 'Data Library',
+ 'id': 'datalibrary',
+ 'class_name': 'search-section search-datalib',
+ 'link_class_name': 'datalib-search-link',
+ 'data': data } );
+ break;
+ case "workflow":
+ this.makeCustomSearchSection( { 'name': 'Workflow',
+ 'id': 'workflow',
+ 'class_name': 'search-section search-workflow',
+ 'link_class_name': 'workflow-search-link',
+ 'data': data } );
+ break;
+ }
+ },
+
+ /** Create templates for all the categories in the search result */
+ makeAllSection: function( data ) {
+ var has_result = false,
+ self = this;
+ // Loop through the data and make the available sections
+ for( var type in data ) {
+ if( data[ type ] && data[ type ].length > 0 ) {
+ has_result = true;
+ self.makeSection( type, data[type] );
+ }
+ }
+ },
+
+ /** Check if item is present in the removed list */
+ checkItemPresent: function( item_id, type, self ) {
+ var present = false,
+ localStorageObject = null;
+ localStorageObject = self.getStorageObject( self, window.Galaxy.user.id, type );
+ if( localStorageObject ) {
+ _.each( localStorageObject, function ( item, item_key ) {
+ if( item_key === item_id ) {
+ present = true;
+ }
+ });
+ return present;
+ }
+ },
+
+ /** Create collection of templates of all sections and links for tools */
+ makeToolSection: function( search_result ) {
+ var template_dict = [],
+ tool_template = "",
+ self = this,
+ $el_search_result = $( '.search-results' ),
+ removed_results_key = "removed_results",
+ pinned_results_key = "pinned_results",
+ class_tool_link = "tool-search-link";
+ _.each( search_result, function( item ) {
+ var all_sections = Galaxy.toolPanel.attributes.layout.models;
+ _.each( all_sections, function( section ) {
+ if( section.attributes.model_class === "ToolSection" ) {
+ var all_tools = section.attributes.elems,
+ is_present = false,
+ tools_template = "",
+ section_header_id = "",
+ section_header_name = "";
+ _.each( all_tools, function( tool ) {
+ if( tool.id === item ) {
+ var attrs = tool.attributes;
+ if( !self.checkItemPresent( attrs.id, removed_results_key, self ) ) {
+ is_present = true;
+ tools_template = tools_template + self._buildLinkTemplate( attrs.id,
+ attrs.link,
+ attrs.name,
+ attrs.description,
+ attrs.target,
+ class_tool_link,
+ self.checkItemPresent( attrs.id,
+ pinned_results_key, self ),
+ attrs.version,
+ attrs.min_width,
+ attrs.form_style );
+ }
+ }
+ });
+ if( is_present ) {
+ section_header_id = section.attributes.id;
+ section_header_name = section.attributes.name;
+ template_dict = self.appendTemplate( template_dict,
+ section_header_id,
+ section_header_name,
+ tools_template );
+ }
+ }
+ else if( section.attributes.model_class === "Tool" || section.attributes.model_class === "DataSourceTool" ) {
+ var attributes = section.attributes;
+ if( item === attributes.id ) {
+ if( !self.checkItemPresent( attributes.id, removed_results_key, self ) ) {
+ tool_template = tool_template + self._buildLinkTemplate( attributes.id, attributes.link,
+ attributes.name, attributes.description, attributes.target,
+ class_tool_link, self.checkItemPresent( attributes.id, pinned_results_key, self ),
+ attributes.version, attributes.min_width, attributes.form_style );
+ }
+ }
+ }
+ });
+ });
+ // Remove the tool search result section if already present
+ $el_search_result.find( '.search-tools' ).remove();
+ // Make template for sections and tools
+ self.makeToolSearchResultTemplate( template_dict, tool_template );
+ },
+
+ /** Append the template or creates a new section */
+ appendTemplate: function( collection, id, name, text ) {
+ var is_present = false;
+ _.each( collection, function( item ) {
+ if( id === item.id ) {
+ item.template = item.template + text;
+ is_present = true;
+ }
+ });
+ if(!is_present) {
+ collection.push( { id: id, template: text, name: name } );
+ }
+ return collection;
+ },
+
+ /** Register tool search link click */
+ registerToolLinkClick: function( self ) {
+ $( ".tool-search-link" ).click(function( e ) {
+ e.preventDefault();
+ self.saveMostUsedToolsCount( this, self );
+ self.searchedToolLink( self, e );
+ });
+
+ $( ".most-used-tools" ).click(function( e ) {
+ e.preventDefault();
+ self.saveMostUsedToolsCount( this, self );
+ self.searchedToolLink( self, e );
+ });
+ },
+
+ /** Save count of the most used tools */
+ saveMostUsedToolsCount: function( el, self ) {
+ var item = {};
+ item = { 'id': $( el ).attr( 'data-id' ),
+ 'desc': $( el )[0].innerText,
+ 'link': $( el ).attr( 'href' ),
+ 'target': $( el ).attr( 'target' ),
+ 'formstyle': $( el ).attr( 'data-formstyle' ),
+ 'version': $( el ).attr( 'data-version' ) };
+ self.setStorageObject( self, window.Galaxy.user.id, 'most_used_tools', item, 1 );
+ },
+
+ /** Register clicks for removed links from custom section */
+ registerRemoveLinkClicks: function( self ) {
+ // Register click of trash icon in elements of excluded section
+ $( '.restore-item' ).click(function( e ) {
+ var $el_removeditems = $( '.removed-items' );
+ self.removeItems( self, this, e, 'removed_results' );
+ if( $el_removeditems.children().length === 0 ) {
+ $el_removeditems.append( self._templateNoItems() );
+ }
+ });
+ // Register the click of trash icon in elements of favorites section
+ $( '.remove-fav' ).click(function( e ) {
+ var $el_favourites = $( '.fav-header' ),
+ item_id = $( this ).parent().attr( 'data-id' );
+ self.removeItems( self, this, e, 'pinned_results' );
+ if( $el_favourites.children().children().length === 0 ) {
+ $el_favourites.remove();
+ }
+ // Looks for the removed pinned element from favorites in the
+ // search result and revert the pinned status to unpinned if any
+ $( '.pinned-item' ).each( function() {
+ var $el_this = $( this ).parent(),
+ id = $el_this.attr( 'data-id' ),
+ $el_pin_item = $el_this.find( '.pin-item' ),
+ $el_remove_item = $el_this.find( '.remove-item' );
+ if( id === item_id ) {
+ $el_pin_item.removeClass( 'pinned-item' );
+ $el_pin_item.attr( 'title', "Add to favourites" );
+ $el_remove_item.removeClass( 'hide' ).addClass( 'show' );
+ }
+ });
+ });
+ },
+
+ /** Remove items from data storage for trash icon */
+ removeItems: function( self, _self, e, type ) {
+ e.preventDefault();
+ e.stopPropagation();
+ self.removeFromDataStorage( self, $( _self ).parent(), type );
+ $( _self ).parent().remove();
+ },
+
+ /** Register remove and pin action clicks */
+ registerLinkActionClickEvent: function( self, $el, $el_parent_section ) {
+ // Register click of trash icon in search results
+ // and move item to excluded section
+ $el.find( ".remove-item" ).click(function( e ) {
+ e.preventDefault();
+ e.stopPropagation();
+ self.setStorage( self, $( this ).parent() );
+ $( this ).parent().remove();
+ // If there are not elements left, remove the section
+ if( $el_parent_section.find( '.remove-item' ).length === 0 ) {
+ $el_parent_section.remove();
+ }
+ });
+ // Register click of pin icon to add the element to favorites section
+ $el.find( ".pin-item" ).click(function( e ) {
+ var $el_this = $( this ),
+ class_pinned = 'pinned-item',
+ title_add = 'Add to favourites',
+ titles_added = 'Added to favourites',
+ class_removeitem = '.remove-item';
+ e.preventDefault();
+ e.stopPropagation();
+ // Toggle between pin and unpin
+ // If pinned, then unpin and vice-versa
+ if( $el_this.hasClass( class_pinned ) ) {
+ self.removeFromDataStorage( self, $el_this.parent(), 'pinned_results' );
+ $el_this.removeClass( class_pinned );
+ $el_this.attr( 'title', title_add );
+ $el_this.parent().find( class_removeitem ).removeClass( 'hide' ).addClass( 'show' );
+ }
+ else {
+ self.setPinnedItemsStorage( self, $el_this.parent() );
+ $el_this.addClass( class_pinned );
+ $el_this.attr( 'title', titles_added );
+ $el_this.parent().find( class_removeitem ).removeClass( 'show' ).addClass( 'hide' );
+ }
+ // Append/ remove the pinned item to/ from favorites section
+ // but only when home filter is selected
+ if( self.getActiveFilter() === "all" ) {
+ self.showPinnedItems( '.fav-header' );
+ }
+ });
+ },
+
+ /** Set localstorage for pinned items */
+ setPinnedItemsStorage: function( self, $el ) {
+ var elem = $el[0].outerHTML;
+ elem = elem.replace( 'tool-link', '' );
+ self.setStorageObject( self, window.Galaxy.user.id, 'pinned_results', $( elem ).attr( 'data-id' ), elem );
+ },
+
+ /** Build removed links */
+ showRemovedLinks: function() {
+ var self = this,
+ $el_removed_result = $( '.removed-items' ),
+ html_text = "",
+ $el_span = null,
+ removed_results_html = null,
+ title_restore_search = "Restore to search";
+ $el_removed_result.html( "" );
+ // Build the removed result from web storage
+ removed_results_html = self.getStorageObject( self, window.Galaxy.user.id, 'removed_results' );
+ for( item in removed_results_html ) {
+ html_text = html_text + removed_results_html[ item ];
+ }
+ // Build html if there is an item
+ if( html_text.length > 0 ) {
+ $el_removed_result.html( html_text );
+ // Remove the link attribute and pin icon from anchor
+ $el_removed_result.find( 'a.link-tile' ).removeAttr( 'href' );
+ $el_removed_result.find( '.pin-item' ).remove();
+ $el_span = $el_removed_result.find( 'span' );
+ $el_span.removeClass( 'remove-item' ).addClass( 'restore-item' );
+ // Update the title of the delete icon
+ $el_span.attr( 'title', title_restore_search );
+ self.registerRemoveLinkClicks( self );
+ }
+ else {
+ $el_removed_result.append( self._templateNoItems() );
+ }
+ },
+
+ /** Display pinned items */
+ showPinnedItems: function( class_name ) {
+ var self = this,
+ pinned_results = {},
+ $el_search_results = $( '.search-results' ),
+ html_text = "",
+ fav_header = "",
+ title = 'Remove from favourites';
+ pinned_results = self.getStorageObject( self, window.Galaxy.user.id, 'pinned_results' );
+ // Build html text from web storage
+ for( var item in pinned_results ) {
+ html_text = html_text + pinned_results[ item ];
+ }
+ // Build section only if there is at least an item
+ if( html_text.length > 0 ) {
+ $el_search_results.show();
+ // If header is present, remove all items
+ // else build header and append to the main section
+ if( $( class_name ).length ) {
+ $( class_name ).find( '.link-tile' ).remove();
+ }
+ else {
+ fav_header = self._buildHeaderTemplate( 'fav_header', 'Favourites', 'search-section fav-header' );
+ $el_search_results.prepend( fav_header );
+ }
+ $( class_name ).append( "
" + html_text + "
" );
+ // Update items in html text
+ $( class_name ).find( '.pin-item' ).remove();
+ $( class_name ).find( '.remove-item' ).addClass( 'remove-fav' ).removeClass( 'remove-item' );
+ $( class_name ).find( '.remove-fav' ).attr( 'title', title );
+ // Register events
+ self.registerRemoveLinkClicks( self );
+ self.registerToolLinkClick( self );
+ $( class_name ).find( '.history-search-link' ).click(function( e ) {
+ self.removeOverlay();
+ });
+ }
+ else {
+ $( class_name ).remove();
+ }
+ },
+
+ /** Build template for most used tools */
+ buildMostUsedTools: function( el ) {
+ var self = this,
+ most_used_tools = {},
+ tools = [],
+ id = "",
+ item_obj = {},
+ html_text = "",
+ used_tools_header = "",
+ $el_most_used_tools_result = $( el ),
+ class_name = 'search-section used-tools-header',
+ title = 'Most Used Tools';
+ most_used_tools = self.getStorageObject( self, window.Galaxy.user.id, 'most_used_tools' );
+ // Transfer the object to an array for sorting on count property
+ for( var item in most_used_tools ) {
+ tools.push([ item, most_used_tools[ item ] ]);
+ }
+ // Sort the list in the decreasing order of count
+ tools.sort(function(item_one, item_two){
+ return item_two[ 1 ][ 'count' ] - item_one[ 1 ][ 'count' ];
+ });
+ // Build the template for most used tools, the most used being shown in the front
+ for( var item in tools ) {
+ var id = tools[ item ][ 0 ],
+ item_obj = tools[ item ][ 1 ],
+ class_names = "most-used-tools btn btn-primary link-tile " + id;
+ html_text = html_text + "" +
+ item_obj.desc + "";
+ }
+ // Build section only if there is at least an item
+ if( html_text.length > 0 ) {
+ used_tools_header = self._buildHeaderTemplate( 'used_tools_header', title, class_name );
+ $el_most_used_tools_result.append( used_tools_header );
+ $el_most_used_tools_result.find( '.used-tools-header' ).append( "
" + html_text + "
" );
+ self.registerToolLinkClick( self );
+ }
+ },
+
+ /** Build the fetched items template using the template dictionary */
+ makeToolSearchResultTemplate: function( collection, tool_template ) {
+ var self = this,
+ $el_search_result = $( '.search-results' ),
+ title = "Tools",
+ class_name = "search-section search-tools",
+ html = "",
+ header_text = "";
+ // Append header section when shown for all
+ if( self.getActiveFilter() === "all" ) {
+ header_text = self._buildHeaderTemplate( "tools", title, class_name );
+ } else {
+ header_text = self._buildHeaderTemplate( "tools", "", class_name );
+ }
+ // Make complete template
+ _.each( collection, function( item ) {
+ html = html + item.template;
+ });
+ html = html + tool_template;
+ self.setHTMLtoDOM( self, $el_search_result, '.search-tools', '.tool-search-link', html, header_text );
+ },
+
+ /** Set HTML text to DOM */
+ setHTMLtoDOM: function( self, $el, section_class, link_class , html_text, header_text ) {
+ if( html_text.length > 0 ) {
+ $el.append( header_text );
+ // Append the template to DOM
+ $el.find( section_class ).append( "
" + html_text + "
" );
+ // Register link clicks for the new links
+ self.registerToolLinkClick( self );
+ self.registerLinkActionClickEvent( self, $( link_class ), $( '.search-tools' ) );
+ } else {
+ if( self.getActiveFilter() !== "all" ) {
+ $el.append( self._templateNoResults() );
+ }
+ }
+ },
+
+ /** Open the respective link as the modal pop up or in the center of the main screen */
+ searchedToolLink: function( _self, e ) {
+ var id = "",
+ form_style = "",
+ version = "",
+ $target_element = null;
+ if( e ) {
+ _self.removeOverlay();
+ // Set the target element as jQuery element
+ if( e.srcElement ) {
+ $target_element = $( e.srcElement );
+ }
+ else if( e.target ) {
+ $target_element = $( e.target );
+ }
+ // Fetch the properties
+ id = $target_element.attr( 'data-id' );
+ form_style = $target_element.attr( 'data-formstyle' );
+ version = $target_element.attr( 'data-version' );
+ // Load as modal popup
+ if( id === 'upload1' ) {
+ Galaxy.upload.show();
+ }
+ // Redirect to the toolform -- we'll want to let Galaxy routing
+ // handle this down the road, but this is still much less
+ // cumbersome than instead of instantiating a tool form here.
+ else if ( form_style === 'regular' || form_style === 'special' ) {
+ // Redirect to url other than the Galaxy
+ document.location = $target_element.attr( 'href' );
+ }
+ }
+ },
+
+ /** Make custom search section */
+ makeCustomSearchSection: function( section_object ) {
+ var self = this,
+ template_string = "",
+ $el_search_result = $( '.search-results' ),
+ $el_section_link = $( "." + section_object.link_class_name ),
+ link = "",
+ target = '_top',
+ data_type = "",
+ section_class_name = section_object.class_name.split(" ")[1],
+ header_text = "",
+ active_filter = self.getActiveFilter();
+ // Set datatype for different url of links
+ if( section_object.link_class_name.indexOf( 'history' ) > -1 ) {
+ data_type = "history";
+ }
+ else if( section_object.link_class_name.indexOf( 'datalib' ) > -1 ) {
+ data_type = "data library";
+ }
+ else if( section_object.link_class_name.indexOf( 'workflow' ) > -1 ) {
+ data_type = "workflow";
+ }
+
+ $el_search_result.find( '.' + section_class_name ).remove();
+ _.each( section_object.data, function( item ) {
+ if( !self.checkItemPresent( item.id, "removed_results", self ) ) {
+ switch( data_type ) {
+ case "history":
+ link = "/datasets/" + item.id + "/display/?preview=True";
+ target = 'galaxy_main';
+ break;
+ case "data library":
+ link = Galaxy.root + "library/list#folders/" + item.root_folder_id;
+ break;
+ case "workflow":
+ link = Galaxy.root + "workflow/editor?id=" + item.id;
+ break;
+ }
+ template_string = template_string + self._buildLinkTemplate( item.id, link, item.name, item.description, target,
+ section_object.link_class_name,
+ self.checkItemPresent( item.id, "pinned_results", self ) );
+ }
+ });
+ // Append section header if filter is "all"
+ if( active_filter === "all" ) {
+ header_text = self._buildHeaderTemplate( section_object.id, section_object.name, section_object.class_name );
+ }
+ else {
+ header_text = self._buildHeaderTemplate( section_object.id, "", section_object.class_name );
+ }
+
+ if( template_string.length > 0 ) {
+ $el_search_result.append( header_text );
+ // Append template to DOM
+ $el_search_result.find( '.' + section_class_name ).append( "
" + template_string + "
" );
+ // Register link clicks for new links
+ $el_search_result.find( "." + section_object.link_class_name ).click(function( e ) {
+ self.removeOverlay();
+ });
+ self.registerLinkActionClickEvent( self, $( '.' + section_object.link_class_name ), $( '.' + section_class_name ) );
+ }
+ else {
+ if( active_filter !== "all" ) {
+ $el_search_result.append( self._templateNoResults() );
+ }
+ }
+ },
+
+ /** Remove the delete item from localstorage */
+ removeFromDataStorage: function( self, $el, type ) {
+ var link_id = "",
+ elem = $el[0].outerHTML;
+ // Get the id of the link
+ link_id = ( $( elem ).attr( 'id' ) ? $( elem ).attr( 'id' ) : $( elem ).attr( 'data-id' ) );
+ // Delete it from web storage
+ self.deleteFromStorage( self, window.Galaxy.user.id, type, link_id );
+ },
+
+ /** Set local/session storage for removed results */
+ setLocalStorageForRemovedLinks: function( self, elem ) {
+ self.setStorageObject( self, window.Galaxy.user.id, 'removed_results', $( elem ).attr( 'data-id' ), elem );
+ },
+
+ /** Set localstorage for the removed links */
+ setStorage: function( self, $el ) {
+ self.setLocalStorageForRemovedLinks( self, $el[0].outerHTML );
+ },
+
+ /** Build web storage object based on whether user is logged in */
+ setStorageObject: function( self, user_id, type, id, elem ) {
+ var storageType = {},
+ key = "",
+ storageObject = {},
+ elem_obj = {};
+ // Get the storage type - localStorage or sessionStorage
+ storageType = ( user_id ? window.localStorage : window.sessionStorage );
+ // Get the storage key
+ key = ( user_id ? ( user_id + self.web_storage_keys[0] ) : self.web_storage_keys[1] );
+ if( storageType.getItem( key ) ) {
+ storageObject = JSON.parse( storageType.getItem( key ) );
+ if( !storageObject[ type ] ) {
+ storageObject[ type ] = {};
+ }
+ }
+ else {
+ storageObject[ type ] = {};
+ }
+
+ // Check for html strings and set element to web storage
+ if( isNaN( elem ) ) {
+ storageObject[ type ][ id ] = elem;
+ }
+ else { // check for most used tools
+ elem_obj = id;
+ if ( storageObject[ type ][ elem_obj.id ] ) {
+ // Increment the counter
+ storageObject[ type ][ elem_obj.id ][ 'count' ] = parseInt( storageObject[ type ][ elem_obj.id ][ 'count' ] ) + 1;
+ }
+ else {
+ storageObject[ type ][ elem_obj.id ] = { 'count': 1,
+ 'desc': elem_obj.desc,
+ 'link': elem_obj.link,
+ 'target': elem_obj.target,
+ 'formstyle': elem_obj.formstyle,
+ 'version': elem_obj.version };
+ }
+ }
+ // Set the object to key
+ storageType.setItem( key, JSON.stringify( storageObject ) );
+ },
+
+ /** Return the web storage object */
+ getStorageObject: function( self, user_id, type ) {
+ var storageType = null,
+ key = "";
+ // Get the storage type - localStorage or sessionStorage
+ storageType = ( user_id ? window.localStorage : window.sessionStorage );
+ // Get the storage key
+ key = ( user_id ? ( user_id + self.web_storage_keys[0] ) : self.web_storage_keys[1] );
+ if ( storageType.getItem( key ) ) {
+ return JSON.parse( storageType.getItem( key ) )[ type ];
+ }
+ else {
+ return {};
+ }
+ },
+
+ /** Remove item from web storage */
+ deleteFromStorage: function( self, user_id, type, id ) {
+ var storageType = null,
+ key = "",
+ localStorageObject = null;
+ // Get the storage type - localStorage or sessionStorage
+ storageType = ( user_id ? window.localStorage : window.sessionStorage );
+ // Get the storage key
+ key = ( user_id ? ( user_id + self.web_storage_keys[0] ) : self.web_storage_keys[1] );
+ localStorageObject = JSON.parse(storageType.getItem( key ));
+ if( localStorageObject[ type ] ) {
+ delete localStorageObject[ type ][ id ];
+ storageType.setItem( key, JSON.stringify( localStorageObject ) );
+ }
+ },
+
+ /** Return links template */
+ _buildLinkTemplate: function( id, link, name, description, target, cls, isBookmarked, version, min_width, form_style ) {
+ var template = "",
+ bookmark_class = (isBookmarked ? "pinned-item" : ""),
+ bookmark_title = (isBookmarked ? "Added to favourites" : "Add to favourites") ;
+ template = " -1 ) {
+ template = template + "' data-version='" + version +
+ "' minsizehint='" + min_width +
+ "' data-formstyle='" + form_style;
+ }
+ template = template + "'>" +
+ ( ( isBookmarked ) ? "" :
+ " " ) +
+ name + " " + (description ? description : "") + "";
+ return template;
+ },
+
+ /** Build section header template */
+ _buildHeaderTemplate: function( id, name, cls ) {
+ return "
" + name + "
";
+ },
+
+ /** Template for no results for any query */
+ _templateNoResults: function() {
+ return '
No results. Please search with different keywords
';
+ },
+
+ /** Template for no items when links are removed */
+ _templateNoItems: function() {
+ return '
The textarea on ' +
+ 'the right shows the list of installed tools on this Galaxy instance.' +
+ 'You can use it to build a custom Galaxy flavour based on the same ' +
+ 'tools. Keep in mind that this list only contains tools which can be ' +
+ 'installed from a toolshed.
1. Save this list as a .yaml ' +
+ 'file and edit it according to your needs. You might want to add or ' +
+ 'remove tools. 2. Follow ' +
+ 'this guide on how to create a new ' +
+ 'Galaxy Docker flavour. Dont forget to add and install the tool list ' +
+ 'with
';
+
+ popup.document.write(html);
+ });
diff --git a/config/plugins/webhooks/demo/tool_list/helper/__init__.py b/config/plugins/webhooks/demo/tool_list/helper/__init__.py
new file mode 100644
index 00000000000..15f84443c5a
--- /dev/null
+++ b/config/plugins/webhooks/demo/tool_list/helper/__init__.py
@@ -0,0 +1,39 @@
+import yaml
+
+
+def main(trans, webhook):
+ data = {}
+ data['tools'] = []
+ unique_tools = []
+
+ tools = trans.app.toolbox.tools()
+
+ for tool in tools:
+
+ try:
+ ts_data = tool[1].tool_shed_repository.to_dict()
+ panel = tool[1].get_panel_section()
+ except AttributeError:
+ continue
+
+ if (ts_data['name'] + ts_data['installed_changeset_revision'] not in
+ unique_tools):
+
+ unique_tools.append(
+ ts_data['name'] + ts_data['installed_changeset_revision']
+ )
+
+ data['tools'].append({
+ 'name': ts_data['name'],
+ 'owner': ts_data['owner'],
+ 'tool_panel_section_label': panel[1],
+ 'tool_shed_url': ts_data['tool_shed'],
+ 'install_tool_dependencies': True,
+ 'install_repository_dependencies': True,
+ 'install_resolver_dependencies': True,
+ 'revisions': [ts_data['installed_changeset_revision']]
+ })
+ if panel[0]:
+ data['tools'][-1]['tool_panel_section_id'] = panel[0]
+
+ return {'yaml': yaml.safe_dump(data, default_flow_style=False)}
diff --git a/config/swarm_manager_conf.yml.sample b/config/swarm_manager_conf.yml.sample
new file mode 100644
index 00000000000..31c5632519c
--- /dev/null
+++ b/config/swarm_manager_conf.yml.sample
@@ -0,0 +1,84 @@
+---
+# Galaxy docker swarm manager configuration file
+#
+# To configure the location of this file, use the `swarm_manager_config_file`
+# setting in galaxy.ini
+
+# When the swarm manager daemonizes, it writes a pid file so that only one
+# manager will run at a time. This is the path to that pid file.
+# {xdg_data_home} will be templated automatically and defaults to
+# ~/.local/share as per the XDG specification
+#pid_file: '{xdg_data_home}/galaxy_swarm_manager.pid'
+
+# Program output will be written to the log
+#log_file: '{xdg_data_home}/galaxy_swarm_manager.log'
+
+# As with GIE plugins, you can modify the base docker command ({docker_args}
+# must be present and will be filled in with the docker subcommand and
+# arguments)
+#command: 'docker {docker_args}'
+
+# Managed services should be started with this string at the beginning of their
+# name. It should match the value of CONTAINER_NAME_PREFIX in
+# lib/galaxy/web/base/interactive_environments.py, so you should not change
+# this unless you change both.
+#service_prefix: galaxy_gie_
+
+# Limits:
+#
+# - max_waiting_services: number of services that should be waiting of each
+# "CPU class" (number of CPUs requested e.g. with --reserve-cpu) before
+# attempting to spawn a node
+# - max_wait_time: number of seconds a service should be waiting before
+# attempting to spawn a node
+# - max_node_idle_time: number of seconds a node should be idle before
+# terminating it
+# - max_node_counts: a dictionary controlling the maximum number of nodes of
+# each CPU class that the swarm manager will attempt to spawn, e.g.:
+# max_node_counts:
+# 1: 10 # spawn up to 10 x 1-CPU nodes
+# 2: 3 # spawn up to 3 x 2-CPU nodes
+# 4: 1 # spawn up to 1 x 4-CPU nodes
+#max_waiting_services: 0
+#max_wait_time: 5
+#max_node_idle_time: 120
+#max_node_counts: {}
+
+# If set, only manage nodes whose swarm hostnames begin with this prefix.
+# Otherwise, attempt to manage all nodes
+#node_prefix: null
+
+# Amount of time to wait for a spawning node to appear in `docker node ls`
+# before considering it failed
+#spawn_wait_time: 30
+
+# Command to run to spawn new nodes. This command should join the node to the
+# swarm. Can include template variables:
+# - {cpu_class}: CPU class as explained above (the value of --reserve-cpu)
+# - {cpus_needed}: Total number of CPUs of the given class needed to run the
+# waiting services
+# If this command does not block until the node is joined to the swarm, make
+# sure it at least completes that step in `spawn_wait_time` once it returns
+# control. This command should return a space-separated list of nodes. If the
+# nodes have a different number of CPUs than the class that they were started
+# for, you can include that number after a colon (e.g. `node1:4`).
+#spawn_command: /bin/true
+
+# Command to run to destroy idle nodes. Can include template variables:
+# - {nodes}: Space-separated list of node names to destroy
+# This command should block until at least the point at which any nodes being
+# deallocated no longer appear in `docker node ls`.
+#destroy_command: /bin/true
+
+# Command to run if either of the above commands failed (e.g. to notify an
+# administrator). Can include template variables:
+# - {failed_command}: Command line of the command that failed
+#command_failure_command: /bin/true
+
+# Number of times to retry spawn/destroy commands before considering them to
+# have failed, and seconds to wait between retries
+#command_retries: 0
+#command_retry_wait: 10
+
+# Stop the swarm manager daemon when there are no services or nodes to manage
+#terminate_when_idle: True
diff --git a/doc/source/admin/authentication.md b/doc/source/admin/authentication.md
new file mode 100644
index 00000000000..81ce814433f
--- /dev/null
+++ b/doc/source/admin/authentication.md
@@ -0,0 +1,210 @@
+# Authentication
+
+Galaxy supports the following authentication mechanisms:
+
+* [Galaxy Database](#galaxy-database) - Galaxy-specific login using e-mail address and password (the default)
+* [Authentication Framework](#authentication-framework) - A plugin-driven framework supporting LDAP/Active Directory and PAM.
+* [OpenID](#openid) - authentication with Galaxy as a relying party
+* [Proxy Authentication](#proxy_authentication) - HTTP [remote user](http://httpd.apache.org/docs/current/mod/mod_cgi.html#env) provided by any front-end Web server
+
+## Galaxy Database
+
+Without any additional configuration Galaxy will simply use its database to maintain usernames and passwords. The
+Galaxy user interface and API provide functions allowing users to register accounts, change passwords, etc....
+
+If deploying Galaxy using the default authentication option, user activation can be enabled also. This is documented
+[below](#user-activation).
+
+## Authentication Framework
+
+Galaxy is distributed with a plugin-driven authentication framework for which the default database authentication is
+just one (and the default plugin). This framework can be used to allow Galaxy to delegate authentication to
+an LDAP server, an Active Directory server, or to PAM.
+
+These same mechanisms can also be configured by proxies serving Galaxy (e.g. nginx or Apache), but configuring them
+within Galaxy allows users to use the Galaxy UI for logging in instead of relying on a proxy.
+
+To configure one or more authentication plugins, simply copy ``config/auth_conf.xml.sample`` to ``config/auth_conf.xml``.
+The provided sample configuration file has numerous commented out examples and serves as the most up-to-date source
+of documentation on configuring these plugins.
+
+## OpenID
+
+[OpenID](https://en.wikipedia.org/wiki/OpenID) is becoming less popular and probably shouldn't be used the primary mechanism
+for authentication in Galaxy but it is an available option.
+
+Enabling OpenID requires you to edit Galaxy's configuration file and set `enable_openid` to `True`. This file is
+likely located in `config/galaxy.ini` and can be created by copying Galaxy's sample `config/galaxy.ini.sample`.
+
+Enabling this option enables OpenID and causes the OpenID form to be displayed on the login screen.
+
+## Remote User Authentication
+
+If Galaxy is deployed with either nginx or Apache serving as a front-end proxy for Galaxy requests, they can be configured
+to authenticate users and pass this authentication information along to Galaxy using the HTTP remote user mechanism. See, for
+example, the [authentication and authorization guide for the Apache Web server](http://httpd.apache.org/docs/2.4/howto/auth.html)
+for an impression of the possibilities. Thus, by the time Galaxy is aware of a request, the user identity will have been determined
+and there will be no need for Galaxy to do any additional authentication work, such as showing a login screen or checking user
+credentials.
+
+However, accepting an identity asserted by the Web server does not relieve Galaxy from having to create a user account for
+such an identity. Thus, Galaxy automatically creates a user for each identity of this kind, recording that the user is
+"external" and also creating a random password in order to effectively disable traditionally performed logins for the user,
+although the remote user mechanism should normally prohibit any login mechanism other than that imposed by the Web server,
+and the "external" flag should itself prohibit the traditional mechanism being used with the user concerned. When a remote
+user returns to Galaxy and is not already logged in, the details of the user are retrieved according to the identity
+information supplied by the Web server.
+
+Enabling remote user authentication requires you to edit Galaxy's configuration file and set `use_remote_user` to `True`.
+This file is likely located in `config/galaxy.ini` and can be created by copying Galaxy's sample `config/galaxy.ini.sample`.
+
+Additional Galaxy configuration options related to remote user authentication are documented in Galaxy's sample
+configuration file. The options ``remote_user_maildomain``, ``remote_user_header``, and ``normalize_remote_user_email`` can
+adapt Galaxy to different responses from the proxy, while ``remote_user_secret`` can be used to provide added
+security, and ``remote_user_logout_href`` can be used to fix Galaxy's logout for the deployed setup.
+
+## User Activation
+
+Galaxy admins using the default authentication mechanism have an option to turn on the email verification feature
+to force users to provide working email during the registration. You can also turn on the disposable email domains
+filter to disable registration for users using known disposable email provider.
+
+How to set up this config is presented here.
+
+*Note: SQLite database is not supported with this feature. Please use PostgreSQL.*
+
+### Account activation feature
+
+In the Galaxy config file **config/galaxy.ini** there is the user activation setting that you have to turn on.
+
+```
+user_activation_on = True
+```
+
+
+There is also the option for tracking jobs in database that is required to be turned on for the account activation to be effective. By default it is off.
+
+```
+track_jobs_in_database = True
+```
+
+
+After you turn on both of these every user that will try to register after this configuration file takes effect will have the verification email sent to the email address provided. Unless the Grace period (see below) is set, the user won't be able to login before the verification happens.
+
+Furthermore in order for this to work correctly smtp server and admin email should be set:
+```
+#smtp_server = some.server.edu:587
+#smtp_username = example_username
+#smtp_password = example_passsword
+#activation_email = activation-noreply@example.com
+#error_email_to = admin@example.com
+```
+
+Smtp server takes care of the email sending and the activation_email email is used as the *From* address in the verification email. Furthermore the error_email_to is being shown to the user if the Galaxy detects its own misconfiguration.
+
+You can also set the instance_resource_url which is shown in the activation emails so you can point users to your wiki or other materials.
+```
+instance_resource_url = http://wiki.galaxyproject.org/
+```
+
+
+The final activation email looks like this:
+
+```
+Hello ,
+
+In order to complete the activation process for begun on at , please click on the following link to verify your account:
+
+test.galaxyproject.org/activate?activation_token=46701ecdbbf2a79a7348ddae33062774edadef59&email=example%40example.com
+
+By clicking on the above link and opening a Galaxy account you are also confirming that you have read and agreed to Galaxy's Terms and Conditions for use of this service (). This includes a quota limit of one account per user. Attempts to subvert this limit by creating multiple accounts or through any other method may result in termination of all associated accounts and data.
+
+Please contact us if you need help with your account at: . You can also browse resources available at: .
+
+More about the Galaxy Project can be found at galaxyproject.org
+
+Your Galaxy Team
+
+```
+
+### Changing email address
+
+If an activated user changes email address in user settings, his/her account will be deactivated. A new activation link will be sent and the user will have to visit it to activate the account again.
+
+### Grace period
+
+In case you want the account activation feature but don't want to disable login completely you can set the **activation_grace_period** parameter. It specifies, in hours, the period in between registration time and the login time that the user will be allowed to log in even with an inactive account.
+```
+# Activation grace period. Activation is not forced (login is not disabled) until
+# grace period has passed. Users under grace period can't run jobs (see inactivity_box_content).
+# In hours. Default is 3. Enter 0 to disable grace period.
+# Users with OpenID logins have grace period forever.
+#activation_grace_period = 3
+```
+
+However with inactive account the user won't be able to run jobs and warning message will be shown to him at the top of the page. It is customizable via the **inactivity_box_content** parameter.
+```
+# Used for warning box for inactive accounts (unable to run jobs).
+# In use only if activation_grace_period is set.
+#inactivity_box_content = Your account has not been activated yet. Please activate your account by verifying your email address. For now you can access everything at Galaxy but your jobs won't run.
+```
+
+### Disposable email address filtering
+
+
+
+To prevent users from using disposable email addresses as a workaround for the email verification the domain blacklist can be turned on through the **blacklist_file** path parameter. Users that use disposable email domains defined at the file in this provided path will be refused registration.
+```
+# E-mail domains blacklist is used for filtering out users that are using disposable email address
+# during the registration. If their address domain matches any domain in the BL they are refused the registration.
+blacklist_file = config/disposable_email_blacklist.conf
+```
+
+
+Disposable domains blacklist file for download and modification is [at GitHub](https://github.com/martenson/disposable-email-domains/blob/master/disposable_email_blacklist.conf)
+
+In the file each domain is on its own line and without the *@* sign. Example of the blacklist file format:
+
+```
+drdrb.com
+mailinator.com
+sogetthis.com
+spamgourmet.com
+trashmail.net
+kurzepost.de
+objectmail.com
+proxymail.eu
+rcpt.at
+trash-mail.at
+trashmail.at
+trashmail.me
+wegwerfmail.de
+wegwerfmail.net
+wegwerfmail.org
+```
+
+## Authentication Related Code
+
+The `lib/galaxy/webapps/galaxy/controllers/user.py` file provides much of the authentication-related logic in the `User` class. Of the supported mechanisms, only those needing to perform actual authentication work require any substantial amount of code in this file; the integration of "remote user" information is performed in the `lib/galaxy/web/framework/__init__.py` file.
+
+Within the `User` class, code supporting authentication mechanisms will need to provide the following things:
+
+* Support within the `login` method for any additional information shown in the login screen. Since the login screen is likely to be modified to show alternative authentication methods alongside the conventional e-mail and password fields, it is possible that information such as identity providers will also need to be made available in order to simplify the experience for users.
+* A separate method to handle the initial stage of authentication for the mechanism. For example, OpenID authentication requests are handled by the `openid_auth` method initially.
+* Additional methods to handle any subsequent stages of authentication. For example, OpenID authentication involves the handling of subsequent requests in the `openid_process`, `openid_associate` and `openid_manage` methods.
+
+### Database Tables
+
+The database employs a `galaxy_user` table which records the details of all registered users, and this table is exposed to the code through the `User` abstraction found in `lib/galaxy/model/mapping.py`. Each logged-in user is assigned a session which references the user in the `galaxy_session` table (exposed via `GalaxySession`).
+
+User information from external sources, such as OpenID, is found in peripheral tables such as `galaxy_user_openid` (exposed by `UserOpenID`) and references the registered user and session of that user.
+
+### Authenticating a User
+
+The following steps are followed in any code that seeks to recognise a user within Galaxy and allow access to the application:
+
+1. The identity credential, currently the e-mail address of the user, is used to find any previously-registered user in the database.
+1. Where no user exists and the login mechanism requires explicit registration, authentication fails at this point. Otherwise, a user is automatically created for previously unknown identities.
+1. For conventional accounts requiring a password, authentication fails at this point if a valid password is not specified. Otherwise, an alternative mechanism for completing authentication may be invoked.
+1. Upon completion of the authentication of a user's identity, any association of that identity with the Galaxy user instance may be performed. For example, an OpenID identity may be associated with a user created for that identity.
+1. Finally, the login is handled using the `handle_user_login` method on the `GalaxyWebTransaction` object, associating the user with a new session.
diff --git a/doc/source/admin/dependency_resolvers.rst b/doc/source/admin/dependency_resolvers.rst
index c74bcf3c2dd..0d6930d1ef7 100644
--- a/doc/source/admin/dependency_resolvers.rst
+++ b/doc/source/admin/dependency_resolvers.rst
@@ -6,10 +6,12 @@ Dependency Resolvers in Galaxy
There are two parts to building a link between Galaxy and command line bioinformatics tools: the tool XML that
specifies a mapping between the Galaxy web user interface and the tool command line and tool dependencies that specify
-how to source the actual packages that implement the tool’s commands. The final script that Galaxy submits to run a
-job uses includes commands, such as changes to the ``PATH`` environment variable, that are generated by *dependency
-resolvers*. There is a default dependency resolver configuration but administrators can provide their own configuration
-using the ``dependency_resolvers_conf.xml`` configuration file in the Galaxy ``config/`` directory.
+how to source the actual packages that implement the tool’s commands. The final script that Galaxy submits to run a job
+uses includes commands, such as changes to the ``PATH`` environment variable, that are generated by *dependency
+resolvers*. These same dependency resolvers are used by the Galaxy administrative UI to display whether an installed
+tool's dependencies have been installed on the Galaxy server, and to show how they will be resolved at job runtime.
+There is a default dependency resolver configuration but administrators can provide their own configuration using the
+``dependency_resolvers_conf.xml`` configuration file in the Galaxy ``config/`` directory.
The binding between tool XML and the tools they need to run is specified in the tool XML using ````
tags, for example
@@ -34,30 +36,31 @@ The default configuration of dependency resolvers is equivalent to the following
.. code-block:: xml
-
-
-
-
+
-This default dependency resolver configuration contains five items. First, the *tool shed dependency resolver* is used,
-then the *Galaxy packages dependency resolver* is used (initially looking for packages by name and version string and then looking for the package just by name), and finally it checks *Conda* for a versioned or unversioned match.
-The default configuration thus prefers packages installed from the Galaxy Tool Shed using legacy ``tool_dependencies.xml``
-files, before trying to find a "Galaxy package" satisfying the specific version the dependency requires before
-falling back to looking for a Galaxy package with merely the correct name, and then looking for Conda recipes with
-matching name and version, and finally just for a Conda package with the correct name. If any of the dependency
-resolvers succeeds a dependency resolution object is returned and no more resolvers are called. This dependency
-resolution object provides shell commands to prepend to the shell script that runs the tool.
+This default dependency resolver configuration contains five items:
+
+1. First, the *Tool Shed dependency resolver* is used, which resolves packages installed from the Galaxy Tool Shed
+ using legacy ``tool_dependencies.xml`` files,
+2. then the *Galaxy packages dependency resolver* is checked for a package matching the requirement name and version,
+3. then the *Conda dependency resolver* is checked for a package matching the requirement name and version. If no
+ versioned match can be found, it then moves on to searching for unversioned matches, that is,
+4. the *Galaxy packages dependency resolver* is checked for a package matching the required name only, and
+5. finally the *Conda dependency resolver* is checked for a package matching the required name only.
+
+If any of the dependency resolvers succeeds a dependency resolution object is returned and no more resolvers are
+called. This dependency resolution object provides shell commands to prepend to the shell script that runs the tool.
This order can be thought of as a descending order of deliberation. Tool Shed dependencies must be declared next to the
tool by the tool author and must be selected for installation at tool installation time - this requires specific actions
-by both the tool author and the deployer who installed the tools. The dependency is therefore expected to highly craft
-to the individual tool. If Galaxy packages have been setup, the deployer of a Galaxy tool has purposely crafted tool
-dependency statements for a specific installation - this is slightly less deliberate than tool shed packages but
+by both the tool author and the deployer who installed the tools. The dependency is therefore expected to highly
+crafted to the individual tool. If Galaxy packages have been setup, the deployer of a Galaxy tool has purposely crafted
+tool dependency statements for a specific installation - this is slightly less deliberate than tool shed packages but
such requirements are less likely to be incidentally resolved than Conda packages. Conda recipes are neither tied to
tools or a specific installation and are maintained in Conda channels such as Bioconda.
diff --git a/doc/source/admin/index.rst b/doc/source/admin/index.rst
index 8bbb19ae162..572f1cf274f 100644
--- a/doc/source/admin/index.rst
+++ b/doc/source/admin/index.rst
@@ -1,27 +1,14 @@
-Special Topics in Galaxy Administration & Deployment Documentation
-==================================================================
+Galaxy Deployment & Administration
+==================================
-This documentation intends to function as a version-specific supplement to the
-`wiki `__, not the primary admin
-documentation. These resources should be used together.
+This documentation is in the midst of being ported and unified based on resources from `old wiki `__ and `new hub `__. These resources should be used together for now.
.. toctree::
- :maxdepth: 3
+ :maxdepth: 2
- dependency_resolvers.rst
-
- conda_faq.rst
-
- mulled_containers.rst
-
- interactive_environments.rst
-
- framework_dependencies.rst
-
- useful_scripts.rst
-
- grt.rst
-
- chat.rst
-
- webhooks.rst
+ tool_panel
+ authentication
+ dependency_resolvers
+ conda_faq
+ framework_dependencies
+ useful_scripts
diff --git a/doc/source/admin/chat-0.png b/doc/source/admin/special_topics/chat-0.png
similarity index 100%
rename from doc/source/admin/chat-0.png
rename to doc/source/admin/special_topics/chat-0.png
diff --git a/doc/source/admin/chat-1.png b/doc/source/admin/special_topics/chat-1.png
similarity index 100%
rename from doc/source/admin/chat-1.png
rename to doc/source/admin/special_topics/chat-1.png
diff --git a/doc/source/admin/chat-2.png b/doc/source/admin/special_topics/chat-2.png
similarity index 100%
rename from doc/source/admin/chat-2.png
rename to doc/source/admin/special_topics/chat-2.png
diff --git a/doc/source/admin/chat-3.png b/doc/source/admin/special_topics/chat-3.png
similarity index 100%
rename from doc/source/admin/chat-3.png
rename to doc/source/admin/special_topics/chat-3.png
diff --git a/doc/source/admin/chat-4.png b/doc/source/admin/special_topics/chat-4.png
similarity index 100%
rename from doc/source/admin/chat-4.png
rename to doc/source/admin/special_topics/chat-4.png
diff --git a/doc/source/admin/chat.rst b/doc/source/admin/special_topics/chat.rst
similarity index 100%
rename from doc/source/admin/chat.rst
rename to doc/source/admin/special_topics/chat.rst
diff --git a/doc/source/admin/communication_server.png b/doc/source/admin/special_topics/communication_server.png
similarity index 100%
rename from doc/source/admin/communication_server.png
rename to doc/source/admin/special_topics/communication_server.png
diff --git a/doc/source/admin/communication_server_rooms.png b/doc/source/admin/special_topics/communication_server_rooms.png
similarity index 100%
rename from doc/source/admin/communication_server_rooms.png
rename to doc/source/admin/special_topics/communication_server_rooms.png
diff --git a/doc/source/admin/grt.rst b/doc/source/admin/special_topics/grt.rst
similarity index 100%
rename from doc/source/admin/grt.rst
rename to doc/source/admin/special_topics/grt.rst
diff --git a/doc/source/admin/images_webhooks/history-menu.png b/doc/source/admin/special_topics/images_webhooks/history-menu.png
similarity index 100%
rename from doc/source/admin/images_webhooks/history-menu.png
rename to doc/source/admin/special_topics/images_webhooks/history-menu.png
diff --git a/doc/source/admin/images_webhooks/masthead.png b/doc/source/admin/special_topics/images_webhooks/masthead.png
similarity index 100%
rename from doc/source/admin/images_webhooks/masthead.png
rename to doc/source/admin/special_topics/images_webhooks/masthead.png
diff --git a/doc/source/admin/images_webhooks/masthead_trans_object.png b/doc/source/admin/special_topics/images_webhooks/masthead_trans_object.png
similarity index 100%
rename from doc/source/admin/images_webhooks/masthead_trans_object.png
rename to doc/source/admin/special_topics/images_webhooks/masthead_trans_object.png
diff --git a/doc/source/admin/images_webhooks/tool.png b/doc/source/admin/special_topics/images_webhooks/tool.png
similarity index 100%
rename from doc/source/admin/images_webhooks/tool.png
rename to doc/source/admin/special_topics/images_webhooks/tool.png
diff --git a/doc/source/admin/images_webhooks/workflow.png b/doc/source/admin/special_topics/images_webhooks/workflow.png
similarity index 100%
rename from doc/source/admin/images_webhooks/workflow.png
rename to doc/source/admin/special_topics/images_webhooks/workflow.png
diff --git a/doc/source/admin/special_topics/index.rst b/doc/source/admin/special_topics/index.rst
new file mode 100644
index 00000000000..2c3f22a971d
--- /dev/null
+++ b/doc/source/admin/special_topics/index.rst
@@ -0,0 +1,12 @@
+Special Topics
+==============
+
+
+.. toctree::
+ :maxdepth: 2
+
+ interactive_environments
+ mulled_containers
+ grt
+ chat
+ webhooks
\ No newline at end of file
diff --git a/doc/source/admin/interactive_environments.png b/doc/source/admin/special_topics/interactive_environments.png
similarity index 100%
rename from doc/source/admin/interactive_environments.png
rename to doc/source/admin/special_topics/interactive_environments.png
diff --git a/doc/source/admin/interactive_environments.rst b/doc/source/admin/special_topics/interactive_environments.rst
similarity index 70%
rename from doc/source/admin/interactive_environments.rst
rename to doc/source/admin/special_topics/interactive_environments.rst
index 7e5e067a46b..9f2ef730bdb 100644
--- a/doc/source/admin/interactive_environments.rst
+++ b/doc/source/admin/special_topics/interactive_environments.rst
@@ -1,5 +1,5 @@
-Galaxy Interactive Environments (GIEs)
-======================================
+Galaxy Interactive Environments
+===============================
A GIE is a Docker container, launched by Galaxy, proxied by Galaxy, with some
extra sugar inside the container to allow users to interact easily with their
@@ -201,7 +201,8 @@ You might want to run your IEs on a host different to the one that hosts your
Galaxy webserver, since IEs on the same host as the webserver compete for
resources with that webserver and introduce some security considerations which
could be mitigated by moving containers to a separate host. This feature has
-been available since 15.07 and is used in production at the University of Freiburg.
+been available since 15.07 and is used in production at the University of
+Freiburg and on usegalaxy.org.
First you need to configure a second host to be Docker enabled. In the
following we call this host ``gx-docker`` You need to start the Docker daemon
@@ -213,9 +214,9 @@ you can start the daemon with
$ docker -H 0.0.0.0:4243 -d
On your client, the Galaxy webserver, you can now install a Docker client. This
-can also be done on older Systems like Scientific-Linux, CentOS 6, which does
-not have Docker support by default. The client just talks to the Docker daemon
-on host ``gx-docker``, and does not run anything itself, locally. You can test
+can also be done on older systems like Scientific-Linux, CentOS 6, which do not
+have Docker support by default. The client just talks to the Docker daemon on
+host ``gx-docker``, and does not run anything itself, locally. You can test
your configuration for example by starting busybox from your client on the
Docker host with
@@ -223,7 +224,13 @@ Docker host with
$ docker -H tcp://gx-docker:4243 run -it busybox sh
-So far so good! Now we need to configure Galaxy to use our new Docker host
+So far so good! Note, however, that unless restricted by a firewall, this mode
+of operation is insecure, as any client could connect and run containers on
+``gx-docker``. If this is a concern at your site, follow the instructions in
+the Docker documentation to `Protect the Docker daemon socket
+`__.
+
+Now we need to configure Galaxy to use our new Docker host
to start the Interactive Environments. For that we need to edit the Jupyter GIE
configuration, ``jupyter.ini`` to use our custom docker host
@@ -233,14 +240,18 @@ configuration, ``jupyter.ini`` to use our custom docker host
[docker]
command = docker -H tcp://gx-docker:4243 {docker_args}
- image = bgruening/docker-ipython-notebook:dev
docker_hostname = gx-docker
-Please adapt your ``command`` and the ``image`` as needed.
+Please adapt your ``command`` as needed.
-As next step we need to configure a share mount point between the Docker host
-and Galaxy. Unfortunately, this can not be a NFS mount. Docker does not like
-NFS yet. You could for example use a sshfs mount with the following script
+The Jupyter GIE supports getting and fetching Galaxy history datasets entirely
+through the Galaxy API so it is not necessary to share a filesystem with
+``gx-docker``. However, other GIE plugins may still require this.
+
+For those GIE plugins, we need to configure a share mount point between the
+Docker host and Galaxy. Unfortunately, this can not be a NFS mount. Docker does
+not like NFS yet. You could for example use a sshfs mount with the following
+script
.. code-block:: bash
@@ -252,3 +263,56 @@ NFS yet. You could for example use a sshfs mount with the following script
fi
This will let Galaxy and the Docker host share temporary files.
+
+Docker Engine Swarm Mode
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+As of Docker Engine version 1.12, Docker Engine can be configured to provide a
+cluster of Docker Engines in a configuration known as *Docker Engine swarm
+mode*. This replaces the previous and similarly named *Docker Swarm*
+clustering solution, which is not compatible with swarm mode.
+
+`The Docker Engine swarm mode documentation
+`__ fully explains the differences, but
+the major difference is that whereas under Docker Swarm one could run commands
+on the swarm with ``docker run``, Docker Engine swarm mode requires one to
+create persistent services with ``docker service create`` and to remove those
+services once no longer in use with ``docker service rm``.
+
+Galaxy supports both Docker Engine swarm mode and the legacy Docker Swarm
+system. Legacy Docker Swarm is supported without any special configuration,
+because the containers are still run with ``docker run`` as before. To support
+Docker Engine swarm mode, additional configuration is required. Begin by
+editing your GIE plugin's ini configuration file (e.g. ``jupyter.ini``) and set
+the ``docker_connect_port`` and ``swarm_mode options`` in addition to any other
+relevant options. Unless you are using a non-standard Docker image, the correct
+value for ``docker_connect_port`` should be suggested to you in the sample
+configuration file:
+
+.. code-block:: ini
+
+ [docker]
+ docker_connect_port = 8888
+ swarm_mode = True
+
+You can also enable swarm mode for *all* GIE plugins by setting
+``interactive_environment_swarm_mode`` in ``galaxy.ini`` to ``True``. If using
+this setting, you must still set ``docker_connect_port`` in each GIE plugin's
+ini configuration file. The ``swarm_mode`` setting in individual GIE plugin
+config files will override the value set in ``galaxy.ini``.
+
+Note that your Galaxy server does not need to be a member of the swarm itself.
+It can use the method outlined above in the `Docker on Another Host`_ section
+to connect as a client to a Docker daemon acting as a swarm mode manager.
+
+Once configured, you should see that your GIE containers are started and run as
+services, which you can inspect using the ``docker service ls`` command and
+other ``docker service`` subcommands.
+
+**Galaxy swarm manager**
+
+Galaxy will start a "swarm manager" process when the first swarm mode GIE is
+launched. You can control this daemon with the config file
+``config/swarm_mode_manager.yml``. Consult the sample configuration at
+``config/swarm_mode_manager.yml.sample`` for syntax. It will automatically shut
+down when no services or nodes remain to be managed.
diff --git a/doc/source/admin/interactive_environments.svg b/doc/source/admin/special_topics/interactive_environments.svg
similarity index 100%
rename from doc/source/admin/interactive_environments.svg
rename to doc/source/admin/special_topics/interactive_environments.svg
diff --git a/doc/source/admin/mulled_containers.rst b/doc/source/admin/special_topics/mulled_containers.rst
similarity index 100%
rename from doc/source/admin/mulled_containers.rst
rename to doc/source/admin/special_topics/mulled_containers.rst
diff --git a/doc/source/admin/webhooks.rst b/doc/source/admin/special_topics/webhooks.rst
similarity index 99%
rename from doc/source/admin/webhooks.rst
rename to doc/source/admin/special_topics/webhooks.rst
index 43891364820..e683685390f 100644
--- a/doc/source/admin/webhooks.rst
+++ b/doc/source/admin/special_topics/webhooks.rst
@@ -1,4 +1,4 @@
-Galaxy webhooks
+Galaxy Webhooks
===============
Tiny plugin interface to extend the Galaxy client.
diff --git a/doc/source/admin/tool_panel.rst b/doc/source/admin/tool_panel.rst
new file mode 100644
index 00000000000..40049f90ca5
--- /dev/null
+++ b/doc/source/admin/tool_panel.rst
@@ -0,0 +1,51 @@
+Tool Panel Administration
+=========================
+
+Galaxy tool panel is located in the left of the 'Analysis page' and offers the following ways of modification.
+
+Configuration
+-------------
+The contents of the tool panel are defined by the following configuration files.
+
+Local tools
+~~~~~~~~~~~
+In the past, the file named by your ``tool_config_file`` configuration setting in your ``config/galaxy.ini`` file was the only file used to populate your Galaxy tool panel. The default name for this file is ``tool_conf.xml``. Since this was the only file involved in populating your Galaxy tool panel, it defined the items (tools, workflows, sections and labels) that would be displayed and the way in which they would be arranged.
+
+Tool Shed tools
+~~~~~~~~~~~~~~~
+For purposes of the Galaxy [Tool Shed](/src/toolshed/index.md) the ``tool_config_file`` setting allows for a comma-separated list of files (e.g., ``tool_config_file = tool_conf.xml,shed_tool_conf.xml``,etc.). The additional shed-related tool panel configuration files (``shed_tool_conf.xml``, etc.) are automatically modified when you install or uninstall a Tool Shed repository (that contains tools) to your Galaxy.
+
+Migrated tools
+~~~~~~~~~~~~~~
+Another configuration file named ``migrated_tools_conf.xml.sample`` is in the Galaxy installation directory. If you start your Galaxy server using ``sh run.sh`` or something similar, this sample file will automatically be copied to a file named ``migrated_tools_conf.xml`` in the same directory. You'll be required to manually copy this file if you start your Galaxy server differently. The migrated_tools_conf.xml file is reserved to contain the XML tag sets for repositories that contain tools that were once included in the Galaxy distribution but have been moved to the Tool Shed. Similar to the approach used with the other shed-related tool panel configuration files describe above, this file's contents will be changed automatically for certain tools contained in repositories that are installed into your local Galaxy instance. More information about this process is described in the following sections.
+
+Layout
+------
+
+The 3 or more files described in the previous section (``tool_conf.xml``, one or more ``shed_tool_conf.xml`` files, and ``migrated_tools_conf.xml``) are all used to load tool panel items (tools, sections, labels and workflows). A file named ``integrated_tool_panel.xml`` defines the arrangement for displaying these loaded items in your Galaxy tool panel.
+If this file does not exist in your Galaxy installation directory, it will be automatically created and populated when you start your Galaxy server. It is initially populated based on the order in which the tool panel items are loaded. The items are loaded as each tool panel configuration file is parsed and its items are loaded. The order in which these configuration files are parsed is the order of the comma-separated list of files defined in your ``tool_config_file`` setting in your ``config/galaxy.ini`` configuration file. The ``migrated_tools_conf.xml`` file is always parsed and loaded last. Let's look at an example to help clarify how this works.
+
+If you uninstall a repository that contains tools, entries for those tools will automatically be removed from the shed-related tool panel config file and the integrated_tool_panel.xml file.
+
+The best approach for managing the new integrated_tool_panel.xml file is to allow Galaxy to add or remove entries as manually adding or removing them will likely result in undesired behavior. Manual changes to the file should simply be moving entries around to produce the desired arrangement of your tool panel.
+
+Sections & Labels
+~~~~~~~~~~~~~~~~~
+* You can add ``labels="updated"`` to the ```` XML element to render a label next to the tool in the tool panel.
+* You can add ```` tag as a child of```` to create a section that can contains tools.
+
+.. code-block:: xml
+
+
+
+
+
+ toolshed.g2.bx.psu.edu
+ fastqc
+ devteam
+ a00a6402d09a
+ toolshed.g2.bx.psu.edu/repos/devteam/fastqc/fastqc/0.67
+ 0.67
+
+
+
\ No newline at end of file
diff --git a/doc/source/conf.py b/doc/source/conf.py
index c861f391b9a..04b5df1160b 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -15,6 +15,8 @@ import datetime
import os
import sys
+import sphinx_rtd_theme
+
# Library to make .md to slideshow
from recommonmark.parser import CommonMarkParser
@@ -67,8 +69,8 @@ source_suffix = ['.rst', '.md']
master_doc = 'index'
# General information about the project.
-project = u'Galaxy Code'
-copyright = str( datetime.datetime.now().year ) + u', Galaxy Team'
+project = u'Galaxy Project'
+copyright = str( datetime.datetime.now().year ) + u', Galaxy Committers'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@@ -123,10 +125,15 @@ html_theme = 'sphinx_rtd_theme'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
-#html_theme_options = {}
+html_theme_options = {
+ 'collapse_navigation': False,
+ 'display_version': True,
+ 'navigation_depth': 2,
+ 'canonical_url': 'https://docs.galaxyproject.org/en/master/',
+}
# Add any paths that contain custom themes here, relative to this directory.
-#html_theme_path = []
+html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
# The name for this set of Sphinx documents. If None, it defaults to
# " v documentation".
@@ -240,7 +247,7 @@ latex_documents = [
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
- ('index', 'galaxy', u'Galaxy Code Documentation',
+ ('index', 'galaxy', u'Galaxy Documentation',
[u'Galaxy Team'], 1)
]
@@ -254,7 +261,7 @@ man_pages = [
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
- ('index', 'Galaxy', u'Galaxy Code Documentation',
+ ('index', 'Galaxy', u'Galaxy Documentation',
u'Galaxy Team', 'Galaxy', 'Data intensive biology for everyone.',
'Miscellaneous'),
]
diff --git a/doc/source/dev/index.rst b/doc/source/dev/index.rst
index 504b996e866..110d5392305 100644
--- a/doc/source/dev/index.rst
+++ b/doc/source/dev/index.rst
@@ -1,4 +1,4 @@
-Developer Documentation
+Development Documentation
=======================
.. toctree::
@@ -8,11 +8,3 @@ Developer Documentation
interactive_environments
build_a_job_runner
faq
-
-These are other primary areas of documentation developers will be interested in:
-
-- `Codebase Documentation`_ for developers of Galaxy
-- `API Documentation`_ for developers of third party tools interacting with Galaxy
-
-.. _Codebase Documentation: ../lib/modules.html
-.. _API Documentation: ../api_doc.html
diff --git a/doc/source/dev/interactive_environments.rst b/doc/source/dev/interactive_environments.rst
index 1b1a97bf917..8e1a474031b 100644
--- a/doc/source/dev/interactive_environments.rst
+++ b/doc/source/dev/interactive_environments.rst
@@ -1,7 +1,7 @@
-Interactive Environments in Detail (and How to Build Your Own)
-==============================================================
+Build an Interactive Environment
+================================
-Unfortunately building a GIE isn't completely straightforward, and it's
+Unfortunately building a Galaxy Interactive Environment (GIE) isn't completely straightforward, and it's
certainly not as simple as picking out an existing container and plugging it
in. Here we'll go through build a "Hello, World" GIE which just displays a file
from a user's history.
diff --git a/doc/source/index.rst b/doc/source/index.rst
index cfee8c491c6..dc176f71ec1 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -1,47 +1,51 @@
-Galaxy Code Documentation
-*************************
+Galaxy Documentation
+********************
-Galaxy_ is an open, web-based platform for accessible, reproducible, and
-transparent computational biomedical research.
+Galaxy is an open, web-based platform for accessible, reproducible, and transparent computational biomedical research.
-- *Accessible:* Users without programming experience can easily specify parameters and run tools and workflows.
-- *Reproducible:* Galaxy captures information so that any user can repeat and understand a complete computational analysis.
-- *Transparent:* Users share and publish analyses via the web and create Pages, interactive, web-based documents that describe a complete analysis.
-
-Things to know:
-
-- There are multiple choices_ when it comes to using Galaxy.
-- You can explore the `current code in the development branch`_ on GitHub.
-- This documentation is hosted at readthedocs_.
-
-For more information on the Galaxy Project, please visit the `project home page`_.
-
-.. _Galaxy: http://galaxyproject.org
-.. _choices: https://wiki.galaxyproject.org/BigPicture/Choices
-.. _current code in the development branch: https://github.com/galaxyproject/galaxy
-.. _readthedocs: http://galaxy.readthedocs.org
-.. _project home page: http://galaxyproject.org
+For more information on the Galaxy Project, please visit the https://galaxyproject.org
-Contents
-========
+* :ref:`release-docs`
+* :ref:`admin-docs`
+* :ref:`dev-docs`
+* :ref:`about-docs`
+
+.. _release-docs:
+
.. toctree::
- :maxdepth: 5
-
- Galaxy API Documentation
-
- Tool Shed API Documentation
-
- Application Documentation
+ :maxdepth: 2
+ :caption: Release Notes
Releases
- Developer Documentation
+.. _admin-docs:
- Special topics in Administration
+.. toctree::
+ :maxdepth: 2
+ :caption: Admin Documentation
+
+ Administration
+ Special topics
+
+.. _dev-docs:
+
+.. toctree::
+ :maxdepth: 1
+ :caption: Developer Documentation
+
+ Development
+ Galaxy API
+ Tool Shed API
+ Application Documentation
+
+.. _about-docs:
+
+.. toctree::
+ :maxdepth: 2
+ :caption: About Project
Project Governance
-
Issue Management
Indices and tables
@@ -60,4 +64,4 @@ If you have your own copy of the Galaxy source code, you can also generate your
$ make -C doc/ html
-The generated documentation will be in ``doc/build/html/`` and can be viewed with a web browser. Note that you will need to install Sphinx and a fair number of module dependencies before this will produce output.
+The generated documentation will be in ``doc/build/html/`` and can be viewed with a web browser. Note that you will need to install Sphinx and a fair number of module dependencies before this will produce output.
\ No newline at end of file
diff --git a/doc/source/project/issues.rst b/doc/source/project/issues.rst
index cdee91d87e6..e1bc602605a 100644
--- a/doc/source/project/issues.rst
+++ b/doc/source/project/issues.rst
@@ -9,6 +9,12 @@ guidelines for longer term planning for various Galaxy related projects.
Some inspiration taken from the way the
`Docker `__ project labels issues.
+Issue Reporting
+===============
+
+Issues (bugs, feature requests, etc.) should be reported at `GitHub issues`_, and
+handling of issues follows the procedures described in the `issues document`_.
+
Milestones
==========
@@ -232,3 +238,5 @@ For now, we will rely on a few simple automation rules:
``triage`` to indicate that they require attention prior to merge.
.. _ORGANIZATION: https://github.com/galaxyproject/galaxy/blob/dev/doc/source/project/organization.rst
+.. _issues document: https://github.com/galaxyproject/galaxy/blob/dev/doc/source/project/issues.rst
+.. _Github issues: https://github.com/galaxyproject/galaxy/issues/
diff --git a/doc/source/releases/17.01_announce.rst b/doc/source/releases/17.01_announce.rst
index 97ae359e2a9..199dbbd68f4 100644
--- a/doc/source/releases/17.01_announce.rst
+++ b/doc/source/releases/17.01_announce.rst
@@ -29,15 +29,17 @@ Highlights
Thanks to `@abretaud `__, `@ashvark `__, `@jvolkening `__, and `@mvdbeek `__.
Implemented in `Pull Request 3145`_, `PullRequest 3510`_ and `PullRequest 3514`_.
-`Github `__
-===========================================================
+Get Galaxy
+==========
-New Galaxy repository
+The code lives at `Github `__ and you should have `Git `__ to obtain it.
+
+To get a new Galaxy repository run:
.. code-block:: shell
$ git clone -b release_17.01 https://github.com/galaxyproject/galaxy.git
-Update of existing Galaxy repository
+To update an existing Galaxy repository run:
.. code-block:: shell
$ git checkout release_17.01 && git pull --ff-only origin release_17.01
diff --git a/lib/galaxy/app.py b/lib/galaxy/app.py
index d5f73b9ad17..bad054e29d3 100644
--- a/lib/galaxy/app.py
+++ b/lib/galaxy/app.py
@@ -23,9 +23,9 @@ from galaxy.openid.providers import OpenIDProviders
from galaxy.tools.data_manager.manager import DataManagers
from galaxy.jobs import metrics as job_metrics
from galaxy.web.proxy import ProxyManager
+from galaxy.web.stack import application_stack_instance
from galaxy.queue_worker import GalaxyQueueWorker
from galaxy.util import heartbeat
-from galaxy.util.postfork import register_postfork_function
from tool_shed.galaxy_install import update_repository_manager
@@ -44,6 +44,7 @@ class UniverseApplication( object, config.ConfiguresGalaxyMixin ):
log.debug( "python path is: %s", ", ".join( sys.path ) )
self.name = 'galaxy'
self.new_installation = False
+ self.application_stack = application_stack_instance()
# Read config file and check for errors
self.config = config.Configuration( **kwargs )
self.config.check()
@@ -151,7 +152,7 @@ class UniverseApplication( object, config.ConfiguresGalaxyMixin ):
fname=self.config.heartbeat_log
)
self.heartbeat.daemon = True
- register_postfork_function(self.heartbeat.start)
+ self.application_stack.register_postfork_function(self.heartbeat.start)
self.sentry_client = None
if self.config.sentry_dsn:
@@ -159,7 +160,7 @@ class UniverseApplication( object, config.ConfiguresGalaxyMixin ):
import raven
self.sentry_client = raven.Client(self.config.sentry_dsn)
- register_postfork_function(postfork_sentry_client)
+ self.application_stack.register_postfork_function(postfork_sentry_client)
# Transfer manager client
if self.config.get_bool( 'enable_beta_job_managers', False ):
diff --git a/lib/galaxy/auth/providers/ldap_ad.py b/lib/galaxy/auth/providers/ldap_ad.py
index 69ffa9cab79..e1ac031c5f1 100644
--- a/lib/galaxy/auth/providers/ldap_ad.py
+++ b/lib/galaxy/auth/providers/ldap_ad.py
@@ -15,7 +15,7 @@ log = logging.getLogger(__name__)
def _get_subs(d, k, params):
- if k not in d:
+ if k not in d or not d[k]:
raise ConfigurationError("Missing '%s' parameter in LDAP options" % k)
return str(d[k]).format(**params)
@@ -25,17 +25,17 @@ def _parse_ldap_options(ldap, options_unparsed):
if not options_unparsed:
return []
- if "=" not in options_unparsed:
- log.error("LDAP authenticate: Invalid syntax in . Syntax should be option1=value1,option2=value2")
- return []
-
ldap_options = []
# Valid options must start with this prefix. See help(ldap)
prefix = "OPT_"
for opt in options_unparsed.split(","):
- key, value = opt.split("=")
+ try:
+ key, value = opt.split("=")
+ except ValueError:
+ log.warning("LDAP authenticate: Invalid syntax '%s' inside element. Syntax should be option1=value1,option2=value2" % opt)
+ continue
try:
pair = []
@@ -109,14 +109,18 @@ class LDAP(AuthProvider):
else:
ldap_options = _parse_ldap_options(ldap, ldap_options_raw)
+ try:
+ # setup connection
+ ldap.set_option(ldap.OPT_REFERRALS, 0)
+
+ for opt in ldap_options:
+ ldap.set_option(*opt)
+ except Exception:
+ log.exception('LDAP authenticate: set_option exception')
+ return (failure_mode, '', '')
+
if 'search-fields' in options:
try:
- # setup connection
- ldap.set_option(ldap.OPT_REFERRALS, 0)
-
- for opt in ldap_options:
- ldap.set_option(*opt)
-
l = ldap.initialize(_get_subs(options, 'server', params))
l.protocol_version = 3
@@ -155,17 +159,9 @@ class LDAP(AuthProvider):
# bind as user to check their credentials
try:
- # setup connection
- ldap.set_option(ldap.OPT_REFERRALS, 0)
-
- for opt in ldap_options:
- ldap.set_option(*opt)
-
l = ldap.initialize(_get_subs(options, 'server', params))
l.protocol_version = 3
bind_password = _get_subs(options, 'bind-password', params)
- if not bind_password:
- raise RuntimeError('LDAP authenticate: empty password')
l.simple_bind_s(_get_subs(
options, 'bind-user', params), bind_password)
try:
diff --git a/lib/galaxy/config.py b/lib/galaxy/config.py
index 94d9dc6ca4e..0c0fb50bdc8 100644
--- a/lib/galaxy/config.py
+++ b/lib/galaxy/config.py
@@ -25,8 +25,8 @@ from galaxy.exceptions import ConfigurationError
from galaxy.util import listify
from galaxy.util import string_as_bool
from galaxy.util.dbkeys import GenomeBuilds
-from galaxy.util.postfork import register_postfork_function
from galaxy.web.formatting import expand_pretty_datetime_format
+from galaxy.web.stack import register_postfork_function
from .version import VERSION_MAJOR
log = logging.getLogger( __name__ )
@@ -52,6 +52,7 @@ PATH_DEFAULTS = dict(
workflow_schedulers_config_file=['config/workflow_schedulers_conf.xml', 'config/workflow_schedulers_conf.xml.sample'],
modules_mapping_files=['config/environment_modules_mapping.yml', 'config/environment_modules_mapping.yml.sample'],
local_conda_mapping_file=['config/local_conda_mapping.yml', 'config/local_conda_mapping.yml.sample'],
+ swarm_manager_config_file=['config/swarm_manager_conf.yml', 'config/swarm_manager_conf.yml.sample'],
)
PATH_LIST_DEFAULTS = dict(
@@ -577,6 +578,8 @@ class Configuration( object ):
elif ie_dirs:
self.visualization_plugins_directory += ",%s" % ie_dirs
+ self.gie_swarm_mode = string_as_bool( kwargs.get( 'interactive_environment_swarm_mode', False ) )
+
self.proxy_session_map = self.resolve_path( kwargs.get( "dynamic_proxy_session_map", "database/session_map.sqlite" ) )
self.manage_dynamic_proxy = string_as_bool( kwargs.get( "dynamic_proxy_manage", "True" ) ) # Set to false if being launched externally
self.dynamic_proxy_debug = string_as_bool( kwargs.get( "dynamic_proxy_debug", "False" ) )
@@ -901,34 +904,25 @@ class ConfiguresGalaxyMixin:
time.sleep(1)
- def reload_toolbox(self):
- # Initialize the tools, making sure the list of tool configs includes the reserved migrated_tools_conf.xml file.
-
- tool_configs = self.config.tool_configs
- if self.config.migrated_tools_config not in tool_configs:
- tool_configs.append( self.config.migrated_tools_config )
-
- from galaxy import tools
- old_toolbox = self.toolbox
- self.toolbox = tools.ToolBox( tool_configs, self.config.tool_path, self )
- self.reindex_tool_search()
- if old_toolbox:
- old_toolbox.shutdown()
-
def _configure_toolbox( self ):
+ from galaxy import tools
from galaxy.managers.citations import CitationsManager
- self.citations_manager = CitationsManager( self )
-
+ from galaxy.tools.deps import containers
from galaxy.tools.toolbox.cache import ToolCache
from galaxy.tools.toolbox.lineages.tool_shed import ToolVersionCache
+
+ self.citations_manager = CitationsManager( self )
self.tool_cache = ToolCache()
self.tool_version_cache = ToolVersionCache(self)
self._toolbox_lock = threading.RLock()
- self.toolbox = None
- self.reload_toolbox()
+ # Initialize the tools, making sure the list of tool configs includes the reserved migrated_tools_conf.xml file.
+ tool_configs = self.config.tool_configs
+ if self.config.migrated_tools_config not in tool_configs:
+ tool_configs.append( self.config.migrated_tools_config )
+ self.toolbox = tools.ToolBox( tool_configs, self.config.tool_path, self )
+ self.reindex_tool_search()
- from galaxy.tools.deps import containers
galaxy_root_dir = os.path.abspath(self.config.root)
file_path = os.path.abspath(getattr(self.config, "file_path"))
app_info = containers.AppInfo(
diff --git a/lib/galaxy/tags/tag_handler.py b/lib/galaxy/container/__init__.py
similarity index 100%
rename from lib/galaxy/tags/tag_handler.py
rename to lib/galaxy/container/__init__.py
diff --git a/lib/galaxy/container/docker_swarm.py b/lib/galaxy/container/docker_swarm.py
new file mode 100644
index 00000000000..b7b67de6e09
--- /dev/null
+++ b/lib/galaxy/container/docker_swarm.py
@@ -0,0 +1,552 @@
+"""
+Docker Swarm mode management
+"""
+import argparse
+import errno
+import json
+import logging
+import os
+import subprocess
+import sys
+import time
+
+try:
+ import daemon
+ import daemon.pidfile
+ import lockfile
+except ImportError:
+ daemon = None
+import yaml
+
+try:
+ import galaxy # noqa: F401 this is a test import
+except ImportError:
+ sys.path.insert(0, os.path.abspath(os.path.join(
+ os.path.dirname(__file__),
+ os.pardir,
+ os.pardir)))
+
+from galaxy.config import (
+ configure_logging,
+ find_path,
+ find_root,
+)
+from galaxy.util.properties import find_config_file, load_app_properties
+
+
+DESCRIPTION = "Daemon to manage a Docker Swarm (running in Docker Swarm mode)."
+SWARM_MANAGER_CONF_DEFAULTS = {
+ 'pid_file': '{xdg_data_home}/galaxy_swarm_manager.pid',
+ 'log_file': '{xdg_data_home}/galaxy_swarm_manager.log',
+ 'command': 'docker {docker_args}',
+ 'service_prefix': 'galaxy_gie_',
+ 'max_waiting_services': 0,
+ 'max_wait_time': 5,
+ 'max_node_counts': {}, # max number of nodes per class to spawn
+ 'max_node_idle_time': 120,
+ 'node_prefix': None,
+ 'spawn_wait_time': 30,
+ 'spawn_command': '/bin/true',
+ 'destroy_command': '/bin/true',
+ 'command_failure_command': '/bin/true',
+ 'command_retries': 0,
+ 'command_retry_wait': 10,
+ 'terminate_when_idle': True,
+}
+OK_NODE_STATE = 'ready-active'
+NODE_CPU_CLASS_LABEL = '_galaxy_cpu_class'
+log = lambda *x: None # noqa: E731
+
+
+# TODO: pass around instances or at least namedtuples rather than these
+# arbitrary dictionaries
+
+
+class DockerInterface(object):
+
+ def __init__(self, swarm_manager_conf):
+ self.swarm_manager_conf = swarm_manager_conf
+ self.command = swarm_manager_conf['command']
+ self.service_prefix = swarm_manager_conf['service_prefix']
+
+ def _run_docker(self, docker_args):
+ raw_cmd = self.command.format(docker_args=docker_args)
+ p = subprocess.Popen(raw_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True, shell=True)
+ stdout, stderr = p.communicate()
+ if p.returncode != 0:
+ log.error("%s\n%s" % (stdout, stderr))
+ return None
+ else:
+ return stdout
+
+ def _parse_docker_column_output(self, output):
+ """Many docker commands do not provide an option to format the output
+ or output in a machine-readily-parseable format (e.g. json). In order
+ to deal with such output and hopefully stay compatible with future
+ column order changes, key returned rows based on column headers.
+
+ An assumption is made that a single space in the header row does not
+ separate columns - column names can have spaces in them, and columns
+ are separated by at least 2 spaces. This seems to be true as of Docker
+ 1.13.1.
+ """
+ parsed = []
+ output = output.splitlines()
+ header = output[0]
+ colstarts = [0]
+ colidx = 0
+ spacect = 0
+ if not output:
+ return parsed
+ for i, c in enumerate(header):
+ if c != ' ' and spacect > 1:
+ colidx += 1
+ colstarts.append(i)
+ spacect = 0
+ elif c == ' ':
+ spacect += 1
+ colstarts.append(None)
+ colheadings = []
+ for i in range(0, len(colstarts) - 1):
+ colheadings.append(header[colstarts[i]:colstarts[i + 1]].strip())
+ for line in output[1:]:
+ row = {}
+ for i, key in enumerate(colheadings):
+ row[key] = line[colstarts[i]:colstarts[i + 1]].strip()
+ parsed.append(row)
+ return parsed
+
+ def _service_inspect(self, service_id):
+ return self._run_docker(docker_args='service inspect {service_id}'.format(service_id=service_id))
+
+ def _get_reserved_cpu_count(self, service_id=None, inspect_output=None):
+ assert service_id or inspect_output, "Either `service_id` or `inspect_output` is required"
+ if not inspect_output:
+ inspect_output = self._service_inspect(service_id)
+ try:
+ return json.loads(inspect_output)[0]['Spec']['Resources']['Reservations']['NanoCPUs'] / 1000000000
+ except KeyError:
+ return 1
+
+ def _node_inspect(self, node_name):
+ return self._run_docker(docker_args='node inspect {node_name}'.format(node_name=node_name))
+
+ def _get_node_cpu_class(self, node_name=None, inspect_output=None):
+ assert node_name or inspect_output, "Either `node_name` or `inspect_output` is required"
+ if not inspect_output:
+ inspect_output = self._node_inspect(node_name)
+ try:
+ return json.loads(inspect_output)[0]['Spec']['Labels'][NODE_CPU_CLASS_LABEL]
+ except KeyError:
+ return None
+
+ def waiting_services_by_cpu_class(self):
+ rval = {}
+ service_ids = self._services_in_state('Running', 'Pending')
+ for service_id in service_ids:
+ cpu_class = self._get_reserved_cpu_count(service_id=service_id)
+ if cpu_class not in rval:
+ rval[cpu_class] = []
+ rval[cpu_class].append(service_id)
+ return rval
+
+ def active_nodes_by_cpu_class(self):
+ rval = {}
+ ls_output = self._run_docker(docker_args='node ls')
+ for node in self._parse_docker_column_output(ls_output):
+ cpu_class = self._get_node_cpu_class(node_name=node['HOSTNAME'])
+ if cpu_class:
+ cpu_class = int(cpu_class)
+ rval[cpu_class] = rval.get(cpu_class, 0) + 1
+ return rval
+
+ def completed_services(self):
+ return self._services_in_state('Shutdown', 'Complete')
+
+ def _services_in_state(self, desired, current):
+ service_ids = []
+ for service_detail in self._service_details():
+ if service_detail['DESIRED STATE'] == desired and service_detail['CURRENT STATE'].startswith(current):
+ service_ids.append(service_detail['ID'])
+ return service_ids
+
+ def _service_details(self):
+ ls_output = self._run_docker(docker_args='service ls')
+ for service in self._parse_docker_column_output(ls_output):
+ if not service['NAME'].startswith(self.service_prefix):
+ continue
+ ps_output = self._run_docker(docker_args='service ps --no-trunc {service_id}'.format(
+ service_id=service['ID']))
+ service_details = self._parse_docker_column_output(ps_output)[0]
+ for col in ('ID', 'NAME'):
+ service_details['PROCESS ' + col] = service_details[col]
+ service_details[col] = service[col]
+ yield service_details
+
+ def clean_services(self):
+ cleaned_services = []
+ services = self.completed_services()
+ if services:
+ cleaned_services = self._run_docker(docker_args='service rm {service_ids}'.format(
+ service_ids=' '.join(services))).splitlines()
+ return cleaned_services
+
+ def node_states(self):
+ nodes = {}
+ ls_output = self._run_docker(docker_args='node ls')
+ for node in self._parse_docker_column_output(ls_output):
+ nodes[node['HOSTNAME']] = {
+ 'state': ('%s-%s' % (node['STATUS'], node['AVAILABILITY'])).lower(),
+ 'manager': True if node['MANAGER STATUS'] else False,
+ }
+ return nodes
+
+ def node_job_count(self, node_name):
+ ps_output = self._run_docker(docker_args='node ps --no-trunc {node_name}'.format(
+ node_name=node_name))
+ jobs = filter(lambda x: x['NAME'].startswith(self.service_prefix), self._parse_docker_column_output(ps_output))
+ return len(jobs)
+
+ def ensure_node_cpu_class(self, node, cpu_class):
+ cur_cpu_class = self._get_node_cpu_class(node_name=node)
+ if str(cpu_class) != cur_cpu_class:
+ log.info("setting node '%s' cpu class from '%s' to '%s'", node, cur_cpu_class, cpu_class)
+ self._run_docker(docker_args='node update --label-add {label_name}={label_val} {node}'.format(
+ label_name=NODE_CPU_CLASS_LABEL,
+ label_val=cpu_class,
+ node=node))
+ else:
+ log.debug("node '%s' cpu class is '%s'", node, cur_cpu_class)
+
+ def node_cpu_class(self, node):
+ return self._get_node_cpu_class(node_name=node)
+
+
+class SwarmManager(object):
+
+ def __init__(self, conf):
+ self.conf = conf
+ self.docker_interface = DockerInterface(conf)
+ self.state = SwarmState(conf)
+ self.spawn_wait_time = conf['spawn_wait_time']
+ self.spawn_command = conf['spawn_command']
+ self.destroy_command = conf['destroy_command']
+ self.command_retries = conf['command_retries']
+ self.command_retry_wait = conf['command_retry_wait']
+ self.node_prefix = conf['node_prefix']
+ self.terminate_when_idle = conf['terminate_when_idle']
+
+ def run(self):
+ while True:
+ node_states = None
+ self._spawn_if_waiting()
+ self._check_for_new_nodes(node_states=node_states)
+ self._destroy_if_surplus(node_states=node_states)
+ self._clean_services()
+ self._terminate_if_idle()
+ time.sleep(1)
+
+ def _run_command(self, command, command_retries=None, **kwargs):
+ stdout = None
+ attempt = 0
+ if not command_retries:
+ command_retries = self.command_retries
+ raw_cmd = command.format(**kwargs)
+ log.debug('running command: %s', raw_cmd)
+ while not stdout and attempt < command_retries + 1:
+ attempt += 1
+ p = subprocess.Popen(raw_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True, shell=True)
+ stdout, stderr = p.communicate()
+ if p.returncode != 0:
+ msg = "error running '%s'" % raw_cmd
+ if attempt < command_retries + 1:
+ msg += ', waiting %s seconds' % self.command_retry_wait
+ time.sleep(self.command_retry_wait)
+ log.warning(msg + "\nstdout: %s\nstderr: %s\n", stdout, stderr)
+ else:
+ msg += ' (final attempt)'
+ log.error(msg + "\nstdout: %s\nstderr: %s\n", stdout, stderr)
+ self._run_command(self.conf['command_failure_command'].format(failed_command=raw_cmd), command_retries=0)
+ stdout = None
+ else:
+ stdout = stdout.strip()
+ return stdout
+
+ def _spawn_if_waiting(self):
+ waiting = self.docker_interface.waiting_services_by_cpu_class()
+ active = self.docker_interface.active_nodes_by_cpu_class()
+ cpus_needed = self.state.need_nodes(waiting, active)
+ for cpu_class in cpus_needed.keys():
+ log.info("requesting node(s) for services requesting %d CPUs total (%d CPUs each): %s", cpus_needed[cpu_class], cpu_class, ' '.join(waiting[cpu_class]))
+ command = '{spawn_command}'.format(spawn_command=self.spawn_command).format(
+ cpu_class=cpu_class,
+ cpus_needed=cpus_needed[cpu_class])
+ new_nodes = self._run_command(command)
+ if not new_nodes:
+ log.warning('spawn_command returned no new nodes, cannot manage nodes')
+ else:
+ log.info("node allocator will spawn: %s", new_nodes)
+ self.state.nodes_requested(cpu_class, new_nodes.split(), waiting[cpu_class])
+ self.state.mark_services_handled(waiting[cpu_class])
+
+ def _check_for_new_nodes(self, node_states=None):
+ for node_name, elapsed, cpu_class, node in self.state.spawning_nodes():
+ if not node_states:
+ node_states = self.docker_interface.node_states()
+ if node_name not in node_states:
+ if elapsed > self.spawn_wait_time:
+ log.warning("spawning node '%s' not found in `docker node ls` and spawn_wait_time exceeded! %d seconds have elapsed", node_name, elapsed)
+ self._run_command(self.conf['command_failure_command'].format(failed_command='wait_for_spawning_node %s' % node_name), command_retries=0)
+ self.mark_spawning_node_timeout(node_name)
+ elif node_states[node_name]['state'] == OK_NODE_STATE:
+ self.docker_interface.ensure_node_cpu_class(node_name, cpu_class)
+ self.state.mark_spawning_node_ready(node_name)
+ log.info("spawning node '%s' is ready!", node_name)
+ elif node_states[node_name]['state'] != node['state']:
+ log.info("spawning node '%s' state changed from '%s' to '%s'", node_name, node['state'], node_states[node_name]['state'])
+ self.docker_interface.ensure_node_cpu_class(node_name, cpu_class)
+ self.state.mark_spawning_node_state(node_name, node_states[node_name]['state'])
+ elif elapsed > self.spawn_wait_time:
+ log.warning("spawning node '%s' state is '%s' after %s seconds", node_name, node_states[node_name]['state'], elapsed)
+
+ def _destroy_if_surplus(self, node_states=None):
+ destroy_nodes = []
+ if not node_states:
+ node_states = self.docker_interface.node_states()
+ for node_name, node_state in node_states.items():
+ if self._node_ready_for_destruction(node_name, node_state):
+ destroy_nodes.append(node_name)
+ if destroy_nodes:
+ command = '{destroy_command}'.format(destroy_command=self.destroy_command).format(
+ nodes=' '.join(destroy_nodes))
+ destroyed_nodes = self._run_command(command)
+ if not destroyed_nodes:
+ log.warning('destroy_command returned no destroyed nodes')
+ else:
+ log.info("destroyed nodes: %s", destroyed_nodes)
+
+ def _node_is_managed(self, node_name, node_state):
+ return (not self.node_prefix or node_name.startswith(self.node_prefix)) and not node_state['manager']
+
+ def _node_ready_for_destruction(self, node_name, node_state):
+ ready = False
+ if (self._node_is_managed(node_name, node_state) and
+ node_state['state'] == 'ready-active'):
+ if self.docker_interface.node_job_count(node_name) == 0:
+ self.state.mark_node_idle(node_name)
+ ready = self.state.is_destruction_time(node_name)
+ else:
+ self.state.clear_node_idle(node_name)
+ return ready
+
+ def _clean_services(self):
+ cleaned_services = self.docker_interface.clean_services()
+ if cleaned_services:
+ self.state.clean_services(cleaned_services)
+ log.info("cleaned services: %s", ', '.join(cleaned_services))
+
+ def _terminate_if_idle(self):
+ if not self.terminate_when_idle:
+ return
+ node_states = self.docker_interface.node_states()
+ for node_name, node_state in node_states.items():
+ if self._node_is_managed(node_name, node_state):
+ return # nonterminated managed nodes remain
+ elif self.docker_interface.node_job_count(node_name) > 0:
+ return # unmanaged nodes are running a galaxy service
+ # FIXME: there's a race condition here
+ if self.docker_interface.waiting_services_by_cpu_class():
+ return # waiting jobs remain
+ log.info('nothing to manage, shutting down')
+ sys.exit(0)
+
+
+class SwarmState(object):
+
+ def __init__(self, conf):
+ self._handled_services = set()
+ self._waiting_since = {}
+ self._spawning_nodes = {}
+ self._surplus_nodes = {}
+ self.max_waiting_services = conf['max_waiting_services']
+ self.max_wait_time = conf['max_wait_time']
+ self.max_node_idle_time = conf['max_node_idle_time']
+ self.max_node_counts = conf['max_node_counts']
+
+ def need_nodes(self, waiting_services, active_nodes):
+ rval = {}
+ need_cpus = self._needed_cpu_counts(waiting_services)
+ spawning_cpus = self._spawning_cpu_counts()
+ for cpu_class in need_cpus.keys():
+ cpus_needed = need_cpus[cpu_class] - spawning_cpus.get(cpu_class, 0)
+ if cpus_needed > 0 and active_nodes.get(cpu_class, 0) < self.max_node_counts.get(cpu_class, sys.maxint):
+ rval[cpu_class] = cpus_needed
+ return rval
+
+ def _needed_cpu_counts(self, waiting_services):
+ """Given a count of services waiting of each cpu class, return the
+ count of nodes needed of each node type if the maximum wait times and
+ waiting service count thresholds have been reached.
+ """
+ rval = {}
+ new_waiting_since = {}
+ for cpu_class in waiting_services.keys():
+ new_waiting_since[cpu_class] = self._waiting_since.get(cpu_class, time.time())
+ # filter out any services that have already been handled
+ unhandled_waiting_services = [ s for s in waiting_services[cpu_class] if s not in self._handled_services ]
+ if (len(unhandled_waiting_services) > self.max_waiting_services and
+ time.time() - new_waiting_since[cpu_class] > self.max_wait_time):
+ # need waiting[cpu_class] nodes of this class
+ rval[cpu_class] = len(unhandled_waiting_services)
+ # drop any cpu_classes from waiting_since that are no longer waiting
+ self._waiting_since = new_waiting_since
+ return rval
+
+ def spawning_nodes(self):
+ now = time.time()
+ for cpu_class in self._spawning_nodes.keys():
+ for node_name in self._spawning_nodes[cpu_class].keys():
+ node = self._spawning_nodes[cpu_class][node_name]
+ yield (node_name, now - node['time_requested'], cpu_class, node)
+
+ def _spawning_cpu_counts(self):
+ rval = {}
+ for cpu_class in self._spawning_nodes.keys():
+ rval[cpu_class] = sum([ v['cpu_count'] for k, v in self._spawning_nodes[cpu_class].items() ])
+ return rval
+
+ def nodes_requested(self, cpu_class, nodes, services):
+ if cpu_class not in self._spawning_nodes:
+ self._spawning_nodes[cpu_class] = {}
+ for node in nodes:
+ node_name = node.split(':')[0]
+ try:
+ cpu_count = node.split(':')[1]
+ except IndexError:
+ cpu_count = cpu_class
+ self._spawning_nodes[cpu_class][node_name] = {
+ 'state': 'requested',
+ 'cpu_count': cpu_count,
+ 'time_requested': time.time(),
+ }
+
+ def mark_services_handled(self, services):
+ self._handled_services.update(services)
+
+ def mark_spawning_node_ready(self, node_name):
+ self._delete_spawning_node(node_name)
+
+ def mark_spawning_node_timeout(self, node_name):
+ self._delete_spawning_node(node_name)
+
+ def _delete_spawning_node(self, node_name):
+ for cpu_class in self._spawning_nodes.keys():
+ if node_name in self._spawning_nodes[cpu_class]:
+ del self._spawning_nodes[cpu_class][node_name]
+
+ def mark_spawning_node_state(self, node_name, state):
+ for cpu_class in self._spawning_nodes.keys():
+ if node_name in self._spawning_nodes[cpu_class]:
+ self._spawning_nodes[cpu_class][node_name]['state'] = state
+
+ def is_destruction_time(self, node_name):
+ now = time.time()
+ return now - self._surplus_nodes.get(node_name, now) > self.max_node_idle_time
+
+ def mark_node_idle(self, node_name):
+ if node_name not in self._surplus_nodes:
+ self._surplus_nodes[node_name] = time.time()
+
+ def clear_node_idle(self, node_name):
+ if node_name in self._surplus_nodes:
+ del self._surplus_nodes[node_name]
+
+ def clean_services(self, services):
+ self._handled_services.difference_update(services)
+
+
+def main(argv=None, fork=False):
+ if not daemon:
+ log.warning('The daemon module is required to use the swarm manager, install it with `pip install python-daemon`')
+ return
+ if argv is None:
+ argv = sys.argv[1:]
+ if fork:
+ p = subprocess.Popen([sys.executable, __file__] + argv)
+ p.wait()
+ else:
+ args = _arg_parser().parse_args(argv)
+ kwargs = _app_properties(args)
+ _run_swarm_manager(kwargs, args)
+
+
+def _app_properties(args):
+ galaxy_config_file = find_config_file("config/galaxy.ini", "universe_wsgi.ini", args.galaxy_config_file)
+ app_properties = load_app_properties(ini_file=galaxy_config_file)
+ return app_properties
+
+
+def _arg_parser():
+ parser = argparse.ArgumentParser(description=DESCRIPTION)
+ parser.add_argument("-c", "--galaxy-config-file", default=None)
+ return parser
+
+
+def _run_swarm_manager(kwargs, args):
+ configure_logging(kwargs)
+ global log
+ log = logging.getLogger(__name__)
+
+ root = find_root(kwargs)
+ swarm_manager_config_file = find_path(kwargs, "swarm_manager_config_file", root)
+ swarm_manager_conf = _parse_swarm_manager_conf(swarm_manager_config_file)
+ try:
+ os.makedirs(os.path.dirname(swarm_manager_conf['pid_file']))
+ except (IOError, OSError) as exc:
+ if exc.errno != errno.EEXIST:
+ raise
+ log.debug("daemonizing, logs will be written to '%s'", swarm_manager_conf['log_file'])
+ pidfile = daemon.pidfile.PIDLockFile(swarm_manager_conf['pid_file'])
+ with open(swarm_manager_conf['log_file'], 'a') as logfh:
+ try:
+ with daemon.DaemonContext(
+ pidfile=pidfile,
+ stdout=logfh,
+ stderr=logfh,
+ ):
+ _swarm_manager(swarm_manager_conf)
+ except lockfile.AlreadyLocked:
+ log.debug("attempt to daemonize with swarm manager already running ignored")
+
+
+def _load_xdg_environment():
+ return dict(
+ data_home=os.path.expanduser(os.environ.get('XDG_DATA_HOME', '~/.local/share')),
+ )
+
+
+def _parse_swarm_manager_conf(swarm_manager_config_file):
+ conf = SWARM_MANAGER_CONF_DEFAULTS.copy()
+ xdg_env = _load_xdg_environment()
+ try:
+ with open(swarm_manager_config_file) as fh:
+ conf.update(yaml.load(fh))
+ except (OSError, IOError) as exc:
+ if exc.errno == errno.ENOENT:
+ log.warning("config file '%s' does not exist, running with default config", swarm_manager_config_file)
+ else:
+ raise
+ for opt in ('pid_file', 'log_file'):
+ conf[opt] = conf[opt].format(xdg_data_home=xdg_env['data_home'])
+ return conf
+
+
+def _swarm_manager(conf):
+ swarm_manager = SwarmManager(conf)
+ log.debug("swarm manager loaded, running...")
+ swarm_manager.run()
+
+
+if __name__ == '__main__':
+ __name__ = 'swarm_manager'
+ main()
diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py
index 161d25a854a..1bfd667ca04 100644
--- a/lib/galaxy/datatypes/binary.py
+++ b/lib/galaxy/datatypes/binary.py
@@ -1148,7 +1148,7 @@ Binary.register_sniffable_binary_format('sra', 'sra', Sra)
class RData( Binary ):
"""Generic R Data file datatype implementation"""
- file_ext = 'RData'
+ file_ext = 'rdata'
def sniff( self, filename ):
rdata_header = b'RDX2\nX\n'
diff --git a/lib/galaxy/datatypes/mothur.py b/lib/galaxy/datatypes/mothur.py
index 21d67d79446..4df70361da1 100644
--- a/lib/galaxy/datatypes/mothur.py
+++ b/lib/galaxy/datatypes/mothur.py
@@ -270,7 +270,8 @@ class AlignCheck(Tabular):
dataset.metadata.column_names = self.column_names
dataset.metadata.column_types = self.column_types
dataset.metadata.comment_lines = self.comment_lines
- dataset.metadata.data_lines -= self.comment_lines
+ if isinstance(dataset.metadata.data_lines, int):
+ dataset.metadata.data_lines -= self.comment_lines
class AlignReport(Tabular):
@@ -735,7 +736,8 @@ class CountTable(Tabular):
dataset.metadata.groups = colnames[2:]
dataset.metadata.comment_lines = 1
- dataset.metadata.data_lines -= 1
+ if isinstance(dataset.metadata.data_lines, int):
+ dataset.metadata.data_lines -= 1
class RefTaxonomy(Tabular):
diff --git a/lib/galaxy/datatypes/proteomics.py b/lib/galaxy/datatypes/proteomics.py
index 2bf02043848..de6229b81f9 100644
--- a/lib/galaxy/datatypes/proteomics.py
+++ b/lib/galaxy/datatypes/proteomics.py
@@ -152,6 +152,14 @@ class MzXML(ProteomicsXml):
root = "mzXML"
+class MzData(ProteomicsXml):
+ """mzData data"""
+ edam_format = "format_3245"
+ file_ext = "mzdata"
+ blurb = "mzData Mass Spectrometry data"
+ root = "mzData"
+
+
class MzIdentML(ProteomicsXml):
edam_format = "format_3247"
file_ext = "mzid"
diff --git a/lib/galaxy/datatypes/text.py b/lib/galaxy/datatypes/text.py
index ec55ea4cded..9399c026f43 100644
--- a/lib/galaxy/datatypes/text.py
+++ b/lib/galaxy/datatypes/text.py
@@ -605,3 +605,50 @@ class Smat(Text):
if re.match(r"[-+]?\d+$", item) is None:
return False
return True
+
+
+class PlantTribesOrtho(Html):
+ """
+ PlantTribes sequences classified into precomputed, orthologous gene family
+ clusters.
+ """
+ file_ext = "ptortho"
+
+ def set_peek(self, dataset, is_multi_byte=False):
+ super(PlantTribesOrtho, self).set_peek(dataset, is_multi_byte=is_multi_byte)
+ dataset.blurb = "PlantTribes gene family clusters: %d files" % dataset.metadata.data_lines
+
+
+class PlantTribesOrthoCodingSequence(Html):
+ """
+ PlantTribes sequences classified into precomputed, orthologous gene family
+ clusters and corresponding coding sequences.
+ """
+ file_ext = "ptorthocs"
+
+ def set_peek(self, dataset, is_multi_byte=False):
+ super(PlantTribesOrthoCodingSequence, self).set_peek(dataset, is_multi_byte=is_multi_byte)
+ dataset.blurb = "PlantTribes gene family clusters with corresponding coding sequences: %d files" % dataset.metadata.data_lines
+
+
+class PlantTribesPhylogeneticTree(Html):
+ """
+ PlantTribes multiple sequence alignments and inferred maximum likelihood
+ phylogenies for orthogroups.
+ """
+ file_ext = "pttree"
+
+ def set_peek(self, dataset, is_multi_byte=False):
+ super(PlantTribesPhylogeneticTree, self).set_peek(dataset, is_multi_byte=is_multi_byte)
+ dataset.blurb = "PlantTribes phylogenetic trees: %d files" % dataset.metadata.data_lines
+
+
+class PlantTribesMultipleSequenceAlignment(Html):
+ """
+ PlantTribes multiple sequence alignments for orthogroups.
+ """
+ file_ext = "ptalign"
+
+ def set_peek(self, dataset, is_multi_byte=False):
+ super(PlantTribesMultipleSequenceAlignment, self).set_peek(dataset, is_multi_byte=is_multi_byte)
+ dataset.blurb = "PlantTribes multiple sequence alignments: %d files" % dataset.metadata.data_lines
diff --git a/lib/galaxy/dependencies/pinned-hashed-requirements.txt b/lib/galaxy/dependencies/pinned-hashed-requirements.txt
index aa60153df4a..6aff369d73c 100644
--- a/lib/galaxy/dependencies/pinned-hashed-requirements.txt
+++ b/lib/galaxy/dependencies/pinned-hashed-requirements.txt
@@ -86,7 +86,7 @@ PasteDeploy==1.5.2 --hash:sha256=3922127d3acc6e274a800978b9293c874b3ef4ac2eb8bf4
docutils==0.12 --hash:sha256=732dfc2d706ea390c264bc69110d3d6c7c3a520628a052ccc5998466f95d5c29
wchartype==0.1 --hash:sha256=2932471fe3a4e5cac4539c1b49bbc2bbd24ec3f00532c7f27c80b7756fdc177d
repoze.lru==0.6 --hash:sha256=731cc0b0a184c9fd270a4f29d9635099bb0398823e9a1a39bf4f488d1ead57b3
-Routes==2.2 --hash:sha256=1d61dc9f1bbd86504de221568743133fbdfeb70f11cee4222cef72aa108e834c
+Routes==2.4.1 --hash:sha256=cc3a4b9a34bfe6b64b1d10d18b845bb2b6cb3ee1fbf6107295dfafe629bb84aa
WebOb==1.4.1 --hash:sha256=dc3c45ac0b56a3c65f47f1da6c23760dfe0139e8a84caaf1cfc9276b3e10875a
WebHelpers==1.3 --hash:sha256=8969ec3fb851872096067a805d512c3bed1952e6fc66f1ef1d1c6a7470937688
Mako==1.0.2 --hash:sha256=d3f372cbc2e7de080b5f7056d160f3ac8279353a2ea8f1ef8fd5b0cf0a6a3b17
diff --git a/lib/galaxy/dependencies/pinned-requirements.txt b/lib/galaxy/dependencies/pinned-requirements.txt
index 4c253a47a3d..17a2bb1138a 100644
--- a/lib/galaxy/dependencies/pinned-requirements.txt
+++ b/lib/galaxy/dependencies/pinned-requirements.txt
@@ -17,7 +17,7 @@ PasteDeploy==1.5.2
docutils==0.12
wchartype==0.1
repoze.lru==0.6
-Routes==2.2
+Routes==2.4.1
WebOb==1.4.1
WebHelpers==1.3
Mako==1.0.2
diff --git a/lib/galaxy/jobs/__init__.py b/lib/galaxy/jobs/__init__.py
index d04ac6acc55..56298a3ed6f 100644
--- a/lib/galaxy/jobs/__init__.py
+++ b/lib/galaxy/jobs/__init__.py
@@ -1322,6 +1322,12 @@ class JobWrapper( object, HasResourceParameters ):
dataset.info = dataset.info.rstrip() + "\n" + context['stderr'].strip()
dataset.tool_version = self.version_string
dataset.set_size()
+ if 'uuid' in context:
+ dataset.dataset.uuid = context['uuid']
+ # Update (non-library) job output datasets through the object store
+ if dataset not in job.output_library_datasets:
+ self.app.object_store.update_from_file(dataset.dataset, create=True)
+ self._collect_extra_files(dataset.dataset, self.working_directory)
# Handle composite datatypes of auto_primary_file type
if dataset.datatype.composite_type == 'auto_primary_file' and not dataset.has_data():
try:
@@ -1332,12 +1338,6 @@ class JobWrapper( object, HasResourceParameters ):
dataset.set_size()
except Exception as e:
log.warning( 'Unable to generate primary composite file automatically for %s: %s', dataset.dataset.id, e )
- if 'uuid' in context:
- dataset.dataset.uuid = context['uuid']
- # Update (non-library) job output datasets through the object store
- if dataset not in job.output_library_datasets:
- self.app.object_store.update_from_file(dataset.dataset, create=True)
- self._collect_extra_files(dataset.dataset, self.working_directory)
if job.states.ERROR == final_job_state:
dataset.blurb = "error"
dataset.mark_unhidden()
diff --git a/lib/galaxy/jobs/runners/__init__.py b/lib/galaxy/jobs/runners/__init__.py
index ba186503144..1ea944d17c9 100644
--- a/lib/galaxy/jobs/runners/__init__.py
+++ b/lib/galaxy/jobs/runners/__init__.py
@@ -404,6 +404,8 @@ class JobState( object ):
self.job_wrapper = job_wrapper
self.job_destination = job_destination
+ self.cleanup_file_attributes = [ 'job_file', 'output_file', 'error_file', 'exit_code_file' ]
+
def set_defaults( self, files_dir ):
if self.job_wrapper is not None:
id_tag = self.job_wrapper.get_id_tag()
@@ -427,6 +429,19 @@ class JobState( object ):
def default_exit_code_file( files_dir, id_tag ):
return os.path.join( files_dir, 'galaxy_%s.ec' % id_tag )
+ def cleanup( self ):
+ for file in [ getattr( self, a ) for a in self.cleanup_file_attributes if hasattr( self, a ) ]:
+ try:
+ os.unlink( file )
+ except Exception as e:
+ # TODO: Move this prefix stuff to a method so we don't have dispatch on attributes we may or may
+ # not have.
+ if not hasattr( self, "job_id" ):
+ prefix = "(%s)" % self.job_wrapper.get_id_tag()
+ else:
+ prefix = "(%s/%s)" % ( self.job_wrapper.get_id_tag(), self.job_id )
+ log.debug( "%s Unable to cleanup %s: %s" % (prefix, file, str( e ) ) )
+
class AsynchronousJobState( JobState ):
"""
@@ -453,8 +468,6 @@ class AsynchronousJobState( JobState ):
self.set_defaults( files_dir )
- self.cleanup_file_attributes = [ 'job_file', 'output_file', 'error_file', 'exit_code_file' ]
-
@property
def running( self ):
return self._running
@@ -482,13 +495,6 @@ class AsynchronousJobState( JobState ):
return True
return False
- def cleanup( self ):
- for file in [ getattr( self, a ) for a in self.cleanup_file_attributes if hasattr( self, a ) ]:
- try:
- os.unlink( file )
- except Exception as e:
- log.debug( "(%s/%s) Unable to cleanup %s: %s" % ( self.job_wrapper.get_id_tag(), self.job_id, file, str( e ) ) )
-
def register_cleanup_file_attribute( self, attribute ):
if attribute not in self.cleanup_file_attributes:
self.cleanup_file_attributes.append( attribute )
diff --git a/lib/galaxy/managers/hdas.py b/lib/galaxy/managers/hdas.py
index 1616756db66..9ccf9880a28 100644
--- a/lib/galaxy/managers/hdas.py
+++ b/lib/galaxy/managers/hdas.py
@@ -254,13 +254,18 @@ class HDASerializer( # datasets._UnflattenedMetadataDatasetAssociationSerialize
'id',
'type_id',
'name',
- 'history_id', 'hid',
+ 'history_id',
+ 'hid',
'history_content_type',
'dataset_id',
- 'state', 'extension',
+ 'state',
+ 'extension',
'deleted', 'purged', 'visible',
- 'type', 'url',
- 'create_time', 'update_time',
+ 'nametags',
+ 'type',
+ 'url',
+ 'create_time',
+ 'update_time',
])
self.add_view( 'detailed', [
'model_class',
@@ -281,6 +286,7 @@ class HDASerializer( # datasets._UnflattenedMetadataDatasetAssociationSerialize
'creating_job',
'rerunnable',
+ 'tags',
'uuid',
'permissions',
'file_name',
@@ -292,7 +298,7 @@ class HDASerializer( # datasets._UnflattenedMetadataDatasetAssociationSerialize
# 'url',
'download_url',
- 'annotation', 'tags',
+ 'annotation',
'api_type'
], include_keys_from='summary' )
@@ -326,7 +332,7 @@ class HDASerializer( # datasets._UnflattenedMetadataDatasetAssociationSerialize
'misc_blurb' : self._remap_from( 'blurb' ),
'file_ext' : self._remap_from( 'extension' ),
'file_path' : self._remap_from( 'file_name' ),
-
+ 'nametags' : self.serialize_nametags,
'resubmitted' : lambda i, k, **c: self.hda_manager.has_been_resubmitted( i ),
'display_apps' : self.serialize_display_apps,
'display_types' : self.serialize_old_display_applications,
@@ -380,6 +386,17 @@ class HDASerializer( # datasets._UnflattenedMetadataDatasetAssociationSerialize
return display_apps
+ def serialize_nametags( self, hda, key, trans=None, **context ):
+ """
+ Return list of 'name' child tags attached to this dataset.
+ TODO: investigate faster ways to fetch 'name' tags and values
+ """
+ nametags = []
+ for tag in hda.tags:
+ if tag.tag.name == 'name':
+ nametags.append(tag.value)
+ return nametags
+
def serialize_old_display_applications( self, hda, key, trans=None, **context ):
"""
Return dictionary containing old-style display app urls.
diff --git a/lib/galaxy/managers/tags.py b/lib/galaxy/managers/tags.py
index 6bb0a6e09e3..45704aec217 100644
--- a/lib/galaxy/managers/tags.py
+++ b/lib/galaxy/managers/tags.py
@@ -131,7 +131,9 @@ class TagManager( object ):
lc_name = name.lower()
# Get or create item-tag association.
item_tag_assoc = self._get_item_tag_assoc( user, item, lc_name )
- if not item_tag_assoc:
+ # If the association does not exist, or if it has a different value, add another.
+ # We do allow multiple associations with different values.
+ if not item_tag_assoc or (item_tag_assoc and item_tag_assoc.value != value):
# Create item-tag association.
# Create tag; if None, skip the tag (and log error).
tag = self._get_or_create_tag( lc_name )
@@ -159,7 +161,7 @@ class TagManager( object ):
# Parse tags.
parsed_tags = self.parse_tags( tags_str )
# Apply each tag.
- for name, value in parsed_tags.items():
+ for name, value in parsed_tags:
self.apply_item_tag( user, item, name, value )
def get_tags_str( self, tags ):
@@ -231,7 +233,7 @@ class TagManager( object ):
def parse_tags( self, tag_str ):
"""
Returns a list of raw (tag-name, value) pairs derived from a string; method scrubs tag names and values as well.
- Return value is a dictionary where tag-names are keys.
+ Return value is a list of (tag_name, tag_value) tuples.
"""
# Gracefully handle None.
if not tag_str:
@@ -240,12 +242,13 @@ class TagManager( object ):
reg_exp = re.compile( '[' + self.tag_separators + ']' )
raw_tags = reg_exp.split( tag_str )
# Extract name-value pairs.
- name_value_pairs = dict()
+ name_value_pairs = []
for raw_tag in raw_tags:
nv_pair = self._get_name_value_pair( raw_tag )
scrubbed_name = self._scrub_tag_name( nv_pair[0] )
scrubbed_value = self._scrub_tag_value( nv_pair[1] )
- name_value_pairs[scrubbed_name] = scrubbed_value
+ # Append tag_name, tag_value tuple -- TODO use NamedTuple
+ name_value_pairs.append(( scrubbed_name, scrubbed_value ))
return name_value_pairs
def _scrub_tag_value( self, value ):
diff --git a/lib/galaxy/managers/workflows.py b/lib/galaxy/managers/workflows.py
index 70842d6b6c8..64dc0be809e 100644
--- a/lib/galaxy/managers/workflows.py
+++ b/lib/galaxy/managers/workflows.py
@@ -13,6 +13,7 @@ from galaxy import model
from galaxy import util
from galaxy import exceptions
from galaxy.model.item_attrs import UsesAnnotations
+from galaxy.util.json import safe_loads
from galaxy.workflow import modules
from .base import decode_id
@@ -412,8 +413,6 @@ class WorkflowContentsManager(UsesAnnotations):
}
def _workflow_to_dict_editor(self, trans, stored):
- """
- """
workflow = stored.latest_workflow
# Pack workflow data into a dictionary and return
data = {}
@@ -426,6 +425,8 @@ class WorkflowContentsManager(UsesAnnotations):
module = module_factory.from_workflow_step( trans, step )
if not module:
raise exceptions.MessageException( 'Unrecognized step type: %s' % step.type )
+ # Load label from state of data input modules, necessary for backward compatibility
+ self.__set_default_label( step, module, step.tool_inputs )
# Fix any missing parameters
upgrade_message = module.check_and_update_state()
if upgrade_message:
@@ -745,9 +746,7 @@ class WorkflowContentsManager(UsesAnnotations):
del step_dict['tool_id']
del step_dict['tool_version']
del step_dict['tool_inputs']
- workflow = step.subworkflow
- step_dict['stored_workflow_id'] = encode(workflow.stored_workflow.id)
- step_dict['workflow_id'] = encode(workflow.id)
+ step_dict['workflow_id'] = encode(step.subworkflow.id)
for conn in step.input_connections:
step_id = step.id if legacy else step.order_index
@@ -835,6 +834,7 @@ class WorkflowContentsManager(UsesAnnotations):
step_dict["subworkflow"] = subworkflow
module = module_factory.from_dict( trans, step_dict, **kwds )
+ self.__set_default_label( step, module, step_dict.get( 'tool_state' ) )
module.save_to_step( step )
annotation = step_dict[ 'annotation' ]
@@ -924,6 +924,16 @@ class WorkflowContentsManager(UsesAnnotations):
del step.temp_input_connections
+ def __set_default_label( self, step, module, state ):
+ """ Previously data input modules had a `name` attribute to rename individual steps. Here, this value is transferred
+ to the actual `label` attribute which is available for all module types, unique, and mapped to its own database column.
+ """
+ if not module.label and module.type in [ 'data_input', 'data_collection_input' ]:
+ new_state = safe_loads( state )
+ default_label = new_state.get( 'name' )
+ if str( default_label ).lower() not in [ 'input dataset', 'input dataset collection' ]:
+ step.label = module.label = default_label
+
class MissingToolsException(exceptions.MessageException):
diff --git a/lib/galaxy/model/__init__.py b/lib/galaxy/model/__init__.py
index b3913fc12cb..0345cce6b07 100644
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -28,6 +28,7 @@ import galaxy.model.orm.now
import galaxy.security.passwords
import galaxy.util
from galaxy.model.item_attrs import UsesAnnotations
+from galaxy.model.util import pgcalc
from galaxy.security import get_permitted_actions
from galaxy.util import (directory_hash_id, Params, ready_name_for_url,
restore_text, send_mail, unicodify, unique_id)
@@ -275,6 +276,31 @@ class User( object, Dictifiable ):
total += hda.dataset.get_total_size()
return total
+ def calculate_and_set_disk_usage( self ):
+ """
+ Calculates and sets user disk usage.
+ """
+ new = None
+ db_session = object_session(self)
+ current = self.get_disk_usage()
+ if db_session.get_bind().dialect.name not in ( 'postgres', 'postgresql' ):
+ done = False
+ while not done:
+ new = self.calculate_disk_usage()
+ db_session.refresh( self )
+ # make sure usage didn't change while calculating
+ # set done if it has not, otherwise reset current and iterate again.
+ if self.get_disk_usage() == current:
+ done = True
+ else:
+ current = self.get_disk_usage()
+ else:
+ new = pgcalc(db_session, self.id)
+ if new not in (current, None):
+ self.set_disk_usage( new )
+ db_session.add( self )
+ db_session.flush()
+
@staticmethod
def user_template_environment( user ):
"""
@@ -1416,6 +1442,7 @@ class History( object, Dictifiable, UsesAnnotations, HasName ):
.options( joinedload("dataset"),
joinedload("dataset.actions"),
joinedload("dataset.actions.role"),
+ joinedload("tags"),
))
self._active_datasets_and_roles = query.all()
return self._active_datasets_and_roles
@@ -2354,8 +2381,8 @@ class HistoryDatasetAssociation( DatasetInstance, Dictifiable, UsesAnnotations,
def copy_attributes( self, new_dataset ):
new_dataset.hid = self.hid
- def to_library_dataset_dataset_association( self, trans, target_folder,
- replace_dataset=None, parent_id=None, user=None, roles=None, ldda_message='' ):
+ def to_library_dataset_dataset_association( self, trans, target_folder, replace_dataset=None,
+ parent_id=None, user=None, roles=None, ldda_message='', element_identifier=None ):
"""
Copy this HDA to a library optionally replacing an existing LDDA.
"""
@@ -2373,7 +2400,7 @@ class HistoryDatasetAssociation( DatasetInstance, Dictifiable, UsesAnnotations,
if not user:
# This should never happen since users must be authenticated to upload to a data library
user = self.history.user
- ldda = LibraryDatasetDatasetAssociation( name=self.name,
+ ldda = LibraryDatasetDatasetAssociation( name=element_identifier or self.name,
info=self.info,
blurb=self.blurb,
peek=self.peek,
diff --git a/lib/galaxy/model/orm/engine_factory.py b/lib/galaxy/model/orm/engine_factory.py
index 16133de1ba0..d373564b9e0 100644
--- a/lib/galaxy/model/orm/engine_factory.py
+++ b/lib/galaxy/model/orm/engine_factory.py
@@ -29,7 +29,7 @@ def build_engine(url, engine_options, database_query_profiling_proxy=False, trac
parameters, context, executemany):
total = time.time() - conn.info['query_start_time'].pop(-1)
if total > slow_query_log_threshold:
- log.debug("Slow query: %f(s) for %s" % (total, statement))
+ log.debug("Slow query: %f(s)\n%s\nParameters: %s" % (total, statement, parameters))
# Create the database engine
engine = create_engine( url, proxy=proxy, **engine_options )
diff --git a/lib/galaxy/queue_worker.py b/lib/galaxy/queue_worker.py
index abbde5ed55d..167be3e2339 100644
--- a/lib/galaxy/queue_worker.py
+++ b/lib/galaxy/queue_worker.py
@@ -18,7 +18,31 @@ logging.getLogger('kombu').setLevel(logging.WARNING)
log = logging.getLogger(__name__)
+def send_local_control_task(app, task, kwargs={}):
+ """
+ This sends a message to the process-local control worker, which is useful
+ for one-time asynchronous tasks like recalculating user disk usage.
+ """
+ log.info("Queuing async task %s." % task)
+ payload = {'task': task,
+ 'kwargs': kwargs}
+ try:
+ c = Connection(app.config.amqp_internal_connection)
+ with producers[c].acquire(block=True) as producer:
+ producer.publish(payload,
+ exchange=galaxy.queues.galaxy_exchange,
+ declare=[galaxy.queues.galaxy_exchange] + [galaxy.queues.control_queue_from_config(app.config)],
+ routing_key='control')
+ except Exception:
+ log.exception("Error queueing async task: %s." % payload)
+
+
def send_control_task(app, task, noop_self=False, kwargs={}):
+ """
+ This sends a control task out to all processes, useful for things like
+ reloading a data table, which needs to happen individually in all
+ processes.
+ """
log.info("Sending %s control task." % task)
payload = {'task': task,
'kwargs': kwargs}
@@ -27,8 +51,9 @@ def send_control_task(app, task, noop_self=False, kwargs={}):
try:
c = Connection(app.config.amqp_internal_connection)
with producers[c].acquire(block=True) as producer:
+ control_queues = galaxy.queues.all_control_queues_for_declare(app.config, app.application_stack)
producer.publish(payload, exchange=galaxy.queues.galaxy_exchange,
- declare=[galaxy.queues.galaxy_exchange] + galaxy.queues.all_control_queues_for_declare(app.config),
+ declare=[galaxy.queues.galaxy_exchange] + control_queues,
routing_key='control')
except Exception:
# This is likely connection refused.
@@ -62,6 +87,8 @@ def reload_tool(app, **kwargs):
def reload_toolbox(app, **kwargs):
log.debug("Executing toolbox reload on '%s'", app.config.server_name)
reload_count = app.toolbox._reload_count
+ if app.tool_cache:
+ app.tool_cache.cleanup()
app.toolbox = _get_new_toolbox(app)
app.toolbox._reload_count = reload_count + 1
@@ -112,6 +139,19 @@ def reload_sanitize_whitelist(app):
app.config.reload_sanitize_whitelist()
+def recalculate_user_disk_usage(app, **kwargs):
+ user_id = kwargs.get('user_id', None)
+ sa_session = app.model.context
+ if user_id:
+ user = sa_session.query( app.model.User ).get( app.security.decode_id( user_id ) )
+ if user:
+ user.calculate_and_set_disk_usage()
+ else:
+ log.error("Recalculate user disk usage task failed, user %s not found" % user_id)
+ else:
+ log.error("Recalculate user disk usage task received without user_id.")
+
+
def reload_tool_data_tables(app, **kwargs):
params = util.Params(kwargs)
log.debug("Executing tool data table reload for %s" % params.get('table_names', 'all tables'))
@@ -135,7 +175,8 @@ control_message_to_task = { 'create_panel_section': create_panel_section,
'reload_display_application': reload_display_application,
'reload_tool_data_tables': reload_tool_data_tables,
'admin_job_lock': admin_job_lock,
- 'reload_sanitize_whitelist': reload_sanitize_whitelist}
+ 'reload_sanitize_whitelist': reload_sanitize_whitelist,
+ 'recalculate_user_disk_usage': recalculate_user_disk_usage}
class GalaxyQueueWorker(ConsumerMixin, threading.Thread):
@@ -165,7 +206,7 @@ class GalaxyQueueWorker(ConsumerMixin, threading.Thread):
# Default to figuring out which control queue to use based on the app config.
queue = galaxy.queues.control_queue_from_config(app.config)
self.task_mapping = task_mapping
- self.declare_queues = galaxy.queues.all_control_queues_for_declare(app.config)
+ self.declare_queues = galaxy.queues.all_control_queues_for_declare(app.config, app.application_stack)
# TODO we may want to purge the queue at the start to avoid executing
# stale 'reload_tool', etc messages. This can happen if, say, a web
# process goes down and messages get sent before it comes back up.
@@ -185,13 +226,13 @@ class GalaxyQueueWorker(ConsumerMixin, threading.Thread):
if body.get('noop', None) != self.app.config.server_name:
try:
f = self.task_mapping[body['task']]
- log.info("Instance '%s' recieved '%s' task, executing now.", self.app.config.server_name, body['task'])
+ log.info("Instance '%s' received '%s' task, executing now.", self.app.config.server_name, body['task'])
f(self.app, **body['kwargs'])
except Exception:
# this shouldn't ever throw an exception, but...
log.exception("Error running control task type: %s" % body['task'])
else:
- log.warning("Recieved a malformed task message:\n%s" % body)
+ log.warning("Received a malformed task message:\n%s" % body)
message.ack()
def shutdown(self):
diff --git a/lib/galaxy/queues.py b/lib/galaxy/queues.py
index 150c4163e64..884d452103b 100644
--- a/lib/galaxy/queues.py
+++ b/lib/galaxy/queues.py
@@ -4,26 +4,21 @@ All message queues used by Galaxy
"""
-from galaxy.util.postfork import process_is_uwsgi
-
from kombu import Exchange, Queue, Connection
ALL_CONTROL = "control.*"
galaxy_exchange = Exchange('galaxy_core_exchange', type='topic')
-def all_control_queues_for_declare(config):
+def all_control_queues_for_declare(config, application_stack):
"""
For in-memory routing (used by sqlalchemy-based transports), we need to be able to
build the entire routing table in producers.
Refactor later to actually persist this somewhere instead of building it repeatedly.
"""
- possible_uwsgi_queues = []
- if process_is_uwsgi:
- import uwsgi
- possible_uwsgi_queues = [Queue("control.%s.%s" % (config.server_name.split('.')[0], wkr['id']), galaxy_exchange, routing_key='control') for wkr in uwsgi.workers()]
- return possible_uwsgi_queues + [Queue('control.%s' % q, galaxy_exchange, routing_key='control') for q in config.server_names]
+ possible_stack_queues = [Queue("control.%s.%s" % (config.server_name.split('.')[0], wkr['id']), galaxy_exchange, routing_key='control') for wkr in application_stack.workers()]
+ return possible_stack_queues + [Queue('control.%s' % q, galaxy_exchange, routing_key='control') for q in config.server_names]
def control_queue_from_config(config):
diff --git a/lib/galaxy/tags/__init__.py b/lib/galaxy/tags/__init__.py
deleted file mode 100644
index 4054609376b..00000000000
--- a/lib/galaxy/tags/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-"""
-Galaxy tagging classes and methods.
-"""
diff --git a/lib/galaxy/tools/__init__.py b/lib/galaxy/tools/__init__.py
index a44c2336527..0e4ce5d49fb 100755
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -42,6 +42,7 @@ from galaxy.tools.deps import (
CachedDependencyManager,
views
)
+from galaxy.tools.fetcher import ToolLocationFetcher
from galaxy.tools.parameters import (
check_param,
params_from_strings,
@@ -124,6 +125,12 @@ GALAXY_LIB_TOOLS_UNVERSIONED = [
"maf_limit_size1",
"maf_by_block_number1",
"wiggle2simple1",
+ # Converters
+ "CONVERTER_fastq_to_fqtoc0",
+ "CONVERTER_gff_to_interval_index_0",
+ "CONVERTER_maf_to_fasta_0",
+ "CONVERTER_maf_to_interval_0",
+ "CONVERTER_wiggle_to_interval_0",
# Tools improperly migrated to the tool shed (devteam)
"lastz_wrapper_2",
"qualityFilter",
@@ -181,6 +188,7 @@ class ToolBox( BaseGalaxyToolBox ):
def __init__( self, config_filenames, tool_root_dir, app, tool_conf_watcher=None ):
self._reload_count = 0
+ self.tool_location_fetcher = ToolLocationFetcher()
super( ToolBox, self ).__init__(
config_filenames=config_filenames,
tool_root_dir=tool_root_dir,
@@ -216,7 +224,11 @@ class ToolBox( BaseGalaxyToolBox ):
def create_tool( self, config_file, repository_id=None, guid=None, **kwds ):
try:
- tool_source = get_tool_source( config_file, enable_beta_formats=getattr( self.app.config, "enable_beta_tool_formats", False ) )
+ tool_source = get_tool_source(
+ config_file,
+ enable_beta_formats=getattr( self.app.config, "enable_beta_tool_formats", False ),
+ tool_location_fetcher=self.tool_location_fetcher,
+ )
except Exception as e:
# capture and log parsing errors
global_tool_errors.add_error(config_file, "Tool XML parsing", e)
@@ -2346,6 +2358,8 @@ class ZipCollectionTool( DatabaseOperationTool ):
new_elements = odict()
new_elements["forward"] = forward
new_elements["reverse"] = reverse
+ history.add_dataset( forward, set_hid=False )
+ history.add_dataset( reverse, set_hid=False )
output_collections.create_collection(
next(iter(self.outputs.values())), "output", elements=new_elements
@@ -2424,7 +2438,10 @@ class MergeCollectionTool( DatabaseOperationTool ):
# Don't copy until we know everything is fine and we have the structure of the list ready to go.
new_elements = odict()
for key, value in new_element_structure.items():
- new_elements[key] = value.copy()
+ copied_value = value.copy()
+ if getattr(copied_value, "history_content_type", None) == "dataset":
+ history.add_dataset(copied_value, set_hid=False)
+ new_elements[key] = copied_value
output_collections.create_collection(
next(iter(self.outputs.values())), "output", elements=new_elements
@@ -2459,7 +2476,10 @@ class FilterFailedDatasetsTool( DatabaseOperationTool ):
if valid:
element_identifier = dce.element_identifier
- new_elements[element_identifier] = element.copy()
+ copied_value = element.copy()
+ if getattr(copied_value, "history_content_type", None) == "dataset":
+ history.add_dataset(copied_value, set_hid=False)
+ new_elements[element_identifier] = copied_value
output_collections.create_collection(
next(iter(self.outputs.values())), "output", elements=new_elements
@@ -2482,8 +2502,9 @@ class FlattenTool( DatabaseOperationTool ):
if dce.is_collection:
add_elements(dce_object, prefix=identifier)
else:
- new_elements[identifier] = dce_object.copy()
-
+ copied_dataset = dce_object.copy()
+ history.add_dataset(copied_dataset, set_hid=False)
+ new_elements[identifier] = copied_dataset
add_elements(hdca.collection)
output_collections.create_collection(
next(iter(self.outputs.values())), "output", elements=new_elements
diff --git a/lib/galaxy/tools/actions/__init__.py b/lib/galaxy/tools/actions/__init__.py
index f1143d8a1ee..19d5f28a946 100644
--- a/lib/galaxy/tools/actions/__init__.py
+++ b/lib/galaxy/tools/actions/__init__.py
@@ -214,6 +214,7 @@ class DefaultToolAction( object ):
# format.
input_ext = 'data' if tool.profile < 16.04 else "input"
input_dbkey = incoming.get( "dbkey", "?" )
+ preserved_tags = []
for name, data in reversed(inp_data.items()):
if not data:
data = NoneDataset( datatypes_registry=app.datatypes_registry )
@@ -234,6 +235,9 @@ class DefaultToolAction( object ):
if identifier is not None:
incoming[ "%s|__identifier__" % name ] = identifier
+ for tag in data.tags:
+ preserved_tags.append(tag)
+
# Collect chromInfo dataset and add as parameters to incoming
( chrom_info, db_dataset ) = app.genome_builds.get_chrom_info( input_dbkey, trans=trans, custom_build_hack_get_len_from_fasta_conversion=tool.id != 'CONVERTER_fasta_to_len' )
if db_dataset:
@@ -303,6 +307,9 @@ class DefaultToolAction( object ):
trans.sa_session.add( data )
trans.app.security_agent.set_all_dataset_permissions( data.dataset, output_permissions, new=True )
+ for tag in preserved_tags:
+ data.tags.append(tag.copy())
+
# Must flush before setting object store id currently.
# TODO: optimize this.
trans.sa_session.flush()
@@ -672,6 +679,17 @@ class OutputCollections(object):
collection_type = input_collections[collection_type_source].collection.collection_type
+ if "elements" in element_kwds:
+ elements = element_kwds["elements"]
+ if hasattr(elements, "items"): # else it is ELEMENTS_UNINITIALIZED object.
+ for key, value in elements.items():
+ # Either a HDA (if) or a DatasetCollection (the else)
+ if getattr(value, "history_content_type", None) == "dataset":
+ assert value.history is not None
+ else:
+ for dataset in value.dataset_instances:
+ assert dataset.history is not None
+
if self.mapping_over_collection:
dc = collections_manager.create_dataset_collection(
self.trans,
diff --git a/lib/galaxy/tools/cwl/cwltool_deps.py b/lib/galaxy/tools/cwl/cwltool_deps.py
index a2a946c91a1..9c2518f03d9 100644
--- a/lib/galaxy/tools/cwl/cwltool_deps.py
+++ b/lib/galaxy/tools/cwl/cwltool_deps.py
@@ -17,6 +17,7 @@ try:
workflow,
job,
process,
+ pathmapper,
)
except (ImportError, SyntaxError):
# Drop SyntaxError once cwltool supports Python 3
@@ -24,6 +25,7 @@ except (ImportError, SyntaxError):
workflow = None
job = None
process = None
+ pathmapper = None
try:
from cwltool import load_tool
@@ -41,6 +43,12 @@ except (ImportError, SyntaxError):
# Drop SyntaxError once schema_salad supports Python 3
schema_salad = None
+try:
+ from schema_salad import ref_resolver
+except (ImportError, SyntaxError):
+ ref_resolver = None
+
+
needs_shell_quoting = re.compile(r"""(^$|[\s|&;()<>\'"$@])""").search
@@ -66,9 +74,11 @@ def ensure_cwltool_available():
__all__ = (
'main',
+ 'ref_resolver',
'load_tool',
'workflow',
'process',
+ 'pathmapper',
'ensure_cwltool_available',
'schema_salad',
'shellescape',
diff --git a/lib/galaxy/tools/cwl/parser.py b/lib/galaxy/tools/cwl/parser.py
index 3e106440933..195fdf28e5e 100644
--- a/lib/galaxy/tools/cwl/parser.py
+++ b/lib/galaxy/tools/cwl/parser.py
@@ -18,11 +18,10 @@ from galaxy.util.odict import odict
from .cwltool_deps import (
ensure_cwltool_available,
- main,
- workflow,
+ process,
)
-from .schema import schema_loader
+from .schema import non_strict_schema_loader, schema_loader
log = logging.getLogger(__name__)
@@ -42,36 +41,36 @@ SUPPORTED_WORKFLOW_REQUIREMENTS = SUPPORTED_TOOL_REQUIREMENTS + [
]
-def tool_proxy(tool_path):
+def tool_proxy(tool_path, strict_cwl_validation=True):
""" Provide a proxy object to cwltool data structures to just
grab relevant data.
"""
ensure_cwltool_available()
- tool = to_cwl_tool_object(tool_path)
+ tool = to_cwl_tool_object(tool_path, strict_cwl_validation=strict_cwl_validation)
return tool
-def workflow_proxy(workflow_path):
+def workflow_proxy(workflow_path, strict_cwl_validation=True):
ensure_cwltool_available()
- workflow = to_cwl_workflow_object(workflow_path)
+ workflow = to_cwl_workflow_object(workflow_path, strict_cwl_validation=strict_cwl_validation)
return workflow
-def load_job_proxy(job_directory):
+def load_job_proxy(job_directory, strict_cwl_validation=True):
ensure_cwltool_available()
job_objects_path = os.path.join(job_directory, JOB_JSON_FILE)
job_objects = json.load(open(job_objects_path, "r"))
tool_path = job_objects["tool_path"]
job_inputs = job_objects["job_inputs"]
output_dict = job_objects["output_dict"]
- cwl_tool = tool_proxy(tool_path)
+ cwl_tool = tool_proxy(tool_path, strict_cwl_validation=strict_cwl_validation)
cwl_job = cwl_tool.job_proxy(job_inputs, output_dict, job_directory=job_directory)
return cwl_job
-def to_cwl_tool_object(tool_path):
+def to_cwl_tool_object(tool_path, strict_cwl_validation=True):
proxy_class = None
- cwl_tool = schema_loader.tool(path=tool_path)
+ cwl_tool = _schema_loader(strict_cwl_validation).tool(path=tool_path)
if isinstance(cwl_tool, int):
raise Exception("Failed to load tool.")
@@ -93,10 +92,9 @@ def to_cwl_tool_object(tool_path):
return proxy
-def to_cwl_workflow_object(workflow_path):
+def to_cwl_workflow_object(workflow_path, strict_cwl_validation=None):
proxy_class = WorkflowProxy
- make_tool = workflow.defaultMakeTool
- cwl_workflow = main.load_tool(workflow_path, False, False, make_tool, False)
+ cwl_workflow = _schema_loader(strict_cwl_validation).tool(path=workflow_path)
raw_workflow = cwl_workflow.tool
check_requirements(raw_workflow, tool=False)
@@ -104,6 +102,11 @@ def to_cwl_workflow_object(workflow_path):
return proxy
+def _schema_loader(strict_cwl_validation):
+ target_schema_loader = schema_loader if strict_cwl_validation else non_strict_schema_loader
+ return target_schema_loader
+
+
def check_requirements(rec, tool=True):
if isinstance(rec, dict):
if "requirements" in rec:
@@ -237,14 +240,21 @@ class JobProxy(object):
def _ensure_cwl_job_initialized(self):
if self._cwl_job is None:
+
self._cwl_job = next(self._tool_proxy._tool.job(
self._input_dict,
self._output_callback,
basedir=self._job_directory,
+ select_resources=self._select_resources,
use_container=False
))
self._is_command_line_job = hasattr(self._cwl_job, "command_line")
+ def _select_resources(self, request):
+ new_request = request.copy()
+ new_request["cores"] = "$GALAXY_SLOTS"
+ return new_request
+
@property
def command_line(self):
if self.is_command_line_job:
@@ -324,6 +334,12 @@ class JobProxy(object):
safe_makedirs(secondary_files_dir)
return secondary_files_dir
+ def stage_files(self):
+ cwl_job = self.cwl_job()
+ if hasattr(cwl_job, "pathmapper"):
+ process.stageFiles(self.cwl_job().pathmapper, os.symlink, ignoreWritable=True)
+ # else: expression tools do not have a path mapper.
+
@staticmethod
def _job_file(job_directory):
return os.path.join(job_directory, JOB_JSON_FILE)
diff --git a/lib/galaxy/tools/cwl/representation.py b/lib/galaxy/tools/cwl/representation.py
index 140708b0f64..fde19ffbf1f 100644
--- a/lib/galaxy/tools/cwl/representation.py
+++ b/lib/galaxy/tools/cwl/representation.py
@@ -19,6 +19,7 @@ GALAXY_TO_CWL_TYPES = {
'float': 'float',
'data': 'File',
'boolean': 'boolean',
+ 'text': 'text'
}
@@ -56,7 +57,8 @@ def to_cwl_job(tool, param_dict, local_working_directory):
os.symlink(secondary_file_path, new_input_path + secondary_file_name)
path = new_input_path
- return {"path": path, "class": "File"}
+ return {"location": path,
+ "class": "File"}
elif cwl_type == "integer":
return int(str(param_dict_value))
elif cwl_type == "long":
@@ -67,7 +69,7 @@ def to_cwl_job(tool, param_dict, local_working_directory):
return float(str(param_dict_value))
elif cwl_type == "boolean":
return string_as_bool(param_dict_value)
- elif cwl_type == "string":
+ elif cwl_type == "text":
return str(param_dict_value)
elif cwl_type == "json":
raw_value = param_dict_value.value
@@ -94,9 +96,6 @@ def to_cwl_job(tool, param_dict, local_working_directory):
else:
input_json[input_name] = simple_value(input, param_dict[input_name])
- input_json["allocatedResources"] = {
- "cpu": "$GALAXY_SLOTS",
- }
return input_json
diff --git a/lib/galaxy/tools/cwl/runtime_actions.py b/lib/galaxy/tools/cwl/runtime_actions.py
index 07a4b2c5731..c3814b7d29d 100644
--- a/lib/galaxy/tools/cwl/runtime_actions.py
+++ b/lib/galaxy/tools/cwl/runtime_actions.py
@@ -2,6 +2,7 @@ import json
import os
import shutil
+from .cwltool_deps import ref_resolver
from .parser import (
JOB_JSON_FILE,
load_job_proxy,
@@ -17,13 +18,16 @@ def handle_outputs(job_directory=None):
if not os.path.exists(cwl_job_file):
# Not a CWL job, just continue
return
- job_proxy = load_job_proxy(job_directory)
+ # So we only need to do strict validation when the tool was loaded,
+ # no reason to do it again during job execution - so this shortcut
+ # allows us to not need Galaxy's full configuration on job nodes.
+ job_proxy = load_job_proxy(job_directory, strict_cwl_validation=False)
tool_working_directory = os.path.join(job_directory, "working")
outputs = job_proxy.collect_outputs(tool_working_directory)
for output_name, output in outputs.items():
- target_path = job_proxy.output_path( output_name )
- if isinstance(output, dict) and "path" in output:
- output_path = output["path"]
+ target_path = job_proxy.output_path(output_name)
+ if isinstance(output, dict) and "location" in output:
+ output_path = ref_resolver.uri_file_path(output["location"])
if output["class"] != "File":
open("galaxy.json", "w").write(json.dump({
"dataset_id": job_proxy.output_id(output_name),
@@ -33,7 +37,7 @@ def handle_outputs(job_directory=None):
shutil.move(output_path, target_path)
for secondary_file in output.get("secondaryFiles", []):
# TODO: handle nested files...
- secondary_file_path = secondary_file["path"]
+ secondary_file_path = ref_resolver.uri_file_path(secondary_file["location"])
assert secondary_file_path.startswith(output_path)
secondary_file_name = secondary_file_path[len(output_path):]
secondary_files_dir = job_proxy.output_secondary_files_dir(
diff --git a/lib/galaxy/tools/cwl/schema.py b/lib/galaxy/tools/cwl/schema.py
index fb24b784724..6b3e1e49ccd 100644
--- a/lib/galaxy/tools/cwl/schema.py
+++ b/lib/galaxy/tools/cwl/schema.py
@@ -24,11 +24,8 @@ class SchemaLoader(object):
@property
def raw_document_loader(self):
- if self._raw_document_loader is None:
- ensure_cwltool_available()
- self._raw_document_loader = schema_salad.ref_resolver.Loader({"cwl": "https://w3id.org/cwl/cwl#", "id": "@id"})
-
- return self._raw_document_loader
+ ensure_cwltool_available()
+ return schema_salad.ref_resolver.Loader({"cwl": "https://w3id.org/cwl/cwl#", "id": "@id"})
def raw_process_reference(self, path):
uri = "file://" + os.path.abspath(path)
@@ -71,3 +68,4 @@ class SchemaLoader(object):
schema_loader = SchemaLoader()
+non_strict_schema_loader = SchemaLoader(strict=False)
diff --git a/lib/galaxy/tools/deps/__init__.py b/lib/galaxy/tools/deps/__init__.py
index cc42d83cd92..0c568ea2fb6 100644
--- a/lib/galaxy/tools/deps/__init__.py
+++ b/lib/galaxy/tools/deps/__init__.py
@@ -198,8 +198,8 @@ class DependencyManager( object ):
return [
ToolShedPackageDependencyResolver(self),
GalaxyPackageDependencyResolver(self),
- GalaxyPackageDependencyResolver(self, versionless=True),
CondaDependencyResolver(self),
+ GalaxyPackageDependencyResolver(self, versionless=True),
CondaDependencyResolver(self, versionless=True),
]
diff --git a/lib/galaxy/tools/deps/conda_util.py b/lib/galaxy/tools/deps/conda_util.py
index 92652a0dca0..00ca742f24e 100644
--- a/lib/galaxy/tools/deps/conda_util.py
+++ b/lib/galaxy/tools/deps/conda_util.py
@@ -30,6 +30,10 @@ VERSIONED_ENV_DIR_NAME = re.compile(r"__(.*)@(.*)")
UNVERSIONED_ENV_DIR_NAME = re.compile(r"__(.*)@_uv_")
USE_PATH_EXEC_DEFAULT = False
CONDA_VERSION = "4.2.13"
+# 2.1.5 is incompatible with 4.2 Conda because of
+# https://github.com/conda/conda-build/pull/1766
+CONDA_BUILD_VERSION = "2.1.4"
+USE_LOCAL_DEFAULT = False
def conda_link():
@@ -45,7 +49,16 @@ def find_conda_prefix(conda_prefix=None):
for Miniconda installs.
"""
if conda_prefix is None:
- return os.path.join(os.path.expanduser("~"), "miniconda2")
+ home = os.path.expanduser("~")
+ miniconda_2_dest = os.path.join(home, "miniconda2")
+ miniconda_3_dest = os.path.join(home, "miniconda3")
+ # Prefer miniconda3 install if both available
+ if os.path.exists(miniconda_3_dest):
+ return miniconda_3_dest
+ elif os.path.exists(miniconda_2_dest):
+ return miniconda_2_dest
+ else:
+ return miniconda_3_dest
return conda_prefix
@@ -54,7 +67,8 @@ class CondaContext(installable.InstallableContext):
def __init__(self, conda_prefix=None, conda_exec=None,
shell_exec=None, debug=False, ensure_channels='',
- condarc_override=None, use_path_exec=USE_PATH_EXEC_DEFAULT, copy_dependencies=False):
+ condarc_override=None, use_path_exec=USE_PATH_EXEC_DEFAULT,
+ copy_dependencies=False, use_local=USE_LOCAL_DEFAULT):
self.condarc_override = condarc_override
if not conda_exec and use_path_exec:
conda_exec = commands.which("conda")
@@ -84,18 +98,27 @@ class CondaContext(installable.InstallableContext):
self.ensured_channels = False
self._conda_version = None
self._miniconda_version = None
+ self._conda_build_available = None
+ self.use_local = use_local
@property
def conda_version(self):
if self._conda_version is None:
- self._guess_conda_version()
+ self._guess_conda_properties()
return self._conda_version
- def _guess_conda_version(self):
+ @property
+ def conda_build_available(self):
+ if self._conda_build_available is None:
+ self._guess_conda_properties()
+ return self._conda_build_available
+
+ def _guess_conda_properties(self):
conda_meta_path = self._conda_meta_path
# Perhaps we should call "conda info --json" and parse it but for now we are going
# to assume the default.
conda_version = LooseVersion(CONDA_VERSION)
+ conda_build_available = False
miniconda_version = "3"
if os.path.exists(conda_meta_path):
@@ -110,9 +133,12 @@ class CondaContext(installable.InstallableContext):
conda_version = LooseVersion(version)
if package == "python" and version.startswith("2"):
miniconda_version = "2"
+ if package == "conda-build":
+ conda_build_available = True
self._conda_version = conda_version
self._miniconda_version = miniconda_version
+ self._conda_build_available = conda_build_available
@property
def _conda_meta_path(self):
@@ -135,6 +161,14 @@ class CondaContext(installable.InstallableContext):
if changed:
self.save_condarc(conda_conf)
+ def ensure_conda_build_installed_if_needed(self):
+ if self.use_local and not self.conda_build_available:
+ conda_targets = [CondaTarget("conda-build", version=CONDA_BUILD_VERSION)]
+ # Cannot use --use-local during installation fo conda-build.
+ return install_conda_targets(conda_targets, env_name=None, conda_context=self, allow_local=False)
+ else:
+ return 0
+
def conda_info(self):
if self.conda_exec is not None:
info_out = commands.execute([self.conda_exec, "info", "--json"])
@@ -215,25 +249,31 @@ class CondaContext(installable.InstallableContext):
def exec_command(self, operation, args):
command = self.command(operation, args)
- env = {'HOME': self.conda_prefix} # We don't want to pollute ~/.conda, which may not even be writable
+ env = {}
condarc_override = self.condarc_override
if condarc_override:
env["CONDARC"] = condarc_override
log.debug("Executing command: %s", command)
+ env['HOME'] = tempfile.mkdtemp(prefix='conda_exec_home_') # We don't want to pollute ~/.conda, which may not even be writable
try:
return self.shell_exec(command, env=env)
except commands.CommandLineException as e:
log.warning(e)
return e.returncode
+ finally:
+ shutil.rmtree(env['HOME'], ignore_errors=True)
- def exec_create(self, args):
+ def exec_create(self, args, allow_local=True):
create_base_args = [
"-y"
]
+ if allow_local and self.use_local:
+ create_base_args.extend(["--use-local"])
create_base_args.extend(args)
return self.exec_command("create", create_base_args)
def exec_remove(self, args):
+ """Remove a conda environment using conda env remove -y --name `args`."""
remove_base_args = [
"remove",
"-y",
@@ -242,10 +282,12 @@ class CondaContext(installable.InstallableContext):
remove_base_args.extend(args)
return self.exec_command("env", remove_base_args)
- def exec_install(self, args):
+ def exec_install(self, args, allow_local=True):
install_base_args = [
"-y"
]
+ if allow_local and self.use_local:
+ install_base_args.extend(["--use-local"])
install_base_args.extend(args)
return self.exec_command("install", install_base_args)
@@ -386,13 +428,18 @@ def hash_conda_packages(conda_packages, conda_target=None):
# shell makes sense for planemo, in Galaxy this should just execute
# these commands as Python
-def install_conda(conda_context=None):
+def install_conda(conda_context=None, force_conda_build=False):
conda_context = _ensure_conda_context(conda_context)
f, script_path = tempfile.mkstemp(suffix=".sh", prefix="conda_install")
os.close(f)
download_cmd = " ".join(commands.download_command(conda_link(), to=script_path, quote_url=True))
install_cmd = "bash '%s' -b -p '%s'" % (script_path, conda_context.conda_prefix)
- fix_version_cmd = "%s install -y -q conda=%s " % (os.path.join(conda_context.conda_prefix, 'bin/conda'), CONDA_VERSION)
+ package_targets = [
+ "conda=%s" % CONDA_VERSION,
+ ]
+ if force_conda_build or conda_context.use_local:
+ package_targets.append("conda-build=%s" % CONDA_BUILD_VERSION)
+ fix_version_cmd = "%s install -y -q %s " % (os.path.join(conda_context.conda_prefix, 'bin/conda'), " ".join(package_targets))
full_command = "%s && %s && %s" % (download_cmd, install_cmd, fix_version_cmd)
try:
log.info("Installing Conda, this may take several minutes.")
@@ -402,7 +449,7 @@ def install_conda(conda_context=None):
os.remove(script_path)
-def install_conda_targets(conda_targets, env_name=None, conda_context=None):
+def install_conda_targets(conda_targets, env_name=None, conda_context=None, allow_local=True):
conda_context = _ensure_conda_context(conda_context)
conda_context.ensure_channels_configured()
if env_name is not None:
@@ -411,9 +458,9 @@ def install_conda_targets(conda_targets, env_name=None, conda_context=None):
]
for conda_target in conda_targets:
create_args.append(conda_target.package_specifier)
- return conda_context.exec_create(create_args)
+ return conda_context.exec_create(create_args, allow_local=allow_local)
else:
- return conda_context.exec_install([t.package_specifier for t in conda_targets])
+ return conda_context.exec_install([t.package_specifier for t in conda_targets], allow_local=allow_local)
def install_conda_target(conda_target, conda_context=None, skip_environment=False):
diff --git a/lib/galaxy/tools/deps/container_resolvers/__init__.py b/lib/galaxy/tools/deps/container_resolvers/__init__.py
index 8e5e35d05a6..0e9e50c784b 100644
--- a/lib/galaxy/tools/deps/container_resolvers/__init__.py
+++ b/lib/galaxy/tools/deps/container_resolvers/__init__.py
@@ -10,6 +10,7 @@ import six
from galaxy.util.dictifiable import Dictifiable
+@six.python_2_unicode_compatible
@six.add_metaclass(ABCMeta)
class ContainerResolver(Dictifiable, object):
"""Description of a technique for resolving container images for tool execution."""
@@ -49,3 +50,6 @@ class ContainerResolver(Dictifiable, object):
def _container_type_enabled(self, container_description, enabled_container_types):
"""Return a boolean indicating if the specified container type is enabled."""
return container_description.type in enabled_container_types
+
+ def __str__(self):
+ return "%s[]" % self.__class__.__name__
diff --git a/lib/galaxy/tools/deps/container_resolvers/mulled.py b/lib/galaxy/tools/deps/container_resolvers/mulled.py
index 3da1ea37456..966cffe2461 100644
--- a/lib/galaxy/tools/deps/container_resolvers/mulled.py
+++ b/lib/galaxy/tools/deps/container_resolvers/mulled.py
@@ -3,6 +3,8 @@
import collections
import logging
+import six
+
from ..container_resolvers import (
ContainerResolver,
)
@@ -102,6 +104,7 @@ def cached_container_description(targets, namespace):
return container
+@six.python_2_unicode_compatible
class CachedMulledContainerResolver(ContainerResolver):
resolver_type = "cached_mulled"
@@ -114,7 +117,11 @@ class CachedMulledContainerResolver(ContainerResolver):
targets = mulled_targets(tool_info)
return cached_container_description(targets, self.namespace)
+ def __str__(self):
+ return "CachedMulledContainerResolver[namespace=%s]" % self.namespace
+
+@six.python_2_unicode_compatible
class MulledContainerResolver(ContainerResolver):
"""Look for mulled images matching tool dependencies."""
@@ -160,7 +167,11 @@ class MulledContainerResolver(ContainerResolver):
type="docker",
)
+ def __str__(self):
+ return "MulledContainerResolver[namespace=%s]" % self.namespace
+
+@six.python_2_unicode_compatible
class BuildMulledContainerResolver(ContainerResolver):
"""Look for mulled images matching tool dependencies."""
@@ -195,6 +206,9 @@ class BuildMulledContainerResolver(ContainerResolver):
self.enabled = ensure_installed(involucro_context, self.auto_init)
return involucro_context
+ def __str__(self):
+ return "BuildContainerResolver[namespace=%s]" % self.namespace
+
def mulled_targets(tool_info):
return requirements_to_mulled_targets(tool_info.requirements)
diff --git a/lib/galaxy/tools/deps/mulled/invfile.lua b/lib/galaxy/tools/deps/mulled/invfile.lua
index cc5260ba7a7..693d7ecf6f9 100644
--- a/lib/galaxy/tools/deps/mulled/invfile.lua
+++ b/lib/galaxy/tools/deps/mulled/invfile.lua
@@ -40,19 +40,49 @@ for i = 1, #test_binds_table do
table.insert(test_bind_args, test_binds_table[i])
end
+local conda_image = VAR.CONDA_IMAGE
+if conda_image == '' then
+ conda_image = 'continuumio/miniconda:latest'
+end
+
+local destination_base_image = VAR.DEST_BASE_IMAGE
+if destination_base_image == '' then
+ destination_base_image = 'bgruening/busybox-bash:0.1'
+end
+
+local verbose = VAR.VERBOSE
+if verbose == '' then
+ verbose = '--quiet'
+else
+ verbose = '--verbose'
+end
+
+local preinstall = VAR.PREINSTALL
+if preinstall ~= '' then
+ preinstall = preinstall .. ' && '
+end
+
+local postinstall = VAR.POSTINSTALL
+if postinstall ~= '' then
+ postinstall = '&&' .. postinstall
+end
+
inv.task('build')
- .using('continuumio/miniconda:latest')
+ .using(conda_image)
.withHostConfig({binds = {"build:/data"}})
.run('rm', '-rf', '/data/dist')
- .using('continuumio/miniconda:latest')
+ .using(conda_image)
.withHostConfig({binds = bind_args})
- .run('/bin/sh', '-c', 'conda install '
+ .run('/bin/sh', '-c', preinstall
+ .. 'conda install '
.. channel_args .. ' '
.. target_args
- .. ' -p /usr/local --copy --yes --quiet')
+ .. ' -p /usr/local --copy --yes '
+ .. verbose
+ .. postinstall)
.wrap('build/dist')
.at('/usr/local')
- .inImage('bgruening/busybox-bash:0.1')
+ .inImage(destination_base_image)
.as(repo)
if VAR.TEST_BINDS == '' then
diff --git a/lib/galaxy/tools/deps/mulled/mulled_build.py b/lib/galaxy/tools/deps/mulled/mulled_build.py
index fb4e7b293f6..f2cc20f304f 100644
--- a/lib/galaxy/tools/deps/mulled/mulled_build.py
+++ b/lib/galaxy/tools/deps/mulled/mulled_build.py
@@ -116,7 +116,7 @@ def mull_targets(
command="build", channels=DEFAULT_CHANNELS, namespace="mulled",
test='true', test_files=None, image_build=None, name_override=None,
repository_template=DEFAULT_REPOSITORY_TEMPLATE, dry_run=False,
- binds=DEFAULT_BINDS
+ conda_version=None, verbose=False, binds=DEFAULT_BINDS
):
targets = list(targets)
if involucro_context is None:
@@ -143,8 +143,13 @@ def mull_targets(
'-set', "TARGETS='%s'" % target_str,
'-set', "REPO='%s'" % repo,
'-set', "BINDS='%s'" % bind_str,
- command,
]
+ if verbose:
+ involucro_args.extend(["-set", "VERBOSE='1'"])
+ if conda_version is not None:
+ verbose = "--verbose" if verbose else "--quiet"
+ involucro_args.extend(["-set", "PREINSTALL='conda install %s --yes conda=%s'" % (verbose, conda_version)])
+ involucro_args.append(command)
if test_files:
test_bind = []
for test_file in test_files:
@@ -165,7 +170,8 @@ def mull_targets(
def context_from_args(args):
- return InvolucroContext(involucro_bin=args.involucro_path)
+ verbose = "2" if not args.verbose else "3"
+ return InvolucroContext(involucro_bin=args.involucro_path, verbose=verbose)
class InvolucroContext(installable.InstallableContext):
@@ -220,6 +226,8 @@ def add_build_arguments(parser):
help="Rebuild package even if already published.")
parser.add_argument('--dry-run', dest='dry_run', action="store_true",
help='Just print commands instead of executing them.')
+ parser.add_argument('--verbose', dest='verbose', action="store_true",
+ help='Cause process to be verbose.')
parser.add_argument('-n', '--namespace', dest='namespace', default="mulled",
help='quay.io namespace.')
parser.add_argument('-r', '--repository_template', dest='repository_template', default=DEFAULT_REPOSITORY_TEMPLATE,
@@ -228,6 +236,8 @@ def add_build_arguments(parser):
help='Target conda channel')
parser.add_argument('--extra-channels', dest='extra_channels', default=",".join(DEFAULT_EXTRA_CHANNELS),
help='Dependent conda channels.')
+ parser.add_argument('--conda-version', dest="conda_version", default=None,
+ help="Change to specified version of Conda before installing packages.")
def add_single_image_arguments(parser):
@@ -277,6 +287,8 @@ def args_to_mull_targets_kwds(args):
kwds["command"] = args.command
if hasattr(args, "repository_template"):
kwds["repository_template"] = args.repository_template
+ if hasattr(args, "conda_version"):
+ kwds["conda_version"] = args.conda_version
kwds["involucro_context"] = context_from_args(args)
diff --git a/lib/galaxy/tools/deps/requirements.py b/lib/galaxy/tools/deps/requirements.py
index 171772f08f1..4d1e7b68ddd 100644
--- a/lib/galaxy/tools/deps/requirements.py
+++ b/lib/galaxy/tools/deps/requirements.py
@@ -151,6 +151,7 @@ DEFAULT_CONTAINER_RESOLVE_DEPENDENCIES = False
DEFAULT_CONTAINER_SHELL = "/bin/sh" # Galaxy assumes bash, but containers are usually thinner.
+@six.python_2_unicode_compatible
class ContainerDescription( object ):
def __init__(
@@ -186,6 +187,9 @@ class ContainerDescription( object ):
shell=shell,
)
+ def __str__(self):
+ return "ContainerDescription[identifier=%s,type=%s]" % (self.identifier, self.type)
+
def parse_requirements_from_dict( root_dict ):
requirements = root_dict.get("requirements", [])
diff --git a/lib/galaxy/tools/deps/resolvers/__init__.py b/lib/galaxy/tools/deps/resolvers/__init__.py
index 043d7dd6caa..bb1761740b0 100644
--- a/lib/galaxy/tools/deps/resolvers/__init__.py
+++ b/lib/galaxy/tools/deps/resolvers/__init__.py
@@ -19,7 +19,7 @@ class DependencyResolver(Dictifiable, object):
"""Abstract description of a technique for resolving container images for tool execution."""
# Keys for dictification.
- dict_collection_visible_keys = ['resolver_type', 'resolves_simple_dependencies']
+ dict_collection_visible_keys = ['resolver_type', 'resolves_simple_dependencies', 'can_uninstall_dependencies']
# A "simple" dependency is one that does not depend on the the tool
# resolving the dependency. Classic tool shed dependencies are non-simple
# because the repository install context is used in dependency resolution
@@ -27,6 +27,7 @@ class DependencyResolver(Dictifiable, object):
# resolution.
disabled = False
resolves_simple_dependencies = True
+ can_uninstall_dependencies = False
config_options = {}
@abstractmethod
@@ -47,8 +48,17 @@ class MultipleDependencyResolver:
"""Variant of DependencyResolver that can optionally resolve multiple dependencies together."""
@abstractmethod
- def resolve_all( self, requirements, **kwds ):
- """Given multiple requirements yield Dependency objects if and only if they may all be resolved together.
+ def resolve_all(self, requirements, **kwds):
+ """
+ Given multiple requirements yields a list of Dependency objects if and only if they may all be resolved together.
+
+ Unsuccessfull attempts should return an empty list.
+
+ :param requirements: list of tool requirements
+ :param type: [ToolRequirement] or ToolRequirements
+
+ :returns: list of resolved dependencies
+ :rtype: [Dependency]
"""
diff --git a/lib/galaxy/tools/deps/resolvers/conda.py b/lib/galaxy/tools/deps/resolvers/conda.py
index c77b0d96cf9..a74b219541e 100644
--- a/lib/galaxy/tools/deps/resolvers/conda.py
+++ b/lib/galaxy/tools/deps/resolvers/conda.py
@@ -55,10 +55,12 @@ class CondaDependencyResolver(DependencyResolver, MultipleDependencyResolver, Li
'auto_install': False,
'auto_init': True,
'copy_dependencies': False,
+ 'use_local': False,
}
_specification_pattern = re.compile(r"https\:\/\/anaconda.org\/\w+\/\w+")
def __init__(self, dependency_manager, **kwds):
+ self.can_uninstall_dependencies = True
self._setup_mapping(dependency_manager, **kwds)
self.versionless = _string_as_bool(kwds.get('versionless', 'false'))
self.dependency_manager = dependency_manager
@@ -83,6 +85,7 @@ class CondaDependencyResolver(DependencyResolver, MultipleDependencyResolver, Li
)
copy_dependencies = _string_as_bool(get_option("copy_dependencies"))
+ use_local = _string_as_bool(get_option("use_local"))
conda_exec = get_option("exec")
debug = _string_as_bool(get_option("debug"))
ensure_channels = get_option("ensure_channels")
@@ -101,7 +104,8 @@ class CondaDependencyResolver(DependencyResolver, MultipleDependencyResolver, Li
ensure_channels=ensure_channels,
condarc_override=condarc_override,
use_path_exec=use_path_exec,
- copy_dependencies=copy_dependencies
+ copy_dependencies=copy_dependencies,
+ use_local=use_local,
)
self.ensure_channels = ensure_channels
@@ -110,12 +114,33 @@ class CondaDependencyResolver(DependencyResolver, MultipleDependencyResolver, Li
self.auto_init = _string_as_bool(get_option("auto_init"))
self.conda_context = conda_context
self.disabled = not galaxy.tools.deps.installable.ensure_installed(conda_context, install_conda, self.auto_init)
+ if self.auto_init and not self.disabled:
+ self.conda_context.ensure_conda_build_installed_if_needed()
self.auto_install = auto_install
self.copy_dependencies = copy_dependencies
def clean(self, **kwds):
return self.conda_context.exec_clean()
+ def uninstall(self, requirements):
+ """Uninstall requirements installed by install_all or multiple install statements."""
+ all_resolved = [r for r in self.resolve_all(requirements) if r.dependency_type]
+ if not all_resolved:
+ all_resolved = [self.resolve(requirement) for requirement in requirements]
+ all_resolved = [r for r in all_resolved if r.dependency_type]
+ if not all_resolved:
+ return None
+ environments = set([os.path.basename(dependency.environment_path) for dependency in all_resolved])
+ return_codes = [self.conda_context.exec_remove([env]) for env in environments]
+ final_return_code = 0
+ for env, return_code in zip(environments, return_codes):
+ if return_code == 0:
+ log.debug("Conda environment '%s' successfully removed." % env)
+ else:
+ log.debug("Conda environment '%s' could not be removed." % env)
+ final_return_code = return_code
+ return final_return_code
+
def install_all(self, conda_targets):
env = self.merged_environment_name(conda_targets)
return_code = install_conda_targets(conda_targets, env, conda_context=self.conda_context)
@@ -132,15 +157,30 @@ class CondaDependencyResolver(DependencyResolver, MultipleDependencyResolver, Li
return is_installed
def resolve_all(self, requirements, **kwds):
+ """
+ Some combinations of tool requirements need to be resolved all at once, so that Conda can select a compatible
+ combination of dependencies. This method returns a list of MergedCondaDependency instances (one for each requirement)
+ if all requirements have been successfully resolved, or an empty list if any of the requirements could not be resolved.
+
+ Parameters specific to this resolver are:
+
+ preserve_python_environment: Boolean, controls whether the python environment should be maintained during job creation for tools
+ that rely on galaxy being importable.
+
+ install: Controls if `requirements` should be installed. If `install` is True and the requirements are not installed
+ an attempt is made to install the requirements. If `install` is None requirements will only be installed if
+ `conda_auto_install` has been activated and the requirements are not yet installed. If `install` is
+ False will not install requirements.
+ """
if len(requirements) == 0:
- return False
+ return []
if not os.path.isdir(self.conda_context.conda_prefix):
- return False
+ return []
for requirement in requirements:
if requirement.type != "package":
- return False
+ return []
ToolRequirements = galaxy.tools.deps.requirements.ToolRequirements
expanded_requirements = ToolRequirements([self._expand_requirement(r) for r in requirements])
@@ -232,7 +272,7 @@ class CondaDependencyResolver(DependencyResolver, MultipleDependencyResolver, Li
if job_directory:
conda_environment = os.path.join(job_directory, conda_env)
else:
- conda_environment = None
+ conda_environment = self.conda_context.env_path(conda_target.install_environment)
return CondaDependency(
self.conda_context,
diff --git a/lib/galaxy/tools/deps/views.py b/lib/galaxy/tools/deps/views.py
index a0b611cc769..0b5c23e3d54 100644
--- a/lib/galaxy/tools/deps/views.py
+++ b/lib/galaxy/tools/deps/views.py
@@ -55,6 +55,22 @@ class DependencyResolversView(object):
dependencies_per_tool = {tool: self._dependency_manager.requirements_to_dependencies(requirements, **kwds) for tool, requirements in tool_requirements_d.items()}
return dependencies_per_tool
+ def uninstall_dependencies(self, index=None, **payload):
+ """Attempt to uninstall requirements. Returns 0 if successfull, else None."""
+ requirements = payload.get('requirements')
+ if not requirements:
+ return None
+ if index:
+ resolver = self._dependency_resolvers[index]
+ if resolver.can_uninstall_dependencies:
+ return resolver.uninstall(requirements)
+ else:
+ for index in self.uninstallable_resolvers:
+ return_code = self._dependency_resolvers[index].uninstall(requirements)
+ if return_code == 0:
+ return return_code
+ return None
+
def install_dependencies(self, requirements):
return self._dependency_manager._requirements_to_dependencies_dict(requirements, **{'install': True})
@@ -134,10 +150,17 @@ class DependencyResolversView(object):
@property
def installable_resolvers(self):
"""
- List index for all active resolvers that have the 'install_dependency' attribute
+ List index for all active resolvers that have the 'install_dependency' attribute.
"""
return [index for index, resolver in enumerate(self._dependency_resolvers) if hasattr(resolver, "install_dependency") and not resolver.disabled ]
+ @property
+ def uninstallable_resolvers(self):
+ """
+ List index for all active resolvers that can uninstall dependencies that have been installed through this resolver.
+ """
+ return [index for index, resolver in enumerate(self._dependency_resolvers) if resolver.can_uninstall_dependencies and not resolver.disabled]
+
def get_requirements_status(self, tool_requirements_d, installed_tool_dependencies=None):
dependencies = self.show_dependencies(tool_requirements_d, installed_tool_dependencies)
# dependencies is a dict keyed on tool_ids, value is a ToolRequirements object for that tool.
diff --git a/lib/galaxy/tools/fetcher.py b/lib/galaxy/tools/fetcher.py
new file mode 100644
index 00000000000..3466c1a5212
--- /dev/null
+++ b/lib/galaxy/tools/fetcher.py
@@ -0,0 +1,25 @@
+from galaxy.util import plugin_config
+
+
+class ToolLocationFetcher(object):
+
+ def __init__(self):
+ self.resolver_classes = self.__resolvers_dict()
+
+ def __resolvers_dict( self ):
+ import galaxy.tools.locations
+ return plugin_config.plugins_dict(galaxy.tools.locations, 'scheme')
+
+ def to_tool_path(self, path_or_uri_like, **kwds):
+ if "://" not in path_or_uri_like:
+ path = path_or_uri_like
+ else:
+ uri_like = path_or_uri_like
+ if ":" not in path_or_uri_like:
+ raise Exception("Invalid URI passed to get_tool_source")
+ scheme, rest = uri_like.split(":", 2)
+ if scheme not in self.resolver_classes:
+ raise Exception("Unknown tool scheme [%s] for URI [%s]" % (scheme, uri_like))
+ path = self.resolver_classes[scheme]().get_tool_source_path(uri_like)
+
+ return path
diff --git a/lib/galaxy/tools/filter_failed_collection.xml b/lib/galaxy/tools/filter_failed_collection.xml
index fb0969f6831..6b386b971d4 100644
--- a/lib/galaxy/tools/filter_failed_collection.xml
+++ b/lib/galaxy/tools/filter_failed_collection.xml
@@ -34,12 +34,13 @@
-
- This tool takes a list dataset collection and filters out the failed
- datasets from it. This is useful for continuing a multi-sample analysis
- when one of more of the samples fails at some point.
+
+This tool takes a list dataset collection and filters out datasets in the failed state. This is useful for continuing a multi-sample analysis when one of more of the samples fails at some point.
+
+.. class:: infomark
+
+This tool will create new history datasets from your collection but your quota usage will not increase.
+
+ ]]>
diff --git a/lib/galaxy/tools/flatten_collection.xml b/lib/galaxy/tools/flatten_collection.xml
index 279fd4a8586..2645f702432 100644
--- a/lib/galaxy/tools/flatten_collection.xml
+++ b/lib/galaxy/tools/flatten_collection.xml
@@ -44,13 +44,13 @@
-
- This tool takes nested collections such as a list of lists or a list of
- dataset pairs - and produces a flat list from the inputs. The collection
- identifiers are merged together to create new collection identifiers in
- the flattened result.
+
+This tool takes nested collections such as a list of lists or a list of dataset pairs - and produces a flat list from the inputs. The collection identifiers are merged together to create new collection identifiers in the flattened result.
+
+.. class:: infomark
+
+This tool will create new history datasets from your collection but your quota usage will not increase.
+
+ ]]>
diff --git a/lib/galaxy/tools/loader_directory.py b/lib/galaxy/tools/loader_directory.py
index bf78802d480..642f3d5ca9a 100644
--- a/lib/galaxy/tools/loader_directory.py
+++ b/lib/galaxy/tools/loader_directory.py
@@ -119,7 +119,7 @@ def is_tool_load_error(obj):
return obj is TOOL_LOAD_ERROR
-def looks_like_a_tool(path, invalid_names=[], enable_beta_formats=False):
+def looks_like_a_tool(path_or_uri_like, invalid_names=[], enable_beta_formats=False):
"""Quick check to see if a file looks like it may be a tool file.
Whether true in a strict sense or not, lets say the intention and
@@ -130,6 +130,11 @@ def looks_like_a_tool(path, invalid_names=[], enable_beta_formats=False):
invalid_names may be supplied in the context of the tool shed to quickly
rule common tool shed XML files.
"""
+ path = resolved_path(path_or_uri_like)
+ if path is UNRESOLVED_URI:
+ # Assume the path maps to a real tool.
+ return True
+
looks = False
if os.path.basename(path) in invalid_names:
@@ -222,7 +227,12 @@ def looks_like_a_tool_cwl(path):
return looks_like_a_cwl_artifact(path, classes=["CommandLineTool", "ExpressionTool"])
-def _find_tool_files(path, recursive, enable_beta_formats):
+def _find_tool_files(path_or_uri_like, recursive, enable_beta_formats):
+ path = resolved_path(path_or_uri_like)
+ if path is UNRESOLVED_URI:
+ # Pass the URI through and assume it maps to a real tool.
+ return [path_or_uri_like]
+
is_file = not os.path.isdir(path)
if not os.path.exists(path):
raise Exception(PATH_DOES_NOT_EXIST_ERROR)
@@ -261,6 +271,19 @@ def _find_files(directory, pattern='*'):
return matches
+UNRESOLVED_URI = object()
+
+
+def resolved_path(path_or_uri_like):
+ """If this is a simple file path, return the path else UNRESOLVED_URI."""
+ if "://" not in path_or_uri_like:
+ return path_or_uri_like
+ elif path_or_uri_like.startswith("file://"):
+ return path_or_uri_like[len("file://"):]
+ else:
+ return UNRESOLVED_URI
+
+
BETA_TOOL_CHECKERS = {
'yaml': looks_like_a_tool_yaml,
'cwl': looks_like_a_tool_cwl,
diff --git a/lib/galaxy/tools/locations/__init__.py b/lib/galaxy/tools/locations/__init__.py
new file mode 100644
index 00000000000..91b7a6f9f87
--- /dev/null
+++ b/lib/galaxy/tools/locations/__init__.py
@@ -0,0 +1,29 @@
+import os
+import tempfile
+
+from abc import (
+ ABCMeta,
+ abstractmethod,
+ abstractproperty,
+)
+
+import six
+
+
+@six.add_metaclass(ABCMeta)
+class ToolLocationResolver(object):
+ """Parse a URI-like string and return a ToolSource object."""
+
+ @abstractproperty
+ def scheme(self):
+ """Short label for the type of location resolver and URI scheme."""
+
+ @abstractmethod
+ def get_tool_source_path(self, uri_like):
+ """Return a local path for the uri_like string."""
+
+ def _temp_path(self, uri_like):
+ """Create an abstraction for this so we can configure and cache later."""
+ handle, filename = tempfile.mkstemp(suffix=uri_like.split("/")[-1])
+ os.close(handle)
+ return filename
diff --git a/lib/galaxy/tools/locations/dockstore.py b/lib/galaxy/tools/locations/dockstore.py
new file mode 100644
index 00000000000..b379c23c38f
--- /dev/null
+++ b/lib/galaxy/tools/locations/dockstore.py
@@ -0,0 +1,69 @@
+try:
+ import requests
+except ImportError:
+ requests = None
+import yaml
+
+from six.moves.urllib.parse import quote
+
+from ..locations import (
+ ToolLocationResolver,
+)
+
+
+class DockStoreResolver(ToolLocationResolver):
+
+ scheme = "dockstore"
+
+ def get_tool_source_path(self, uri_like):
+ assert uri_like.startswith("dockstore://")
+ tool_id = uri_like[len("dockstore://"):]
+ if ":" in tool_id:
+ tool_id, version = tool_id.split(":", 1)
+ else:
+ tool_id, version = tool_id, "latest"
+ tmp_path = self._temp_path(uri_like + ".cwl")
+ cwl_str = _Ga4ghToolClient().get_tool_cwl(tool_id, version=version, as_string=True)
+ with open(tmp_path, "wb") as f:
+ f.write(cwl_str)
+ return tmp_path
+
+
+class _Ga4ghToolClient(object):
+
+ def __init__(self, base_url="https://www.dockstore.org:8443/api"):
+ self.base_url = base_url
+
+ def get_tools(self):
+ return self._requests.get("%s/ga4gh/v1/tools" % self.base_url)
+
+ def get_tool(self, tool_id):
+ url = "%s/ga4gh/v1/tools/%s" % (self.base_url, quote(tool_id, safe=''))
+ return self._requests.get(url)
+
+ def get_tool_version(self, tool_id, version="latest"):
+ url = "%s/ga4gh/v1/tools/%s/versions/%s" % (self.base_url, quote(tool_id, safe=''), version)
+ return self._requests.get(url)
+
+ def get_tool_descriptor(self, tool_id, version="latest", tool_type="CWL"):
+ url = "%s/ga4gh/v1/tools/%s/versions/%s/%s/descriptor" % (self.base_url, quote(tool_id, safe=''), version, tool_type)
+ return self._requests.get(url)
+
+ def get_tool_cwl(self, tool_id, version="latest", as_string=False):
+ tool_type = "CWL"
+ url = "%s/ga4gh/v1/tools/%s/versions/%s/%s/descriptor" % (self.base_url, quote(tool_id, safe=''), version, tool_type)
+ descriptor_response = self._requests.get(url)
+ descriptor_str = descriptor_response.json()["descriptor"]
+ if as_string:
+ return descriptor_str
+ else:
+ return yaml.load(descriptor_str)
+
+ @property
+ def _requests(self):
+ if requests is None:
+ raise Exception("requests Python library needs to be installed use GA4GH APIs")
+ return requests
+
+
+__all__ = ("DockStoreResolver",)
diff --git a/lib/galaxy/tools/locations/file.py b/lib/galaxy/tools/locations/file.py
new file mode 100644
index 00000000000..3d25769783a
--- /dev/null
+++ b/lib/galaxy/tools/locations/file.py
@@ -0,0 +1,12 @@
+from ..locations import (
+ ToolLocationResolver,
+)
+
+
+class HttpToolResolver(ToolLocationResolver):
+
+ scheme = "file"
+
+ def get_tool_source_path(self, uri_like):
+ assert uri_like.startswith("file://")
+ return uri_like[len("file://"):]
diff --git a/lib/galaxy/tools/locations/http.py b/lib/galaxy/tools/locations/http.py
new file mode 100644
index 00000000000..d03ef3854da
--- /dev/null
+++ b/lib/galaxy/tools/locations/http.py
@@ -0,0 +1,26 @@
+from galaxy.util import download_to_file
+
+from ..locations import (
+ ToolLocationResolver,
+)
+
+
+class HttpToolResolver(ToolLocationResolver):
+
+ scheme = "http"
+
+ def __init__(self, **kwds):
+ pass
+
+ def get_tool_source_path(self, uri_like):
+ tmp_path = self._temp_path(uri_like)
+ download_to_file(uri_like, tmp_path)
+ return tmp_path
+
+
+class HttpsToolResolver(HttpToolResolver):
+
+ scheme = "https"
+
+
+__all__ = ("HttpToolResolver", "HttpsToolResolver")
diff --git a/lib/galaxy/tools/merge_collection.xml b/lib/galaxy/tools/merge_collection.xml
index c6f44b4aa9a..7ecd7a49ea3 100644
--- a/lib/galaxy/tools/merge_collection.xml
+++ b/lib/galaxy/tools/merge_collection.xml
@@ -270,10 +270,13 @@
-
- This tool takes two list and creates a single unified list.
+
+.. class:: infomark
+
+This tool will create new history datasets for your collection but your quota usage will not increase.
+
+ ]]>
diff --git a/lib/galaxy/tools/parameters/basic.py b/lib/galaxy/tools/parameters/basic.py
index 0c9a2005eec..a7f2617b1a0 100644
--- a/lib/galaxy/tools/parameters/basic.py
+++ b/lib/galaxy/tools/parameters/basic.py
@@ -2,7 +2,6 @@
Basic tool parameters.
"""
import logging
-import numbers
import os
import os.path
import re
@@ -131,8 +130,6 @@ class ToolParameter( object, Dictifiable ):
def to_python( self, value, app ):
"""Convert a value created with to_json back to an object representation"""
- if isinstance( value, numbers.Number ):
- return unicodify( value )
return value
def value_to_basic( self, value, app, use_security=False ):
@@ -1767,8 +1764,13 @@ class DataToolParameter( BaseDataToolParameter ):
multiple = self.multiple
# build and append a new select option
- def append( list, id, hid, name, src, keep=False ):
- return list.append( { 'id' : trans.security.encode_id( id ), 'hid' : hid, 'name' : name, 'src' : src, 'keep': keep } )
+ def append( list, hda, name, src, keep=False ):
+ return list.append( { 'id' : trans.security.encode_id( hda.id ),
+ 'hid' : hda.hid,
+ 'name' : name,
+ 'tags' : [ t.user_tname if not t.value else "%s:%s" % (t.user_tname, t.value) for t in hda.tags ],
+ 'src' : src,
+ 'keep' : keep } )
# add datasets
visible_hda = other_values.get( self.name )
@@ -1779,7 +1781,7 @@ class DataToolParameter( BaseDataToolParameter ):
m = match.hda
has_matched = has_matched or visible_hda == m or visible_hda == hda
m_name = '%s (as %s)' % ( match.original_hda.name, match.target_ext ) if match.implicit_conversion else m.name
- append( d[ 'options' ][ 'hda' ], m.id, m.hid, m_name, 'hda' )
+ append( d[ 'options' ][ 'hda' ], m, m_name, 'hda' )
if not has_matched and hasattr( visible_hda, 'hid' ):
if visible_hda.deleted:
hda_state = 'deleted'
@@ -1787,13 +1789,13 @@ class DataToolParameter( BaseDataToolParameter ):
hda_state = 'hidden'
else:
hda_state = 'unavailable'
- append( d[ 'options' ][ 'hda' ], visible_hda.id, visible_hda.hid, '(%s) %s' % ( hda_state, visible_hda.name ), 'hda', True )
+ append( d[ 'options' ][ 'hda' ], visible_hda, '(%s) %s' % ( hda_state, visible_hda.name ), 'hda', True )
# add dataset collections
dataset_collection_matcher = DatasetCollectionMatcher( dataset_matcher )
for hdca in history.active_dataset_collections:
if dataset_collection_matcher.hdca_match( hdca, reduction=multiple ):
- append( d[ 'options' ][ 'hdca' ], hdca.id, hdca.hid, hdca.name, 'hdca' )
+ append( d[ 'options' ][ 'hdca' ], hdca, hdca.name, 'hdca' )
# sort both lists
d['options']['hda'] = sorted(d['options']['hda'], key=lambda k: k['hid'], reverse=True)
@@ -1920,20 +1922,22 @@ class DataCollectionToolParameter( BaseDataToolParameter ):
# append directly matched collections
for hdca in self.match_collections( trans, history, dataset_matcher ):
d['options']['hdca'].append({
- 'id': trans.security.encode_id( hdca.id ),
- 'hid': hdca.hid,
- 'name': hdca.name,
- 'src': 'hdca'
+ 'id' : trans.security.encode_id( hdca.id ),
+ 'hid' : hdca.hid,
+ 'name' : hdca.name,
+ 'src' : 'hdca',
+ 'tags' : [ t.user_tname if not t.value else "%s:%s" % (t.user_tname, t.value) for t in hdca.tags ]
})
# append matching subcollections
for hdca in self.match_multirun_collections( trans, history, dataset_matcher ):
subcollection_type = self._history_query( trans ).can_map_over( hdca ).collection_type
d['options']['hdca'].append({
- 'id': trans.security.encode_id( hdca.id ),
- 'hid': hdca.hid,
- 'name': hdca.name,
- 'src': 'hdca',
+ 'id' : trans.security.encode_id( hdca.id ),
+ 'hid' : hdca.hid,
+ 'name' : hdca.name,
+ 'src' : 'hdca',
+ 'tags' : [ t.user_tname if not t.value else "%s:%s" % (t.user_tname, t.value) for t in hdca.tags ],
'map_over_type': subcollection_type
})
diff --git a/lib/galaxy/tools/parser/cwl.py b/lib/galaxy/tools/parser/cwl.py
index 65c33d80146..a981bafdb07 100644
--- a/lib/galaxy/tools/parser/cwl.py
+++ b/lib/galaxy/tools/parser/cwl.py
@@ -18,16 +18,17 @@ log = logging.getLogger(__name__)
class CwlToolSource(ToolSource):
- def __init__(self, tool_file):
+ def __init__(self, tool_file, strict_cwl_validation=True):
self._cwl_tool_file = tool_file
self._id, _ = os.path.splitext(os.path.basename(tool_file))
self._tool_proxy = None
self._source_path = tool_file
+ self._strict_cwl_validation = strict_cwl_validation
@property
def tool_proxy(self):
if self._tool_proxy is None:
- self._tool_proxy = tool_proxy(self._source_path)
+ self._tool_proxy = tool_proxy(self._source_path, strict_cwl_validation=self._strict_cwl_validation)
return self._tool_proxy
def parse_tool_type(self):
@@ -95,7 +96,7 @@ class CwlToolSource(ToolSource):
return "0.0.1"
def parse_description(self):
- return ""
+ return self.tool_proxy.description()
def parse_input_pages(self):
page_source = CwlPageSource(self.tool_proxy)
diff --git a/lib/galaxy/tools/parser/factory.py b/lib/galaxy/tools/parser/factory.py
index d38949f8498..69a5dbd7477 100644
--- a/lib/galaxy/tools/parser/factory.py
+++ b/lib/galaxy/tools/parser/factory.py
@@ -13,10 +13,12 @@ from .interface import InputSource
from .xml import XmlInputSource, XmlToolSource
from .yaml import YamlToolSource
+from ..fetcher import ToolLocationFetcher
+
log = logging.getLogger(__name__)
-def get_tool_source(config_file=None, xml_tree=None, enable_beta_formats=True):
+def get_tool_source(config_file=None, xml_tree=None, enable_beta_formats=True, tool_location_fetcher=None):
"""Return a ToolSource object corresponding to supplied source.
The supplied source may be specified as a file path (using the config_file
@@ -27,6 +29,10 @@ def get_tool_source(config_file=None, xml_tree=None, enable_beta_formats=True):
elif config_file is None:
raise ValueError("get_tool_source called with invalid config_file None.")
+ if tool_location_fetcher is None:
+ tool_location_fetcher = ToolLocationFetcher()
+
+ config_file = tool_location_fetcher.to_tool_path(config_file)
if not enable_beta_formats:
tree = load_tool_xml(config_file)
return XmlToolSource(tree, source_path=config_file)
diff --git a/lib/galaxy/tools/search/__init__.py b/lib/galaxy/tools/search/__init__.py
index 2e30f5d7845..489bc4d125f 100644
--- a/lib/galaxy/tools/search/__init__.py
+++ b/lib/galaxy/tools/search/__init__.py
@@ -49,8 +49,9 @@ class ToolBoxSearch( object ):
self.build_index( index_help )
def build_index( self, index_help=True ):
- # Works around https://bitbucket.org/mchaput/whoosh/issues/391/race-conditions-with-temp-storage
+ """Prepare search index for tools loaded in toolbox."""
RamStorage.temp_storage = _temp_storage
+ # Works around https://bitbucket.org/mchaput/whoosh/issues/391/race-conditions-with-temp-storage
self.storage = RamStorage()
self.index = self.storage.create_index( self.schema )
writer = self.index.writer()
@@ -66,16 +67,15 @@ class ToolBoxSearch( object ):
"section": to_unicode( tool.get_panel_section()[1] if len( tool.get_panel_section() ) == 2 else '' ),
"help": to_unicode( "" )
}
- # Hyphens are wildcards in Whoosh causing bad things
if tool.name.find( '-' ) != -1:
+ # Hyphens are wildcards in Whoosh causing bad things
add_doc_kwds['name'] = (' ').join( [ token.text for token in self.rex( to_unicode( tool.name ) ) ] )
else:
add_doc_kwds['name'] = to_unicode( tool.name )
- # We do not want to search Tool Shed or version parts
- # of the long ids
- if id.find( '/' ) != -1:
- slash_indexes = [ m.start() for m in re.finditer( '/', id ) ]
- id_stub = id[ ( slash_indexes[1] + 1 ): slash_indexes[4] ]
+ if tool.guid:
+ # Create a stub consisting of owner, repo, and tool from guid
+ slash_indexes = [ m.start() for m in re.finditer( '/', tool.guid ) ]
+ id_stub = tool.guid[ ( slash_indexes[1] + 1 ): slash_indexes[4] ]
add_doc_kwds['stub'] = (' ').join( [ token.text for token in self.rex( to_unicode( id_stub ) ) ] )
else:
add_doc_kwds['stub'] = to_unicode( id )
diff --git a/lib/galaxy/tools/toolbox/base.py b/lib/galaxy/tools/toolbox/base.py
index 402e490bb47..28a73fa4ab0 100644
--- a/lib/galaxy/tools/toolbox/base.py
+++ b/lib/galaxy/tools/toolbox/base.py
@@ -79,7 +79,13 @@ class AbstractToolBox( Dictifiable, ManagesIntegratedToolPanelMixin, object ):
if tool_conf_watcher:
self._tool_conf_watcher = tool_conf_watcher # Avoids (re-)starting threads in uwsgi
else:
- self._tool_conf_watcher = get_tool_conf_watcher(lambda: self.handle_reload_toolbox())
+ if hasattr(self.app, 'tool_cache'):
+ # Normal galaxy instances should have a tool_cache,
+ # but the toolshed does not.
+ tool_cache = self.app.tool_cache
+ else:
+ tool_cache = None
+ self._tool_conf_watcher = get_tool_conf_watcher(reload_callback=lambda: self.handle_reload_toolbox(), tool_cache=tool_cache)
self._filter_factory = FilterFactory( self )
self._tool_tag_manager = tool_tag_manager( app )
self._init_tools_from_configs( config_filenames )
diff --git a/lib/galaxy/tools/toolbox/cache.py b/lib/galaxy/tools/toolbox/cache.py
index 2c2968ad12e..22b1fc882c6 100644
--- a/lib/galaxy/tools/toolbox/cache.py
+++ b/lib/galaxy/tools/toolbox/cache.py
@@ -1,3 +1,6 @@
+import os
+
+from galaxy.util.hash_util import md5_hash_file
class ToolCache(object):
@@ -7,8 +10,42 @@ class ToolCache(object):
"""
def __init__(self):
+ self._hash_by_tool_paths = {}
self._tools_by_path = {}
self._tool_paths_by_id = {}
+ self._mod_time_by_path = {}
+
+ def cleanup(self):
+ """
+ Remove uninstalled tools from tool cache if they are not on disk anymore or if their content has changed.
+
+ Returns list of tool_ids that have been removed.
+ """
+ removed_tool_ids = []
+ try:
+ paths_to_cleanup = {path: tool.all_ids for path, tool in self._tools_by_path.items() if self._should_cleanup(path)}
+ for config_filename, tool_ids in paths_to_cleanup.items():
+ del self._hash_by_tool_paths[config_filename]
+ del self._tools_by_path[config_filename]
+ for tool_id in tool_ids:
+ if tool_id in self._tool_paths_by_id:
+ del self._tool_paths_by_id[tool_id]
+ removed_tool_ids.extend(tool_ids)
+ except Exception:
+ # If by chance the file is being removed while calculating the hash or modtime
+ # we don't want the thread to die.
+ pass
+ return removed_tool_ids
+
+ def _should_cleanup(self, config_filename):
+ """Return True if `config_filename` does not exist or if modtime and hash have changes, else return False."""
+ if not os.path.exists(config_filename):
+ return True
+ new_mtime = os.path.getmtime(config_filename)
+ if self._mod_time_by_path.get(config_filename) < new_mtime:
+ if md5_hash_file(config_filename) != self._hash_by_tool_paths.get(config_filename):
+ return True
+ return False
def get_tool(self, config_filename):
""" Get the tool from the cache if the tool is up to date.
@@ -18,10 +55,15 @@ class ToolCache(object):
def expire_tool(self, tool_id):
if tool_id in self._tool_paths_by_id:
config_filename = self._tool_paths_by_id[tool_id]
+ del self._hash_by_tool_paths[config_filename]
del self._tool_paths_by_id[tool_id]
del self._tools_by_path[config_filename]
+ del self._mod_time_by_path[config_filename]
def cache_tool(self, config_filename, tool):
+ tool_hash = md5_hash_file(config_filename)
tool_id = str( tool.id )
+ self._hash_by_tool_paths[config_filename] = tool_hash
+ self._mod_time_by_path[config_filename] = os.path.getmtime(config_filename)
self._tool_paths_by_id[tool_id] = config_filename
self._tools_by_path[config_filename] = tool
diff --git a/lib/galaxy/tools/toolbox/watcher.py b/lib/galaxy/tools/toolbox/watcher.py
index 264d8d85e5a..cbd9fa75a4f 100644
--- a/lib/galaxy/tools/toolbox/watcher.py
+++ b/lib/galaxy/tools/toolbox/watcher.py
@@ -15,7 +15,7 @@ except ImportError:
can_watch = False
from galaxy.util.hash_util import md5_hash_file
-from galaxy.util.postfork import register_postfork_function
+from galaxy.web.stack import register_postfork_function
log = logging.getLogger( __name__ )
@@ -48,8 +48,8 @@ def get_observer_class(config_value, default, monitor_what_str):
return observer_class
-def get_tool_conf_watcher(reload_callback):
- return ToolConfWatcher(reload_callback)
+def get_tool_conf_watcher(reload_callback, tool_cache=None):
+ return ToolConfWatcher(reload_callback=reload_callback, tool_cache=tool_cache)
def get_tool_data_dir_watcher(tool_data_tables, config):
@@ -73,8 +73,9 @@ def get_tool_watcher(toolbox, config):
class ToolConfWatcher(object):
- def __init__(self, reload_callback):
+ def __init__(self, reload_callback, tool_cache=None):
self.paths = {}
+ self.cache = tool_cache
self._active = False
self._lock = threading.Lock()
self.thread = threading.Thread(target=self.check, name="ToolConfWatcher.thread")
@@ -92,6 +93,7 @@ class ToolConfWatcher(object):
self.thread.join()
def check(self):
+ """Check for changes in self.paths or self.cache and call the event handler."""
hashes = { key: None for key in self.paths.keys() }
while self._active:
do_reload = False
@@ -113,7 +115,10 @@ class ToolConfWatcher(object):
hashes[path] = new_hash
log.debug("The file '%s' has changes.", path)
do_reload = True
-
+ if not do_reload and self.cache:
+ removed_ids = self.cache.cleanup()
+ if removed_ids:
+ do_reload = True
if do_reload:
with self._lock:
t = threading.Thread(target=self.event_handler.on_any_event)
diff --git a/lib/galaxy/tools/unzip_collection.xml b/lib/galaxy/tools/unzip_collection.xml
index 159589a0468..decfd1f30de 100644
--- a/lib/galaxy/tools/unzip_collection.xml
+++ b/lib/galaxy/tools/unzip_collection.xml
@@ -12,12 +12,19 @@
-
- This tool takes a paired dataset collection and builds two datasets
- from it. If mapped over a list of paired datasets, this tool will
- produce two lists of datasets.
+
+This tool takes a paired dataset collection and builds two datasets from it. If mapped over a list of paired datasets, this tool will produce two lists of datasets.
+
+----
+
+**Example**
+
+If a collection consists of two forward and two reverse datasets (e.g., forward and reverse reads from a sequencing experiment) this tool will output two collections: one consisting of forward reads and one of reverse reads.
+
+.. class:: infomark
+
+This tool will create new history datasets from your collection but your quota usage will not increase.
+
+ ]]>
diff --git a/lib/galaxy/tools/xsd/galaxy.xsd b/lib/galaxy/tools/xsd/galaxy.xsd
index 96f9f9289a2..6138f86a4e3 100644
--- a/lib/galaxy/tools/xsd/galaxy.xsd
+++ b/lib/galaxy/tools/xsd/galaxy.xsd
@@ -356,6 +356,10 @@ Read more about configuring Galaxy to run Docker jobs
diff --git a/lib/galaxy/tools/zip_collection.xml b/lib/galaxy/tools/zip_collection.xml
index 2eb6be3e8c2..70ce0841a45 100644
--- a/lib/galaxy/tools/zip_collection.xml
+++ b/lib/galaxy/tools/zip_collection.xml
@@ -15,12 +15,19 @@
-
- This tool takes two datasets and creates a dataset pair from
- them. Mapping over two lists, this tool can be used to build
- a list of dataset pairs from two individual lists of datasets.
+
+.. class:: infomark
+
+This tool will create new history datasets for your collection but your quota usage will not increase.
+
+ ]]>
diff --git a/lib/galaxy/util/json.py b/lib/galaxy/util/json.py
index 2f38b96ccc8..6bd11fc73fd 100644
--- a/lib/galaxy/util/json.py
+++ b/lib/galaxy/util/json.py
@@ -56,10 +56,13 @@ def swap_inf_nan( val ):
def safe_loads( arg ):
"""
This is a wrapper around loads that returns the parsed value instead of
- raising a value error.
+ raising a value error. It also avoids autoconversion of non-iterables
+ i.e numeric and boolean values.
"""
try:
loaded = json.loads( arg )
+ if loaded is not None and not isinstance( loaded, collections.Iterable ):
+ loaded = arg
except ( TypeError, ValueError ):
loaded = arg
return loaded
diff --git a/lib/galaxy/util/postfork.py b/lib/galaxy/util/postfork.py
deleted file mode 100644
index 8cb7c86adec..00000000000
--- a/lib/galaxy/util/postfork.py
+++ /dev/null
@@ -1,43 +0,0 @@
-"""
-Handle postfork functions under uWSGI
-"""
-
-# The uwsgi module is automatically injected by the parent uwsgi
-# process and only exists that way. If anything works, this is a
-# uwsgi-managed process.
-try:
- import uwsgi
- if hasattr(uwsgi, "numproc"):
- process_is_uwsgi = True
- else:
- process_is_uwsgi = False
-except ImportError:
- # This is not a uwsgi process, or something went horribly wrong.
- process_is_uwsgi = False
-
-try:
- from uwsgidecorators import postfork
-except:
- def pf_dec(func):
- return func
- postfork = pf_dec
- if process_is_uwsgi:
- print("WARNING: This is a uwsgi process but the uwsgidecorators library"
- " is unavailable. This is likely due to using an external (not"
- " in Galaxy's virtualenv) uwsgi and you may experience errors.")
-
-
-postfork_functions = []
-
-
-@postfork
-def do_postfork():
- for f, args, kwargs in [ t for t in postfork_functions ]:
- f(*args, **kwargs)
-
-
-def register_postfork_function(f, *args, **kwargs):
- if process_is_uwsgi:
- postfork_functions.append((f, args, kwargs))
- else:
- f(*args, **kwargs)
diff --git a/lib/galaxy/visualization/plugins/plugin.py b/lib/galaxy/visualization/plugins/plugin.py
index 856a2ca7ee2..2406605516b 100644
--- a/lib/galaxy/visualization/plugins/plugin.py
+++ b/lib/galaxy/visualization/plugins/plugin.py
@@ -274,7 +274,16 @@ class InteractiveEnvironmentPlugin( VisualizationPlugin ):
render_vars[ 'plugin_path' ] = os.path.abspath( self.path )
if self.config.get( 'plugin_type', 'visualization' ) == "interactive_environment":
- request = self.INTENV_REQUEST_FACTORY( trans, self )
+ try:
+ request = self.INTENV_REQUEST_FACTORY( trans, self )
+ except:
+ log.exception("IE plugin request handling failed")
+ return trans.fill_template( 'message.mako',
+ message='Loading the interactive environment failed, please contact the {admin_tag} for assistance'.format(
+ admin_tag='Galaxy administrator'.format(
+ admin_mail=trans.app.config.error_email_to)
+ if trans.app.config.error_email_to else 'Galaxy administrator'),
+ status='error')
render_vars[ "ie_request" ] = request
template_filename = self.config[ 'entry_point' ][ 'file' ]
diff --git a/lib/galaxy/web/base/controller.py b/lib/galaxy/web/base/controller.py
index 69ecdec06a0..a15b95047d7 100644
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -10,9 +10,7 @@ from sqlalchemy import true
from paste.httpexceptions import HTTPBadRequest, HTTPInternalServerError
from paste.httpexceptions import HTTPNotImplemented, HTTPRequestRangeNotSatisfiable
-from galaxy.exceptions import ItemAccessibilityException, ItemDeletionException, ItemOwnershipException
-from galaxy.exceptions import MessageException, ToolMissingException
-
+from galaxy import exceptions
from galaxy import web
from galaxy import model
from galaxy import security
@@ -163,7 +161,7 @@ class BaseUIController( BaseController ):
return BaseController.get_object( self, trans, id, class_name,
check_ownership=check_ownership, check_accessible=check_accessible, deleted=deleted )
- except MessageException:
+ except exceptions.MessageException:
raise # handled in the caller
except:
log.exception( "Exception in get_object check for %s %s:" % ( class_name, str( id ) ) )
@@ -177,9 +175,9 @@ class BaseAPIController( BaseController ):
return BaseController.get_object( self, trans, id, class_name,
check_ownership=check_ownership, check_accessible=check_accessible, deleted=deleted )
- except ItemDeletionException as e:
+ except exceptions.ItemDeletionException as e:
raise HTTPBadRequest( detail="Invalid %s id ( %s ) specified: %s" % ( class_name, str( id ), str( e ) ) )
- except MessageException as e:
+ except exceptions.MessageException as e:
raise HTTPBadRequest( detail=e.err_msg )
except Exception as e:
log.exception( "Exception in get_object check for %s %s." % ( class_name, str( id ) ) )
@@ -192,7 +190,7 @@ class BaseAPIController( BaseController ):
def get_id( item, model_class, column ):
try:
return trans.security.decode_id( item )
- except:
+ except Exception:
pass # maybe an email/group name
# this will raise if the item is invalid
return trans.sa_session.query( model_class ).filter( column == item ).first().id
@@ -202,12 +200,12 @@ class BaseAPIController( BaseController ):
for item in util.listify( payload.get( 'in_users', [] ) ):
try:
new_in_users.append( get_id( item, trans.app.model.User, trans.app.model.User.table.c.email ) )
- except:
+ except Exception:
invalid.append( item )
for item in util.listify( payload.get( 'in_groups', [] ) ):
try:
new_in_groups.append( get_id( item, trans.app.model.Group, trans.app.model.Group.table.c.name ) )
- except:
+ except Exception:
invalid.append( item )
if invalid:
msg = "The following value(s) for associated users and/or groups could not be parsed: %s." % ', '.join( invalid )
@@ -455,13 +453,69 @@ class UsesLibraryMixinItems( SharableItemSecurityMixin ):
if check_accessible:
if not trans.app.security_agent.can_access_library_item( current_user_roles, item, trans.user ):
- raise ItemAccessibilityException( )
+ raise exceptions.ItemAccessibilityException('You do not have access to the requested item')
if not trans.app.security_agent.can_add_library_item( trans.get_current_user_roles(), item ):
# Slight misuse of ItemOwnershipException?
- raise ItemOwnershipException( "User cannot add to library item." )
+ raise exceptions.ItemOwnershipException( "User cannot add to library item." )
- def copy_hda_to_library_folder( self, trans, hda, library_folder, roles=None, ldda_message='' ):
+ def _copy_hdca_to_library_folder(self, trans, hda_manager, from_hdca_id, folder_id, ldda_message=''):
+ """
+ Fetches the collection identified by `from_hcda_id` and dispatches individual collection elements to
+ _copy_hda_to_library_folder
+ """
+ hdca = trans.sa_session.query(trans.app.model.HistoryDatasetCollectionAssociation).get(from_hdca_id)
+ if hdca.collection.collection_type != 'list':
+ raise exceptions.NotImplemented('Cannot add nested collections to library. Please flatten your collection first.')
+ hdas = []
+ for element in hdca.collection.elements:
+ hdas.append((element.element_identifier, element.dataset_instance.id))
+ return [self._copy_hda_to_library_folder(trans,
+ hda_manager=hda_manager,
+ from_hda_id=hda_id,
+ folder_id=folder_id,
+ ldda_message=ldda_message,
+ element_identifier=element_identifier) for (element_identifier, hda_id) in hdas]
+
+ def _copy_hda_to_library_folder( self, trans, hda_manager, from_hda_id, folder_id, ldda_message='', element_identifier=None ):
+ """
+ Copies hda ``from_hda_id`` to library folder ``folder_id``, optionally
+ adding ``ldda_message`` to the new ldda's ``message``.
+
+ ``library_contents.create`` will branch to this if called with 'from_hda_id'
+ in its payload.
+ """
+ log.debug( '_copy_hda_to_library_folder: %s' % ( str(( from_hda_id, folder_id, ldda_message )) ) )
+ # PRECONDITION: folder_id has already been altered to remove the folder prefix ('F')
+ # TODO: allow name and other, editable ldda attrs?
+ if ldda_message:
+ ldda_message = util.sanitize_html.sanitize_html( ldda_message, 'utf-8' )
+
+ # check permissions on (all three?) resources: hda, library, folder
+ # TODO: do we really need the library??
+ hda = hda_manager.get_owned( from_hda_id, trans.user, current_history=trans.history )
+ hda = hda_manager.error_if_uploading( hda )
+ folder = self.get_library_folder( trans, folder_id, check_accessible=True )
+
+ # TOOD: refactor to use check_user_can_add_to_library_item, eliminate boolean
+ # can_current_user_add_to_library_item.
+ if folder.parent_library.deleted:
+ raise exceptions.ObjectAttributeInvalidException('You cannot add datasets into deleted library. Undelete it first.')
+ 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 this folder,')
+
+ ldda = self.copy_hda_to_library_folder( trans, hda, folder, ldda_message=ldda_message, element_identifier=element_identifier )
+ # I don't see a reason why hdas copied into libraries should not be visible.
+ # If there is, refactor `ldda.visible = True` to do this only when adding HDCAs.
+ ldda.visible = True
+ trans.sa_session.flush()
+ ldda_dict = ldda.to_dict()
+ rval = trans.security.encode_dict_ids( ldda_dict )
+ update_time = ldda.update_time.strftime("%Y-%m-%d %I:%M %p")
+ rval['update_time'] = update_time
+ return rval
+
+ def copy_hda_to_library_folder( self, trans, hda, library_folder, roles=None, ldda_message='', element_identifier=None ):
# PRECONDITION: permissions for this action on hda and library_folder have been checked
roles = roles or []
@@ -470,7 +524,7 @@ class UsesLibraryMixinItems( SharableItemSecurityMixin ):
# create the new ldda and apply the folder perms to it
ldda = hda.to_library_dataset_dataset_association( trans, target_folder=library_folder,
- roles=roles, ldda_message=ldda_message )
+ roles=roles, ldda_message=ldda_message, element_identifier=element_identifier )
self._apply_library_folder_permissions_to_ldda( trans, library_folder, ldda )
self._apply_hda_permissions_to_ldda( trans, hda, ldda )
# TODO:?? not really clear on how permissions are being traded here
@@ -693,15 +747,15 @@ class UsesVisualizationMixin( UsesLibraryMixinItems ):
# default to trans.user, error if anon
if not user:
if not trans.user:
- raise ItemAccessibilityException( "You must be logged in to import Galaxy visualizations" )
+ raise exceptions.ItemAccessibilityException( "You must be logged in to import Galaxy visualizations" )
user = trans.user
# check accessibility
visualization = self.get_visualization( trans, id, check_ownership=False )
if not visualization.importable:
- raise ItemAccessibilityException( "The owner of this visualization has disabled imports via this link." )
+ raise exceptions.ItemAccessibilityException( "The owner of this visualization has disabled imports via this link." )
if visualization.deleted:
- raise ItemDeletionException( "You can't import this visualization because it has been deleted." )
+ raise exceptions.ItemDeletionException( "You can't import this visualization because it has been deleted." )
# copy vis and alter title
# TODO: need to handle custom db keys.
@@ -1139,7 +1193,7 @@ class UsesStoredWorkflowMixin( SharableItemSecurityMixin, UsesAnnotations ):
for step in stored_workflow.latest_workflow.steps:
try:
module_injector.inject( step )
- except ToolMissingException:
+ except exceptions.ToolMissingException:
pass
def _import_shared_workflow( self, trans, stored):
@@ -1353,7 +1407,7 @@ class UsesFormDefinitionsMixin:
form_id_select_field = self.build_form_id_select_field( trans, forms, selected_value=kwd.get( 'form_id', 'none' ) )
try:
decoded_form_id = trans.security.decode_id( form_id )
- except:
+ except Exception:
decoded_form_id = None
if decoded_form_id:
for form in forms:
@@ -1899,7 +1953,7 @@ class UsesFormDefinitionsMixin:
id = library_id
try:
item = trans.sa_session.query( trans.app.model.Library ).get( trans.security.decode_id( library_id ) )
- except:
+ except Exception:
item = None
item_desc = 'data library'
action = 'library_info'
@@ -1908,7 +1962,7 @@ class UsesFormDefinitionsMixin:
id = folder_id
try:
item = trans.sa_session.query( trans.app.model.LibraryFolder ).get( trans.security.decode_id( folder_id ) )
- except:
+ except Exception:
item = None
item_desc = 'folder'
action = 'folder_info'
@@ -1917,7 +1971,7 @@ class UsesFormDefinitionsMixin:
id = ldda_id
try:
item = trans.sa_session.query( trans.app.model.LibraryDatasetDatasetAssociation ).get( trans.security.decode_id( ldda_id ) )
- except:
+ except Exception:
item = None
item_desc = 'dataset'
action = 'ldda_edit_info'
@@ -1926,7 +1980,7 @@ class UsesFormDefinitionsMixin:
id = request_type_id
try:
item = trans.sa_session.query( trans.app.model.RequestType ).get( trans.security.decode_id( request_type_id ) )
- except:
+ except Exception:
item = None
item_desc = 'request type'
action = 'view_editable_request_type'
@@ -1935,7 +1989,7 @@ class UsesFormDefinitionsMixin:
id = sample_id
try:
item = trans.sa_session.query( trans.app.model.Sample ).get( trans.security.decode_id( sample_id ) )
- except:
+ except Exception:
item = None
item_desc = 'sample'
action = 'view_sample'
diff --git a/lib/galaxy/web/base/controllers/admin.py b/lib/galaxy/web/base/controllers/admin.py
index 8c671160008..1490fdf667e 100644
--- a/lib/galaxy/web/base/controllers/admin.py
+++ b/lib/galaxy/web/base/controllers/admin.py
@@ -1,7 +1,7 @@
import logging
import os
from datetime import datetime, timedelta
-from six import string_types
+import six
from string import punctuation as PUNCTUATION
from sqlalchemy import and_, false, func, or_
@@ -931,10 +931,7 @@ class Admin( object ):
kwd[ 'message' ] = util.sanitize_text( "Invalid user id (%s) received" % str( user_id ) )
kwd[ 'status' ] = 'error'
else:
- return trans.response.send_redirect( web.url_for( controller='user',
- action='manage_user_info',
- cntrller='admin',
- **kwd ) )
+ return trans.response.send_redirect( web.url_for( controller='user', action='information', **kwd ) )
elif operation == "manage roles and groups":
return self.manage_roles_and_groups_for_user( trans, **kwd )
if trans.app.config.allow_user_deletion:
@@ -1123,6 +1120,35 @@ class Admin( object ):
job=job,
message="Back" )
+ @web.expose
+ @web.require_admin
+ def manage_tool_dependencies( self, trans, install_dependencies=False, uninstall_dependencies=False, selected_tool_ids=None, viewkey='View tool-centric dependencies'):
+ if not selected_tool_ids:
+ selected_tool_ids = []
+ tools_by_id = trans.app.toolbox.tools_by_id
+ view = six.next(six.itervalues(trans.app.toolbox.tools_by_id))._view
+ if selected_tool_ids:
+ # install the dependencies for the tools in the selected_tool_ids list
+ if not isinstance(selected_tool_ids, list):
+ selected_tool_ids = [selected_tool_ids]
+ requirements = set([tools_by_id[tid].tool_requirements for tid in selected_tool_ids])
+ if install_dependencies:
+ [view.install_dependencies(r) for r in requirements]
+ elif uninstall_dependencies:
+ [view.uninstall_dependencies(index=None, requirements=r) for r in requirements]
+ tool_ids_by_requirements = {}
+ for tid, tool in trans.app.toolbox.tools_by_id.items():
+ if tool.tool_requirements not in tool_ids_by_requirements:
+ tool_ids_by_requirements[tool.tool_requirements] = [tid]
+ else:
+ tool_ids_by_requirements[tool.tool_requirements].append(tid)
+ requirements_status = {r: view.get_requirements_status({tid: r}, tools_by_id[tids[0]].installed_tool_dependencies) for r, tids in tool_ids_by_requirements.items()}
+ return trans.fill_template( '/webapps/galaxy/admin/manage_dependencies.mako',
+ tools=tools_by_id,
+ requirements_status=requirements_status,
+ tool_ids_by_requirements=tool_ids_by_requirements,
+ viewkey=viewkey )
+
@web.expose
@web.require_admin
def sanitize_whitelist( self, trans, submit_whitelist=False, tools_to_whitelist=[]):
@@ -1130,7 +1156,7 @@ class Admin( object ):
# write the configured sanitize_whitelist_file with new whitelist
# and update in-memory list.
with open(trans.app.config.sanitize_whitelist_file, 'wt') as f:
- if isinstance(tools_to_whitelist, string_types):
+ if isinstance(tools_to_whitelist, six.string_types):
tools_to_whitelist = [tools_to_whitelist]
new_whitelist = sorted([tid for tid in tools_to_whitelist if tid in trans.app.toolbox.tools_by_id])
f.write("\n".join(new_whitelist))
diff --git a/lib/galaxy/web/base/interactive_environments.py b/lib/galaxy/web/base/interactive_environments.py
index fa87a37329f..e43b775c072 100644
--- a/lib/galaxy/web/base/interactive_environments.py
+++ b/lib/galaxy/web/base/interactive_environments.py
@@ -6,9 +6,12 @@ import yaml
import stat
import random
import tempfile
+import uuid
from subprocess import Popen, PIPE
+from galaxy.util import string_as_bool_or_none
from galaxy.util.bunch import Bunch
+from galaxy.container import docker_swarm
from galaxy import web, model
from galaxy.managers import api_keys
from galaxy.tools.deps.docker_util import DockerVolume
@@ -17,6 +20,9 @@ import logging
log = logging.getLogger(__name__)
+CONTAINER_NAME_PREFIX = 'galaxy_gie_'
+
+
class InteractiveEnvironmentRequest(object):
def __init__(self, trans, plugin):
@@ -44,6 +50,11 @@ class InteractiveEnvironmentRequest(object):
self.attr.docker_hostname = self.attr.viz_config.get("docker", "docker_hostname")
self.attr.docker_connect_port = self.attr.viz_config.get("docker", "docker_connect_port") or None
+ if string_as_bool_or_none(self.attr.viz_config.get("docker", "swarm_mode")) is not None:
+ self.attr.swarm_mode = string_as_bool_or_none(self.attr.viz_config.get("docker", "swarm_mode"))
+ else:
+ self.attr.swarm_mode = trans.app.config.gie_swarm_mode
+
# Generate per-request passwords the IE plugin can use to configure
# the destination container.
self.notebook_pw_salt = self.generate_password(length=12)
@@ -78,6 +89,10 @@ class InteractiveEnvironmentRequest(object):
if self.attr.proxy_prefix.startswith('/'):
self.attr.proxy_prefix = '/' + self.attr.proxy_prefix.lstrip('/')
+ assert not self.attr.swarm_mode or (self.attr.swarm_mode and
+ self.attr.docker_connect_port is not None), \
+ "Error: Docker swarm mode enabled but docker_connect_port is not set"
+
def load_allowed_images(self):
if os.path.exists(os.path.join(self.attr.our_config_dir, 'allowed_images.yml')):
fn = os.path.join(self.attr.our_config_dir, 'allowed_images.yml')
@@ -108,11 +123,12 @@ class InteractiveEnvironmentRequest(object):
# their defaults dictionary instead.
default_dict = {
'command': 'docker {docker_args}',
- 'command_inject': '--sig-proxy=true -e DEBUG=false',
+ 'command_inject': '-e DEBUG=false -e DEFAULT_CONTAINER_RUNTIME=120',
'docker_hostname': 'localhost',
'wx_tempdir': 'False',
'docker_galaxy_temp_dir': None,
- 'docker_connect_port': None
+ 'docker_connect_port': None,
+ 'swarm_mode': None,
}
viz_config = ConfigParser.SafeConfigParser(default_dict)
conf_path = os.path.join( self.attr.our_config_dir, self.attr.viz_id + ".ini" )
@@ -211,33 +227,73 @@ class InteractiveEnvironmentRequest(object):
def volume(self, host_path, container_path, **kwds):
return DockerVolume(host_path, container_path, **kwds)
- def docker_cmd(self, image, env_override={}, volumes=[]):
+ def docker_cmd(self, image, env_override=None, volumes=None):
"""
Generate and return the docker command to execute
"""
+ if env_override is None:
+ env_override = {}
+ if volumes is None:
+ volumes = []
temp_dir = self.temp_dir
conf = self.get_conf_dict()
conf.update(env_override)
env_str = ' '.join(['-e "%s=%s"' % (key.upper(), item) for key, item in conf.items()])
volume_str = ' '.join(['-v "%s"' % volume for volume in volumes])
import_volume_str = '-v "{temp_dir}:/import/"'.format(temp_dir=temp_dir) if self.attr.import_volume else ''
+ name = None
# This is the basic docker command such as "sudo -u docker docker {docker_args}"
# or just "docker {docker_args}"
command = self.attr.viz_config.get("docker", "command")
# Then we format in the entire docker command in place of
# {docker_args}, so as to let the admin not worry about which args are
# getting passed
- command = command.format(docker_args='run {command_inject} {environment} -d -P {import_volume_str} {volume_str} {image}')
+ command_inject = self.attr.viz_config.get("docker", "command_inject")
+ # --name should really not be set, but we'll try to honor it anyway
+ if '--name' not in command_inject:
+ name = CONTAINER_NAME_PREFIX + uuid.uuid4().hex
+ if not self.attr.swarm_mode:
+ command = command.format(docker_args='run {command_inject} {name} {environment} -d -P {import_volume_str} {volume_str} {image}')
+ # --sig-proxy is not valid in the swarm mode context
+ if '--sig-proxy=' not in command_inject:
+ command_inject = '--sig-proxy=true ' + command_inject
+ else:
+ command = command.format(docker_args='service create --replicas 1 --restart-condition none {command_inject} {name} -p {docker_connect_port} {environment} {image}')
+
# Once that's available, we format again with all of our arguments
command = command.format(
- command_inject=self.attr.viz_config.get("docker", "command_inject"),
+ command_inject=command_inject,
+ name='--name=%s' % name if name is not None else '',
environment=env_str,
import_volume_str=import_volume_str,
volume_str=volume_str,
image=image,
+ docker_connect_port=self.attr.docker_connect_port,
)
return command
+ def get_digest_image(self, image):
+ """Get the digest image string for an image.
+
+ :type image: str
+ :param image: image name and optionally, tag
+
+ :returns: digest string, having the format `@:`, e.g.:
+ `'bgruening/docker-jupyter-notebook@sha256:3ec0bc9abc9d511aa602ee4fff2534d80dd9b1564482de52cb5de36cce6debae'`
+ """
+ command = self.attr.viz_config.get("docker", "command")
+ command = command.format(docker_args="image inspect --format '{{{{(index .RepoDigests 0)}}}}' {image}".format(image=image))
+ p = Popen(command, stdout=PIPE, stderr=PIPE, close_fds=True, shell=True)
+ stdout, stderr = p.communicate()
+ digest = None
+ if p.returncode == 0:
+ digest = stdout.strip()
+ elif p.returncode == 1 and stderr.strip() == 'Error: No such image: {image}'.format(image=image):
+ log.warning("%s not pulled, cannot get digest", image)
+ else:
+ log.error( "%s\n%s" % (stdout, stderr) )
+ return digest or image
+
def _idsToVolumes(self, ids):
if len(ids.strip()) == 0:
return []
@@ -286,6 +342,11 @@ class InteractiveEnvironmentRequest(object):
raise Exception("Attempting to launch disallowed image! %s not in list of allowed images [%s]"
% (image, ', '.join(self.allowed_images)))
+ # The digest image is necessary if using swarm mode and the image's
+ # registry (e.g. docker hub, quay.io) is down. See:
+ # https://github.com/docker/docker/issues/31427
+ image = self.get_digest_image(image)
+
if additional_ids is not None:
volumes += self._idsToVolumes(additional_ids)
@@ -310,6 +371,9 @@ class InteractiveEnvironmentRequest(object):
log.debug( "Container host: %s", self.attr.docker_hostname )
host_port = None
+ if self.attr.swarm_mode:
+ docker_swarm.main(argv=['-c', self.trans.app.config.config_file], fork=True)
+
if len(port_mappings) > 1:
if self.attr.docker_connect_port is not None:
for _service, _host_ip, _host_port in port_mappings:
@@ -333,7 +397,9 @@ class InteractiveEnvironmentRequest(object):
port=host_port,
proxy_prefix=self.attr.proxy_prefix,
route_name=self.attr.viz_id,
- container_ids=[container_id],
+ container_ids=[container_id] if not self.attr.swarm_mode else [],
+ service_ids=[container_id] if self.attr.swarm_mode else [],
+ docker_command=self.attr.viz_config.get("docker", "command"),
)
# These variables then become available for use in templating URLs
self.attr.proxy_url = self.attr.proxy_request[ 'proxy_url' ]
@@ -355,7 +421,10 @@ class InteractiveEnvironmentRequest(object):
:returns: inspect_data, a dict of docker inspect output
"""
command = self.attr.viz_config.get("docker", "command")
- command = command.format(docker_args="inspect %s" % container_id)
+ if not self.attr.swarm_mode:
+ command = command.format(docker_args="inspect %s" % container_id)
+ else:
+ command = command.format(docker_args="service inspect %s" % container_id)
log.info("Inspecting docker container {0} with command [{1}]".format(
container_id,
command
@@ -368,15 +437,6 @@ class InteractiveEnvironmentRequest(object):
return None
inspect_data = json.loads(stdout)
- # [{
- # "NetworkSettings" : {
- # "Ports" : {
- # "3306/tcp" : [
- # {
- # "HostIp" : "127.0.0.1",
- # "HostPort" : "3306"
- # }
- # ]
return inspect_data
def get_container_host(self, inspect_data):
@@ -410,13 +470,43 @@ class InteractiveEnvironmentRequest(object):
Someday code that calls this should be refactored whenever we get
containers with multiple ports working.
"""
+ # non-swarm:
+ # [{
+ # "NetworkSettings" : {
+ # "Ports" : {
+ # "3306/tcp" : [
+ # {
+ # "HostIp" : "127.0.0.1",
+ # "HostPort" : "3306"
+ # }
+ # ]
+ # swarm:
+ # [{
+ # "Endpoint": {
+ # "Ports": [
+ # {
+ # "Protocol": "tcp",
+ # "TargetPort": 8888,
+ # "PublishedPort": 30000,
+ # "PublishMode": "ingress"
+ # }
+ # ]
mappings = []
- port_mappings = inspect_data[0]['NetworkSettings']['Ports']
- for port_name in port_mappings:
- for binding in port_mappings[port_name]:
+ if not self.attr.swarm_mode:
+ port_mappings = inspect_data[0]['NetworkSettings']['Ports']
+ for port_name in port_mappings:
+ for binding in port_mappings[port_name]:
+ mappings.append((
+ port_name.replace('/tcp', '').replace('/udp', ''),
+ binding['HostIp'],
+ binding['HostPort']
+ ))
+ else:
+ port_mappings = inspect_data[0]['Endpoint']['Ports']
+ for binding in port_mappings:
mappings.append((
- port_name.replace('/tcp', '').replace('/udp', ''),
- binding['HostIp'],
- binding['HostPort']
+ binding['TargetPort'],
+ '127.0.0.1', # use the routing mesh
+ binding['PublishedPort']
))
return mappings
diff --git a/lib/galaxy/web/framework/base.py b/lib/galaxy/web/framework/base.py
index e227a8080eb..bdc4a9d501a 100644
--- a/lib/galaxy/web/framework/base.py
+++ b/lib/galaxy/web/framework/base.py
@@ -9,7 +9,6 @@ import tarfile
import tempfile
import time
import types
-from Cookie import SimpleCookie
import routes
import webob
@@ -17,6 +16,7 @@ import webob
from paste import httpexceptions
from paste.request import get_cookies
from paste.response import HeaderDict
+from six.moves.http_cookies import SimpleCookie
from galaxy.util import smart_str
@@ -62,10 +62,10 @@ class WebApplication( object ):
self.controllers = dict()
self.api_controllers = dict()
self.mapper = routes.Mapper()
+ self.clientside_routes = routes.Mapper(controller_scan=None, register=False)
# FIXME: The following two options are deprecated and should be
# removed. Consult the Routes documentation.
self.mapper.minimization = True
- # self.mapper.explicit = False
self.transaction_factory = DefaultWebTransaction
# Set if trace logging is enabled
self.trace_logger = None
@@ -98,7 +98,7 @@ class WebApplication( object ):
self.mapper.connect( route, **kwargs )
def add_client_route( self, route ):
- self.add_route(route, controller='root', action='client')
+ self.clientside_routes.connect( route, controller='root', action='client' )
def set_transaction_factory( self, transaction_factory ):
"""
@@ -113,7 +113,8 @@ class WebApplication( object ):
requests
"""
# Create/compile the regular expressions for route mapping
- self.mapper.create_regs( self.controllers.keys() )
+ self.mapper.create_regs( list(self.controllers.keys()) )
+ self.clientside_routes.create_regs()
def trace( self, **fields ):
if self.trace_logger:
@@ -137,43 +138,23 @@ class WebApplication( object ):
if self.trace_logger:
self.trace_logger.context_remove( "request_id" )
- def handle_request( self, environ, start_response, body_renderer=None ):
- # Grab the request_id (should have been set by middleware)
- request_id = environ.get( 'request_id', 'unknown' )
- # Map url using routes
- path_info = environ.get( 'PATH_INFO', '' )
- map = self.mapper.match( path_info, environ )
- if path_info.startswith('/api'):
- environ[ 'is_api_request' ] = True
- controllers = self.api_controllers
- else:
- environ[ 'is_api_request' ] = False
- controllers = self.controllers
- if map is None:
- raise httpexceptions.HTTPNotFound( "No route for " + path_info )
- self.trace( path_info=path_info, map=map )
- # Setup routes
- rc = routes.request_config()
- rc.mapper = self.mapper
- rc.mapper_dict = map
- rc.environ = environ
- # Setup the transaction
- trans = self.transaction_factory( environ )
- trans.request_id = request_id
- rc.redirect = trans.response.send_redirect
+ def _resolve_map_match( self, map_match, path_info, controllers, use_default=True):
# Get the controller class
- controller_name = map.pop( 'controller', None )
+ controller_name = map_match.pop( 'controller', None )
controller = controllers.get( controller_name, None )
- if controller_name is None:
+ if controller is None:
raise httpexceptions.HTTPNotFound( "No controller for " + path_info )
# Resolve action method on controller
- action = map.pop( 'action', 'index' )
# This is the easiest way to make the controller/action accessible for
# url_for invocations. Specifically, grids.
- trans.controller = controller_name
- trans.action = action
+ action = map_match.pop( 'action', 'index' )
method = getattr( controller, action, None )
+ if method is None and not use_default:
+ # Skip default, we do this, for example, when we want to fail
+ # through to another mapper.
+ raise httpexceptions.HTTPNotFound( "No action for " + path_info )
if method is None:
+ # no matching method, we try for a default
method = getattr( controller, 'default', None )
if method is None:
raise httpexceptions.HTTPNotFound( "No action for " + path_info )
@@ -183,10 +164,50 @@ class WebApplication( object ):
# Is the method callable
if not callable( method ):
raise httpexceptions.HTTPNotFound( "Action not callable for " + path_info )
+ return ( controller_name, controller, action, method )
+
+ def handle_request( self, environ, start_response, body_renderer=None ):
+ # Grab the request_id (should have been set by middleware)
+ request_id = environ.get( 'request_id', 'unknown' )
+ # Map url using routes
+ path_info = environ.get( 'PATH_INFO', '' )
+ client_match = self.clientside_routes.match( path_info, environ )
+ map_match = self.mapper.match( path_info, environ ) or client_match
+ if path_info.startswith('/api'):
+ environ[ 'is_api_request' ] = True
+ controllers = self.api_controllers
+ else:
+ environ[ 'is_api_request' ] = False
+ controllers = self.controllers
+ if map_match is None:
+ raise httpexceptions.HTTPNotFound( "No route for " + path_info )
+ self.trace( path_info=path_info, map_match=map_match )
+ # Setup routes
+ rc = routes.request_config()
+ rc.mapper = self.mapper
+ rc.mapper_dict = map_match
+ rc.environ = environ
+ # Setup the transaction
+ trans = self.transaction_factory( environ )
+ trans.request_id = request_id
+ rc.redirect = trans.response.send_redirect
+ # Resolve mapping to controller/method
+ try:
+ # We don't use default methods if there's a clientside match for this route.
+ use_default = client_match is None
+ controller_name, controller, action, method = self._resolve_map_match( map_match, path_info, controllers, use_default=use_default)
+ except httpexceptions.HTTPNotFound:
+ # Failed, let's check client routes
+ if not environ[ 'is_api_request' ]:
+ controller_name, controller, action, method = self._resolve_map_match( client_match, path_info, controllers )
+ else:
+ raise
+ trans.controller = controller_name
+ trans.action = action
environ['controller_action_key'] = "%s.%s.%s" % ('api' if environ['is_api_request'] else 'web', controller_name, action or 'default')
# Combine mapper args and query string / form args and call
kwargs = trans.request.params.mixed()
- kwargs.update( map )
+ kwargs.update( map_match )
# Special key for AJAX debugging, remove to avoid confusing methods
kwargs.pop( '_', None )
try:
@@ -264,7 +285,7 @@ class LazyProperty( object ):
if obj is None:
return self
value = self.func( obj )
- setattr( obj, self.func.func_name, value )
+ setattr( obj, self.func.__name__, value )
return value
@@ -393,14 +414,14 @@ class Response( object ):
self.headers = HeaderDict( { "content-type": "text/html" } )
self.cookies = SimpleCookie()
- def set_content_type( self, type ):
+ def set_content_type( self, type_ ):
"""
Sets the Content-Type header
"""
- self.headers[ "content-type" ] = type
+ self.headers[ "content-type" ] = type_
def get_content_type( self ):
- return self.headers[ "content-type" ]
+ return self.headers.get("content-type", None)
def send_redirect( self, url ):
"""
@@ -414,8 +435,7 @@ class Response( object ):
"""
result = self.headers.headeritems()
# Add cookie to header
- for name in self.cookies.keys():
- crumb = self.cookies[name]
+ for name, crumb in self.cookies.items():
header, value = str( crumb ).split( ': ', 1 )
result.append( ( header, value ) )
return result
diff --git a/lib/galaxy/web/framework/decorators.py b/lib/galaxy/web/framework/decorators.py
index 94d639c7e16..bec881522c4 100644
--- a/lib/galaxy/web/framework/decorators.py
+++ b/lib/galaxy/web/framework/decorators.py
@@ -164,8 +164,7 @@ def expose_api( func, to_json=True, user_required=True ):
def __extract_payload_from_request( trans, func, kwargs ):
-
- content_type = trans.request.headers[ 'content-type' ]
+ content_type = trans.request.headers.get('content-type', '')
if content_type.startswith( 'application/x-www-form-urlencoded' ) or content_type.startswith( 'multipart/form-data' ):
# If the content type is a standard type such as multipart/form-data, the wsgi framework parses the request body
# and loads all field values into kwargs. However, kwargs also contains formal method parameters etc. which
@@ -177,7 +176,7 @@ def __extract_payload_from_request( trans, func, kwargs ):
named_args, _, _, _ = inspect.getargspec( func )
for arg in named_args:
payload.pop( arg, None )
- for k, v in payload.iteritems():
+ for k, v in payload.items():
if isinstance( v, string_types ):
try:
# note: parse_non_hex_float only needed here for single string values where something like
diff --git a/lib/galaxy/web/framework/helpers/grids.py b/lib/galaxy/web/framework/helpers/grids.py
index bca528e0f9d..ea569363724 100644
--- a/lib/galaxy/web/framework/helpers/grids.py
+++ b/lib/galaxy/web/framework/helpers/grids.py
@@ -346,7 +346,7 @@ class GridColumn( object ):
def __init__( self, label, key=None, model_class=None, method=None, format=None,
link=None, attach_popup=False, visible=True, nowrap=False,
# Valid values for filterable are ['standard', 'advanced', None]
- filterable=None, sortable=True, label_id_prefix=None, inbound=False ):
+ filterable=None, sortable=True, label_id_prefix=None, target=None ):
"""Create a grid column."""
self.label = label
self.key = key
@@ -354,7 +354,7 @@ class GridColumn( object ):
self.method = method
self.format = format
self.link = link
- self.inbound = inbound
+ self.target = target
self.nowrap = nowrap
self.attach_popup = attach_popup
self.visible = visible
@@ -565,7 +565,7 @@ class OwnerAnnotationColumn( TextColumn, UsesAnnotations ):
ann_snippet += "..."
else:
ann_snippet = ""
- return ann_snippet
+ return escape( ann_snippet )
def get_single_filter( self, user, a_filter ):
""" Filter by annotation and annotation owner. """
@@ -603,7 +603,7 @@ class CommunityTagsColumn( TextColumn ):
column_filter = ",".join( column_filter )
raw_tags = trans.app.tag_handler.parse_tags( column_filter.encode( "utf-8" ) )
clause_list = []
- for name, value in raw_tags.items():
+ for name, value in raw_tags:
if name:
# Filter by all tags.
clause_list.append( self.model_class.tags.any( func.lower( self.model_tag_association_class.user_tname ).like( "%" + name.lower() + "%" ) ) )
@@ -633,7 +633,7 @@ class IndividualTagsColumn( CommunityTagsColumn ):
column_filter = ",".join( column_filter )
raw_tags = trans.app.tag_handler.parse_tags( column_filter.encode( "utf-8" ) )
clause_list = []
- for name, value in raw_tags.items():
+ for name, value in raw_tags:
if name:
# Filter by individual's tag names.
clause_list.append( self.model_class.tags.any( and_( func.lower( self.model_tag_association_class.user_tname ).like( "%" + name.lower() + "%" ), self.model_tag_association_class.user == user ) ) )
@@ -799,7 +799,7 @@ class SharingStatusColumn( GridColumn ):
class GridOperation( object ):
def __init__( self, label, key=None, condition=None, allow_multiple=True, allow_popup=True,
target=None, url_args=None, async_compatible=False, confirm=None,
- global_operation=None, inbound=False ):
+ global_operation=None ):
self.label = label
self.key = key
self.allow_multiple = allow_multiple
@@ -808,7 +808,6 @@ class GridOperation( object ):
self.target = target
self.url_args = url_args
self.async_compatible = async_compatible
- self.inbound = inbound
# if 'confirm' is set, then ask before completing the operation
self.confirm = confirm
# specify a general operation that acts on the full grid
@@ -842,10 +841,10 @@ class DisplayByUsernameAndSlugGridOperation( GridOperation ):
class GridAction( object ):
- def __init__( self, label=None, url_args=None, inbound=False ):
+ def __init__( self, label=None, url_args=None, target=None ):
self.label = label
self.url_args = url_args
- self.inbound = inbound
+ self.target = target
class GridColumnFilter( object ):
diff --git a/lib/galaxy/web/framework/middleware/batch.py b/lib/galaxy/web/framework/middleware/batch.py
index 58dfd7b64ae..631b8db5796 100644
--- a/lib/galaxy/web/framework/middleware/batch.py
+++ b/lib/galaxy/web/framework/middleware/batch.py
@@ -59,11 +59,11 @@ class BatchMiddleware( object ):
]
}
- def __init__( self, galaxy, application, config=None ):
- #: the original galaxy webapp
- self.galaxy = galaxy
+ def __init__( self, application, galaxy, config=None ):
#: the wrapped webapp
self.application = application
+ #: the original galaxy webapp
+ self.galaxy = galaxy
self.config = self.DEFAULT_CONFIG.copy()
self.config.update( config )
self.base_url = routes.url_for( '/' )
diff --git a/lib/galaxy/web/framework/middleware/sentry.py b/lib/galaxy/web/framework/middleware/sentry.py
index 980dec49205..aec0ee3b420 100644
--- a/lib/galaxy/web/framework/middleware/sentry.py
+++ b/lib/galaxy/web/framework/middleware/sentry.py
@@ -12,7 +12,7 @@ try:
except:
Client = None
-from galaxy.util.postfork import register_postfork_function
+from galaxy.web.stack import register_postfork_function
RAVEN_IMPORT_MESSAGE = ('The Python raven package is required to use this '
diff --git a/lib/galaxy/web/proxy/__init__.py b/lib/galaxy/web/proxy/__init__.py
index 8db25a730b6..3efb82f8156 100644
--- a/lib/galaxy/web/proxy/__init__.py
+++ b/lib/galaxy/web/proxy/__init__.py
@@ -1,6 +1,7 @@
import logging
import os
import json
+from collections import namedtuple
from galaxy.util.filelock import FileLock
from galaxy.util import sockets
@@ -46,7 +47,7 @@ class ProxyManager(object):
def shutdown( self ):
self.lazy_process.shutdown()
- def setup_proxy( self, trans, host=DEFAULT_PROXY_TO_HOST, port=None, proxy_prefix="", route_name="", container_ids=None ):
+ def setup_proxy( self, trans, host=DEFAULT_PROXY_TO_HOST, port=None, proxy_prefix="", route_name="", container_ids=None, service_ids=None, docker_command=None ):
if self.manage_dynamic_proxy:
log.info("Attempting to start dynamic proxy process")
log.debug("Cmd: " + ' '.join(self.lazy_process.command_and_args))
@@ -54,6 +55,8 @@ class ProxyManager(object):
if container_ids is None:
container_ids = []
+ if service_ids is None:
+ service_ids = []
authentication = AuthenticationToken(trans)
proxy_requests = ProxyRequests(host=host, port=port)
@@ -61,7 +64,9 @@ class ProxyManager(object):
authentication,
proxy_requests,
'/%s' % route_name,
- container_ids
+ container_ids,
+ service_ids,
+ docker_command,
)
# TODO: These shouldn't need to be request.host and request.scheme -
# though they are reasonable defaults.
@@ -79,6 +84,10 @@ class ProxyManager(object):
'proxied_host': proxy_requests.host,
}
+ def query_proxy( self, trans ):
+ authentication = AuthenticationToken(trans)
+ return self.proxy_ipc.fetch_requests(authentication)
+
def __setup_lazy_process( self, config ):
launcher = self.proxy_launcher()
command = launcher.launch_proxy_command(config)
@@ -174,7 +183,10 @@ def proxy_ipc(config):
class ProxyIpc(object):
- def handle_requests(self, authentication, proxy_requests, route_name, container_ids):
+ def handle_requests(self, authentication, proxy_requests, route_name, container_ids, service_ids, docker_command):
+ raise NotImplementedError()
+
+ def fetch_requests(self, authentication, key):
raise NotImplementedError()
@@ -183,50 +195,103 @@ class JsonFileProxyIpc(object):
def __init__(self, proxy_session_map):
self.proxy_session_map = proxy_session_map
- def handle_requests(self, authentication, proxy_requests, route_name, container_ids):
- key = "%s:%s" % ( proxy_requests.host, proxy_requests.port )
- secure_id = authentication.cookie_value
+ def handle_requests(self, authentication, proxy_requests, route_name, container_ids, service_ids, docker_command):
+ key = authentication.cookie_value
with FileLock( self.proxy_session_map ):
if not os.path.exists( self.proxy_session_map ):
open( self.proxy_session_map, "w" ).write( "{}" )
json_data = open( self.proxy_session_map, "r" ).read()
session_map = json.loads( json_data )
- to_remove = []
- for k, value in session_map.items():
- if value == secure_id:
- to_remove.append( k )
- for k in to_remove:
- del session_map[ k ]
- session_map[ key ] = secure_id
+ session_map[ key ] = {
+ 'host': proxy_requests.host,
+ 'port': proxy_requests.port,
+ 'container_ids': container_ids,
+ 'service_ids': service_ids,
+ 'docker_command': docker_command,
+ }
new_json_data = json.dumps( session_map )
open( self.proxy_session_map, "w" ).write( new_json_data )
+ def fetch_requests(self, authentication):
+ key = authentication.cookie_value
+ try:
+ with open(self.proxy_session_map) as fh:
+ session_map = json.load(fh)
+ m = session_map[key]
+ return ProxyMapping(
+ host=m['host'],
+ port=m['port'],
+ container_ids=m['container_ids'],
+ service_ids=m['service_ids'],
+ docker_command=m['docker_command'],
+ )
+ except (TypeError, KeyError):
+ log.warning('fetch_requests(): invalid key: %s', key)
+ return None
+
class SqliteProxyIpc(object):
def __init__(self, proxy_session_map):
self.proxy_session_map = proxy_session_map
- def handle_requests(self, authentication, proxy_requests, route_name, container_ids):
- key = "%s:%s" % ( proxy_requests.host, proxy_requests.port )
- secure_id = authentication.cookie_value
+ def handle_requests(self, authentication, proxy_requests, route_name, container_ids, service_ids, docker_command):
+ key = authentication.cookie_value
with FileLock( self.proxy_session_map ):
conn = sqlite.connect(self.proxy_session_map)
try:
c = conn.cursor()
try:
# Create table
- c.execute('''CREATE TABLE gxproxy
- (key text PRIMARY_KEY, secret text)''')
+ c.execute('''CREATE TABLE gxproxy2
+ (key text PRIMARY KEY,
+ host text,
+ port integer,
+ container_ids text,
+ service_ids text,
+ docker_command text)''')
except Exception:
pass
- insert_tmpl = '''INSERT INTO gxproxy (key, secret) VALUES ('%s', '%s');'''
- insert = insert_tmpl % (key, secure_id)
- c.execute(insert)
+ delete = '''DELETE FROM gxproxy2 WHERE key=?'''
+ c.execute(delete, (key,))
+ insert = '''INSERT INTO gxproxy2
+ (key, host, port, container_ids, service_ids, docker_command)
+ VALUES (?, ?, ?, ?, ?, ?)'''
+ c.execute(insert,
+ (key,
+ proxy_requests.host,
+ proxy_requests.port,
+ json.dumps(container_ids),
+ json.dumps(service_ids),
+ docker_command))
conn.commit()
finally:
conn.close()
+ def fetch_requests(self, authentication):
+ key = authentication.cookie_value
+ with FileLock( self.proxy_session_map):
+ conn = sqlite.connect(self.proxy_session_map)
+ try:
+ c = conn.cursor()
+ select = '''SELECT host, port, container_ids, service_ids, docker_command
+ FROM gxproxy2
+ WHERE key=?'''
+ c.execute(select, (key,))
+ try:
+ host, port, container_ids, service_ids, docker_command = c.fetchone()
+ except TypeError:
+ log.warning('fetch_requests(): invalid key: %s', key)
+ return None
+ return ProxyMapping(
+ host=host,
+ port=port,
+ container_ids=json.loads(container_ids),
+ service_ids=json.loads(service_ids),
+ docker_command=docker_command)
+ finally:
+ conn.close()
+
class RestGolangProxyIpc(object):
@@ -234,7 +299,7 @@ class RestGolangProxyIpc(object):
self.config = config
self.api_url = 'http://127.0.0.1:%s/api?api_key=%s' % (self.config.dynamic_proxy_bind_port, self.config.dynamic_proxy_golang_api_key)
- def handle_requests(self, authentication, proxy_requests, route_name, container_ids, sleep=1):
+ def handle_requests(self, authentication, proxy_requests, route_name, container_ids, service_ids, docker_command, sleep=1):
"""Make a POST request to the GO proxy to register a route
"""
values = {
@@ -260,4 +325,8 @@ class RestGolangProxyIpc(object):
self.handle_requests(authentication, proxy_requests, route_name, container_ids, sleep=sleep + 1)
pass
+
+ProxyMapping = namedtuple('ProxyMapping', ['host', 'port', 'container_ids', 'service_ids', 'docker_command'])
+
+
# TODO: MQ diven proxy?
diff --git a/lib/galaxy/web/proxy/js/lib/mapper.js b/lib/galaxy/web/proxy/js/lib/mapper.js
index 20f0f14e262..54fb097078e 100644
--- a/lib/galaxy/web/proxy/js/lib/mapper.js
+++ b/lib/galaxy/web/proxy/js/lib/mapper.js
@@ -15,9 +15,7 @@ var updateFromJson = function(path, map) {
var keyToSession = JSON.parse(content);
var newSessions = {};
for(var key in keyToSession) {
- var hostAndPort = key.split(":");
- // 'host': hostAndPort[0],
- newSessions[keyToSession[key]] = {'target': {'host': hostAndPort[0], 'port': parseInt(hostAndPort[1])}};
+ newSessions[key] = {'target': {'host': keyToSession[key]['host'], 'port': parseInt(keyToSession[key]['port'])}};
}
for(var oldSession in map) {
if(!(oldSession in newSessions)) {
@@ -32,12 +30,10 @@ var updateFromJson = function(path, map) {
var updateFromSqlite = function(path, map) {
var newSessions = {};
var loadSessions = function() {
- db.each("SELECT key, secret FROM gxproxy", function(err, row) {
+ db.each("SELECT key, host, port FROM gxproxy2", function(err, row) {
var key = row['key'];
- var secret = row['secret'];
- var hostAndPort = key.split(":");
- var target = {'host': hostAndPort[0], 'port': parseInt(hostAndPort[1])};
- newSessions[secret] = {'target': target};
+ var target = {'host': row['host'], 'port': parseInt(row['port'])};
+ newSessions[key] = {'target': target};
}, finish);
};
@@ -75,4 +71,4 @@ var mapFor = function(path) {
return map;
};
-exports.mapFor = mapFor;
\ No newline at end of file
+exports.mapFor = mapFor;
diff --git a/lib/galaxy/web/stack/__init__.py b/lib/galaxy/web/stack/__init__.py
new file mode 100644
index 00000000000..d843822e598
--- /dev/null
+++ b/lib/galaxy/web/stack/__init__.py
@@ -0,0 +1,106 @@
+"""Web application stack operations
+"""
+from __future__ import print_function
+
+import inspect
+import logging
+import os
+
+# The uwsgi module is automatically injected by the parent uwsgi
+# process and only exists that way. If anything works, this is a
+# uwsgi-managed process.
+try:
+ import uwsgi
+except ImportError:
+ uwsgi = None
+
+try:
+ from uwsgidecorators import postfork as uwsgi_postfork
+except:
+ uwsgi_postfork = lambda x: x # noqa: E731
+ if uwsgi is not None and hasattr(uwsgi, 'numproc'):
+ print("WARNING: This is a uwsgi process but the uwsgidecorators library"
+ " is unavailable. This is likely due to using an external (not"
+ " in Galaxy's virtualenv) uwsgi and you may experience errors. "
+ "HINT:\n {venv}/bin/pip install uwsgidecorators".format(
+ venv=os.environ.get('VIRTUAL_ENV', '/path/to/venv')))
+
+
+log = logging.getLogger(__name__)
+
+
+class ApplicationStack(object):
+ name = None
+ prohibited_middleware = frozenset()
+
+ @classmethod
+ def register_postfork_function(cls, f, *args, **kwargs):
+ f(*args, **kwargs)
+
+ def workers(self):
+ return []
+
+ def allowed_middleware(self, middleware):
+ if hasattr(middleware, '__name__'):
+ middleware = middleware.__name__
+ return middleware not in self.prohibited_middleware
+
+ def set_postfork_server_name(self, app):
+ pass
+
+
+class UWSGIApplicationStack(ApplicationStack):
+ name = 'uWSGI'
+ prohibited_middleware = frozenset([
+ 'wrap_in_static',
+ 'EvalException',
+ ])
+
+ postfork_functions = []
+
+ @classmethod
+ def register_postfork_function(cls, f, *args, **kwargs):
+ cls.postfork_functions.append((f, args, kwargs))
+
+ def workers(self):
+ return uwsgi.workers()
+
+ def set_postfork_server_name(self, app):
+ app.config.server_name += ".%d" % uwsgi.worker_id()
+
+
+class PasteApplicationStack(ApplicationStack):
+ name = 'Python Paste'
+
+
+class WeblessApplicationStack(ApplicationStack):
+ name = 'Webless'
+
+
+def application_stack_class():
+ """Returns the correct ApplicationStack class for the stack under which
+ this Galaxy process is running.
+ """
+ if uwsgi is not None and hasattr(uwsgi, 'numproc'):
+ return UWSGIApplicationStack
+ else:
+ # cleverer ideas welcome
+ for frame in inspect.stack():
+ if frame[1].endswith(os.path.join('pastescript', 'loadwsgi.py')):
+ return PasteApplicationStack
+ return WeblessApplicationStack
+
+
+def application_stack_instance():
+ stack_class = application_stack_class()
+ return stack_class()
+
+
+def register_postfork_function(f, *args, **kwargs):
+ application_stack_class().register_postfork_function(f, *args, **kwargs)
+
+
+@uwsgi_postfork
+def _do_postfork():
+ for f, args, kwargs in [ t for t in UWSGIApplicationStack.postfork_functions ]:
+ f(*args, **kwargs)
diff --git a/lib/galaxy/webapps/galaxy/api/folder_contents.py b/lib/galaxy/webapps/galaxy/api/folder_contents.py
index 5a1d14fab4e..f2295465591 100644
--- a/lib/galaxy/webapps/galaxy/api/folder_contents.py
+++ b/lib/galaxy/webapps/galaxy/api/folder_contents.py
@@ -250,54 +250,43 @@ class FolderContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrary
:param payload: dictionary structure containing:
:param from_hda_id: (optional) the id of an accessible HDA to copy into the library
:type from_hda_id: encoded id
+ :param from_hdca_id: (optional) the id of an accessible HDCA to copy into the library
+ :type from_hdca_id: encoded id
:param ldda_message: (optional) the new message attribute of the LDDA created
:type ldda_message: str
:param extended_metadata: (optional) dub-dictionary containing any extended metadata to associate with the item
:type extended_metadata: dict
:type payload: dict
- :returns: a dictionary containing the id, name, and 'show' url of the new item
- :rtype: dict
+ :returns: a list of dictionaries containing the id, name, and 'show' url of the new item
+ :rtype: list
:raises: ObjectAttributeInvalidException,
InsufficientPermissionsException, ItemAccessibilityException,
InternalServerError
"""
encoded_folder_id_16 = self.__decode_library_content_id( trans, encoded_folder_id )
- from_hda_id, ldda_message = ( payload.pop( 'from_hda_id', None ), payload.pop( 'ldda_message', '' ) )
+ from_hda_id = payload.pop( 'from_hda_id', None )
+ from_hdca_id = payload.pop( 'from_hdca_id', None )
+ ldda_message = payload.pop( 'ldda_message', '' )
if ldda_message:
ldda_message = util.sanitize_html.sanitize_html( ldda_message, 'utf-8' )
- rval = {}
+ rvals = []
try:
- decoded_hda_id = self.decode_id( from_hda_id )
- hda = self.hda_manager.get_owned( decoded_hda_id, trans.user, current_history=trans.history )
- hda = self.hda_manager.error_if_uploading( hda )
- 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()
-
- 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" )
- ldda_dict = ldda.to_dict()
- 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 ) )
+ if from_hda_id:
+ decoded_hda_id = self.decode_id( from_hda_id )
+ rvals.append(self._copy_hda_to_library_folder( trans, self.hda_manager, decoded_hda_id, encoded_folder_id_16, ldda_message ))
+ if from_hdca_id:
+ decoded_hdca_id = self.decode_id( from_hdca_id )
+ rvals.extend(self._copy_hdca_to_library_folder( trans, self.hda_manager, decoded_hdca_id, encoded_folder_id_16, ldda_message ))
except Exception as 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 ) ) ):
+ if 'not accessible to the current user' in str( exc ) or 'You are not allowed to access this dataset' in str( exc ):
raise exceptions.ItemAccessibilityException( 'You do not have access to the requested item' )
else:
log.exception( exc )
- raise exceptions.InternalServerError( 'An unknown error ocurred. Please try again.' )
- return rval
+ raise exc
+ return rvals
def __decode_library_content_id( self, trans, encoded_folder_id ):
"""
diff --git a/lib/galaxy/webapps/galaxy/api/library_contents.py b/lib/galaxy/webapps/galaxy/api/library_contents.py
index bc58d2e7cf0..89c8e0b8c49 100644
--- a/lib/galaxy/webapps/galaxy/api/library_contents.py
+++ b/lib/galaxy/webapps/galaxy/api/library_contents.py
@@ -150,6 +150,9 @@ class LibraryContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrar
To copy an HDA into a library send ``create_type`` of 'file' and
the HDA's encoded id in ``from_hda_id`` (and optionally ``ldda_message``).
+ To copy an HDCA into a library send ``create_type`` of 'file' and
+ the HDCA's encoded id in ``from_hdca_id`` (and optionally ``ldda_message``).
+
:type library_id: str
:param library_id: the encoded id of the library where to create the new item
:type payload: dict
@@ -160,7 +163,7 @@ class LibraryContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrar
* from_hda_id: (optional, only if create_type is 'file') the
encoded id of an accessible HDA to copy into the library
* ldda_message: (optional) the new message attribute of the LDDA created
- * extended_metadata: (optional) dub-dictionary containing any extended
+ * extended_metadata: (optional) sub-dictionary containing any extended
metadata to associate with the item
* upload_option: (optional) one of 'upload_file' (default), 'upload_directory' or 'upload_paths'
* server_dir: (optional, only if upload_option is
@@ -180,8 +183,8 @@ class LibraryContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrar
* description: (optional, only if create_type is 'folder')
description of the folder to create
- :rtype: dict
- :returns: a dictionary containing the id, name,
+ :rtype: list
+ :returns: a list of dictionaries containing the id, name,
and 'show' url of the new item
"""
if 'create_type' not in payload:
@@ -209,9 +212,16 @@ class LibraryContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrar
# are we copying an HDA to the library folder?
# we'll need the id and any message to attach, then branch to that private function
- from_hda_id, ldda_message = ( payload.pop( 'from_hda_id', None ), payload.pop( 'ldda_message', '' ) )
- if create_type == 'file' and from_hda_id:
- return self._copy_hda_to_library_folder( trans, from_hda_id, library_id, real_folder_id, ldda_message )
+ from_hda_id, from_hdca_id, ldda_message = ( payload.pop( 'from_hda_id', None ), payload.pop( 'from_hdca_id', None ), payload.pop( 'ldda_message', '' ) )
+ log.debug(payload)
+ if create_type == 'file':
+ rval = []
+ if from_hda_id:
+ rval.append(self._copy_hda_to_library_folder( trans, self.hda_manager, self.decode_id(from_hda_id), real_folder_id, ldda_message ))
+ if from_hdca_id:
+ rval.extend(self._copy_hdca_to_library_folder(trans, self.hda_manager, self.decode_id(from_hdca_id), real_folder_id, ldda_message))
+ if from_hda_id or from_hdca_id:
+ return rval
# check for extended metadata, store it and pop it out of the param
# otherwise sanitize_param will have a fit
@@ -285,52 +295,6 @@ class LibraryContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrar
# for cross type comparisions, ie "True" == True
yield prefix, ("%s" % (meta)).encode("utf8", errors='replace')
- def _copy_hda_to_library_folder( self, trans, from_hda_id, library_id, folder_id, ldda_message='' ):
- """
- Copies hda ``from_hda_id`` to library folder ``folder_id``, optionally
- adding ``ldda_message`` to the new ldda's ``message``.
-
- ``library_contents.create`` will branch to this if called with 'from_hda_id'
- in its payload.
- """
- log.debug( '_copy_hda_to_library_folder: %s' % ( str(( from_hda_id, library_id, folder_id, ldda_message )) ) )
- # PRECONDITION: folder_id has already been altered to remove the folder prefix ('F')
- # TODO: allow name and other, editable ldda attrs?
- if ldda_message:
- ldda_message = util.sanitize_html.sanitize_html( ldda_message, 'utf-8' )
-
- rval = {}
- try:
- # check permissions on (all three?) resources: hda, library, folder
- # TODO: do we really need the library??
- from_hda_id = self.decode_id( from_hda_id )
- hda = self.hda_manager.get_owned( from_hda_id, trans.user, current_history=trans.history )
- hda = self.hda_manager.error_if_uploading( hda )
- # library = self.get_library( trans, library_id, check_accessible=True )
- folder = self.get_library_folder( trans, folder_id, check_accessible=True )
-
- # TOOD: refactor to use check_user_can_add_to_library_item, eliminate boolean
- # can_current_user_add_to_library_item.
- if not self.can_current_user_add_to_library_item( trans, folder ):
- trans.response.status = 403
- return { 'error': 'user has no permission to add to library folder (%s)' % ( folder_id ) }
-
- ldda = self.copy_hda_to_library_folder( trans, hda, folder, ldda_message=ldda_message )
- ldda_dict = ldda.to_dict()
- rval = trans.security.encode_dict_ids( ldda_dict )
-
- except Exception as exc:
- # TODO: grrr...
- if 'not accessible to the current user' in str( exc ):
- trans.response.status = 403
- return { 'error': str( exc ) }
- else:
- log.exception( exc )
- trans.response.status = 500
- return { 'error': str( exc ) }
-
- return rval
-
@web.expose_api
def update( self, trans, id, library_id, payload, **kwd ):
"""
diff --git a/lib/galaxy/webapps/galaxy/api/tool_dependencies.py b/lib/galaxy/webapps/galaxy/api/tool_dependencies.py
index ea5821dfea3..8aace0fc90f 100644
--- a/lib/galaxy/webapps/galaxy/api/tool_dependencies.py
+++ b/lib/galaxy/webapps/galaxy/api/tool_dependencies.py
@@ -23,7 +23,7 @@ class ToolDependenciesAPIController( BaseAPIController ):
@require_admin
def index(self, trans, **kwd):
"""
- GET /api/dependencies_resolvers
+ GET /api/dependency_resolvers
"""
return self._view.index()
@@ -31,7 +31,7 @@ class ToolDependenciesAPIController( BaseAPIController ):
@require_admin
def show(self, trans, id):
"""
- GET /api/dependencies_resolver/
+ GET /api/dependency_resolvers/
"""
return self._view.show(id)
@@ -39,7 +39,7 @@ class ToolDependenciesAPIController( BaseAPIController ):
@require_admin
def update(self, trans):
"""
- PUT /api/dependencies_resolvers
+ PUT /api/dependency_resolvers
Reload tool dependency resolution configuration.
"""
@@ -49,7 +49,7 @@ class ToolDependenciesAPIController( BaseAPIController ):
@require_admin
def resolver_dependency(self, trans, id, **kwds):
"""
- GET /api/dependencies_resolver/{index}/dependency
+ GET /api/dependency_resolvers/{index}/dependency
Resolve described requirement against specified dependency resolver.
@@ -75,7 +75,7 @@ class ToolDependenciesAPIController( BaseAPIController ):
@require_admin
def install_dependency(self, trans, id=None, **kwds):
"""
- POST /api/dependencies_resolver/{index}/dependency
+ POST /api/dependency_resolvers/{index}/dependency
Install described requirement against specified dependency resolver.
@@ -102,7 +102,7 @@ class ToolDependenciesAPIController( BaseAPIController ):
@require_admin
def manager_dependency(self, trans, **kwds):
"""
- GET /api/dependencies_resolvers/dependency
+ GET /api/dependency_resolvers/dependency
Resolve described requirement against all dependency resolvers, returning
the match with highest priority.
@@ -129,7 +129,7 @@ class ToolDependenciesAPIController( BaseAPIController ):
@require_admin
def resolver_requirements(self, trans, id, **kwds):
"""
- GET /api/dependencies_resolver/{index}/requirements
+ GET /api/dependency_resolvers/{index}/requirements
Find all "simple" requirements that could be resolved "exactly"
by this dependency resolver. The dependency resolver must implement
@@ -148,7 +148,7 @@ class ToolDependenciesAPIController( BaseAPIController ):
@require_admin
def manager_requirements(self, trans, **kwds):
"""
- GET /api/dependencies_resolver/requirements
+ GET /api/dependency_resolvers/requirements
Find all "simple" requirements that could be resolved "exactly"
by all dependency resolvers that support this operation.
@@ -167,7 +167,7 @@ class ToolDependenciesAPIController( BaseAPIController ):
@require_admin
def clean(self, trans, id=None, **kwds):
"""
- POST /api/dependencies_resolver/{index}/clean
+ POST /api/dependency_resolvers/{index}/clean
Cleans up intermediate files created by resolvers during the dependency
installation.
diff --git a/lib/galaxy/webapps/galaxy/api/tools.py b/lib/galaxy/webapps/galaxy/api/tools.py
index 3b501f3cc48..812f51d1c11 100644
--- a/lib/galaxy/webapps/galaxy/api/tools.py
+++ b/lib/galaxy/webapps/galaxy/api/tools.py
@@ -135,12 +135,16 @@ class ToolsController( BaseAPIController, UsesVisualizationMixin ):
@web.require_admin
def install_dependencies(self, trans, id, **kwds):
"""
- POST /api/tools/{tool_id}/install_dependencies
+ POST /api/tools/{tool_id}/dependencies
+
+ This endpoint is also available through POST /api/tools/{tool_id}/install_dependencies,
+ but will be deprecated in the future.
+
Attempts to install requirements via the dependency resolver
parameters:
build_dependency_cache: If true, attempts to cache dependencies for this tool
- force_rebuild: If true and chache dir exists, attempts to delete cache dir
+ force_rebuild: If true and cache dir exists, attempts to delete cache dir
"""
tool = self._get_tool(id)
tool._view.install_dependencies(tool.requirements)
@@ -150,6 +154,19 @@ class ToolsController( BaseAPIController, UsesVisualizationMixin ):
# _view.install_dependencies should return a dict with stdout, stderr and success status
return tool.tool_requirements_status
+ @expose_api
+ @web.require_admin
+ def uninstall_dependencies(self, trans, id, **kwds):
+ """
+ DELETE /api/tools/{tool_id}/dependencies
+ Attempts to uninstall requirements via the dependency resolver
+
+ """
+ tool = self._get_tool(id)
+ tool._view.uninstall_dependencies(index=None, requirements=tool.requirements)
+ # TODO: rework resolver install system to log and report what has been done.
+ return tool.tool_requirements_status
+
@expose_api
@web.require_admin
def build_dependency_cache(self, trans, id, **kwds):
diff --git a/lib/galaxy/webapps/galaxy/api/users.py b/lib/galaxy/webapps/galaxy/api/users.py
index 08bf3b295ae..0e39c648ed2 100644
--- a/lib/galaxy/webapps/galaxy/api/users.py
+++ b/lib/galaxy/webapps/galaxy/api/users.py
@@ -3,9 +3,12 @@ API operations on User objects.
"""
import logging
-import datetime
+import random
import re
+import socket
+from datetime import datetime
+from markupsafe import escape
from sqlalchemy import false, true, and_, or_
from galaxy import exceptions, util, web
@@ -14,6 +17,7 @@ from galaxy.managers import users
from galaxy.security.validate_user_input import validate_email
from galaxy.security.validate_user_input import validate_password
from galaxy.security.validate_user_input import validate_publicname
+from galaxy.web import url_for
from galaxy.web import _future_expose_api as expose_api
from galaxy.web import _future_expose_api_anonymous as expose_api_anonymous
from galaxy.web.base.controller import BaseAPIController
@@ -24,7 +28,7 @@ from galaxy.web.base.controller import BaseUIController
from galaxy.web.base.controller import UsesFormDefinitionsMixin
from galaxy.web.form_builder import AddressField
from galaxy.tools.toolbox.filters import FilterFactory
-from galaxy.util import docstring_trim, listify
+from galaxy.util import docstring_trim, listify, hash_util
from galaxy.util.odict import odict
@@ -231,9 +235,7 @@ class UserAPIController( BaseAPIController, UsesTagsMixin, CreatesUsersMixin, Cr
# TODO: move to more basal, common resource than this
def anon_user_api_value( self, trans ):
- """
- Returns data for an anonymous user, truncated to only usage and quota_percent
- """
+ """Return data for an anonymous user, truncated to only usage and quota_percent"""
usage = trans.app.quota_agent.get_usage( trans )
percent = trans.app.quota_agent.get_percent( trans=trans, usage=usage )
return {'total_disk_usage': int( usage ),
@@ -242,9 +244,7 @@ class UserAPIController( BaseAPIController, UsesTagsMixin, CreatesUsersMixin, Cr
@expose_api
def get_information(self, trans, id, **kwd):
- '''
- Returns user details such as public username, type, addresses, etc.
- '''
+ """Return user details such as username, email, addresses etc."""
user = self._get_user(trans, id)
email = user.email
username = user.username
@@ -315,9 +315,7 @@ class UserAPIController( BaseAPIController, UsesTagsMixin, CreatesUsersMixin, Cr
@expose_api
def set_information(self, trans, id, payload={}, **kwd):
- '''
- Save a user's email address, public username, type, addresses etc.
- '''
+ """Save a user's email, username, addresses etc."""
user = self._get_user(trans, id)
email = payload.get('email')
username = payload.get('username')
@@ -327,14 +325,17 @@ class UserAPIController( BaseAPIController, UsesTagsMixin, CreatesUsersMixin, Cr
message = validate_publicname(trans, username, user)
if message:
raise MessageException(message)
- # Update user email and user's private role name which must match
if user.email != email:
+ # Update user email and user's private role name which must match
private_role = trans.app.security_agent.get_private_user_role(user)
private_role.name = email
private_role.description = 'Private role for ' + email
user.email = email
+ trans.sa_session.add(user)
trans.sa_session.add(private_role)
+ trans.sa_session.flush()
if trans.app.config.user_activation_on:
+ # Deactivate the user if email was changed and activation is on.
user.active = False
if self.send_verification_email(trans, user.email, user.username):
message = 'The login information has been updated with the changes. Verification email has been sent to your new email address. Please verify it by clicking the activation link in the email. Please check your spam/trash folder in case you cannot find the message.'
@@ -343,8 +344,8 @@ class UserAPIController( BaseAPIController, UsesTagsMixin, CreatesUsersMixin, Cr
if trans.app.config.error_email_to is not None:
message += ' Contact: %s' % trans.app.config.error_email_to
raise MessageException(message)
- # Update public name
if user.username != username:
+ # Update public name
user.username = username
# Update user custom form
user_info_form_id = payload.get('info|form_id')
@@ -393,6 +394,60 @@ class UserAPIController( BaseAPIController, UsesTagsMixin, CreatesUsersMixin, Cr
trans.log_event('User information added')
return {'message': 'User information has been saved.'}
+ def send_verification_email( self, trans, email, username ):
+ """
+ Send the verification email containing the activation link to the user's email.
+ """
+ if username is None:
+ username = trans.user.username
+ activation_link = self.prepare_activation_link( trans, escape( email ) )
+
+ host = trans.request.host.split( ':' )[ 0 ]
+ if host in [ 'localhost', '127.0.0.1', '0.0.0.0' ]:
+ host = socket.getfqdn()
+ body = ("Hello %s,\n\n"
+ "In order to complete the activation process for %s begun on %s at %s, please click on the following link to verify your account:\n\n"
+ "%s \n\n"
+ "By clicking on the above link and opening a Galaxy account you are also confirming that you have read and agreed to Galaxy's Terms and Conditions for use of this service (%s). This includes a quota limit of one account per user. Attempts to subvert this limit by creating multiple accounts or through any other method may result in termination of all associated accounts and data.\n\n"
+ "Please contact us if you need help with your account at: %s. You can also browse resources available at: %s. \n\n"
+ "More about the Galaxy Project can be found at galaxyproject.org\n\n"
+ "Your Galaxy Team" % (escape( username ), escape( email ),
+ datetime.utcnow().strftime( "%D"),
+ trans.request.host, activation_link,
+ trans.app.config.terms_url,
+ trans.app.config.error_email_to,
+ trans.app.config.instance_resource_url))
+ to = email
+ frm = trans.app.config.email_from or 'galaxy-no-reply@' + host
+ subject = 'Galaxy Account Activation'
+ try:
+ util.send_mail( frm, to, subject, body, trans.app.config )
+ return True
+ except Exception:
+ log.exception( 'Unable to send the activation email.' )
+ return False
+
+ def prepare_activation_link( self, trans, email ):
+ """
+ Prepare the account activation link for the user.
+ """
+ activation_token = self.get_activation_token( trans, email )
+ activation_link = url_for( controller='user', action='activate', activation_token=activation_token, email=email, qualified=True )
+ return activation_link
+
+ def get_activation_token( self, trans, email ):
+ """
+ Check for the activation token. Create new activation token and store it in the database if no token found.
+ """
+ user = trans.sa_session.query( trans.app.model.User ).filter( trans.app.model.User.table.c.email == email ).first()
+ activation_token = user.activation_token
+ if activation_token is None:
+ activation_token = hash_util.new_secure_hash( str( random.getrandbits( 256 ) ) )
+ user.activation_token = activation_token
+ trans.sa_session.add( user )
+ trans.sa_session.flush()
+ return activation_token
+
def _validate_email_publicname(self, email, username):
''' Validate email and username using regex '''
if email == '' or not isinstance( email, basestring ):
diff --git a/lib/galaxy/webapps/galaxy/api/workflows.py b/lib/galaxy/webapps/galaxy/api/workflows.py
index af2c1271335..cd930783cd8 100644
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -369,6 +369,7 @@ class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesAnn
return {
'label' : inputs.get( '__label', '' ),
'annotation' : inputs.get( '__annotation', '' ),
+ 'name' : module.get_name(),
'tool_state' : module.get_state(),
'data_inputs' : module.get_data_inputs(),
'data_outputs' : module.get_data_outputs(),
diff --git a/lib/galaxy/webapps/galaxy/buildapp.py b/lib/galaxy/webapps/galaxy/buildapp.py
index 2cf4b3214ea..b75b124543c 100644
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -19,10 +19,14 @@ import galaxy.model.mapping
import galaxy.datatypes.registry
import galaxy.web.framework
import galaxy.web.framework.webapp
-from galaxy.webapps.util import build_template_error_formatters
+from galaxy.webapps.util import (
+ MiddlewareWrapUnsupported,
+ build_template_error_formatters,
+ wrap_if_allowed,
+ wrap_if_allowed_or_fail
+)
from galaxy import util
from galaxy.util import asbool
-from galaxy.util.postfork import process_is_uwsgi, register_postfork_function
from galaxy.util.properties import load_app_properties
from paste import httpexceptions
@@ -64,15 +68,6 @@ def paste_app_factory( global_conf, **kwargs ):
# Create the universe WSGI application
webapp = GalaxyWebApplication( app, session_cookie='galaxysession', name='galaxy' )
- # CLIENTSIDE ROUTES
- # The following are routes that are handled completely on the clientside.
- # The following routes don't bootstrap any information, simply provide the
- # base analysis interface at which point the application takes over.
-
- webapp.add_client_route( '/tours' )
- webapp.add_client_route( '/tours/{tour_id}' )
- webapp.add_client_route( '/users' )
-
# STANDARD CONTROLLER ROUTES
webapp.add_ui_controllers( 'galaxy.webapps.galaxy.controllers', app )
# Force /history to go to view of current
@@ -110,18 +105,27 @@ def paste_app_factory( global_conf, **kwargs ):
# isolation as well.
populate_api_routes( webapp, app )
+ # CLIENTSIDE ROUTES
+ # The following are routes that are handled completely on the clientside.
+ # The following routes don't bootstrap any information, simply provide the
+ # base analysis interface at which point the application takes over.
+
+ webapp.add_client_route( '/tours' )
+ webapp.add_client_route( '/tours/{tour_id}' )
+ webapp.add_client_route( '/user' )
+ webapp.add_client_route( '/user/{form_id}' )
+
# ==== Done
# Indicate that all configuration settings have been provided
webapp.finalize_config()
# Wrap the webapp in some useful middleware
if kwargs.get( 'middleware', True ):
- webapp = wrap_in_middleware( webapp, global_conf, **kwargs )
+ webapp = wrap_in_middleware(webapp, global_conf, app.application_stack, **kwargs)
if asbool( kwargs.get( 'static_enabled', True) ):
- if process_is_uwsgi:
- log.error("Static middleware is enabled in your configuration but this is a uwsgi process. Refusing to wrap in static middleware.")
- else:
- webapp = wrap_in_static( webapp, global_conf, plugin_frameworks=[ app.visualizations_registry ], **kwargs )
+ webapp = wrap_if_allowed(webapp, app.application_stack, wrap_in_static,
+ args=(global_conf,),
+ kwargs=dict(plugin_frameworks=[app.visualizations_registry], **kwargs))
# Close any pooled database connections before forking
try:
galaxy.model.mapping.metadata.bind.dispose()
@@ -134,7 +138,7 @@ def paste_app_factory( global_conf, **kwargs ):
except:
log.exception("Unable to dispose of pooled toolshed install model database connections.")
- register_postfork_function(postfork_setup)
+ app.application_stack.register_postfork_function(postfork_setup)
for th in threading.enumerate():
if th.is_alive():
@@ -161,9 +165,7 @@ def uwsgi_app_factory():
def postfork_setup():
from galaxy.app import app
- if process_is_uwsgi:
- import uwsgi
- app.config.server_name += ".%s" % uwsgi.worker_id()
+ app.application_stack.set_postfork_server_name(app)
app.control_worker.bind_and_start()
@@ -183,11 +185,6 @@ def populate_api_routes( webapp, app ):
path_prefix='/api/histories/{history_id}/contents',
parent_resources=dict( member_name='history', collection_name='histories' ),
)
-
- contents_archive_mapper = webapp.mapper.submapper( action='archive', controller='history_contents' )
- contents_archive_mapper.connect( '/api/histories/{history_id}/contents/archive' )
- contents_archive_mapper.connect( '/api/histories/{history_id}/contents/archive/{filename}{.format}' )
-
# Legacy access to HDA details via histories/{history_id}/contents/{hda_id}
webapp.mapper.resource( 'content',
'contents',
@@ -269,6 +266,8 @@ def populate_api_routes( webapp, app ):
webapp.mapper.connect( '/api/tools/{id:.+?}/download', action='download', controller="tools" )
webapp.mapper.connect( '/api/tools/{id:.+?}/requirements', action='requirements', controller="tools")
webapp.mapper.connect( '/api/tools/{id:.+?}/install_dependencies', action='install_dependencies', controller="tools", conditions=dict( method=[ "POST" ] ))
+ webapp.mapper.connect( '/api/tools/{id:.+?}/dependencies', action='install_dependencies', controller="tools", conditions=dict( method=[ "POST" ] ))
+ webapp.mapper.connect( '/api/tools/{id:.+?}/dependencies', action='uninstall_dependencies', controller="tools", conditions=dict( method=[ "DELETE" ] ))
webapp.mapper.connect( '/api/tools/{id:.+?}/build_dependency_cache', action='build_dependency_cache', controller="tools", conditions=dict( method=[ "POST" ] ))
webapp.mapper.connect( '/api/tools/{id:.+?}', action='show', controller="tools" )
webapp.mapper.resource( 'tool', 'tools', path_prefix='/api' )
@@ -337,6 +336,11 @@ def populate_api_routes( webapp, app ):
"/api/histories/{id}/exports/{jeha_id}", controller="histories",
action="archive_download", conditions=dict( method=[ "GET" ] ) )
+ webapp.mapper.connect( '/api/histories/{history_id}/contents/archive',
+ controller='history_contents', action='archive')
+ webapp.mapper.connect( '/api/histories/{history_id}/contents/archive/{filename}{.format}',
+ controller='history_contents', action='archive')
+
# ---- visualizations registry ---- generic template renderer
# @deprecated: this route should be considered deprecated
webapp.add_route( '/visualization/show/{visualization_name}', controller='visualization', action='render', visualization_name=None )
@@ -845,12 +849,13 @@ def _add_item_provenance_controller( webapp, name_prefix, path_prefix, **kwd ):
webapp.mapper.resource(name, "provenance", path_prefix=path_prefix, controller=controller)
-def wrap_in_middleware( app, global_conf, **local_conf ):
+def wrap_in_middleware( app, global_conf, application_stack, **local_conf ):
"""
Based on the configuration wrap `app` in a set of common and useful
middleware.
"""
webapp = app
+ stack = application_stack
# Merge the global and local configurations
conf = global_conf.copy()
@@ -859,16 +864,15 @@ def wrap_in_middleware( app, global_conf, **local_conf ):
# First put into place httpexceptions, which must be most closely
# wrapped around the application (it can interact poorly with
# other middleware):
- app = httpexceptions.make_middleware( app, conf )
- log.debug( "Enabling 'httpexceptions' middleware" )
+ app = wrap_if_allowed( app, stack, httpexceptions.make_middleware, name='paste.httpexceptions', args=(conf,) )
# Statsd request timing and profiling
statsd_host = conf.get('statsd_host', None)
if statsd_host:
from galaxy.web.framework.middleware.statsd import StatsdMiddleware
- app = StatsdMiddleware( app,
- statsd_host,
- conf.get('statsd_port', 8125),
- conf.get('statsd_prefix', 'galaxy') )
+ app = wrap_if_allowed( app, stack, StatsdMiddleware,
+ args=( statsd_host,
+ conf.get('statsd_port', 8125),
+ conf.get('statsd_prefix', 'galaxy') ) )
log.debug( "Enabling 'statsd' middleware" )
# If we're using remote_user authentication, add middleware that
# protects Galaxy from improperly configured authentication in the
@@ -877,25 +881,26 @@ def wrap_in_middleware( app, global_conf, **local_conf ):
use_remote_user = asbool(conf.get( 'use_remote_user', False )) or single_user
if use_remote_user:
from galaxy.web.framework.middleware.remoteuser import RemoteUser
- app = RemoteUser( app, maildomain=conf.get( 'remote_user_maildomain', None ),
- display_servers=util.listify( conf.get( 'display_servers', '' ) ),
- single_user=single_user,
- admin_users=conf.get( 'admin_users', '' ).split( ',' ),
- remote_user_header=conf.get( 'remote_user_header', 'HTTP_REMOTE_USER' ),
- remote_user_secret_header=conf.get('remote_user_secret', None),
- normalize_remote_user_email=conf.get('normalize_remote_user_email', False))
+ app = wrap_if_allowed( app, stack, RemoteUser,
+ kwargs=dict(
+ maildomain=conf.get('remote_user_maildomain', None),
+ display_servers=util.listify( conf.get('display_servers', '')),
+ single_user=single_user,
+ admin_users=conf.get('admin_users', '').split(','),
+ remote_user_header=conf.get('remote_user_header', 'HTTP_REMOTE_USER'),
+ remote_user_secret_header=conf.get('remote_user_secret', None),
+ normalize_remote_user_email=conf.get('normalize_remote_user_email', False)) )
# The recursive middleware allows for including requests in other
# requests or forwarding of requests, all on the server side.
if asbool(conf.get('use_recursive', True)):
from paste import recursive
- app = recursive.RecursiveMiddleware( app, conf )
- log.debug( "Enabling 'recursive' middleware" )
+ app = wrap_if_allowed( app, stack, recursive.RecursiveMiddleware, args=(conf,) )
# If sentry logging is enabled, log here before propogating up to
# the error middleware
sentry_dsn = conf.get( 'sentry_dsn', None )
if sentry_dsn:
from galaxy.web.framework.middleware.sentry import Sentry
- app = Sentry( app, sentry_dsn )
+ app = wrap_if_allowed( app, stack, Sentry, args=(sentry_dsn,) )
# Various debug middleware that can only be turned on if the debug
# flag is set, either because they are insecure or greatly hurt
# performance
@@ -903,48 +908,41 @@ def wrap_in_middleware( app, global_conf, **local_conf ):
# Middleware to check for WSGI compliance
if asbool( conf.get( 'use_lint', False ) ):
from paste import lint
- app = lint.make_middleware( app, conf )
- log.debug( "Enabling 'lint' middleware" )
+ app = wrap_if_allowed( app, stack, lint.make_middleware, name='paste.lint', args=(conf,) )
# Middleware to run the python profiler on each request
if asbool( conf.get( 'use_profile', False ) ):
from paste.debug import profile
- app = profile.ProfileMiddleware( app, conf )
- log.debug( "Enabling 'profile' middleware" )
- if debug and asbool( conf.get( 'use_interactive', False ) ) and not process_is_uwsgi:
+ app = wrap_if_allowed( app, stack, profile.ProfileMiddleware, args=(conf,) )
+ if debug and asbool( conf.get( 'use_interactive', False ) ):
# Interactive exception debugging, scary dangerous if publicly
# accessible, if not enabled we'll use the regular error printing
# middleware.
- from weberror import evalexception
- app = evalexception.EvalException( app, conf,
- templating_formatters=build_template_error_formatters() )
- log.debug( "Enabling 'eval exceptions' middleware" )
+ try:
+ from weberror import evalexception
+ app = wrap_if_allowed_or_fail( app, stack, evalexception.EvalException,
+ args=(conf,),
+ kwargs=dict(templating_formatters=build_template_error_formatters()) )
+ except MiddlewareWrapUnsupported as exc:
+ log.warning(str(exc))
+ import galaxy.web.framework.middleware.error
+ app = wrap_if_allowed( app, stack, galaxy.web.framework.middleware.error.ErrorMiddleware, args=(conf,) )
else:
- if debug and asbool( conf.get( 'use_interactive', False ) ) and process_is_uwsgi:
- log.error("Interactive debugging middleware is enabled in your configuration "
- "but this is a uwsgi process. Refusing to wrap in interactive error middleware.")
# Not in interactive debug mode, just use the regular error middleware
import galaxy.web.framework.middleware.error
- app = galaxy.web.framework.middleware.error.ErrorMiddleware( app, conf )
- log.debug( "Enabling 'error' middleware" )
+ app = wrap_if_allowed( app, stack, galaxy.web.framework.middleware.error.ErrorMiddleware, args=(conf,) )
# Transaction logging (apache access.log style)
if asbool( conf.get( 'use_translogger', True ) ):
from galaxy.web.framework.middleware.translogger import TransLogger
- app = TransLogger( app )
- log.debug( "Enabling 'trans logger' middleware" )
+ app = wrap_if_allowed( app, stack, TransLogger )
# X-Forwarded-Host handling
from galaxy.web.framework.middleware.xforwardedhost import XForwardedHostMiddleware
- app = XForwardedHostMiddleware( app )
- log.debug( "Enabling 'x-forwarded-host' middleware" )
+ app = wrap_if_allowed( app, stack, XForwardedHostMiddleware )
# Request ID middleware
from galaxy.web.framework.middleware.request_id import RequestIDMiddleware
- app = RequestIDMiddleware( app )
- log.debug( "Enabling 'Request ID' middleware" )
-
+ app = wrap_if_allowed( app, stack, RequestIDMiddleware )
# api batch call processing middleware
from galaxy.web.framework.middleware.batch import BatchMiddleware
- app = BatchMiddleware( webapp, app, {})
- log.debug( "Enabling 'Batch' middleware" )
-
+ app = wrap_if_allowed( app, stack, BatchMiddleware, args=(webapp, {}) )
return app
diff --git a/lib/galaxy/webapps/galaxy/controllers/admin.py b/lib/galaxy/webapps/galaxy/controllers/admin.py
index d061506bc2a..917ccaae55c 100644
--- a/lib/galaxy/webapps/galaxy/controllers/admin.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin.py
@@ -10,7 +10,6 @@ from galaxy import web
from galaxy.actions.admin import AdminActions
from galaxy.exceptions import MessageException
from galaxy.model import tool_shed_install as install_model
-from galaxy.model.util import pgcalc
from galaxy.util import nice_size, sanitize_text, url_get
from galaxy.util.odict import odict
from galaxy.web import url_for
@@ -92,7 +91,8 @@ class UserListGrid( grids.Grid ):
model_class=model.User,
link=( lambda item: dict( operation="information", id=item.id, webapp="galaxy" ) ),
attach_popup=True,
- filterable="advanced" ),
+ filterable="advanced",
+ target="top" ),
UserNameColumn( "User Name",
key="username",
model_class=model.User,
@@ -874,27 +874,9 @@ class AdminGalaxy( BaseUIController, Admin, AdminActions, UsesQuotaMixin, QuotaP
user = trans.sa_session.query( trans.model.User ).get( trans.security.decode_id( user_id ) )
if not user:
return trans.show_error_message( "User not found for id (%s)" % sanitize_text( str( user_id ) ) )
- engine = None
- if trans.app.config.database_connection:
- engine = trans.app.config.database_connection.split(':')[0]
- if engine not in ( 'postgres', 'postgresql' ):
- done = False
- while not done:
- current = user.get_disk_usage()
- new = user.calculate_disk_usage()
- trans.sa_session.refresh( user )
- # make sure usage didn't change while calculating, set done
- if user.get_disk_usage() == current:
- done = True
- if new not in (current, None):
- user.set_disk_usage( new )
- trans.sa_session.add( user )
- trans.sa_session.flush()
- else:
- # We can use the lightning fast pgcalc!
- current = user.get_disk_usage()
- new = pgcalc( self.sa_session, user.id )
- # yes, still a small race condition between here and the flush
+ current = user.get_disk_usage()
+ user.calculate_and_set_disk_usage()
+ new = user.get_disk_usage()
if new in ( current, None ):
message = 'Usage is unchanged at %s.' % nice_size( current )
else:
diff --git a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
index e0742004dab..7b103af9f53 100644
--- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
@@ -1049,8 +1049,7 @@ class AdminToolshed( AdminGalaxy ):
repo_info_dicts = [ encoding_util.tool_shed_decode( encoded_repo_info_dict ) for encoded_repo_info_dict in encoded_repo_info_dicts ]
dd = dependency_display.DependencyDisplayer( trans.app )
install_repository_manager = install_manager.InstallRepositoryManager( trans.app )
- if ( ( not includes_tools_for_display_in_tool_panel and kwd.get( 'select_shed_tool_panel_config_button', False ) ) or
- ( includes_tools_for_display_in_tool_panel and kwd.get( 'select_tool_panel_section_button', False ) ) ):
+ if kwd.get( 'select_tool_panel_section_button', False ):
if updating:
repository = repository_util.get_tool_shed_repository_by_id( trans.app, updating_repository_id )
decoded_updated_metadata = encoding_util.tool_shed_decode( encoded_updated_metadata )
@@ -1214,57 +1213,29 @@ class AdminToolshed( AdminGalaxy ):
install_resolver_dependencies_check_box = None
encoded_repo_info_dicts = encoding_util.encoding_sep.join( encoded_repo_info_dicts )
tool_shed_url = kwd[ 'tool_shed_url' ]
- if includes_tools_for_display_in_tool_panel:
- return trans.fill_template( '/admin/tool_shed_repository/select_tool_panel_section.mako',
- encoded_repo_info_dicts=encoded_repo_info_dicts,
- updating=updating,
- updating_repository_id=updating_repository_id,
- updating_to_ctx_rev=updating_to_ctx_rev,
- updating_to_changeset_revision=updating_to_changeset_revision,
- encoded_updated_metadata=encoded_updated_metadata,
- includes_tools=includes_tools,
- includes_tools_for_display_in_tool_panel=includes_tools_for_display_in_tool_panel,
- includes_tool_dependencies=includes_tool_dependencies,
- install_tool_dependencies_check_box=install_tool_dependencies_check_box,
- install_resolver_dependencies_check_box=install_resolver_dependencies_check_box,
- has_repository_dependencies=has_repository_dependencies,
- install_repository_dependencies_check_box=install_repository_dependencies_check_box,
- new_tool_panel_section_label=new_tool_panel_section_label,
- containers_dict=containers_dict,
- shed_tool_conf=shed_tool_conf,
- shed_tool_conf_select_field=shed_tool_conf_select_field,
- tool_panel_section_select_field=tool_panel_section_select_field,
- tool_shed_url=tool_shed_url,
- requirements_status=requirements_status,
- message=message,
- status=status )
- else:
- # If installing repositories that includes no tools and has no repository dependencies, display a page
- # allowing the Galaxy administrator to select a shed-related tool panel configuration file whose tool_path
- # setting will be the location the repositories will be installed.
- return trans.fill_template( '/admin/tool_shed_repository/select_shed_tool_panel_config.mako',
- encoded_repo_info_dicts=encoded_repo_info_dicts,
- updating=updating,
- updating_repository_id=updating_repository_id,
- updating_to_ctx_rev=updating_to_ctx_rev,
- updating_to_changeset_revision=updating_to_changeset_revision,
- encoded_updated_metadata=encoded_updated_metadata,
- includes_tools=includes_tools,
- includes_tools_for_display_in_tool_panel=includes_tools_for_display_in_tool_panel,
- includes_tool_dependencies=includes_tool_dependencies,
- install_tool_dependencies_check_box=install_tool_dependencies_check_box,
- install_resolver_dependencies_check_box=install_resolver_dependencies_check_box,
- has_repository_dependencies=has_repository_dependencies,
- install_repository_dependencies_check_box=install_repository_dependencies_check_box,
- new_tool_panel_section_label=new_tool_panel_section_label,
- containers_dict=containers_dict,
- shed_tool_conf=shed_tool_conf,
- shed_tool_conf_select_field=shed_tool_conf_select_field,
- tool_panel_section_select_field=tool_panel_section_select_field,
- tool_shed_url=tool_shed_url,
- tool_requirements=tool_requirements,
- message=message,
- status=status )
+ return trans.fill_template( '/admin/tool_shed_repository/select_tool_panel_section.mako',
+ encoded_repo_info_dicts=encoded_repo_info_dicts,
+ updating=updating,
+ updating_repository_id=updating_repository_id,
+ updating_to_ctx_rev=updating_to_ctx_rev,
+ updating_to_changeset_revision=updating_to_changeset_revision,
+ encoded_updated_metadata=encoded_updated_metadata,
+ includes_tools=includes_tools,
+ includes_tools_for_display_in_tool_panel=includes_tools_for_display_in_tool_panel,
+ includes_tool_dependencies=includes_tool_dependencies,
+ install_tool_dependencies_check_box=install_tool_dependencies_check_box,
+ install_resolver_dependencies_check_box=install_resolver_dependencies_check_box,
+ has_repository_dependencies=has_repository_dependencies,
+ install_repository_dependencies_check_box=install_repository_dependencies_check_box,
+ new_tool_panel_section_label=new_tool_panel_section_label,
+ containers_dict=containers_dict,
+ shed_tool_conf=shed_tool_conf,
+ shed_tool_conf_select_field=shed_tool_conf_select_field,
+ tool_panel_section_select_field=tool_panel_section_select_field,
+ tool_shed_url=tool_shed_url,
+ requirements_status=requirements_status,
+ message=message,
+ status=status )
@web.expose
@web.require_admin
diff --git a/lib/galaxy/webapps/galaxy/controllers/dataset.py b/lib/galaxy/webapps/galaxy/controllers/dataset.py
index 97033c4be10..f704e3f96f3 100644
--- a/lib/galaxy/webapps/galaxy/controllers/dataset.py
+++ b/lib/galaxy/webapps/galaxy/controllers/dataset.py
@@ -58,7 +58,7 @@ class HistoryDatasetAssociationListGrid( grids.Grid ):
grids.TextColumn( "Name", key="name",
# Link name to dataset's history.
link=( lambda item: iff( item.history.deleted, None, dict( operation="switch", id=item.id ) ) ), filterable="advanced", attach_popup=True ),
- HistoryColumn( "History", key="history", sortable=False, inbound=True,
+ HistoryColumn( "History", key="history", sortable=False, target="inbound",
link=( lambda item: iff( item.history.deleted, None, dict( operation="switch_history", id=item.id ) ) ) ),
grids.IndividualTagsColumn( "Tags", key="tags", model_tag_association_class=model.HistoryDatasetAssociationTagAssociation, filterable="advanced", grid_name="HistoryDatasetAssocationListGrid" ),
StatusColumn( "Status", key="deleted", attach_popup=False ),
diff --git a/lib/galaxy/webapps/galaxy/controllers/history.py b/lib/galaxy/webapps/galaxy/controllers/history.py
index e0623e5b20d..044e2473751 100644
--- a/lib/galaxy/webapps/galaxy/controllers/history.py
+++ b/lib/galaxy/webapps/galaxy/controllers/history.py
@@ -111,7 +111,7 @@ class HistoryListGrid( grids.Grid ):
grids.GridOperation( "View", allow_multiple=False ),
grids.GridOperation( "Share or Publish", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False ),
grids.GridOperation( "Copy", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False ),
- grids.GridOperation( "Rename", condition=( lambda item: not item.deleted ), async_compatible=False, inbound=True ),
+ grids.GridOperation( "Rename", condition=( lambda item: not item.deleted ), async_compatible=False, target="inbound" ),
grids.GridOperation( "Delete", condition=( lambda item: not item.deleted ), async_compatible=True ),
grids.GridOperation( "Delete Permanently", condition=( lambda item: not item.purged ), confirm="History contents will be removed from disk, this cannot be undone. Continue?", async_compatible=True ),
grids.GridOperation( "Undelete", condition=( lambda item: item.deleted and not item.purged ), async_compatible=True ),
@@ -1261,21 +1261,6 @@ class HistoryController( BaseUIController, SharableMixin, UsesAnnotations, UsesI
return
# TODO: used in page/editor.mako
- @web.expose
- def name_autocomplete_data( self, trans, q=None, limit=None, timestamp=None ):
- """Return autocomplete data for history names"""
- user = trans.get_user()
- if not user:
- return
-
- ac_data = ""
- for history in ( trans.sa_session.query( model.History )
- .filter_by( user=user )
- .filter( func.lower( model.History.name ).like(q.lower() + "%") ) ):
- ac_data = ac_data + history.name + "\n"
- return ac_data
- # TODO: used in grid_base.mako
-
@web.expose
@web.require_login( "rename histories" )
def rename( self, trans, id=None, name=None, **kwd ):
diff --git a/lib/galaxy/webapps/galaxy/controllers/interactive_environments.py b/lib/galaxy/webapps/galaxy/controllers/interactive_environments.py
new file mode 100644
index 00000000000..36d986fcdfe
--- /dev/null
+++ b/lib/galaxy/webapps/galaxy/controllers/interactive_environments.py
@@ -0,0 +1,46 @@
+"""
+API check for whether the current session's interactive environment launch is ready
+"""
+from subprocess import Popen, PIPE
+
+from galaxy.web import expose, json
+from galaxy.web.base.controller import BaseUIController
+
+import logging
+log = logging.getLogger(__name__)
+
+
+class InteractiveEnvironmentsController(BaseUIController):
+
+ @expose
+ @json
+ def ready(self, trans, **kwd):
+ """
+ GET /interactive_environments/ready/
+
+ Queries the GIE proxy IPC to determine whether the current user's session's GIE launch is ready
+
+ :returns: ``true`` if ready else ``false``
+ :rtype: boolean
+ """
+ proxy_map = self.app.proxy_manager.query_proxy(trans)
+ if proxy_map.container_ids:
+ command = proxy_map.docker_command.format(
+ docker_args='ps --format {{{{.Status}}}} --filter id={container_id}'.format(
+ container_id=proxy_map.container_ids[0]))
+ match_col = 0
+ match_str = 'Up'
+ elif proxy_map.service_ids:
+ command = proxy_map.docker_command.format(
+ docker_args='service ps --no-trunc {service_id}'.format(service_id=proxy_map.service_ids[0]))
+ match_col = 5
+ match_str = 'Running'
+ else:
+ raise Exception('Proxy map has neither container ids nor service ids stored')
+ p = Popen(command, stdout=PIPE, stderr=PIPE, close_fds=True, shell=True)
+ stdout, stderr = p.communicate()
+ if p.returncode != 0:
+ log.error( "%s\n%s" % (stdout, stderr) )
+ return None
+ else:
+ return stdout.splitlines()[-1].strip().split()[match_col].startswith(match_str)
diff --git a/lib/galaxy/webapps/galaxy/controllers/user.py b/lib/galaxy/webapps/galaxy/controllers/user.py
index c69eb8765e0..bd073197eda 100644
--- a/lib/galaxy/webapps/galaxy/controllers/user.py
+++ b/lib/galaxy/webapps/galaxy/controllers/user.py
@@ -17,6 +17,7 @@ from galaxy import model
from galaxy import util
from galaxy import web
from galaxy.exceptions import ObjectInvalid
+from galaxy.queue_worker import send_local_control_task
from galaxy.security.validate_user_input import (transform_publicname,
validate_email,
validate_password,
@@ -624,9 +625,12 @@ class User( BaseUIController, UsesFormDefinitionsMixin, CreatesUsersMixin, Creat
refresh_frames = [ 'masthead', 'history', 'tools' ]
else:
refresh_frames = [ 'masthead', 'history' ]
- # Recalculate user disk usage.
if trans.user:
- trans.user.calculate_disk_usage()
+ # Queue a quota recalculation (async) task -- this takes a
+ # while sometimes, so we don't want to block on logout.
+ send_local_control_task( trans.app,
+ 'recalculate_user_disk_usage',
+ {'user_id': trans.security.encode_id(trans.user.id)} )
# Since logging an event requires a session, we'll log prior to ending the session
trans.log_event( "User logged out" )
else:
@@ -1190,3 +1194,108 @@ class User( BaseUIController, UsesFormDefinitionsMixin, CreatesUsersMixin, Creat
message=message,
display_top=kwd.get('redirect_home', False)
)
+
+ @web.expose
+ @web.require_admin
+ def edit_info( self, trans, cntrller, **kwd ):
+ """
+ TEMPORARY ENDPOINT - added back to support admin-level user info
+ editing prior to adminjs. This is code that was prematurely removed
+ from the user controller when the user-side editing functionality was
+ replaced.
+
+ The method manage_user_info, which follows this, should also be removed
+ at that time.
+
+ Edit user information = username, email or password.
+ """
+ params = util.Params( kwd )
+ is_admin = cntrller == 'admin' and trans.user_is_admin()
+ message = util.restore_text( params.get( 'message', '' ) )
+ status = params.get( 'status', 'done' )
+ user_id = params.get( 'user_id', None )
+ if user_id and is_admin:
+ user = trans.sa_session.query( trans.app.model.User ).get( trans.security.decode_id( user_id ) )
+ elif user_id and ( not trans.user or trans.user.id != trans.security.decode_id( user_id ) ):
+ message = 'Invalid user id'
+ status = 'error'
+ user = None
+ else:
+ user = trans.user
+ if user and params.get( 'login_info_button', False ):
+ # Editing email and username
+ email = util.restore_text( params.get( 'email', '' ) )
+ username = util.restore_text( params.get( 'username', '' ) ).lower()
+
+ # Validate the new values for email and username
+ message = validate_email( trans, email, user )
+ if not message and username:
+ message = validate_publicname( trans, username, user )
+ if message:
+ status = 'error'
+ else:
+ if ( user.email != email ):
+ # The user's private role name must match the user's login ( email )
+ private_role = trans.app.security_agent.get_private_user_role( user )
+ private_role.name = email
+ private_role.description = 'Private role for ' + email
+ # Change the email itself
+ user.email = email
+ trans.sa_session.add_all( ( user, private_role ) )
+ trans.sa_session.flush()
+ if trans.webapp.name == 'galaxy' and trans.app.config.user_activation_on:
+ user.active = False
+ trans.sa_session.add( user )
+ trans.sa_session.flush()
+ is_activation_sent = self.send_verification_email( trans, user.email, user.username )
+ if is_activation_sent:
+ message = 'The login information has been updated with the changes. Verification email has been sent to your new email address. Please verify it by clicking the activation link in the email. Please check your spam/trash folder in case you cannot find the message.'
+ else:
+ message = 'Unable to send activation email, please contact your local Galaxy administrator.'
+ if trans.app.config.error_email_to is not None:
+ message += ' Contact: %s' % trans.app.config.error_email_to
+ if ( user.username != username ):
+ user.username = username
+ trans.sa_session.add( user )
+ trans.sa_session.flush()
+ message = 'The login information has been updated with the changes.'
+ elif user and params.get( 'edit_user_info_button', False ):
+ # Edit user information - webapp MUST BE 'galaxy'
+ user_type_fd_id = params.get( 'user_type_fd_id', 'none' )
+ if user_type_fd_id not in [ 'none' ]:
+ user_type_form_definition = trans.sa_session.query( trans.app.model.FormDefinition ).get( trans.security.decode_id( user_type_fd_id ) )
+ elif user.values:
+ user_type_form_definition = user.values.form_definition
+ else:
+ # User was created before any of the user_info forms were created
+ user_type_form_definition = None
+ if user_type_form_definition:
+ values = self.get_form_values( trans, user, user_type_form_definition, **kwd )
+ else:
+ values = {}
+ flush_needed = False
+ if user.values:
+ # Editing the user info of an existing user with existing user info
+ user.values.content = values
+ trans.sa_session.add( user.values )
+ flush_needed = True
+ elif values:
+ form_values = trans.model.FormValues( user_type_form_definition, values )
+ trans.sa_session.add( form_values )
+ user.values = form_values
+ flush_needed = True
+ if flush_needed:
+ trans.sa_session.add( user )
+ trans.sa_session.flush()
+ message = "The user information has been updated with the changes."
+ if user and trans.webapp.name == 'galaxy' and is_admin:
+ kwd[ 'user_id' ] = trans.security.encode_id( user.id )
+ kwd[ 'id' ] = user_id
+ if message:
+ kwd[ 'message' ] = util.sanitize_text( message )
+ if status:
+ kwd[ 'status' ] = status
+ return trans.response.send_redirect( web.url_for( controller='user',
+ action='manage_user_info',
+ cntrller=cntrller,
+ **kwd ) )
diff --git a/lib/galaxy/webapps/galaxy/controllers/visualization.py b/lib/galaxy/webapps/galaxy/controllers/visualization.py
index f0195cf1c89..3794e0c6e4a 100644
--- a/lib/galaxy/webapps/galaxy/controllers/visualization.py
+++ b/lib/galaxy/webapps/galaxy/controllers/visualization.py
@@ -65,7 +65,7 @@ class HistorySelectionGrid( grids.Grid ):
datasets_action = 'list_history_datasets'
datasets_param = "f-history"
columns = [
- NameColumn( "History Name", key="name", filterable="standard", inbound=True ),
+ NameColumn( "History Name", key="name", filterable="standard", target="inbound" ),
grids.GridColumn( "Last Updated", key="update_time", format=time_ago, visible=False ),
DbKeyPlaceholderColumn( "Dbkey", key="dbkey", model_class=model.HistoryDatasetAssociation, visible=False )
]
@@ -88,7 +88,7 @@ class LibrarySelectionGrid( LibraryListGrid ):
datasets_action = 'list_library_datasets'
datasets_param = "f-library"
columns = [
- NameColumn( "Library Name", key="name", filterable="standard", inbound=True )
+ NameColumn( "Library Name", key="name", filterable="standard", target="inbound" )
]
num_rows_per_page = 10
use_async = True
@@ -224,12 +224,12 @@ class VisualizationListGrid( grids.Grid ):
key="free-text-search", visible=False, filterable="standard" )
)
global_actions = [
- grids.GridAction( "Create new visualization", dict( action='create' ), inbound=True )
+ grids.GridAction( "Create new visualization", dict( action='create' ), target="inbound" )
]
operations = [
grids.GridOperation( "Open", allow_multiple=False, url_args=get_url_args ),
grids.GridOperation( "Open in Circster", allow_multiple=False, condition=( lambda item: item.type == 'trackster' ), url_args=dict( action='circster' ) ),
- grids.GridOperation( "Edit Attributes", allow_multiple=False, url_args=dict( action='edit'), inbound=True),
+ grids.GridOperation( "Edit Attributes", allow_multiple=False, url_args=dict( action='edit'), target="inbound" ),
grids.GridOperation( "Copy", allow_multiple=False, condition=( lambda item: not item.deleted )),
grids.GridOperation( "Share or Publish", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False ),
grids.GridOperation( "Delete", condition=( lambda item: not item.deleted ), confirm="Are you sure you want to delete this visualization?" ),
diff --git a/lib/galaxy/webapps/reports/app.py b/lib/galaxy/webapps/reports/app.py
index 74761446588..c21c3dcfa7d 100644
--- a/lib/galaxy/webapps/reports/app.py
+++ b/lib/galaxy/webapps/reports/app.py
@@ -4,6 +4,7 @@ import time
import galaxy.model
from galaxy.web import security
+from galaxy.web.stack import application_stack_instance
import logging
log = logging.getLogger( __name__ )
@@ -17,6 +18,7 @@ class UniverseApplication( object ):
self.config = config.Configuration( **kwargs )
self.config.check()
config.configure_logging( self.config )
+ self.application_stack = application_stack_instance()
# Determine the database url
if self.config.database_connection:
db_url = self.config.database_connection
diff --git a/lib/galaxy/webapps/reports/buildapp.py b/lib/galaxy/webapps/reports/buildapp.py
index bba669debad..e2e6317b742 100644
--- a/lib/galaxy/webapps/reports/buildapp.py
+++ b/lib/galaxy/webapps/reports/buildapp.py
@@ -11,9 +11,12 @@ from inspect import isclass
from paste import httpexceptions
from galaxy.util import asbool
-from galaxy.util.postfork import process_is_uwsgi
-from galaxy.webapps.util import build_template_error_formatters
-
+from galaxy.webapps.util import (
+ MiddlewareWrapUnsupported,
+ build_template_error_formatters,
+ wrap_if_allowed,
+ wrap_if_allowed_or_fail
+)
import galaxy.model
import galaxy.model.mapping
import galaxy.web.framework.webapp
@@ -69,9 +72,11 @@ def app_factory( global_conf, **kwargs ):
webapp.finalize_config()
# Wrap the webapp in some useful middleware
if kwargs.get( 'middleware', True ):
- webapp = wrap_in_middleware( webapp, global_conf, **kwargs )
+ webapp = wrap_in_middleware(webapp, global_conf, app.application_stack, **kwargs)
if asbool( kwargs.get( 'static_enabled', True ) ):
- webapp = wrap_in_static( webapp, global_conf, **kwargs )
+ webapp = wrap_if_allowed(webapp, app.application_stack, wrap_in_static,
+ args=(global_conf,),
+ kwargs=kwargs)
# Close any pooled database connections before forking
try:
galaxy.model.mapping.metadata.bind.dispose()
@@ -81,8 +86,9 @@ def app_factory( global_conf, **kwargs ):
return webapp
-def wrap_in_middleware( app, global_conf, **local_conf ):
+def wrap_in_middleware( app, global_conf, application_stack, **local_conf ):
"""Based on the configuration wrap `app` in a set of common and useful middleware."""
+ stack = application_stack
# Merge the global and local configurations
conf = global_conf.copy()
conf.update(local_conf)
@@ -90,14 +96,12 @@ def wrap_in_middleware( app, global_conf, **local_conf ):
# First put into place httpexceptions, which must be most closely
# wrapped around the application (it can interact poorly with
# other middleware):
- app = httpexceptions.make_middleware( app, conf )
- log.debug( "Enabling 'httpexceptions' middleware" )
+ app = wrap_if_allowed( app, stack, httpexceptions.make_middleware, name='paste.httpexceptions', args=(conf,) )
# The recursive middleware allows for including requests in other
# requests or forwarding of requests, all on the server side.
if asbool(conf.get('use_recursive', True)):
from paste import recursive
- app = recursive.RecursiveMiddleware( app, conf )
- log.debug( "Enabling 'recursive' middleware" )
+ app = wrap_if_allowed( app, stack, recursive.RecursiveMiddleware, args=(conf,) )
# Various debug middleware that can only be turned on if the debug
# flag is set, either because they are insecure or greatly hurt
# performance
@@ -105,44 +109,40 @@ def wrap_in_middleware( app, global_conf, **local_conf ):
# Middleware to check for WSGI compliance
if asbool( conf.get( 'use_lint', True ) ):
from paste import lint
- app = lint.make_middleware( app, conf )
- log.debug( "Enabling 'lint' middleware" )
+ app = wrap_if_allowed( app, stack, lint.make_middleware, name='paste.lint', args=(conf,) )
# Middleware to run the python profiler on each request
if asbool( conf.get( 'use_profile', False ) ):
import profile
- app = profile.ProfileMiddleware( app, conf )
- log.debug( "Enabling 'profile' middleware" )
+ app = wrap_if_allowed( app, stack, profile.ProfileMiddleware, args=(conf,) )
# Middleware that intercepts print statements and shows them on the
# returned page
if asbool( conf.get( 'use_printdebug', True ) ):
from paste.debug import prints
- app = prints.PrintDebugMiddleware( app, conf )
- log.debug( "Enabling 'print debug' middleware" )
- if debug and asbool( conf.get( 'use_interactive', False ) ) and not process_is_uwsgi:
+ app = wrap_if_allowed( app, stack, prints.PrintDebugMiddleware, args=(conf,) )
+ if debug and asbool( conf.get( 'use_interactive', False ) ):
# Interactive exception debugging, scary dangerous if publicly
# accessible, if not enabled we'll use the regular error printing
# middleware.
- from weberror import evalexception
- app = evalexception.EvalException( app, conf,
- templating_formatters=build_template_error_formatters() )
- log.debug( "Enabling 'eval exceptions' middleware" )
+ try:
+ from weberror import evalexception
+ app = wrap_if_allowed_or_fail( app, stack, evalexception.EvalException,
+ args=(conf,),
+ kwargs=dict(templating_formatters=build_template_error_formatters()) )
+ except MiddlewareWrapUnsupported as exc:
+ log.warning(str(exc))
+ import galaxy.web.framework.middleware.error
+ app = wrap_if_allowed( app, stack, galaxy.web.framework.middleware.error.ErrorMiddleware, args=(conf,) )
else:
- if debug and asbool( conf.get( 'use_interactive', False ) ) and process_is_uwsgi:
- log.error("Interactive debugging middleware is enabled in your configuration "
- "but this is a uwsgi process. Refusing to wrap in interactive error middleware.")
# Not in interactive debug mode, just use the regular error middleware
- from paste.exceptions import errormiddleware
- app = errormiddleware.ErrorMiddleware( app, conf )
- log.debug( "Enabling 'error' middleware" )
+ import galaxy.web.framework.middleware.error
+ app = wrap_if_allowed( app, stack, galaxy.web.framework.middleware.error.ErrorMiddleware, args=(conf,) )
# Transaction logging (apache access.log style)
if asbool( conf.get( 'use_translogger', True ) ):
from paste.translogger import TransLogger
- app = TransLogger( app )
- log.debug( "Enabling 'trans logger' middleware" )
+ app = wrap_if_allowed( app, stack, TransLogger )
# X-Forwarded-Host handling
from galaxy.web.framework.middleware.xforwardedhost import XForwardedHostMiddleware
- app = XForwardedHostMiddleware( app )
- log.debug( "Enabling 'x-forwarded-host' middleware" )
+ app = wrap_if_allowed( app, stack, XForwardedHostMiddleware )
return app
diff --git a/lib/galaxy/webapps/tool_shed/app.py b/lib/galaxy/webapps/tool_shed/app.py
index b05fb939b62..f1b4f45f515 100644
--- a/lib/galaxy/webapps/tool_shed/app.py
+++ b/lib/galaxy/webapps/tool_shed/app.py
@@ -11,6 +11,7 @@ from galaxy.managers.tags import CommunityTagManager
from galaxy.openid.providers import OpenIDProviders
from galaxy.util.dbkeys import GenomeBuilds
from galaxy.web import security
+from galaxy.web.stack import application_stack_instance
import tool_shed.repository_registry
import tool_shed.repository_types.registry
from tool_shed.grids.repository_grid_filter_manager import RepositoryGridFilterManager
@@ -29,6 +30,7 @@ class UniverseApplication( object ):
self.config = config.Configuration( **kwd )
self.config.check()
configure_logging( self.config )
+ self.application_stack = application_stack_instance()
# Initialize the Galaxy datatypes registry.
self.datatypes_registry = galaxy.datatypes.registry.Registry()
self.datatypes_registry.load_datatypes( self.config.root, self.config.datatypes_config )
diff --git a/lib/galaxy/webapps/tool_shed/buildapp.py b/lib/galaxy/webapps/tool_shed/buildapp.py
index 59c09a1d5a0..32f710308d4 100644
--- a/lib/galaxy/webapps/tool_shed/buildapp.py
+++ b/lib/galaxy/webapps/tool_shed/buildapp.py
@@ -14,9 +14,13 @@ from galaxy.util import asbool
import galaxy.webapps.tool_shed.model
import galaxy.webapps.tool_shed.model.mapping
import galaxy.web.framework.webapp
-from galaxy.webapps.util import build_template_error_formatters
+from galaxy.webapps.util import (
+ MiddlewareWrapUnsupported,
+ build_template_error_formatters,
+ wrap_if_allowed,
+ wrap_if_allowed_or_fail
+)
from galaxy import util
-from galaxy.util.postfork import process_is_uwsgi
from galaxy.util.properties import load_app_properties
from routes.middleware import RoutesMiddleware
@@ -186,12 +190,11 @@ def app_factory( global_conf, **kwargs ):
webapp.finalize_config()
# Wrap the webapp in some useful middleware
if kwargs.get( 'middleware', True ):
- webapp = wrap_in_middleware( webapp, global_conf, **kwargs )
+ webapp = wrap_in_middleware(webapp, global_conf, app.application_stack, **kwargs)
if asbool( kwargs.get( 'static_enabled', True) ):
- if process_is_uwsgi:
- log.error("Static middleware is enabled in your configuration but this is a uwsgi process. Refusing to wrap in static middleware.")
- else:
- webapp = wrap_in_static( webapp, global_conf, **kwargs )
+ webapp = wrap_if_allowed(webapp, app.application_stack, wrap_in_static,
+ args=(global_conf,),
+ kwargs=kwargs)
# Close any pooled database connections before forking
try:
galaxy.webapps.tool_shed.model.mapping.metadata.bind.dispose()
@@ -201,8 +204,9 @@ def app_factory( global_conf, **kwargs ):
return webapp
-def wrap_in_middleware( app, global_conf, **local_conf ):
+def wrap_in_middleware( app, global_conf, application_stack, **local_conf ):
"""Based on the configuration wrap `app` in a set of common and useful middleware."""
+ stack = application_stack
# Merge the global and local configurations
conf = global_conf.copy()
conf.update( local_conf )
@@ -210,63 +214,62 @@ def wrap_in_middleware( app, global_conf, **local_conf ):
# First put into place httpexceptions, which must be most closely
# wrapped around the application (it can interact poorly with
# other middleware):
- app = httpexceptions.make_middleware( app, conf )
- log.debug( "Enabling 'httpexceptions' middleware" )
+ app = wrap_if_allowed( app, stack, httpexceptions.make_middleware, name='paste.httpexceptions', args=(conf,) )
# Create a separate mapper for redirects to prevent conflicts.
redirect_mapper = routes.Mapper()
redirect_mapper = _map_redirects( redirect_mapper )
# Load the Routes middleware which we use for redirecting
- app = RoutesMiddleware( app, redirect_mapper )
- log.debug( "Enabling 'routes' middleware" )
+ app = wrap_if_allowed( app, stack, RoutesMiddleware, args=(redirect_mapper,) )
# If we're using remote_user authentication, add middleware that
# protects Galaxy from improperly configured authentication in the
# upstream server
if asbool(conf.get( 'use_remote_user', False )):
from galaxy.webapps.tool_shed.framework.middleware.remoteuser import RemoteUser
- app = RemoteUser( app, maildomain=conf.get( 'remote_user_maildomain', None ),
- display_servers=util.listify( conf.get( 'display_servers', '' ) ),
- admin_users=conf.get( 'admin_users', '' ).split( ',' ),
- remote_user_secret_header=conf.get('remote_user_secret', None) )
- log.debug( "Enabling 'remote user' middleware" )
+ app = wrap_if_allowed( app, stack, RemoteUser,
+ kwargs=dict(
+ maildomain=conf.get('remote_user_maildomain', None),
+ display_servers=util.listify( conf.get('display_servers', '')),
+ admin_users=conf.get('admin_users', '').split(','),
+ remote_user_header=conf.get('remote_user_header', 'HTTP_REMOTE_USER'),
+ remote_user_secret_header=conf.get('remote_user_secret', None),
+ normalize_remote_user_email=conf.get('normalize_remote_user_email', False)) )
# The recursive middleware allows for including requests in other
# requests or forwarding of requests, all on the server side.
if asbool(conf.get('use_recursive', True)):
from paste import recursive
- app = recursive.RecursiveMiddleware( app, conf )
- log.debug( "Enabling 'recursive' middleware" )
- if debug and asbool( conf.get( 'use_interactive', False ) ) and not process_is_uwsgi:
+ app = wrap_if_allowed( app, stack, recursive.RecursiveMiddleware, args=(conf,) )
+ if debug and asbool( conf.get( 'use_interactive', False ) ):
# Interactive exception debugging, scary dangerous if publicly
# accessible, if not enabled we'll use the regular error printing
# middleware.
- from weberror import evalexception
- app = evalexception.EvalException( app, conf,
- templating_formatters=build_template_error_formatters() )
- log.debug( "Enabling 'eval exceptions' middleware" )
+ try:
+ from weberror import evalexception
+ app = wrap_if_allowed_or_fail( app, stack, evalexception.EvalException,
+ args=(conf,),
+ kwargs=dict(templating_formatters=build_template_error_formatters()) )
+ except MiddlewareWrapUnsupported as exc:
+ log.warning(str(exc))
+ import galaxy.web.framework.middleware.error
+ app = wrap_if_allowed( app, stack, galaxy.web.framework.middleware.error.ErrorMiddleware, args=(conf,) )
+
else:
- if debug and asbool( conf.get( 'use_interactive', False ) ) and process_is_uwsgi:
- log.error("Interactive debugging middleware is enabled in your configuration "
- "but this is a uwsgi process. Refusing to wrap in interactive error middleware.")
# Not in interactive debug mode, just use the regular error middleware
import galaxy.web.framework.middleware.error
- app = galaxy.web.framework.middleware.error.ErrorMiddleware( app, conf )
- log.debug( "Enabling 'error' middleware" )
+ app = wrap_if_allowed( app, stack, galaxy.web.framework.middleware.error.ErrorMiddleware, args=(conf,) )
# Transaction logging (apache access.log style)
if asbool( conf.get( 'use_translogger', True ) ):
from paste.translogger import TransLogger
- app = TransLogger( app )
- log.debug( "Enabling 'trans logger' middleware" )
+ app = wrap_if_allowed( app, stack, TransLogger )
# If sentry logging is enabled, log here before propogating up to
# the error middleware
# TODO sentry config is duplicated between tool_shed/galaxy, refactor this.
sentry_dsn = conf.get( 'sentry_dsn', None )
if sentry_dsn:
from galaxy.web.framework.middleware.sentry import Sentry
- log.debug( "Enabling 'sentry' middleware" )
- app = Sentry( app, sentry_dsn )
+ app = wrap_if_allowed( app, stack, Sentry, args=(sentry_dsn,) )
# X-Forwarded-Host handling
from galaxy.web.framework.middleware.xforwardedhost import XForwardedHostMiddleware
- app = XForwardedHostMiddleware( app )
- log.debug( "Enabling 'x-forwarded-host' middleware" )
+ app = wrap_if_allowed( app, stack, XForwardedHostMiddleware )
# Various debug middleware that can only be turned on if the debug
# flag is set, either because they are insecure or greatly hurt
# performance. The print debug middleware needs to be loaded last,
@@ -276,19 +279,16 @@ def wrap_in_middleware( app, global_conf, **local_conf ):
# Middleware to check for WSGI compliance
if asbool( conf.get( 'use_lint', True ) ):
from paste import lint
- app = lint.make_middleware( app, conf )
- log.debug( "Enabling 'lint' middleware" )
+ app = wrap_if_allowed( app, stack, lint.make_middleware, name='paste.lint', args=(conf,) )
# Middleware to run the python profiler on each request
if asbool( conf.get( 'use_profile', False ) ):
import profile
- app = profile.ProfileMiddleware( app, conf )
- log.debug( "Enabling 'profile' middleware" )
+ app = wrap_if_allowed( app, stack, profile.ProfileMiddleware, args=(conf,) )
# Middleware that intercepts print statements and shows them on the
# returned page
if asbool( conf.get( 'use_printdebug', True ) ):
from paste.debug import prints
- app = prints.PrintDebugMiddleware( app, conf )
- log.debug( "Enabling 'print debug' middleware" )
+ app = wrap_if_allowed( app, stack, prints.PrintDebugMiddleware, args=(conf,) )
return app
diff --git a/lib/galaxy/webapps/util.py b/lib/galaxy/webapps/util.py
index 618f27dda0f..442b938fa5d 100644
--- a/lib/galaxy/webapps/util.py
+++ b/lib/galaxy/webapps/util.py
@@ -1,8 +1,17 @@
from __future__ import absolute_import
+import logging
+
import mako.exceptions
+log = logging.getLogger(__name__)
+
+
+class MiddlewareWrapUnsupported(Exception):
+ pass
+
+
def build_template_error_formatters():
"""
Build a list of template error formatters for WebError. When an error
@@ -19,3 +28,48 @@ def build_template_error_formatters():
return mako.exceptions.html_error_template().render( full=False, css=False )
formatters.append( mako_html_data )
return formatters
+
+
+def wrap_if_allowed_or_fail(app, stack, wrap, name=None, args=None, kwargs=None):
+ """
+ Wrap the application with the given method if the application stack allows for it.
+
+ Arguments are the same as for :func:`wrap_if_allowed`.
+
+ Raises :exception:`MiddlewareWrapUnsupported` if the stack does not allow the middleware.
+ """
+ name = name or wrap.__name__
+ if not stack.allowed_middleware(wrap):
+ raise MiddlewareWrapUnsupported(
+ "'%s' is enabled in your configuration but the %s application stack does not support it, this "
+ "middleware has been disabled" % (name, stack.name))
+ args = args or []
+ kwargs = kwargs or {}
+ log.debug("Enabling '%s' middleware", name)
+ return wrap(app, *args, **kwargs)
+
+
+def wrap_if_allowed(app, stack, wrap, name=None, args=None, kwargs=None):
+ """
+ Wrap the application with the given method if the application stack allows for it.
+
+ :type app: :class:`galaxy.web.framework.webapp.WebApplication` subclass
+ :param app: application to wrap
+ :type stack: :class:`galaxy.web.stack.ApplicationStack` subclass
+ :param stack: instance of application stack implementing `allowed_middleware()` method
+ :type wrap: types.FunctionType or types.LambdaType
+ :param wrap: function to wrap application with
+ :type name: str
+ :param name: alternative wrap function name for logging purposes (`wrap.__name__` if None)
+ :type args: list
+ :param args: arguments to pass to `wrap` (not including `app` itself)
+ :type kwargs: dict
+ :param kwargs: keyword arguments to pass to `wrap`
+
+ Returns `app` unmodified if the stack does not allow the middleware.
+ """
+ try:
+ return wrap_if_allowed_or_fail(app, stack, wrap, name=name, args=args, kwargs=kwargs)
+ except MiddlewareWrapUnsupported as exc:
+ log.warning(str(exc))
+ return app
diff --git a/lib/galaxy/workflow/modules.py b/lib/galaxy/workflow/modules.py
index 008f352a061..87fc5894eb5 100644
--- a/lib/galaxy/workflow/modules.py
+++ b/lib/galaxy/workflow/modules.py
@@ -236,7 +236,7 @@ class SubWorkflowModule( WorkflowModule ):
@classmethod
def from_dict( Class, trans, d, **kwds ):
- module = Class( trans )
+ module = super( SubWorkflowModule, Class ).from_dict( trans, d, **kwds )
if "subworkflow" in d:
module.subworkflow = d[ "subworkflow" ]
elif "content_id" in d:
@@ -244,14 +244,12 @@ class SubWorkflowModule( WorkflowModule ):
module.subworkflow = WorkflowsManager( trans.app ).get_owned_workflow( trans, d[ "content_id" ] )
else:
raise Exception( "Step associated subworkflow could not be found." )
- module.label = d.get( "label" )
return module
@classmethod
def from_workflow_step( Class, trans, step, **kwds ):
- module = Class( trans )
+ module = super( SubWorkflowModule, Class ).from_workflow_step( trans, step, **kwds )
module.subworkflow = step.subworkflow
- module.label = step.label
return module
def save_to_step( self, step ):
@@ -274,11 +272,9 @@ class SubWorkflowModule( WorkflowModule ):
if hasattr( self.subworkflow, 'input_steps' ):
for step in self.subworkflow.input_steps:
name = step.label
- if name is None:
- step_module = module_factory.from_workflow_step( self.trans, step )
- name = step_module.state.inputs.get( "name" )
if not name:
- raise Exception( "Failed to find name for workflow module." )
+ step_module = module_factory.from_workflow_step( self.trans, step )
+ name = step_module.get_name()
step_type = step.type
assert step_type in step_to_input_type
input = dict(
@@ -379,11 +375,6 @@ class InputModule( WorkflowModule ):
class InputDataModule( InputModule ):
type = "data_input"
name = "Input dataset"
- default_name = "Input Dataset"
-
- def get_inputs( self ):
- name = self.state.inputs.get( 'name', self.default_name )
- return dict( name=TextToolParameter( None, Element( "param", name="name", label="Name", type="text", value=name ) ) )
def get_data_outputs( self ):
return [ dict( name='output', extensions=['input'] ) ]
@@ -400,21 +391,17 @@ class InputDataModule( InputModule ):
return ', '.join( filter_set )
def get_runtime_inputs( self, connections=None ):
- label = self.state.inputs.get( "name", "Input Dataset" )
- return dict( input=DataToolParameter( None, Element( "param", name="input", label=label, multiple=False, type="data", format=self.get_filter_set( connections ) ), self.trans ) )
+ return dict( input=DataToolParameter( None, Element( "param", name="input", label=self.label, multiple=False, type="data", format=self.get_filter_set( connections ) ), self.trans ) )
class InputDataCollectionModule( InputModule ):
type = "data_collection_input"
name = "Input dataset collection"
- default_name = "Input Dataset Collection"
default_collection_type = "list"
collection_type = default_collection_type
def get_inputs( self ):
- name = self.state.inputs.get( "name", self.default_name )
collection_type = self.state.inputs.get( "collection_type", self.default_collection_type )
- input_name = TextToolParameter( None, Element( "param", name="name", label="Name", type="text", value=name ) )
input_collection_type = TextToolParameter( None, XML(
'''
@@ -423,12 +410,11 @@ class InputDataCollectionModule( InputModule ):
''' % collection_type ) )
- return odict( [ ( "name", input_name ), ( "collection_type", input_collection_type ) ] )
+ return dict( collection_type=input_collection_type )
def get_runtime_inputs( self, **kwds ):
- label = self.state.inputs.get( "name", self.default_name )
collection_type = self.state.inputs.get( "collection_type", self.default_collection_type )
- input_element = Element( "param", name="input", label=label, type="data_collection", collection_type=collection_type )
+ input_element = Element( "param", name="input", label=self.label, type="data_collection", collection_type=collection_type )
return dict( input=DataCollectionToolParameter( None, input_element, self.trans ) )
def get_data_outputs( self ):
diff --git a/lib/galaxy/workflow/steps.py b/lib/galaxy/workflow/steps.py
index 0302c65472e..c58de37ab12 100644
--- a/lib/galaxy/workflow/steps.py
+++ b/lib/galaxy/workflow/steps.py
@@ -52,7 +52,12 @@ def edgelist_for_workflow_steps( steps ):
for step in steps:
edges.append( ( steps_to_index[step], steps_to_index[step] ) )
for conn in step.input_connections:
- edges.append( ( steps_to_index[conn.output_step], steps_to_index[conn.input_step] ) )
+ output_index = steps_to_index[conn.output_step]
+ input_index = steps_to_index[conn.input_step]
+ # self connection - a cycle not detectable by topsort function.
+ if output_index == input_index:
+ raise CycleError([], 0, 0)
+ edges.append( ( output_index, input_index ) )
return edges
diff --git a/lib/tool_shed/galaxy_install/grids/admin_toolshed_grids.py b/lib/tool_shed/galaxy_install/grids/admin_toolshed_grids.py
index f3824bb2c92..b1fe6d4a835 100644
--- a/lib/tool_shed/galaxy_install/grids/admin_toolshed_grids.py
+++ b/lib/tool_shed/galaxy_install/grids/admin_toolshed_grids.py
@@ -155,8 +155,7 @@ class InstalledRepositoryGrid( grids.Grid ):
grids.GridAction( label="Update tool shed status",
url_args=dict( controller='admin_toolshed',
action='update_tool_shed_status_for_installed_repository',
- all_installed_repositories=True ),
- inbound=False )
+ all_installed_repositories=True ) )
]
operations = [ grids.GridOperation( label="Update tool shed status",
condition=( lambda item: not item.deleted ),
diff --git a/lib/tool_shed/galaxy_install/update_repository_manager.py b/lib/tool_shed/galaxy_install/update_repository_manager.py
index 3846f301658..572a72a7abd 100644
--- a/lib/tool_shed/galaxy_install/update_repository_manager.py
+++ b/lib/tool_shed/galaxy_install/update_repository_manager.py
@@ -8,7 +8,6 @@ from sqlalchemy import false
import tool_shed.util.shed_util_common as suc
from galaxy import util
-from galaxy.util.postfork import register_postfork_function
from tool_shed.util import common_util
from tool_shed.util import encoding_util
from tool_shed.util import repository_util
@@ -27,7 +26,7 @@ class UpdateRepositoryManager( object ):
self.sleeper = Sleeper()
self.restarter = threading.Thread( target=self.__restarter )
self.restarter.daemon = True
- register_postfork_function(self.restarter.start)
+ self.app.application_stack.register_postfork_function(self.restarter.start)
self.seconds_to_sleep = int( app.config.hours_between_check * 3600 )
def get_update_to_changeset_revision_and_ctx_rev( self, repository ):
diff --git a/run_tests.sh b/run_tests.sh
index 37e2be5bddb..e17084660b5 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -8,7 +8,6 @@ rm -f run_functional_tests.log
show_help() {
cat </dev/null 2>/dev/null
}
-ensure_grunt() {
+ensure_grunt_for_qunit() {
if ! exists "grunt";
then
- echo "Grunt not on path, cannot run these tests."
- exit 1
+ PATH="$PATH:./test/qunit/node_modules/grunt/bin"
+ export PATH
+ if ! exists "grunt";
+ then
+ echo "Grunt not on path, cannot run these tests."
+ exit 1
+ fi
fi
}
@@ -246,8 +281,8 @@ then
DOCKER_RUN_EXTRA_ARGS="-v ${tmp}:/tmp ${DOCKER_RUN_EXTRA_ARGS}"
shift
fi
- UID=$(id -u)
- DOCKER_RUN_EXTRA_ARGS="-e GALAXY_TEST_UID=${UID} ${DOCKER_RUN_EXTRA_ARGS}"
+ MY_UID=$(id -u)
+ DOCKER_RUN_EXTRA_ARGS="-e GALAXY_TEST_UID=${MY_UID} ${DOCKER_RUN_EXTRA_ARGS}"
echo "Launching docker container for testing..."
docker $DOCKER_EXTRA_ARGS run $DOCKER_RUN_EXTRA_ARGS -e "BUILD_NUMBER=$BUILD_NUMBER" -e "GALAXY_TEST_DATABASE_TYPE=$db_type" --rm -v `pwd`:/galaxy $DOCKER_IMAGE "$@"
exit $?
@@ -586,7 +621,7 @@ if [ "$driver" = "python" ]; then
echo "Testing complete. HTML report is in \"$report_file\"." 1>&2
exit ${exit_status}
else
- ensure_grunt
+ ensure_grunt_for_qunit
if [ -n "$watch" ]; then
grunt_task="watch"
else
diff --git a/scripts/api/README b/scripts/api/README
index 1ade28a2889..0737666488c 100644
--- a/scripts/api/README
+++ b/scripts/api/README
@@ -1,116 +1,4 @@
-This is not documentation. These are hints and examples to get you started
-until the documentation is written.
+To learn about Galaxy API please use the following resources:
-Set these options in galaxy.ini and start the server:
-
-admin_users = you@example.org
-library_import_dir = /path/to/some/directory
-
-In the directory you specified for 'library_import_dir', create some
-subdirectories, and put (or symlink) files to import into Galaxy into those
-subdirectories.
-
-In Galaxy, create an account that matches the address you put in 'admin_users',
-then browse to that user's preferences and generate a new API Key. Copy the
-key to your clipboard and then use these scripts:
-
-% ./display.py my_key http://localhost:4096/api/libraries
-Collection Members
-------------------
-
-0 elements in collection
-
-% ./library_create_library.py my_key http://localhost:4096/api/libraries api_test 'API Test Library'
-Response
---------
-/api/libraries/f3f73e481f432006
- name: api_test
- id: f3f73e481f432006
-
-% ./display.py my_key http://localhost:4096/api/libraries
-Collection Members
-------------------
-/api/libraries/f3f73e481f432006
- name: api_test
- id: f3f73e481f432006
-
-% ./display.py my_key http://localhost:4096/api/libraries/f3f73e481f432006
-Member Information
-------------------
-synopsis: None
-contents_url: /api/libraries/f3f73e481f432006/contents
-description: API Test Library
-name: api_test
-
-% ./display.py my_key http://localhost:4096/api/libraries/f3f73e481f432006/contents
-Collection Members
-------------------
-/api/libraries/f3f73e481f432006/contents/28202595c0d2591f61ddda595d2c3670
- name: /
- type: folder
- id: 28202595c0d2591f61ddda595d2c3670
-
-% ./library_create_folder.py my_key http://localhost:4096/api/libraries/f3f73e481f432006/contents 28202595c0d2591f61ddda595d2c3670 api_test_folder1 'API Test Folder 1'
-Response
---------
-/api/libraries/f3f73e481f432006/contents/28202595c0d2591fa4f9089d2303fd89
- name: api_test_folder1
- id: 28202595c0d2591fa4f9089d2303fd89
-
-% ./library_upload_from_import_dir.py my_key http://localhost:4096/api/libraries/f3f73e481f432006/contents 28202595c0d2591fa4f9089d2303fd89 bed bed hg19
-Response
---------
-/api/libraries/f3f73e481f432006/contents/e9ef7fdb2db87d7b
- name: 2.bed
- id: e9ef7fdb2db87d7b
-/api/libraries/f3f73e481f432006/contents/3b7f6a31f80a5018
- name: 3.bed
- id: 3b7f6a31f80a5018
-
-% ./display.py my_key http://localhost:4096/api/libraries/f3f73e481f432006/contents
-Collection Members
-------------------
-/api/libraries/f3f73e481f432006/contents/28202595c0d2591f61ddda595d2c3670
- name: /
- type: folder
- id: 28202595c0d2591f61ddda595d2c3670
-/api/libraries/f3f73e481f432006/contents/28202595c0d2591fa4f9089d2303fd89
- name: /api_test_folder1
- type: folder
- id: 28202595c0d2591fa4f9089d2303fd89
-/api/libraries/f3f73e481f432006/contents/e9ef7fdb2db87d7b
- name: /api_test_folder1/2.bed
- type: file
- id: e9ef7fdb2db87d7b
-/api/libraries/f3f73e481f432006/contents/3b7f6a31f80a5018
- name: /api_test_folder1/3.bed
- type: file
- id: 3b7f6a31f80a5018
-
-% ./display.py my_key http://localhost:4096/api/libraries/f3f73e481f432006/contents/e9ef7fdb2db87d7b
-Member Information
-------------------
-misc_blurb: 68 regions
-metadata_endCol: 3
-data_type: bed
-metadata_columns: 6
-metadata_nameCol: 4
-uploaded_by: nate@...
-metadata_strandCol: 6
-name: 2.bed
-genome_build: hg19
-metadata_comment_lines: None
-metadata_startCol: 2
-metadata_chromCol: 1
-file_size: 4272
-metadata_data_lines: 68
-message:
-metadata_dbkey: hg19
-misc_info: uploaded bed file
-date_uploaded: 2010-06-22T17:01:51.266119
-metadata_column_types: str, int, int, str, int, str
-
-Other parameters are valid when uploading, they are the same parameters as are
-used in the web form, like 'link_data_only' and etc.
-
-The request and response format should be considered alpha and are subject to change.
+https://galaxyproject.org/develop/api/
+https://docs.galaxyproject.org/en/latest/api_doc.html
diff --git a/scripts/bootstrap_history.py b/scripts/bootstrap_history.py
index 3d9438a4313..f5823045c36 100644
--- a/scripts/bootstrap_history.py
+++ b/scripts/bootstrap_history.py
@@ -100,15 +100,17 @@ Highlights
**Feature3**
Feature description.
-`Github `__
-===========================================================
+Get Galaxy
+==========
-New Galaxy repository
+The code lives at `Github `__ and you should have `Git `__ to obtain it.
+
+To get a new Galaxy repository run:
.. code-block:: shell
$$ git clone -b release_${release} https://github.com/galaxyproject/galaxy.git
-Update of existing Galaxy repository
+To update an existing Galaxy repository run:
.. code-block:: shell
$$ git checkout release_${release} && git pull --ff-only origin release_${release}
diff --git a/scripts/secret_decoder_ring.py b/scripts/secret_decoder_ring.py
index 7eae0968e9e..88ba046309c 100644
--- a/scripts/secret_decoder_ring.py
+++ b/scripts/secret_decoder_ring.py
@@ -37,6 +37,7 @@ security_helper = SecurityHelper(id_secret=id_secret)
if len(sys.argv) != 3:
sys.stdout.write("python %s (encode|decode) value\n" % sys.argv[0])
+ sys.exit(1)
action = sys.argv[1]
value = sys.argv[2]
diff --git a/static/maps/analysis.js.map b/static/maps/analysis.js.map
new file mode 100644
index 00000000000..76a73b1586f
--- /dev/null
+++ b/static/maps/analysis.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"analysis.js","sources":["../src/analysis.js"],"names":["jQuery","require","$","GalaxyApp","QUERY_STRING","PANEL","ToolPanel","HistoryPanel","PAGE","ToolForm","UserPreferences","Tours","window","app","options","bootstrapped","Galaxy","debug","config","toolPanel","el","userIsAnonymous","user","isAnonymous","toolbox","toolbox_in_panel","stored_workflow_menu_entries","nginx_upload_path","ftp_upload_site","default_genome","default_extension","centerPanel","CenterPanel","historyPanel","galaxyRoot","root","allow_user_dataset_purge","analysisPage","PageLayoutView","_","extend","left","center","right","page","params","tool_panel","upload","uploadButton","currHistoryPanel","historyView","listenToGalaxy","display","view","remove","router","Backbone","Router","initialize","this","execute","callback","args","name","queryObj","parse","pop","push","apply","routes","(/)","(/)root*","(/)tours(/)(:tour_id)","(/)users(/)","show_tours","tour_id","giveTour","ToursView","show_users","View","home","tool_id","job_id","show","_loadCenterIframe","_loadToolForm","workflow_id","m_c","m_a","id","url","prop","render","loadCurrentHistory","listenTo","fetch","urlRoot","connectToQuotaMeter","masthead","quotaMeter","history","start","pushState"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/app.js.map b/static/maps/app.js.map
new file mode 100644
index 00000000000..32b717e1a27
--- /dev/null
+++ b/static/maps/app.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"app.js","sources":["../src/app.js"],"names":["define","Utils","Masthead","Modal","QuotaMeter","Backbone","View","extend","initialize","options","Galaxy","app","this","modal","masthead","setElement","_template","$el","append","$","render","require","Analysis","window","console","log","err","debug","initialize2","merge","params","$container","parent","attr","addClass","message_box_visible","show","show_inactivity_warning","menu","Menu","GalaxyMenu","config","quotaMeter","UserQuotaMeter","model","user","el","display","target","remove","panels","_buildPanels","Views","panel_ids","i","id","view","components","header","title","cls","buttons","body","$panel","_templatePanel","find","html","Panel","center","panel","drag","toggle","right","message_box_class","message_box_content","inactivity_box_content","root"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/app/analysis.js.map b/static/maps/app/analysis.js.map
new file mode 100644
index 00000000000..18214fc8da9
--- /dev/null
+++ b/static/maps/app/analysis.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"analysis.js","sources":["../../src/app/analysis.js"],"names":["define","Backbone","View","extend","initialize","options","this","Utils","merge","setElement","_template","params","$","prop","Galaxy","root","tool_id","param","workflow_id","m_c","m_a","config","require_login","user","id","self","on","show","empty","hide","display","$el","scrollTop","append","tool_search","Tools","ToolSearch","spinner_url","search_url","hidden","tools","ToolCollection","toolbox","tool_panel","ToolPanel","layout","toolbox_in_panel","tool_panel_view","ToolPanelView","model","toolPanel","get","size","render","prepend","_templateTool","title","href","i","stored_workflow_menu_entries","m","stored_workflow","name","encoded_stored_workflow_id","click","parent","handle_minwidth_hint","attr","upload","Upload","components","header","buttons","buttonRefresh","Ui","ButtonLink","cls","icon","onclick","top","currHistoryPanel","loadCurrentHistory","buttonOptions","target","buttonViewMulti","body","historyOptionsMenu","optionsMenu","anonymous","purgeAllowed","allow_user_dataset_purge","HistoryPanel","CurrentHistoryPanel","el","linkTarget","$scrollContainer","connectToQuotaMeter","quotaMeter","listenToGalaxy","left"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/galaxy.interactive_environments.js.map b/static/maps/galaxy.interactive_environments.js.map
index ee5a8e61608..75370a01be8 100644
--- a/static/maps/galaxy.interactive_environments.js.map
+++ b/static/maps/galaxy.interactive_environments.js.map
@@ -1 +1 @@
-{"version":3,"file":"galaxy.interactive_environments.js","sources":["../src/galaxy.interactive_environments.js"],"names":["append_notebook","url","clear_main_area","$","append","remove","children","display_spinner","galaxy_root","test_ie_availability","success_callback","request_count","interval","setInterval","ajax","xhrFields","withCredentials","type","timeout","success","console","log","clearInterval","error","toastr","closeButton","timeOut","tapToDismiss"],"mappings":"AAIA,QAASA,iBAAgBC,GACrBC,kBACAC,EAAE,SAASC,OAAO,uHAAwHH,EAAK,eAInJ,QAASC,mBACLC,EAAE,YAAYE,SACdF,EAAE,SAASG,WAAWD,SAG1B,QAASE,mBACDJ,EAAE,SAASC,OAAO,0BAA4BI,YAAc,wGAWpE,QAASC,sBAAqBR,EAAKS,GAC/B,GAAIC,GAAgB,CACpBJ,mBACAK,SAAWC,YAAY,WACnBV,EAAEW,MACEb,IAAKA,EACLc,WACIC,iBAAiB,GAErBC,KAAM,MACNC,QAAS,IACTC,QAAS,WACLC,QAAQC,IAAI,8BACZC,cAAcV,UACdF,KAEJa,MAAO,WACHZ,IACAS,QAAQC,IAAI,WAAaV,GACtBA,EAAgB,KACfW,cAAcV,UACdV,kBACAsB,OAAOD,MACH,sDACA,SACCE,aAAe,EAAMC,QAAW,IAAOC,cAAgB,SAKzE"}
\ No newline at end of file
+{"version":3,"file":"galaxy.interactive_environments.js","sources":["../src/galaxy.interactive_environments.js"],"names":["append_notebook","url","clear_main_area","$","append","remove","children","display_spinner","galaxy_root","load_when_ready","success_callback","request_count","timeout_time","timeout_time_max","timeout_time_step","timeout","ajax","xhrFields","withCredentials","type","dataType","success","data","console","log","toastr","clear","info","closeButton","tapToDismiss","window","setTimeout","error","test_ie_availability","interval","setInterval","clearInterval","timeOut"],"mappings":"AAIA,QAASA,iBAAgBC,GACrBC,kBACAC,EAAE,SAASC,OAAO,uHAAwHH,EAAK,eAInJ,QAASC,mBACLC,EAAE,YAAYE,SACdF,EAAE,SAASG,WAAWD,SAG1B,QAASE,mBACDJ,EAAE,SAASC,OAAO,0BAA4BI,YAAc,wGAMpE,QAASC,iBAAgBR,EAAKS,GAC1B,GAAIC,GAAgB,EAChBC,EAAe,IACfC,EAAmB,KACnBC,EAAoB,IACpBC,EAAU,WACVZ,EAAEa,MACEf,IAAKA,EACLgB,WACIC,iBAAiB,GAErBC,KAAM,MACNJ,QAAS,IACTK,SAAU,OACVC,QAAS,SAASC,GACH,GAARA,GACCC,QAAQC,IAAI,gDACZtB,kBACAuB,OAAOC,QACPhB,KACa,GAARY,GACe,GAAjBX,IACCJ,kBACAkB,OAAOE,KACH,gGACCC,aAAe,EAAMC,cAAgB,KAG9ClB,IACkBE,EAAfD,IACCA,GAAgBE,GAEpBS,QAAQC,IAAI,qBAAuBb,EAAgB,aAAeC,EAAe,IAAO,KACxFkB,OAAOC,WAAWhB,EAASH,KAE3BV,kBACAuB,OAAOC,QACPD,OAAOO,MACH,gHACA,SACCJ,aAAe,EAAMC,cAAgB,QAM1DC,QAAOC,WAAWhB,EAASH,GAY/B,QAASqB,sBAAqBhC,EAAKS,GAC/B,GAAIC,GAAgB,CACpBJ,mBACA2B,SAAWC,YAAY,WACnBhC,EAAEa,MACEf,IAAKA,EACLgB,WACIC,iBAAiB,GAErBC,KAAM,MACNJ,QAAS,IACTM,QAAS,WACLE,QAAQC,IAAI,8BACZY,cAAcF,UACdxB,KAEJsB,MAAO,WACHrB,IACAY,QAAQC,IAAI,wBAA0Bb,GACnCA,EAAgB,KACfyB,cAAcF,UACdhC,kBACAuB,OAAOO,MACH,sDACA,SACCJ,aAAe,EAAMS,QAAW,IAAOR,cAAgB,SAKzE"}
\ No newline at end of file
diff --git a/static/maps/layout/menu.js.map b/static/maps/layout/menu.js.map
index 9a4fc63be5b..3f18f65c444 100644
--- a/static/maps/layout/menu.js.map
+++ b/static/maps/layout/menu.js.map
@@ -1 +1 @@
-{"version":3,"file":"menu.js","sources":["../../src/layout/menu.js"],"names":["define","GenericNav","Webhooks","Collection","Backbone","extend","model","Model","defaults","visible","target","fetch","options","this","reset","extendedNavItem","GenericNavView","add","render","id","title","url","tooltip","disabled","Galaxy","user","menu","user_requests","lims_doc_url","callback","webhooks","$","document","ready","each","models","index","webhook","toJSON","activate","page","masthead","collection","name","icon","config","onclick","function","Function","get","cls","helpTab","support_url","search_url","mailing_lists","screencasts_url","wiki_url","citation_url","router","navigate","trigger","window","location","root","terms_url","push","biostar_url","unshift","biostar_url_redirect","userTab","divider","noscratchbook","allow_user_creation","activeView","active_view","set","jQuery","Deferred","resolve","promise","Tab","View","initialize","setElement","_template","$dropdown","$toggle","$menu","$note","listenTo","events","click .dropdown-toggle","self","remove","$el","attr","css","visibility","_formatUrl","html","removeClass","addClass","display","placement","show","off","on","hide","empty","_","menuItem","append","_buildMenuItem","e","preventDefault","frame","_toggleClick","buildLink","label","m","popover","content","setTimeout","attributes","indexOf","charAt"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"menu.js","sources":["../../src/layout/menu.js"],"names":["define","GenericNav","Webhooks","_l","Collection","Backbone","extend","model","Model","defaults","visible","target","fetch","options","this","reset","extendedNavItem","GenericNavView","add","render","id","title","url","tooltip","disabled","Galaxy","user","menu","user_requests","lims_doc_url","callback","webhooks","$","document","ready","each","models","index","webhook","toJSON","activate","page","masthead","collection","name","icon","config","onclick","function","Function","get","cls","helpTab","support_url","search_url","mailing_lists","screencasts_url","wiki_url","citation_url","router","navigate","trigger","window","location","root","terms_url","push","biostar_url","unshift","biostar_url_redirect","userTab","divider","noscratchbook","allow_user_creation","activeView","active_view","set","jQuery","Deferred","resolve","promise","Tab","View","initialize","setElement","_template","$dropdown","$toggle","$menu","$note","listenTo","events","click .dropdown-toggle","self","remove","$el","attr","css","visibility","_formatUrl","html","removeClass","addClass","display","placement","show","off","on","hide","empty","_","menuItem","append","_buildMenuItem","e","preventDefault","frame","_toggleClick","buildLink","label","m","popover","content","setTimeout","attributes","indexOf","charAt"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/mvc/collection/base-creator.js.map b/static/maps/mvc/collection/base-creator.js.map
new file mode 100644
index 00000000000..a77a1ba84fc
--- /dev/null
+++ b/static/maps/mvc/collection/base-creator.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"base-creator.js","sources":["../../../src/mvc/collection/base-creator.js"],"names":["define","CollectionCreatorMixin","_validationWarning","what","clear","VALIDATION_CLASS","this","$","add","focus","select","removeClass","addClass","_changeName","_getName","_nameCheckForEnter","ev","keyCode","blocking","_clickCreate","_","escape","val","_clickMoreHelp","stopPropagation","hide","_clickLessHelp","show","_toggleHelp","toggleClass","toggle","_showAlert","message","alertClass","attr","find","html","_hideAlert","_cancelCreate","oncancel","call","name","createList","_creatorTemplates","main","template","join"],"mappings":"AAAAA,UACG,WAKH,GAAIC,IAGAC,mBAAqB,SAAUC,EAAMC,GACjC,GAAIC,GAAmB,oBACV,UAATF,IACAA,EAAOG,KAAKC,EAAG,oBAAqBC,IAAKF,KAAKC,EAAG,4BACjDD,KAAKC,EAAG,oBAAqBE,QAAQC,UAErCN,GACAD,EAAOA,GAAQG,KAAKC,EAAG,IAAMF,GAC7BF,EAAKQ,YAAaN,IAElBF,EAAKS,SAAUP,IAMvBQ,YAAc,WACVP,KAAKJ,mBAAoB,SAAUI,KAAKQ,aAI5CC,mBAAqB,SAAUC,GACR,KAAfA,EAAGC,SAAmBX,KAAKY,UAC3BZ,KAAKa,gBAKbL,SAAW,WACP,MAAOM,GAAEC,OAAQf,KAAKC,EAAG,oBAAqBe,QAKlDC,eAAiB,SAAUP,GACvBA,EAAGQ,kBACHlB,KAAKC,EAAG,cAAeK,SAAU,YACjCN,KAAKC,EAAG,cAAekB,QAG3BC,eAAiB,SAAUV,GACvBA,EAAGQ,kBACHlB,KAAKC,EAAG,cAAeI,YAAa,YACpCL,KAAKC,EAAG,cAAeoB,QAG3BC,YAAc,SAAUZ,GACpBA,EAAGQ,kBACHlB,KAAKC,EAAG,cAAesB,YAAa,YACpCvB,KAAKC,EAAG,cAAeuB,UAI3BC,WAAa,SAAUC,EAASC,GAC5BA,EAAaA,GAAc,eAC3B3B,KAAKC,EAAG,cAAekB,OACvBnB,KAAKC,EAAG,kBACH2B,KAAM,QAAS,2BAA4BtB,SAAUqB,GAAaN,OAClEQ,KAAM,kBAAmBC,KAAMJ,IAGxCK,WAAa,WACT/B,KAAKC,EAAG,cAAeoB,OACvBrB,KAAKC,EAAG,kBAAmBkB,QAG/Ba,cAAe,WACkB,kBAAlBhC,MAAKiC,UACZjC,KAAKiC,SAASC,KAAMlC,OAK5Ba,aAAe,WACX,GAAIsB,GAAOnC,KAAKQ,UACX2B,GAEOnC,KAAKY,UACbZ,KAAKoC,WAAYD,GAFjBnC,KAAKJ,mBAAoB,SAMjCyC,mBACIC,KAAOxB,EAAEyB,UACL,8CACA,yDACA,+CACFC,KAAK,MAMX,QACI7C,uBAAwBA"}
\ No newline at end of file
diff --git a/static/maps/mvc/collection/list-collection-creator.js.map b/static/maps/mvc/collection/list-collection-creator.js.map
index e89da4f1df6..397ec01f6de 100644
--- a/static/maps/mvc/collection/list-collection-creator.js.map
+++ b/static/maps/mvc/collection/list-collection-creator.js.map
@@ -1 +1 @@
-{"version":3,"file":"list-collection-creator.js","sources":["../../../src/mvc/collection/list-collection-creator.js"],"names":["define","HDCA","STATES","BASE_MVC","UI_MODAL","naturalSort","_l","createListCollection","contents","elements","toJSON","promise","listCollectionCreatorModal","creationFn","name","map","element","id","src","history_content_type","createHDCA","logNamespace","DatasetCollectionElementView","Backbone","View","extend","LoggableMixin","_logNamespace","tagName","className","initialize","attributes","this","selected","render","$el","attr","html","template","addClass","_","join","select","toggle","toggleClass","trigger","source","hasClass","discard","view","parentWidth","parent","width","animate","margin-right","destroy","off","remove","events","click","click .name","click .discard","dragstart","dragend","dragover","drop","_click","ev","stopPropagation","_clickName","preventDefault","response","prompt","_clickDiscard","_dragstart","originalEvent","dataTransfer","effectAllowed","setData","JSON","stringify","_dragend","removeClass","_sendToParent","toString","ListCollectionCreator","elementViewClass","collectionClass","HistoryListDatasetCollection","minElements","defaultAttributes","TypeError","oncreate","oncancel","autoscrollDist","highlightClr","metric","creator","each","value","key","initialElements","_instanceSetUp","_elementsSetUp","_setUpBehaviors","selectedIds","$dragging","blocking","invalidElements","workingElements","elementViews","slice","_ensureElementIds","_validateElements","_mangleDuplicateNames","_sortElements","forEach","hasOwnProperty","uniqueId","filter","problem","_isElementInvalid","push","text","state","OK","contains","NOT_READY_STATES","deleted","purged","SAFETY","counter","existingNames","currName","Error","speed","callback","length","_renderInvalid","empty","templates","main","_renderHeader","_renderMiddle","_renderFooter","_addPluginComponents","$","focus","invalidInitial","problems","show","$header","header","find","prepend","helpContent","_invalidElementsAlert","$middle","middle","_renderList","$footer","footer","hoverhighlight","_showAlert","_validationWarning","what","clear","VALIDATION_CLASS","add","_disableNameAndCreate","disable","isUndefined","prop","$list","_renderClearSelected","size","hide","$tmp","jQuery","removeElementView","elementView","_createElementView","append","children","invoke","height","css","has","_listenToElementView","listenTo","data","addElementView","without","stopListening","_renderNoElementsLeft","noElementsLeft","_elementToJSON","createList","message","always","fail","xhr","status","done","call","on","_errorHandler","once","error","content","readyState","responseJSON","click .more-help","click .less-help","click .main-help","click .header .alert button","click .reset","click .clear-selected","click .collection-elements","dragover .collection-elements","drop .collection-elements","collection-element.dragstart .collection-elements","collection-element.dragend .collection-elements","change .collection-name","keydown .collection-name","click .cancel-create","click .create-collection","_clickMoreHelp","_clickLessHelp","_toggleHelp","alertClass","_hideAlert","reset","clearSelectedElements","_dragoverElements","_checkForAutoscroll","clientY","$nearest","_getNearestElement","$placeholder","before","$element","y","AUTOSCROLL_SPEED","offset","scrollTop","upperDist","top","lowerDist","outerHeight","WIGGLE","lis","toArray","i","$li","halfHeight","Math","floor","_dropElements","dropEffect","insertBefore","insertAfter","last","_syncOrderToDom","newElements","findWhere","console","_elementDragstart","_elementDragend","_changeName","_getName","_nameCheckForEnter","keyCode","_clickCreate","escape","val","collectionCreatorModal","options","CreatorClass","deferred","Deferred","modal","Galaxy","defaults","reject","resolve","title","body","closing_events","window","_collectionCreator"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"list-collection-creator.js","sources":["../../../src/mvc/collection/list-collection-creator.js"],"names":["define","HDCA","STATES","BASE_MVC","baseCreator","UI_MODAL","naturalSort","_l","createListCollection","contents","elements","toJSON","promise","listCollectionCreatorModal","creationFn","name","map","element","id","src","history_content_type","createHDCA","logNamespace","DatasetCollectionElementView","Backbone","View","extend","LoggableMixin","_logNamespace","tagName","className","initialize","attributes","this","selected","render","$el","attr","html","template","addClass","_","join","select","toggle","toggleClass","trigger","source","hasClass","discard","view","parentWidth","parent","width","animate","margin-right","destroy","off","remove","events","click","click .name","click .discard","dragstart","dragend","dragover","drop","_click","ev","stopPropagation","_clickName","preventDefault","response","prompt","_clickDiscard","_dragstart","originalEvent","dataTransfer","effectAllowed","setData","JSON","stringify","_dragend","removeClass","_sendToParent","toString","ListCollectionCreator","CollectionCreatorMixin","elementViewClass","collectionClass","HistoryListDatasetCollection","minElements","defaultAttributes","TypeError","oncreate","oncancel","autoscrollDist","highlightClr","metric","creator","each","value","key","initialElements","_instanceSetUp","_elementsSetUp","_setUpBehaviors","selectedIds","$dragging","blocking","invalidElements","workingElements","elementViews","slice","_ensureElementIds","_validateElements","_mangleDuplicateNames","_sortElements","forEach","hasOwnProperty","uniqueId","filter","problem","_isElementInvalid","push","text","state","OK","contains","NOT_READY_STATES","deleted","purged","SAFETY","counter","existingNames","currName","Error","speed","callback","length","_renderInvalid","empty","templates","main","_renderHeader","_renderMiddle","_renderFooter","_addPluginComponents","$","focus","invalidInitial","problems","show","$header","header","find","prepend","helpContent","_invalidElementsAlert","$middle","middle","_renderList","$footer","footer","hoverhighlight","_showAlert","_disableNameAndCreate","disable","isUndefined","prop","$list","_renderClearSelected","size","hide","$tmp","jQuery","removeElementView","elementView","_createElementView","append","children","invoke","height","css","has","_listenToElementView","listenTo","data","addElementView","without","stopListening","_renderNoElementsLeft","noElementsLeft","_elementToJSON","createList","message","always","fail","xhr","status","done","call","on","_errorHandler","once","error","content","readyState","responseJSON","click .more-help","click .less-help","click .main-help","click .header .alert button","click .reset","click .clear-selected","click .collection-elements","dragover .collection-elements","drop .collection-elements","collection-element.dragstart .collection-elements","collection-element.dragend .collection-elements","change .collection-name","keydown .collection-name","click .cancel-create","click .create-collection","reset","clearSelectedElements","_dragoverElements","_checkForAutoscroll","clientY","$nearest","_getNearestElement","$placeholder","before","$element","y","AUTOSCROLL_SPEED","offset","scrollTop","upperDist","top","lowerDist","outerHeight","WIGGLE","lis","toArray","i","$li","halfHeight","Math","floor","_dropElements","dropEffect","insertBefore","insertAfter","last","_syncOrderToDom","newElements","findWhere","console","_elementDragstart","_elementDragend","_creatorTemplates","collectionCreatorModal","options","CreatorClass","deferred","Deferred","modal","Galaxy","defaults","reject","resolve","title","body","closing_events","window","_collectionCreator"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/mvc/collection/list-of-pairs-collection-creator.js.map b/static/maps/mvc/collection/list-of-pairs-collection-creator.js.map
index 085c028006a..37f2496ae9b 100644
--- a/static/maps/mvc/collection/list-of-pairs-collection-creator.js.map
+++ b/static/maps/mvc/collection/list-of-pairs-collection-creator.js.map
@@ -1 +1 @@
-{"version":3,"file":"list-of-pairs-collection-creator.js","sources":["../../../src/mvc/collection/list-of-pairs-collection-creator.js"],"names":["define","levenshteinDistance","naturalSort","LIST_COLLECTION_CREATOR","baseMVC","_l","autoPairFnBuilder","options","getRegExps","_regexps","length","RegExp","this","filters","createPair","params","a","listA","splice","indexA","b","listB","indexB","aInBIndex","indexOf","bInAIndex","_pair","silent","preprocessMatch","regexps","call","_","extend","matchTo","name","replace","possible","debug","bestMatch","score","index","paired","JSON","stringify","match","scoreThreshold","push","createListOfPairsCollection","collection","elements","toJSON","pairedCollectionCreatorModal","historyId","logNamespace","PairView","Backbone","View","LoggableMixin","_logNamespace","tagName","className","initialize","attributes","pair","template","join","render","$el","attr","data","html","addClass","events","dragstart","dragend","dragover","drop","_dragstart","ev","currentTarget","style","opacity","originalEvent","dataTransfer","effectAllowed","setData","parent","trigger","_dragend","_sendToParent","toString","PairedCollectionCreator","metric","defaults","datasets","DEFAULT_FILTERS","automaticallyPair","strategy","matchPercentage","twoPassAutopairing","initialList","commonFilters","isArray","strategies","DEFAULT_STRATEGY","isFunction","removeExtensions","oncancel","oncreate","autoscrollDist","unpairedPanelHidden","pairedPanelHidden","$dragging","blocking","_setUpBehaviors","_dataSetUp","illumina","Rs","simple","lcs","levenshtein","unpaired","selectedIds","_sortInitialList","_ensureIds","slice","autoPair","once","_sortDatasetList","list","sort","forEach","dataset","hasOwnProperty","id","uniqueId","_splitByFilters","_filter","filter","test","regexFilters","map","stringFilter","split","i","_addToUnpaired","binSearchSortedIndex","low","hi","mid","Math","floor","compared","bind","autopairSimple","concat","autopairLevenshtein","distance","max","autopairLCS","_naiveStartingAndEndingLCS","s1","s2","fwdLCS","revLCS","j","fwd","rev","_createPair","without","Error","_guessNameForPair","forward","reverse","undefined","fwdName","revName","lastDotIndex","lastIndexOf","extension","_unpair","unpairAll","pairs","_pairToJSON","src","collection_type","element_identifiers","createList","creator","url","Galaxy","root","ajaxData","type","escape","$","val","jQuery","ajax","contentType","dataType","always","fail","xhr","status","message","_ajaxErrHandler","done","response","error","content","readyState","responseJSON","_showAlert","speed","empty","templates","main","_renderHeader","_renderMiddle","_renderFooter","_addPluginComponents","$header","header","find","prepend","helpContent","_renderFilters","add","$middle","middle","hide","_renderUnpaired","_renderPaired","$fwd","$rev","$prd","text","_renderUnpairedDisplayStr","toggle","_renderUnpairedEmpty","_renderPairButton","_renderUnpairedDataset","append","_adjUnpairedOnScrollbar","_renderUnpairedNotShown","numFiltered","selected","$msg","$unpairedColumns","last","$firstDataset","first","ucRight","offset","left","outerWidth","dsRight","rightDiff","css","_renderPairedEmpty","show","pairView","$footer","footer","prop","_chooseFiltersPopover","hoverhighlight","selector","filterChoice","val1","val2","$popoverContent","values","filterSet","popover","container","placement","_validationWarning","what","clear","VALIDATION_CLASS","focus","select","removeClass","on","scrollTop","splitView","msgClass","hideUnpaired","click .more-help","click .less-help","click .header .alert button","click .forward-column .column-title","click .reverse-column .column-title","click .unpair-all-link","change .forward-unpaired-filter input","focus .forward-unpaired-filter input","click .autopair-link","click .choose-filters .filter-choice","click .clear-filters-link","change .reverse-unpaired-filter input","focus .reverse-unpaired-filter input","click .forward-column .dataset.unpaired","click .reverse-column .dataset.unpaired","click .paired-column .dataset.unpaired","click .unpaired-columns","mousedown .unpaired-columns .dataset","click .paired-column-title","mousedown .flexible-partition-drag","click .paired-columns .dataset.paired","click .paired-columns","click .paired-columns .pair-name","click .unpair-btn","dragover .paired-columns .column-datasets","drop .paired-columns .column-datasets","pair.dragstart .paired-columns .column-datasets","pair.dragend .paired-columns .column-datasets","change .remove-extensions","toggleExtensions","change .collection-name","keydown .collection-name","click .cancel-create","click .create-collection","_clickMoreHelp","_clickLessHelp","alertClass","_hideAlert","_clickShowOnlyUnpaired","is","hidePaired","_clickShowOnlyPaired","callback","_clickUnpairAll","_clickAutopair","_clickFilterChoice","$selected","_hideChooseFilters","_clearFilters","_clickUnpairedDataset","stopPropagation","toggleSelectUnpaired","$dataset","force","hasClass","waitToPair","pairAllSelected","fwds","revs","each","min","err","clearSelectedUnpaired","_mousedownUnpaired","shiftKey","$startTarget","target","moveListener","document","one","off","_clickPairRow","rowIndex","eq","_startPartitionDrag","endDrag","unbind","trackMouse","pageY","startingY","adjPartition","mousemove","adj","$unpaired","$paired","unpairedHi","parseInt","pairedHi","movingUpwards","height","flex","selectPair","toggleClass","clearSelectedPaired","_clickPairName","$name","$pair","prompt","customizedName","_clickUnpair","pairIndex","_dragoverPairedColumns","preventDefault","$list","_checkForAutoscroll","clientY","$nearest","_getNearestPairedDatasetLi","remove","$placeholder","before","$element","y","AUTOSCROLL_SPEED","upperDist","top","lowerDist","outerHeight","WIGGLE","lis","toArray","$li","halfHeight","_dropPairedColumns","dropEffect","insertBefore","insertAfter","_syncPairsToDom","newPaired","_pairDragstart","_pairDragend","_changeName","_getName","_nameCheckForEnter","keyCode","_clickCreate","_printList","e","_printPair","deferred","Deferred","modal","reject","resolve","window","title","body","width","closing_events"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"list-of-pairs-collection-creator.js","sources":["../../../src/mvc/collection/list-of-pairs-collection-creator.js"],"names":["define","levenshteinDistance","naturalSort","baseCreator","baseMVC","_l","autoPairFnBuilder","options","getRegExps","_regexps","length","RegExp","this","filters","createPair","params","a","listA","splice","indexA","b","listB","indexB","aInBIndex","indexOf","bInAIndex","_pair","silent","preprocessMatch","regexps","call","_","extend","matchTo","name","replace","possible","debug","bestMatch","score","index","paired","JSON","stringify","match","scoreThreshold","push","createListOfPairsCollection","collection","elements","toJSON","pairedCollectionCreatorModal","historyId","logNamespace","PairView","Backbone","View","LoggableMixin","_logNamespace","tagName","className","initialize","attributes","pair","template","join","render","$el","attr","data","html","addClass","events","dragstart","dragend","dragover","drop","_dragstart","ev","currentTarget","style","opacity","originalEvent","dataTransfer","effectAllowed","setData","parent","trigger","_dragend","_sendToParent","toString","PairedCollectionCreator","CollectionCreatorMixin","metric","defaults","datasets","DEFAULT_FILTERS","automaticallyPair","strategy","matchPercentage","twoPassAutopairing","initialList","commonFilters","isArray","strategies","DEFAULT_STRATEGY","isFunction","removeExtensions","oncancel","oncreate","autoscrollDist","unpairedPanelHidden","pairedPanelHidden","$dragging","blocking","_setUpBehaviors","_dataSetUp","illumina","Rs","simple","lcs","levenshtein","unpaired","selectedIds","_sortInitialList","_ensureIds","slice","autoPair","once","_sortDatasetList","list","sort","forEach","dataset","hasOwnProperty","id","uniqueId","_splitByFilters","_filter","filter","test","regexFilters","map","stringFilter","split","i","_addToUnpaired","binSearchSortedIndex","low","hi","mid","Math","floor","compared","bind","autopairSimple","concat","autopairLevenshtein","distance","max","autopairLCS","_naiveStartingAndEndingLCS","s1","s2","fwdLCS","revLCS","j","fwd","rev","_createPair","without","Error","_guessNameForPair","forward","reverse","undefined","fwdName","revName","lastDotIndex","lastIndexOf","extension","_unpair","unpairAll","pairs","_pairToJSON","src","collection_type","element_identifiers","createList","creator","url","Galaxy","root","ajaxData","type","escape","$","val","jQuery","ajax","contentType","dataType","always","fail","xhr","status","message","_ajaxErrHandler","done","response","error","content","readyState","responseJSON","_showAlert","speed","empty","templates","main","_renderHeader","_renderMiddle","_renderFooter","_addPluginComponents","$header","header","find","prepend","helpContent","_renderFilters","add","$middle","middle","hide","_renderUnpaired","_renderPaired","$fwd","$rev","$prd","text","_renderUnpairedDisplayStr","toggle","_renderUnpairedEmpty","_renderPairButton","_renderUnpairedDataset","append","_adjUnpairedOnScrollbar","_renderUnpairedNotShown","numFiltered","selected","$msg","$unpairedColumns","last","$firstDataset","first","ucRight","offset","left","outerWidth","dsRight","rightDiff","css","_renderPairedEmpty","show","pairView","$footer","footer","prop","_chooseFiltersPopover","hoverhighlight","selector","filterChoice","val1","val2","$popoverContent","values","filterSet","popover","container","placement","_validationWarning","what","clear","VALIDATION_CLASS","focus","select","removeClass","on","scrollTop","splitView","msgClass","hideUnpaired","click .more-help","click .less-help","click .main-help","click .header .alert button","click .forward-column .column-title","click .reverse-column .column-title","click .unpair-all-link","change .forward-unpaired-filter input","focus .forward-unpaired-filter input","click .autopair-link","click .choose-filters .filter-choice","click .clear-filters-link","change .reverse-unpaired-filter input","focus .reverse-unpaired-filter input","click .forward-column .dataset.unpaired","click .reverse-column .dataset.unpaired","click .paired-column .dataset.unpaired","click .unpaired-columns","mousedown .unpaired-columns .dataset","click .paired-column-title","mousedown .flexible-partition-drag","click .paired-columns .dataset.paired","click .paired-columns","click .paired-columns .pair-name","click .unpair-btn","dragover .paired-columns .column-datasets","drop .paired-columns .column-datasets","pair.dragstart .paired-columns .column-datasets","pair.dragend .paired-columns .column-datasets","change .remove-extensions","toggleExtensions","change .collection-name","keydown .collection-name","click .cancel-create","click .create-collection","_clickShowOnlyUnpaired","is","hidePaired","_clickShowOnlyPaired","callback","_clickUnpairAll","_clickAutopair","_clickFilterChoice","$selected","_hideChooseFilters","_clearFilters","_clickUnpairedDataset","stopPropagation","toggleSelectUnpaired","$dataset","force","hasClass","waitToPair","pairAllSelected","fwds","revs","each","min","err","clearSelectedUnpaired","_mousedownUnpaired","shiftKey","$startTarget","target","moveListener","document","one","off","_clickPairRow","rowIndex","eq","_startPartitionDrag","endDrag","unbind","trackMouse","pageY","startingY","adjPartition","mousemove","adj","$unpaired","$paired","unpairedHi","parseInt","pairedHi","movingUpwards","height","flex","selectPair","toggleClass","clearSelectedPaired","_clickPairName","$name","$pair","prompt","customizedName","_clickUnpair","pairIndex","_dragoverPairedColumns","preventDefault","$list","_checkForAutoscroll","clientY","$nearest","_getNearestPairedDatasetLi","remove","$placeholder","before","$element","y","AUTOSCROLL_SPEED","upperDist","top","lowerDist","outerHeight","WIGGLE","lis","toArray","$li","halfHeight","_dropPairedColumns","dropEffect","insertBefore","insertAfter","_syncPairsToDom","newPaired","_pairDragstart","_pairDragend","_printList","e","_printPair","_creatorTemplates","deferred","Deferred","modal","reject","resolve","window","title","body","width","closing_events"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/mvc/dataset/dataset-li-edit.js.map b/static/maps/mvc/dataset/dataset-li-edit.js.map
index e6fed7a942d..4c8953ffced 100644
--- a/static/maps/mvc/dataset/dataset-li-edit.js.map
+++ b/static/maps/mvc/dataset/dataset-li-edit.js.map
@@ -1 +1 @@
-{"version":3,"file":"dataset-li-edit.js","sources":["../../../src/mvc/dataset/dataset-li-edit.js"],"names":["define","STATES","DATASET_LI","TAGS","ANNOTATIONS","faIconButton","BASE_MVC","_l","_super","DatasetListItemView","DatasetListItemEdit","extend","initialize","attributes","prototype","call","this","hasUser","purgeAllowed","tagsEditorShown","annotationEditorShown","_renderPrimaryActions","actions","model","get","NOT_VIEWABLE","concat","_renderEditButton","_renderDeleteButton","DISCARDED","purged","deleted","editBtnData","title","href","urls","edit","target","linkTarget","faIcon","classes","disabled","_","contains","UPLOAD","NEW","self","deletedAlready","isDeletedOrPurged","onclick","$el","find","trigger","_renderDetails","$details","state","OK","FAILED_METADATA","_renderTags","_renderAnnotation","_makeDbkeyEditLink","_setUpBehaviors","_renderToolHelpButton","datasetID","dataset_id","jobID","creating_job","parseToolBuild","data","helpString","name","help","append","$","parseHTML","parseToolID","ajax","url","Galaxy","root","tool_id","done","fail","user","id","length","toggle","console","log","_renderSecondaryActions","ERROR","unshift","_renderErrButton","_renderRerunButton","_renderVisualizationsButton","report_error","rerun","ev","preventDefault","require","ToolForm","form","View","job_id","deferred","execute","app","display","visualizations","hasData","isEmpty","isObject","warn","$visualizations","templates","attr","_addScratchBookFn","addBack","$links","click","frame","active","add","stopPropagation","$where","view","tagsEditor","TagsEditor","el","onshowFirstTime","render","onshow","onhide","$activator","appendTo","annotationEditor","AnnotationEditor","editableDbkey","replaceWith","events","clone","click .undelete-link","click .purge-link","click .edit-btn","click .delete-btn","click .rerun-btn","click .report-err-btn","click .visualization-btn","click .dbkey a","_clickUndeleteLink","undelete","_clickPurgeLink","confirm","purge","toString","modelString","warnings","failed_metadata","wrapTemplate","visualizationsTemplate"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"dataset-li-edit.js","sources":["../../../src/mvc/dataset/dataset-li-edit.js"],"names":["define","STATES","DATASET_LI","TAGS","ANNOTATIONS","faIconButton","BASE_MVC","_l","_super","DatasetListItemView","DatasetListItemEdit","extend","initialize","attributes","prototype","call","this","hasUser","purgeAllowed","tagsEditorShown","annotationEditorShown","_renderPrimaryActions","actions","model","get","NOT_VIEWABLE","concat","_renderEditButton","_renderDeleteButton","DISCARDED","purged","deleted","editBtnData","title","href","urls","edit","target","linkTarget","faIcon","classes","disabled","_","contains","UPLOAD","NEW","self","deletedAlready","isDeletedOrPurged","onclick","$el","find","trigger","_renderDetails","$details","state","OK","FAILED_METADATA","_renderTags","_renderAnnotation","_makeDbkeyEditLink","_setUpBehaviors","_renderToolHelpButton","datasetID","dataset_id","jobID","creating_job","parseToolBuild","data","helpString","name","help","append","$","parseHTML","parseToolID","ajax","url","Galaxy","root","tool_id","done","fail","user","id","length","toggle","console","log","_renderSecondaryActions","ERROR","unshift","_renderErrButton","_renderRerunButton","_renderVisualizationsButton","report_error","rerun","ev","preventDefault","router","push","job_id","visualizations","hasData","isEmpty","isObject","warn","$visualizations","templates","attr","_addScratchBookFn","addBack","$links","click","frame","active","add","stopPropagation","$where","view","tagsEditor","TagsEditor","el","onshowFirstTime","render","onshow","onhide","$activator","appendTo","annotationEditor","AnnotationEditor","editableDbkey","replaceWith","events","clone","click .undelete-link","click .purge-link","click .edit-btn","click .delete-btn","click .rerun-btn","click .report-err-btn","click .visualization-btn","click .dbkey a","_clickUndeleteLink","undelete","_clickPurgeLink","confirm","purge","toString","modelString","warnings","failed_metadata","wrapTemplate","visualizationsTemplate"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/mvc/form/form-input.js.map b/static/maps/mvc/form/form-input.js.map
index b3aa0b1504a..0eb52534e88 100644
--- a/static/maps/mvc/form/form-input.js.map
+++ b/static/maps/mvc/form/form-input.js.map
@@ -1 +1 @@
-{"version":3,"file":"form-input.js","sources":["../../../src/mvc/form/form-input.js"],"names":["define","Backbone","View","extend","initialize","app","options","this","app_options","model","attributes","field","Model","text_enable","text_disable","cls_enable","cls_disable","set","setElement","_template","$field","$","$info","$preview","$collapsible","$collapsible_text","$collapsible_icon","$title","$title_text","$error_text","$error","$backdrop","prepend","$el","collapsible_value","get","collapsed","undefined","JSON","stringify","listenTo","render","self","on","trigger","backdrop","error","text","reset","hide","help_text","help_argument","indexOf","html","_","escape","error_text","show","color","style","collapsible_state","removeClass","addClass","attr","tooltip","placement","append"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"form-input.js","sources":["../../../src/mvc/form/form-input.js"],"names":["define","Backbone","View","extend","initialize","app","options","this","app_options","model","attributes","field","Model","text_enable","text_disable","cls_enable","cls_disable","set","setElement","_template","$field","$","$info","$preview","$collapsible","$collapsible_text","$collapsible_icon","$title","$title_text","$error_text","$error","$backdrop","prepend","$el","collapsible_value","get","collapsed","undefined","JSON","stringify","listenTo","render","self","on","trigger","backdrop","error","text","reset","hide","help_text","help_argument","indexOf","html","_","escape","error_text","show","color","style","collapsible_state","removeClass","addClass","attr","tooltip","placement","append"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/mvc/form/form-section.js.map b/static/maps/mvc/form/form-section.js.map
index 364b4c3500a..79f263836c0 100644
--- a/static/maps/mvc/form/form-section.js.map
+++ b/static/maps/mvc/form/form-section.js.map
@@ -1 +1 @@
-{"version":3,"file":"form-section.js","sources":["../../../src/mvc/form/form-section.js"],"names":["define","Utils","Ui","Portlet","Repeat","InputElement","Parameters","View","Backbone","extend","initialize","app","options","this","inputs","parameters","setElement","$","render","self","$el","empty","_","each","input","add","input_def","jQuery","id","uid","input_list","type","_addConditional","_addRepeat","_addSection","_addRow","test_param","model","get","disabled","field","set","value","selectedCase","data","matchCase","i","cases","case_def","section_row","nonhidden","j","hidden","fadeIn","hide","trigger","sub_section","_append","addClass","create","sub_section_id","block_index","repeat","ondel","del","title","min","max","onnew","n_cache","size","cache","Math","default","hideOptions","input_element","label","name","help","portlet","cls","collapsible","collapsible_button","collapsed","expanded","append","html","on","input_id","length","expand","onchange","field_list","hide_label","text_value","collapsible_value","collapsible_preview","argument","color","style","backdrop","element_list","attr"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"form-section.js","sources":["../../../src/mvc/form/form-section.js"],"names":["define","Utils","Ui","Portlet","Repeat","InputElement","Parameters","View","Backbone","extend","initialize","app","options","this","inputs","parameters","setElement","$","render","self","$el","empty","_","each","input","add","input_def","jQuery","id","uid","input_list","type","_addConditional","_addRepeat","_addSection","_addRow","test_param","model","get","disabled","field","set","value","selectedCase","data","matchCase","i","cases","case_def","section_row","nonhidden","j","hidden","fadeIn","hide","trigger","sub_section","_append","addClass","create","sub_section_id","block_index","repeat","ondel","del","title","min","max","onnew","n_cache","size","cache","Math","default","hideOptions","input_element","label","name","help","portlet","cls","collapsible","collapsible_button","collapsed","expanded","append","html","on","input_id","length","expand","onchange","field_list","hide_label","text_value","collapsible_value","collapsible_preview","argument","color","style","backdrop","fixed","element_list","attr"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/mvc/grid/grid-template.js.map b/static/maps/mvc/grid/grid-template.js.map
index 642528da5f2..c162c6e0605 100644
--- a/static/maps/mvc/grid/grid-template.js.map
+++ b/static/maps/mvc/grid/grid-template.js.map
@@ -1 +1 @@
-{"version":3,"file":"grid-template.js","sources":["../../../src/mvc/grid/grid-template.js"],"names":["define","Utils","grid","options","tmpl","embedded","this","grid_header","grid_table","info_text","title","global_actions","show_popup","length","i","action","label_cls","inbound","url_args","label","insert","grid_filters","header","show_item_checkboxes","items","columns","column","visible","key","href","extra","body","num_rows_rendered","items_length","item","encoded_id","encode_id","current_item_id","id","j","nowrap","column_settings","column_config","link","value","jQuery","type","replace","cls","attach_popup","operations","label_class","label_id_prefix","footer","use_paging","num_pages","num_page_links","cur_page_num","page_link_range","min_page","min_offset","max_range","max_page","max_offset","page_index","get_class_plural","operation","allow_multiple","found_global","global_operation","legend","message","status","default_filter_dict","filters","advanced_search_display","advanced_search","show_advanced_search_link","filterable","column_key","f_key","d_key","standard_search_display","grid_column_filter","column_label","toLowerCase","is_text","url","temp_column","filter_value","JSON","stringify","column_filter","filter_element","filter","params","slice","size","seperator","cf_label","categorical_filters","cf","cf_key","cf_arg","filter_key","sanitize"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"grid-template.js","sources":["../../../src/mvc/grid/grid-template.js"],"names":["define","Utils","grid","options","tmpl","embedded","this","grid_header","grid_table","info_text","title","global_actions","show_popup","length","i","action","label_cls","target","url_args","label","insert","grid_filters","header","show_item_checkboxes","items","columns","column","visible","key","href","extra","body","num_rows_rendered","items_length","item","encoded_id","encode_id","current_item_id","id","j","nowrap","column_settings","column_config","link","value","jQuery","type","replace","cls","attach_popup","operations","label_id_prefix","footer","use_paging","num_pages","num_page_links","cur_page_num","page_link_range","min_page","min_offset","max_range","max_page","max_offset","page_index","get_class_plural","operation","allow_multiple","found_global","global_operation","legend","message","status","default_filter_dict","filters","advanced_search_display","advanced_search","show_advanced_search_link","filterable","column_key","f_key","d_key","standard_search_display","grid_column_filter","column_label","toLowerCase","is_text","url","temp_column","filter_value","JSON","stringify","column_filter","filter_element","filter","params","slice","size","seperator","cf_label","categorical_filters","cf","cf_key","cf_arg","filter_key","sanitize"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/mvc/grid/grid-view.js.map b/static/maps/mvc/grid/grid-view.js.map
index f56e2c7005a..a3cc8abf674 100644
--- a/static/maps/mvc/grid/grid-view.js.map
+++ b/static/maps/mvc/grid/grid-view.js.map
@@ -1 +1 @@
-{"version":3,"file":"grid-view.js","sources":["../../../src/mvc/grid/grid-view.js"],"names":["jQuery","ajaxSettings","traditional","define","GridModel","Templates","PopupMenu","Backbone","View","extend","grid","initialize","grid_config","this","setElement","use_panels","$","css","padding","overflow","init_grid","handle_refresh","refresh_frames","inArray","top","Galaxy","currHistoryPanel","loadCurrentHistory","options","attributes","url","get","replace","set","$el","html","find","header","body","footer","message","self","use_hide_message","setTimeout","init_grid_elements","init_grid_controls","init_refresh_on_change","each","off","click","submit_operation","select","keyup","set_sort_condition","attr","submit","column_key","text_input_obj","text_input","val","add_filter_condition","parent","remove","remove_filter_condition","set_categorical_filter","t1","length","autocomplete","history_tag_autocomplete_url","selectFirst","autoFill","highlight","mustMatch","t2","history_name_autocomplete_url","slideToggle","on","check_all_items","checkboxes","check_count","update_checked","text","filter","change","rating","set_page","execute","href","inbound","items_length","items","i","item","button","popup","j","operation","operation_id","operation_settings","popupConfig","target","confirmation_text","func","e","preventDefault","label","findItemByHtml","addItem","name","value","add_filter","t","filter_element","container","append","go_page_one","remove_filter","col_key","cur_sort","new_sort","indexOf","substring","sort_arrow","addClass","new_value","category_filter","cur_value","trim","filter_value","empty","removeClass","new_page","id","page_num","parseInt","split","cur_page","children","operation_button","operation_name","number_of_checked_ids","_","findWhere","operations","confirm","item_ids","push","chk_all","document","getElementById","checks","getElementsByTagName","total","checked","undefined","href_parts","href_parms_str","href_parms","index","toLowerCase","can_async_op","update_grid","go_to","async","advanced_search","is","param","get_url_data","$div","closest","load","window","location","method","show","ajax","type","data","error","alert","success","response_text","embedded","insert","json","parseJSON","hide","complete"],"mappings":"AAEAA,OAAOC,aAAaC,aAAc,EAGlCC,QACI,sBACA,yBACA,qBACD,SAASC,EAAWC,EAAWC,GAGlC,MAAOC,UAASC,KAAKC,QAGjBC,KAAM,KAGNC,WAAY,SAASC,GAGjBC,KAAKC,WAAW,mBAGZF,EAAYG,YACZC,EAAE,WAAWC,KACTC,QAAc,OACdC,SAAc,SAKtBN,KAAKO,UAAUR,IAInBS,eAAgB,SAAUC,GAClBA,GACIN,EAAEO,QAAQ,UAAWD,GAAkB,IACnCE,IAAIC,QAAUD,IAAIC,OAAOC,kBACzBF,IAAIC,OAAOC,iBAAiBC,sBAO5CP,UAAW,SAASR,GAGhBC,KAAKH,KAAO,GAAIN,GAAUQ,EAG1B,IAAIgB,GAAUf,KAAKH,KAAKmB,UAGxBhB,MAAKQ,eAAeO,EAAQN,eAG5B,IAAIQ,GAAMjB,KAAKH,KAAKqB,IAAI,WAaxB,IAZAD,EAAMA,EAAIE,QAAQ,gBAAiB,IACnCnB,KAAKH,KAAKuB,IAAI,WAAYH,GAG1BjB,KAAKqB,IAAIC,KAAK9B,EAAUK,KAAKkB,IAG7Bf,KAAKqB,IAAIE,KAAK,sBAAsBD,KAAK9B,EAAUgC,OAAOT,IAC1Df,KAAKqB,IAAIE,KAAK,oBAAoBD,KAAK9B,EAAUiC,KAAKV,IACtDf,KAAKqB,IAAIE,KAAK,sBAAsBD,KAAK9B,EAAUkC,OAAOX,IAGtDA,EAAQY,QAAS,CACjB3B,KAAKqB,IAAIE,KAAK,iBAAiBD,KAAK9B,EAAUmC,QAAQZ,GACtD,IAAIa,GAAO5B,IACPe,GAAQc,kBACRC,WAAY,WAAaF,EAAKP,IAAIE,KAAK,iBAAiBD,KAAK,KAAQ,KAK7EtB,KAAK+B,qBACL/B,KAAKgC,qBAILC,0BAIJD,mBAAoB,WAGhB,GAAIJ,GAAO5B,IAGXA,MAAKqB,IAAIE,KAAK,qBAAqBW,KAAK,WACpC/B,EAAEH,MAAMmC,MACRhC,EAAEH,MAAMoC,MAAM,WAEV,MADAR,GAAKS,iBAAiBrC,OACf,MAKfA,KAAKqB,IAAIE,KAAK,oBAAoBW,KAAK,WACnC/B,EAAEH,MAAMmC,MACRhC,EAAEH,MAAMoC,MAAM,WAAajC,EAAEH,MAAMsC,WAC3BC,MAAM,WAAcpC,EAAEH,MAAMI,IAAI,aAAc,cAI1DJ,KAAKqB,IAAIE,KAAK,cAAcW,KAAM,WAC9B/B,EAAEH,MAAMmC,MACRhC,EAAEH,MAAMoC,MAAO,WAEZ,MADAR,GAAKY,mBAAoBrC,EAAEH,MAAMyC,KAAK,cAC/B,MAKdzC,KAAKqB,IAAIE,KAAK,qBAAqBW,KAAM,WACrC/B,EAAEH,MAAMmC,MACRhC,EAAEH,MAAM0C,OAAQ,WACZ,GAAIC,GAAaxC,EAAEH,MAAMyC,KAAK,cAC1BG,EAAiBzC,EAAE,UAAYwC,EAAa,WAC5CE,EAAaD,EAAeE,KAGhC,OAFAF,GAAeE,IAAI,IACnBlB,EAAKmB,qBAAqBJ,EAAYE,IAC/B,MAKf7C,KAAKqB,IAAIE,KAAK,wBAAwBW,KAAM,WACxC/B,EAAEH,MAAMmC,MACRhC,EAAEH,MAAMoC,MAAO,WAQX,MANAjC,GAAEH,MAAMgD,SAASC,SAGjBrB,EAAKsB,wBAAyB/C,EAAEH,MAAMyC,KAAK,cAAetC,EAAEH,MAAMyC,KAAK,gBAGhE,MAKfzC,KAAKqB,IAAIE,KAAK,2BAA2BW,KAAM,WAC3C/B,EAAEH,MAAMmC,MACRhC,EAAEH,MAAMoC,MAAO,WAEX,MADAR,GAAKuB,uBAAwBhD,EAAEH,MAAMyC,KAAK,cAAetC,EAAEH,MAAMyC,KAAK,gBAC/D,KAKf,IAAIW,GAAKpD,KAAKqB,IAAIE,KAAK,qBACnB6B,GAAGC,QACHD,EAAGE,aAAatD,KAAKH,KAAK0D,8BACpBC,aAAa,EAAOC,UAAU,EAAOC,WAAW,EAAOC,WAAW,GAE5E,IAAIC,GAAK5D,KAAKqB,IAAIE,KAAK,qBACnBqC,GAAGP,QACHO,EAAGN,aAAatD,KAAKH,KAAKgE,+BACpBL,aAAa,EAAOC,UAAU,EAAOC,WAAW,EAAOC,WAAW,IAI5E3D,KAAKqB,IAAIE,KAAK,2BAA2BW,KAAM,WAC3C/B,EAAEH,MAAMmC,MACRhC,EAAEH,MAAMoC,MAAO,WAGX,MAFAR,GAAKP,IAAIE,KAAK,oBAAoBuC,YAAY,QAC9ClC,EAAKP,IAAIE,KAAK,oBAAoBuC,YAAY,SACvC,MAKf9D,KAAKqB,IAAIE,KAAK,cAAcY,MAC5BnC,KAAKqB,IAAIE,KAAK,cAAcwC,GAAG,QAAS,WACpCnC,EAAKoC,qBAKbjC,mBAAqB,WAEjB/B,KAAKqB,IAAIE,KAAK,SAASW,KAAM,WACzB,GAAI+B,GAAa9D,EAAEH,MAAMuB,KAAK,kCAC1B2C,EAAc/D,EAAEH,MAAMuB,KAAK,4BAC3B4C,EAAiB,WACjBD,EAAYE,KAAMjE,EAAE8D,GAAYI,OAAO,YAAYhB,QAGvDlD,GAAE8D,GAAY/B,KAAM,WAChB/B,EAAEH,MAAMsE,OAAOH,KAEnBA,MAImD,IAAnDnE,KAAKqB,IAAIE,KAAK,0BAA0B8B,QACxCrD,KAAKqB,IAAIE,KAAK,0BAA0BgD,UAG5C,IAAIxD,GAAUf,KAAKH,KAAKmB,WACpBY,EAAO5B,IAKXA,MAAKqB,IAAIE,KAAK,kBAAkBW,KAAM,WAClC/B,EAAEH,MAAMoC,MAAO,WAEZ,MADAR,GAAK4C,SAAUrE,EAAEH,MAAMyC,KAAK,cACrB,MAOdzC,KAAKqB,IAAIE,KAAK,gBAAgBW,KAAM,WAChC/B,EAAEH,MAAMoC,MAAO,WAKX,MAJAR,GAAK6C,SACDC,KAAOvE,EAAEH,MAAMyC,KAAK,QACpBkC,SAAU,KAEP,MAKf3E,KAAKqB,IAAIE,KAAK,iBAAiBW,KAAM,WACjC/B,EAAEH,MAAMoC,MAAO,WAIX,MAHAR,GAAK6C,SACDC,KAAOvE,EAAEH,MAAMyC,KAAK,WAEjB,KAKf,IAAImC,GAAe7D,EAAQ8D,MAAMxB,MACjC,IAAoB,GAAhBuB,EAOJ,IAAK,GAAIE,KAAK/D,GAAQ8D,MACtB,CAEI,GAAIE,GAAOhE,EAAQ8D,MAAMC,GAGrBE,EAAShF,KAAKqB,IAAIE,KAAK,SAAWuD,EAAI,SAC1CE,GAAO7C,KACP,IAAI8C,GAAQ,GAAIxF,GAAUuF,EAG1B,KAAK,GAAIE,KAAKnE,GAAoB,WAClC,CAEI,CAAA,GAAIoE,GAAYpE,EAAoB,WAAEmE,GAClCE,EAAeD,EAAiB,MAChCE,EAAqBN,EAAuB,iBAAEK,EAClCL,GAAgB,UAGhC,GAAIM,EAA4B,SAAKF,EAAuB,YAC5D,CAEI,GAAIG,IAEAhE,KAAO6D,EAAiB,MACxBT,KAAOW,EAA6B,SACpCE,OAASF,EAA2B,OACpCG,kBAAoBL,EAAmB,QACvCR,QAAUQ,EAAmB,QAIjCG,GAAYG,KAAO,SAASC,GAExBA,EAAEC,gBACF,IAAIC,GAAQzF,EAAEuF,EAAEH,QAAQjE,OACpBP,EAAUf,KAAK6F,eAAeD,EAClChE,GAAK6C,QAAQ1D,IAIjBkE,EAAMa,QAAQR,OAO9BvC,qBAAsB,SAAUgD,EAAMC,GAElC,GAAc,KAAVA,EACA,OAAO,CAIXhG,MAAKH,KAAKoG,WAAWF,EAAMC,GAAO,EAGlC,IAAIE,GAAI/F,EAAEX,EAAU2G,eAAeJ,EAAMC,IACrCpE,EAAO5B,IACXkG,GAAE9D,MAAM,WAEJjC,EAAEH,MAAMiD,SAGRrB,EAAKsB,wBAAwB6C,EAAMC,IAIvC,IAAII,GAAYpG,KAAKqB,IAAIE,KAAK,IAAMwE,EAAO,sBAC3CK,GAAUC,OAAOH,GAGjBlG,KAAKsG,cACLtG,KAAKyE,WAITvB,wBAAyB,SAAU6C,EAAMC,GAErChG,KAAKH,KAAK0G,cAAcR,EAAMC,GAG9BhG,KAAKsG,cACLtG,KAAKyE,WAITjC,mBAAoB,SAAUgE,GAG1B,GAAIC,GAAWzG,KAAKH,KAAKqB,IAAI,YACzBwF,EAAWF,CACmB,MAA9BC,EAASE,QAAQH,IAEgB,MAA7BC,EAASG,UAAU,EAAG,KACtBF,EAAW,IAAMF,GAKzBxG,KAAKqB,IAAIE,KAAK,eAAe0B,QAG7B,IAAI4D,GAAyC,KAA3BH,EAASE,UAAU,EAAE,GAAa,SAAW,SAC3DV,EAAI/F,EAAE,SAAW0G,EAAa,WAAWC,SAAS,aAGtD9G,MAAKqB,IAAIE,KAAK,IAAMiF,EAAU,WAAWH,OAAOH,GAGhDlG,KAAKH,KAAKuB,IAAI,WAAYsF,GAC1B1G,KAAKsG,cACLtG,KAAKyE,WAITtB,uBAAwB,SAAU4C,EAAMgB,GAEpC,GAAIC,GAAkBhH,KAAKH,KAAKqB,IAAI,uBAAuB6E,GACvDkB,EAAYjH,KAAKH,KAAKqB,IAAI,WAAW6E,GACrCnE,EAAO5B,IACXA,MAAKqB,IAAIE,KAAK,IAAMwE,EAAO,WAAW7D,KAAM,WACxC,GAAIkC,GAAOjE,EAAE+G,KAAM/G,EAAEH,MAAMoE,QACvBC,EAAS2C,EAAgB5C,GACzB+C,EAAe9C,EAAO0B,EAC1B,IAAIoB,GAAgBJ,EAGhB5G,EAAEH,MAAMoH,QACRjH,EAAEH,MAAM8G,SAAS,kBACjB3G,EAAEH,MAAMqG,OAAOjC,OACZ,IAAI+C,GAAgBF,EAAW,CAGlC9G,EAAEH,MAAMoH,OACR,IAAIlB,GAAI/F,EAAE,eAAiBiE,EAAO,OAClC8B,GAAE9D,MAAM,WACJR,EAAKuB,uBAAwB4C,EAAMoB,KAEvChH,EAAEH,MAAMqH,YAAY,kBACpBlH,EAAEH,MAAMqG,OAAOH,MAKvBlG,KAAKH,KAAKoG,WAAWF,EAAMgB,GAC3B/G,KAAKsG,cACLtG,KAAKyE,WAITD,SAAU,SAAU8C,GAEhB,GAAI1F,GAAO5B,IACXA,MAAKqB,IAAIE,KAAK,cAAcW,KAAM,WAC9B,GAGIkC,GAHAmD,EAAKpH,EAAEH,MAAMyC,KAAK,MAClB+E,EAAWC,SAAUF,EAAGG,MAAM,KAAK,GAAI,IACvCC,EAAW/F,EAAK/B,KAAKqB,IAAI,WAE7B,IAAIsG,IAAaF,EAGblD,EAAOjE,EAAEH,MAAM4H,WAAWxD,OAC1BjE,EAAEH,MAAMoH,QACRjH,EAAEH,MAAM8G,SAAS,iBACjB3G,EAAEH,MAAMoE,KAAKA,OAEZ,IAAIoD,IAAaG,EAAU,CAG5BvD,EAAOjE,EAAEH,MAAMoE,OACfjE,EAAEH,MAAMoH,QACRjH,EAAEH,MAAMqH,YAAY,gBACpB,IAAInB,GAAI/F,EAAE,eAAiBiE,EAAO,OAClC8B,GAAE9D,MAAM,WACJR,EAAK4C,SAASgD,KAElBrH,EAAEH,MAAMqG,OAAOH,MAIN,QAAboB,EACAtH,KAAKH,KAAKuB,IAAI,WAAYkG,GAE1BtH,KAAKH,KAAKuB,IAAI,WAAYqG,SAASH,EAAU,KAEjDtH,KAAKyE,WAITpC,iBAAkB,SAAUwF,EAAkBrC,GAG1C,GAAIsC,GAAiB3H,EAAE0H,GAAkB/E,MAGrCiF,EAAwB/H,KAAKqB,IAAIE,KAAK,4BAA4B8B,MACtE,KAAK0E,EAAwB,EACzB,OAAO,CAIX,IAAI5C,GAAY6C,EAAEC,UAAUjI,KAAKH,KAAKmB,WAAWkH,YAAatC,MAAOkC,GACjE3C,KAAcK,IACdA,EAAoBL,EAAUgD,SAAW,GAI7C,IAAIC,KAaJ,OAZApI,MAAKqB,IAAIE,KAAK,0BAA0BW,KAAK,WACzCkG,EAASC,KAAMlI,EAAEH,MAAM8C,SAI3B9C,KAAKyE,SACDU,UAAW2C,EACXP,GAAIa,EACJ5C,kBAAmBA,KAIhB,GAGXxB,gBAAiB,WACb,GAGIc,GAHAwD,EAAUC,SAASC,eAAe,aAClCC,EAASF,SAASG,qBAAqB,SACvCC,EAAQ,CAEZ,IAAKL,EAAQM,WAAY,EACrB,IAAM9D,EAAE,EAAGA,EAAI2D,EAAOpF,OAAQyB,IACc,KAAnC2D,EAAO3D,GAAGiB,KAAKY,QAAS,QAC1B8B,EAAO3D,GAAG8D,SAAU,EACpBD,SAKP,KAAM7D,EAAE,EAAGA,EAAI2D,EAAOpF,OAAQyB,IACc,KAAnC2D,EAAO3D,GAAGiB,KAAKY,QAAS,QAC1B8B,EAAO3D,GAAG8D,SAAU,EAK/B5I,MAAK+B,sBAITuE,YAAa,WAET,GAAIqB,GAAW3H,KAAKH,KAAKqB,IAAI,WACZ,QAAbyG,GAAkCkB,SAAblB,GAAuC,QAAbA,GAC/C3H,KAAKH,KAAKuB,IAAI,WAAY,IAOlCqD,QAAS,SAAU1D,GAEf,GAAIwG,GAAK,KACL7C,EAAO,KACPS,EAAY,KACZK,EAAoB,KACpBb,EAAU,IAGd,IAAI5D,IAGA2D,EAAO3D,EAAQ2D,KACfS,EAAYpE,EAAQoE,UACpBoC,EAAKxG,EAAQwG,GACb/B,EAAoBzE,EAAQyE,kBAC5Bb,EAAU5D,EAAQ4D,QAGLkE,SAATnE,GAAoD,IAA9BA,EAAKiC,QAAQ,eAAqB,CAExD,GAAImC,GAAapE,EAAKgD,MAAM,IAC5B,IAAIoB,EAAWzF,OAAS,EAGpB,IAAK,GAFD0F,GAAiBD,EAAW,GAC5BE,EAAaD,EAAerB,MAAM,KAC7BuB,EAAQ,EAAGA,EAAQD,EAAW3F,OAAQ4F,IACG,IAA1CD,EAAWC,GAAOtC,QAAQ,cAE1BxB,EAAY6D,EAAWC,GAAOvB,MAAM,KAAK,GACzCvC,EAAYA,EAAUhE,QAAS,MAAO,MACI,IAAnC6H,EAAWC,GAAOtC,QAAQ,QAEjCY,EAAKyB,EAAWC,GAAOvB,MAAM,KAAK,IAQtD,MAAIvC,IAAaoC,EAET/B,GAA0C,IAArBA,GAAgD,QAArBA,GAAoD,QAArBA,IAC3E2C,QAAQ3C,IACD,GAGfL,EAAYA,EAAU+D,cAGtBlJ,KAAKH,KAAKuB,KACN+D,UAAWA,EACXiD,SAAUb,IAIVvH,KAAKH,KAAKsJ,aAAahE,GACvBnF,KAAKoJ,cAELpJ,KAAKqJ,MAAM1E,EAASD,IAIjB,GAIPA,GACA1E,KAAKqJ,MAAM1E,EAASD,IACb,IAIP1E,KAAKH,KAAKqB,IAAI,SACdlB,KAAKoJ,cAELpJ,KAAKqJ,MAAM1E,EAASD,IAIjB,IAIX2E,MAAO,SAAU1E,EAASD,GAEtB,GAAI4E,GAAQtJ,KAAKH,KAAKqB,IAAI,QAmB1B,IAlBAlB,KAAKH,KAAKuB,IAAI,SAAS,GAGvBmI,gBAAkBvJ,KAAKqB,IAAIE,KAAK,oBAAoBiI,GAAG,YACvDxJ,KAAKH,KAAKuB,IAAI,kBAAmBmI,iBAG7B7E,IACAA,EAAO1E,KAAKH,KAAKqB,IAAI,YAAc,IAAMf,EAAEsJ,MAAMzJ,KAAKH,KAAK6J,iBAI/D1J,KAAKH,KAAKuB,KACN+D,UAAW0D,OACXT,SAAUS,OACVS,MAAOA,IAGP3E,EAAS,CAET,GAAIgF,GAAOxJ,EAAE,gBAAgByJ,QAAQ,WACrC,IAAoB,IAAhBD,EAAKtG,OAEL,WADAsG,GAAKE,KAAKnF,GAKlBoF,OAAOC,SAAWrF,GAItB0E,YAAa,WAET,GAAIY,GAAUhK,KAAKH,KAAKqB,IAAI,aAAe,OAAS,KAGpDlB,MAAKqB,IAAIE,KAAK,wBAAwB0I,MACtC,IAAIrI,GAAO5B,IACXG,GAAE+J,MACEC,KAAMH,EACN/I,IAAKW,EAAK/B,KAAKqB,IAAI,YACnBkJ,KAAMxI,EAAK/B,KAAK6J,eAChBW,MAAO,WAAqBC,MAAO,wBACnCC,QAAS,SAASC,GAGd,GAAIC,GAAW7I,EAAK/B,KAAKqB,IAAI,YACzBwJ,EAAS9I,EAAK/B,KAAKqB,IAAI,UAGvByJ,EAAOxK,EAAEyK,UAAUJ,EAGvBG,GAAKF,SAAWA,EAChBE,EAAKD,OAASA,EAGd9I,EAAKrB,UAAUoK,GAGf/I,EAAKP,IAAIE,KAAK,wBAAwBsJ,QAE1CC,SAAU,WAENlJ,EAAK/B,KAAKuB,KACN+D,UAAW0D,OACXT,SAAUS"}
\ No newline at end of file
+{"version":3,"file":"grid-view.js","sources":["../../../src/mvc/grid/grid-view.js"],"names":["jQuery","ajaxSettings","traditional","define","GridModel","Templates","PopupMenu","Backbone","View","extend","grid","initialize","grid_config","this","setElement","use_panels","$","css","padding","overflow","init_grid","handle_refresh","refresh_frames","inArray","top","Galaxy","currHistoryPanel","loadCurrentHistory","options","attributes","url","get","replace","set","$el","html","find","header","body","footer","message","self","use_hide_message","setTimeout","init_grid_elements","init_grid_controls","init_refresh_on_change","each","off","click","submit_operation","select","keyup","set_sort_condition","attr","submit","column_key","text_input_obj","text_input","val","add_filter_condition","parent","remove","remove_filter_condition","set_categorical_filter","slideToggle","on","check_all_items","checkboxes","check_count","update_checked","text","filter","length","change","rating","set_page","execute","href","target","items_length","items","i","item","button","popup","j","operation","operation_id","operation_settings","popupConfig","confirmation_text","func","e","preventDefault","label","findItemByHtml","addItem","name","value","add_filter","t","filter_element","container","append","go_page_one","remove_filter","col_key","cur_sort","new_sort","indexOf","substring","sort_arrow","addClass","new_value","category_filter","cur_value","trim","filter_value","empty","removeClass","new_page","id","page_num","parseInt","split","cur_page","children","operation_button","operation_name","number_of_checked_ids","_","findWhere","operations","confirm","item_ids","push","chk_all","document","getElementById","checks","getElementsByTagName","total","checked","undefined","href_parts","href_parms_str","href_parms","index","toLowerCase","can_async_op","update_grid","go_to","async","advanced_search","is","param","get_url_data","$div","closest","load","window","location","method","show","ajax","type","data","error","alert","success","response_text","embedded","insert","json","parseJSON","hide","complete"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/mvc/history/hda-li.js.map b/static/maps/mvc/history/hda-li.js.map
index ab9a378ed93..0bad59d3c19 100644
--- a/static/maps/mvc/history/hda-li.js.map
+++ b/static/maps/mvc/history/hda-li.js.map
@@ -1 +1 @@
-{"version":3,"file":"hda-li.js","sources":["../../../src/mvc/history/hda-li.js"],"names":["define","DATASET_LI","BASE_MVC","_l","_super","DatasetListItemView","HDAListItemView","extend","className","prototype","initialize","attributes","options","call","this","toString","modelString","model","templates","titleBarTemplate","wrapTemplate","warnings","_","hidden","titleBar"],"mappings":"AAAAA,QACI,yBACA,eACA,sBACD,SAAUC,EAAYC,EAAUC,GAEnC,YAGA,IAAIC,GAASH,EAAWI,oBAMpBC,EAAkBF,EAAOG,QAGzBC,UAAcJ,EAAOK,UAAUD,UAAY,mBAE3CE,WAAa,SAAUC,EAAYC,GAC/BR,EAAOK,UAAUC,WAAWG,KAAMC,KAAMH,EAAYC,IAKxDG,SAAW,WACP,GAAIC,GAAgBF,KAAW,MAAIA,KAAKG,MAAQ,GAAK,YACrD,OAAO,mBAAqBD,EAAc,MAwC9C,OAlCJV,GAAgBG,UAAUS,UAAa,WAEnC,GAAIC,GAAmBjB,EAASkB,cAE5B,6CACI,mCACA,sBAEI,+CACA,gDACJ,SACJ,UACD,WAECC,EAAWC,EAAEf,UAAYH,EAAOK,UAAUS,UAAUG,UACpDE,OAASrB,EAASkB,cAEd,gCACI,+CACIjB,EAAI,gCACR,SACJ,WACD,YAGP,OAAOmB,GAAEf,UAAYH,EAAOK,UAAUS,WAClCM,SAAWL,EACXE,SAAWA,QAQXf,gBAAmBA"}
\ No newline at end of file
+{"version":3,"file":"hda-li.js","sources":["../../../src/mvc/history/hda-li.js"],"names":["define","DATASET_LI","BASE_MVC","_l","_super","DatasetListItemView","HDAListItemView","extend","className","prototype","initialize","attributes","options","call","this","toString","modelString","model","templates","titleBarTemplate","wrapTemplate","warnings","_","hidden","titleBar"],"mappings":"AAAAA,QACI,yBACA,eACA,sBACD,SAAUC,EAAYC,EAAUC,GAEnC,YAGA,IAAIC,GAASH,EAAWI,oBAMpBC,EAAkBF,EAAOG,QAGzBC,UAAcJ,EAAOK,UAAUD,UAAY,mBAE3CE,WAAa,SAAUC,EAAYC,GAC/BR,EAAOK,UAAUC,WAAWG,KAAMC,KAAMH,EAAYC,IAKxDG,SAAW,WACP,GAAIC,GAAgBF,KAAW,MAAIA,KAAKG,MAAQ,GAAK,YACrD,OAAO,mBAAqBD,EAAc,MA8C9C,OAxCJV,GAAgBG,UAAUS,UAAa,WAEnC,GAAIC,GAAmBjB,EAASkB,cAE5B,6CACI,mCACA,sBAEI,+CACA,gDACJ,SACA,QACA,0BACI,gDACI,mDACJ,YACJ,UACJ,UACD,WAECC,EAAWC,EAAEf,UAAYH,EAAOK,UAAUS,UAAUG,UACpDE,OAASrB,EAASkB,cAEd,gCACI,+CACIjB,EAAI,gCACR,SACJ,WACD,YAGP,OAAOmB,GAAEf,UAAYH,EAAOK,UAAUS,WAClCM,SAAWL,EACXE,SAAWA,QAQXf,gBAAmBA"}
\ No newline at end of file
diff --git a/static/maps/mvc/library/library-foldertoolbar-view.js.map b/static/maps/mvc/library/library-foldertoolbar-view.js.map
index 3467916fe6f..0f041d503ca 100644
--- a/static/maps/mvc/library/library-foldertoolbar-view.js.map
+++ b/static/maps/mvc/library/library-foldertoolbar-view.js.map
@@ -1 +1 @@
-{"version":3,"file":"library-foldertoolbar-view.js","sources":["../../../src/mvc/library/library-foldertoolbar-view.js"],"names":["define","mod_masthead","mod_utils","mod_toastr","mod_library_model","mod_select","FolderToolbarView","Backbone","View","extend","el","events","click #toolbtn_create_folder","click #toolbtn_bulk_import","click #include_deleted_datasets_chk","click #toolbtn_bulk_delete","click .toolbtn-show-locinfo","click .page_size_prompt","defaults","can_add_library_item","contains_file_or_folder","chain_call_control","total_number","failed_number","disabled_jstree_element","modal","jstree","histories","select_genome","select_extension","list_extensions","auto","id","text","description","list_genomes","initialize","options","this","_","fetchExtAndGenomes","render","toolbar_template","templateToolBar","template_defaults","is_admin","is_anonym","mutiple_add_dataset_options","Galaxy","user","isAdmin","isAnonymous","config","user_library_import_dir","allow_library_path_paste","library_import_dir","$el","html","renderPaginator","paginator_template","templatePaginator","$","find","show_page","parseInt","page_count","total_items_count","items_shown","configureElements","show","hide","tooltip","createFolderFromModal","event","preventDefault","stopPropagation","self","template","templateNewFolderInModal","closing_events","title","body","buttons","Create","create_new_folder_event","Close","folderDetails","serialize_new_folder","validate_new_folder","folder","FolderAsModel","url_items","history","fragment","split","current_folder_id","length","url","urlRoot","save","success","set","type","libraries","folderListView","collection","add","error","model","response","responseJSON","err_msg","name","val","modalBulkImport","checkedValues","info","refreshUserHistoriesList","that","templateBulkImportInModal","models","Import","importAllIntoHistory","callback","GalaxyHistories","fetch","disableButton","new_history_name","post","root","done","new_history","last_used_history_id","processImportToHistory","fail","always","enableButton","history_id","history_name","dataset_ids","folder_ids","each","parentElement","data","classList","contains","push","datasets_to_import","i","library_dataset_id","historyItem","HistoryItem","content","source","library_folder_id","initChainCallControl","action","jQuery","getJSON","chainCallImportingIntoHistory","updateProgress","progress","progressStep","width","Math","round","txt_representation","download","folder_id","format","ld_ids","processDownload","method","param","inputs","pair","appendTo","submit","remove","addFilesFromHistoryModal","template_modal","templateAddFilesFromHistory","folder_name","full_path","Add","addAllDatasetsFromHistory","closing_callback","library_router","back","fetchAndDisplayHistoryContents","change","target","value","importFilesFromPathModal","templateImportPathModal","importFromPathsClicked","navigate","trigger","renderSelectBoxes","get","datatypes","key","extension","description_url","sort","a","b","unshift","cache","genomes","css","container","importFilesFromGalaxyFolderModal","templateBrowserModal","importFromJstreePath","bind","renderJstree","Jstree","require","core","plugins","types","icon","file","checkbox","three_state","err_code","warning","preserve_dirs","is","link_data","file_type","dbkey","paths","valid_paths","trimmed","trim","chainCallImportingFolders","templateAddingDatasetsProgressBar","templateDeletingItemsProgressBar","templateImportIntoHistoryProgressBar","emit","all_nodes","get_selected","selected_nodes","filter","node","state","disabled","selection_type","undefined","li_attr","full_source","chainCallImportingUserdirFiles","history_contents","HistoryContents","history_contents_template","templateHistoryContents","contents","reverse","checked_hdas","history_dataset_ids","hdas_to_add","hid","history_dataset_id","folder_item","Item","from_hda_id","chainCallAddingHdas","history_item_set","popped_item","pop","onclick","window","location","promise","when","hdas_set","added_hdas","Folder","chainCallDeletingItems","items_to_delete","deleted_items","destroy","item","include_deleted","updated_item","model_class","checkIncludeDeleted","fetchFolder","checked","deleteSelectedItems","substring","items_total","dataset","showLocInfo","library","libraryListView","parent_library_id","showLocInfoModal","Library","templateLocInfoInModal","showImportModal","showPageSizePrompt","folder_page_size","prompt","preferences","join"],"mappings":"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AAOuD,UAAUC,eAAe/D,QAAUT,GAAIM,KAAKD,QAAQL,GAAI+B,UAAW,MAIhFpB,gBAAiB,WACf,MAAOJ,GAAEsC,UAET,wCAEE,6BACE,yCACE,+CAEA,2DACA,sGACE,UACE,mFACF,WACF,SACA,qNACE,qEACF,YACA,0CACA,kEACE,oIACE,8FACF,YACA,yCACE,yEACA,6DACE,gFACF,UACA,qDACE,4BACA,+CACA,wDACE,mFACF,UACA,qDACE,kEACF,UACF,UACF,QACF,SACA,iBACE,0LACE,mEACF,OACF,UACA,iOACE,mCACA,mBACF,YACA,0FACE,kIACE,4EACF,YACA,yCACE,kEACA,kEACA,+DACF,QACF,SACE,+NACA,oDACA,8LACE,0CACA,gBACF,YACA,qGACE,gGACE,gDACE,8CACA,aACF,YACF,OACF,UACF,SACF,UAEF,kCACA,SAEA,wDAEF,UACEsO,KAAK,MAGTN,uBAAwB,WACtB,MAAOtQ,GAAEsC,UACP,QACE,6CACE,UACE,uCACA,YACF,WACA,UACE,OACE,gBACA,sCACF,QACA,gDACE,OACE,uBACA,6CACF,QACF,UACA,6CACE,OACE,oBACA,0CACF,QACF,UACA,uDACE,OACE,mBACA,2GACF,QACF,UACA,OACE,cACA,oCACF,QACF,WACF,WACA,6CACE,UACE,sCACA,YACF,WACA,UACE,OACE,gBACA,sCACF,QACA,gDACE,OACE,uBACA,6CACF,QACF,UACA,OACE,cACA,6BACF,QACA,WACJ,WACJ,UACEsO,KAAK,MAGTrO,yBAA0B,WACxB,MAAOvC,GAAEsC,UACT,8BACE,SACE,wEACA,4EACF,UACF,UACEsO,KAAK,MAIT5L,0BAA4B,WAC1B,MAAOhF,GAAEsC,UACT,QACE,mCACE,mBACA,iHACE,8CACE,mGACF,YACF,YACF,SACA,mCACE,kBACA,4GACA,WACF,SACF,UACEsO,KAAK,MAGTnE,qCAAuC,WACrC,MAAOzM,GAAEsC,UACT,4BACE,2EACF,SACA,yBACE,gJACE,mDACF,SACF,UACEsO,KAAK,MAGTrE,kCAAmC,WACjC,MAAOvM,GAAEsC,UACT,4BACE,iFACF,SACA,yBACE,gJACE,mDACF,SACF,UACEsO,KAAK,MAGTpE,iCAAkC,WAChC,MAAOxM,GAAEsC,UACT,4BACA,SACA,yBACE,gJACE,mDACF,SACF,UACEsO,KAAK,MAGT9F,qBAAsB,WACpB,MAAO9K,GAAEsC,UACT,gCACE,0JACA,wLACA,mCACE,oFACE,yGACF,WACA,sFACA,uFACA,WACF,SACA,mCACE,kFACE,yFACA,+BACF,WACA,0EACE,mEACA,gCACF,WACF,SACA,qGACE,aACF,YACA,qGACE,cACF,YACA,SAEA,4BACA,SACA,SACA,kFACA,QACE,gFACA,4EACA,SACJ,UACEsO,KAAK,MAGTjH,wBAAyB,WACvB,MAAO3J,GAAEsC,UACT,gCACE,+JACA,sCACE,4DACE,yFACA,+BACF,WACA,oDACE,mEACA,gCACF,WACF,SACA,uKACA,SACA,kFACA,QACE,gFACA,4EACF,SACF,UACEsO,KAAK,MAGT9H,4BAA6B,WAC3B,MAAO9I,GAAEsC,UACT,6BACE,QACE,oBACA,8EACE,8CACE,mGACF,YACF,YACF,SACA,QACA,sCACA,SACF,UACEsO,KAAK,MAGTlD,wBAAyB;AACvB,MAAO1N,GAAEsC,UACT,kDACA,OACE,0DACE,yDACE,iIACF,QACF,YACF,SACEsO,KAAK,MAGTvP,kBAAmB,WACjB,MAAOrB,GAAEsC,UACT,wCACE,uCACE,gDACE,iGACA,wHACF,iBACE,iGACA,2GACF,UACF,iBACE,kHACA,wHACF,UACA,sBACE,0FACF,QACA,4CACE,2GACA,0HACF,iBACE,yHACA,2IACF,UACF,QACA,SACE,sBACA,8HACE,qBACF,OACA,0CACF,WACEsO,KAAK,OAKX,QACI7S,kBAAmBA"}
\ No newline at end of file
+{"version":3,"file":"library-foldertoolbar-view.js","sources":["../../../src/mvc/library/library-foldertoolbar-view.js"],"names":["define","mod_masthead","mod_utils","mod_toastr","mod_library_model","mod_select","FolderToolbarView","Backbone","View","extend","el","events","click #toolbtn_create_folder","click #toolbtn_bulk_import","click #include_deleted_datasets_chk","click #toolbtn_bulk_delete","click .toolbtn-show-locinfo","click .page_size_prompt","defaults","can_add_library_item","contains_file_or_folder","chain_call_control","total_number","failed_number","disabled_jstree_element","modal","jstree","histories","select_genome","select_extension","list_extensions","auto","id","text","description","list_genomes","initialize","options","this","_","fetchExtAndGenomes","render","toolbar_template","templateToolBar","template_defaults","is_admin","is_anonym","mutiple_add_dataset_options","Galaxy","user","isAdmin","isAnonymous","config","user_library_import_dir","allow_library_path_paste","library_import_dir","$el","html","renderPaginator","paginator_template","templatePaginator","$","find","show_page","parseInt","page_count","total_items_count","items_shown","configureElements","show","hide","tooltip","createFolderFromModal","event","preventDefault","stopPropagation","self","template","templateNewFolderInModal","closing_events","title","body","buttons","Create","create_new_folder_event","Close","folderDetails","serialize_new_folder","validate_new_folder","folder","FolderAsModel","url_items","history","fragment","split","current_folder_id","length","url","urlRoot","save","success","set","type","libraries","folderListView","collection","add","error","model","response","responseJSON","err_msg","name","val","modalBulkImport","checkedValues","info","refreshUserHistoriesList","that","templateBulkImportInModal","models","Import","importAllIntoHistory","callback","GalaxyHistories","fetch","disableButton","new_history_name","post","root","done","new_history","last_used_history_id","processImportToHistory","fail","always","enableButton","history_id","history_name","dataset_ids","folder_ids","each","parentElement","data","classList","contains","push","datasets_to_import","i","library_dataset_id","historyItem","HistoryItem","content","source","library_folder_id","initChainCallControl","action","jQuery","getJSON","chainCallImportingIntoHistory","updateProgress","progress","progressStep","width","Math","round","txt_representation","download","folder_id","format","ld_ids","processDownload","method","param","inputs","pair","appendTo","submit","remove","addFilesFromHistoryModal","template_modal","templateAddFilesFromHistory","folder_name","full_path","Add","addAllDatasetsFromHistory","closing_callback","library_router","back","fetchAndDisplayHistoryContents","change","target","value","importFilesFromPathModal","templateImportPathModal","importFromPathsClicked","navigate","trigger","renderSelectBoxes","get","datatypes","key","extension","description_url","sort","a","b","unshift","cache","genomes","css","container","importFilesFromGalaxyFolderModal","templateBrowserModal","importFromJstreePath","bind","renderJstree","Jstree","require","core","plugins","types","icon","file","checkbox","three_state","err_code","warning","preserve_dirs","is","link_data","file_type","dbkey","paths","valid_paths","trimmed","trim","chainCallImportingFolders","templateAddingDatasetsProgressBar","templateDeletingItemsProgressBar","templateImportIntoHistoryProgressBar","emit","all_nodes","get_selected","selected_nodes","filter","node","state","disabled","selection_type","undefined","li_attr","full_source","chainCallImportingUserdirFiles","history_contents","HistoryContents","history_contents_template","templateHistoryContents","contents","reverse","checked_hdas","history_item_ids","history_item_types","items_to_add","hid","item_type","history_item_id","folder_item","Item","from_hdca_id","from_hda_id","chainCallAddingHdas","history_item_set","popped_item","pop","onclick","window","location","promise","when","hdas_set","added_hdas","Folder","chainCallDeletingItems","items_to_delete","deleted_items","destroy","item","include_deleted","updated_item","model_class","checkIncludeDeleted","fetchFolder","checked","deleteSelectedItems","substring","items_total","dataset","showLocInfo","library","libraryListView","parent_library_id","showLocInfoModal","Library","templateLocInfoInModal","showImportModal","showPageSizePrompt","folder_page_size","prompt","preferences","join"],"mappings":"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OuD,UAAU8M,YAAY9G,IAAK,oBACrF,OAApB4G,GAAgCA,GAAoBnP,SAAUmP,KACjEnQ,OAAOuD,UAAU8M,YAAYhN,KAAO8M,iBAAoBnP,SAAUmP,KAClEnQ,OAAOuD,UAAUC,eAAe/D,QAAUT,GAAIM,KAAKD,QAAQL,GAAI+B,UAAW,MAIhFpB,gBAAiB,WACf,MAAOJ,GAAEsC,UAET,wCAEE,6BACE,yCACE,+CAEA,2DACA,sGACE,UACE,mFACF,WACF,SACA,qNACE,qEACF,YACA,0CACA,kEACE,oIACE,8FACF,YACA,yCACE,yEACA,6DACE,gFACF,UACA,qDACE,4BACA,+CACA,wDACE,mFACF,UACA,qDACE,kEACF,UACF,UACF,QACF,SACA,iBACE,0LACE,mEACF,OACF,UACA,iOACE,mCACA,mBACF,YACA,0FACE,kIACE,4EACF,YACA,yCACE,kEACA,kEACA,+DACF,QACF,SACE,+NACA,oDACA,8LACE,0CACA,gBACF,YACA,qGACE,gGACE,gDACE,8CACA,aACF,YACF,OACF,UACF,SACF,UAEF,kCACA,SAEA,wDAEF,UACEyO,KAAK,MAGTN,uBAAwB,WACtB,MAAOzQ,GAAEsC,UACP,QACE,6CACE,UACE,uCACA,YACF,WACA,UACE,OACE,gBACA,sCACF,QACA,gDACE,OACE,uBACA,6CACF,QACF,UACA,6CACE,OACE,oBACA,0CACF,QACF,UACA,uDACE,OACE,mBACA,2GACF,QACF,UACA,OACE,cACA,oCACF,QACF,WACF,WACA,6CACE,UACE,sCACA,YACF,WACA,UACE,OACE,gBACA,sCACF,QACA,gDACE,OACE,uBACA,6CACF,QACF,UACA,OACE,cACA,6BACF,QACA,WACJ,WACJ,UACEyO,KAAK,MAGTxO,yBAA0B,WACxB,MAAOvC,GAAEsC,UACT,8BACE,SACE,wEACA,4EACF,UACF,UACEyO,KAAK,MAIT/L,0BAA4B,WAC1B,MAAOhF,GAAEsC,UACT,QACE,mCACE,mBACA,iHACE,8CACE,mGACF,YACF,YACF,SACA,mCACE,kBACA,4GACA,WACF,SACF,UACEyO,KAAK,MAGTtE,qCAAuC,WACrC,MAAOzM,GAAEsC,UACT,4BACE,2EACF,SACA,yBACE,gJACE,mDACF,SACF,UACEyO,KAAK,MAGTxE,kCAAmC,WACjC,MAAOvM,GAAEsC,UACT,4BACE,iFACF,SACA,yBACE,gJACE,mDACF,SACF,UACEyO,KAAK,MAGTvE,iCAAkC,WAChC,MAAOxM,GAAEsC,UACT,4BACA,SACA,yBACE,gJACE,mDACF,SACF,UACEyO,KAAK,MAGTjG,qBAAsB,WACpB,MAAO9K,GAAEsC,UACT,gCACE,0JACA,wLACA,mCACE,oFACE,yGACF,WACA,sFACA,uFACA,WACF,SACA,mCACE,kFACE,yFACA,+BACF,WACA,0EACE,mEACA,gCACF,WACF,SACA,qGACE,aACF,YACA,qGACE,cACF,YACA,SAEA,4BACA,SACA,SACA,kFACA,QACE,gFACA,4EACA,SACJ,UACEyO,KAAK,MAGTpH,wBAAyB,WACvB,MAAO3J,GAAEsC,UACT,gCACE,+JACA,sCACE,4DACE,yFACA,+BACF,WACA,oDACE,mEACA,gCACF,WACF,SACA,uKACA,SACA,kFACA,QACE,gFACA,4EACF,SACF,UACEyO,KAAK,MAGTjI,4BAA6B,WAC3B,MAAO9I,GAAEsC,UACT,6BACE,QACE,oBACA,8EACE,8CACE,mGACF,YACF,YACF,SACA,QACA,sCACA,SACF,UACEyO,KAAK;;EAGTrD,wBAAyB,WACvB,MAAO1N,GAAEsC,UACT,kDACA,OACE,0DACE,oDACE,yDACI,kEACA,0CACE,+GACE,sJACF,QACD,iBACE,6FACG,2GACE,oKACF,UACF,QACF,UACN,iGACI,+GACE,iIACF,QACJ,UACF,UACF,YACF,SACEyO,KAAK,MAGT1P,kBAAmB,WACjB,MAAOrB,GAAEsC,UACT,wCACE,uCACE,gDACE,iGACA,wHACF,iBACE,iGACA,2GACF,UACF,iBACE,kHACA,wHACF,UACA,sBACE,0FACF,QACA,4CACE,2GACA,0HACF,iBACE,yHACA,2IACF,UACF,QACA,SACE,sBACA,8HACE,qBACF,OACA,0CACF,WACEyO,KAAK,OAKX,QACIhT,kBAAmBA"}
\ No newline at end of file
diff --git a/static/maps/mvc/tool/tool-form-composite.js.map b/static/maps/mvc/tool/tool-form-composite.js.map
index 560a0bbe46b..b66abf8d75b 100644
--- a/static/maps/mvc/tool/tool-form-composite.js.map
+++ b/static/maps/mvc/tool/tool-form-composite.js.map
@@ -1 +1 @@
-{"version":3,"file":"tool-form-composite.js","sources":["../../../src/mvc/tool/tool-form-composite.js"],"names":["define","Utils","Deferred","Ui","Form","FormData","ToolFormBase","Modal","Webhooks","WorkflowIcons","View","Backbone","extend","initialize","options","self","this","modal","parent","Galaxy","model","Model","deferred","setElement","$","addClass","append","$message","$header","$steps","$el","_configure","render","_refresh","on","scroll","window","resize","margin","_","reduce","children","memo","child","outerHeight","height","css","_handleWorkflowParameter","value","callback","re","match","exec","String","wp_name","wp_inputs","label","name","type","color","wp_count","style","links","forms","steps","parms","each","get","step","i","emit","debug","icon","step_type","title","parseInt","step_label","step_name","annotation","step_version","merge","index","escape","help","citations","collapsible","collapsed","_isDataStep","sustain_version","sustain_repeats","sustain_conditionals","narrow","text_enable","text_disable","cls_enable","cls_disable","errors","messages","initial_errors","cls","hide_operations","needs_refresh","always_refresh","visitInputs","inputs","input","output_connections","output_connection","sub_step","step_index","input_step_index","push","j","connections_by_name","connection","input_name","step_linked","output_name","wp_input","wp_linked","backdrop","post_job_actions","pja","action_arguments","arg","data_resolved","context","is_data_input","indexOf","data_ref","length","is_workflow","__class__","flavor","optional","isEmpty","collapsible_value","collapsible_preview","reset","_renderHeader","_renderMessage","_renderParameters","_renderHistory","_renderStep","execute_btn","Button","onclick","_execute","empty","Label","Message","message","status","persistent","fade","step_version_changes","wp_form","onchange","input_list","input_def","_refreshStep","_append","history_form","test_param","cases","form","execute","promise","postchange","process","current_state","tool_id","id","tool_version","version","data","create","wait","request","url","root","success","update","resolve","error","response","reject","portlet","html","short_str","is_simple_input","hide_label","description","link","ignore","show_progress","set","wait_text","percentage","setTimeout","field","field_list","new_value","undefined","values","source_step","v","multiple","wp_field","wp_value","replace","RegExp","trigger","_refreshHistory","history","currHistoryPanel","_refresh_history","clearTimeout","refresh","numOfUnfinishedShownContents","UPDATE_DELAY","_enabled","_submit","history_form_data","job_def","new_history_name","history_id","replacement_params","parameters","parameters_normalized","batch","validated","job_inputs","job_input_id","input_value","input_id","highlight","hide","_templateSuccess","isArray","WebhookView","urlRoot","input_found","err_data","step_related_errors","error_messages","matchResponse","show","body","_templateError","err_msg","buttons","Close","complete","$container","enabled","lst","startsWith","sanitize","text","JSON","stringify"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"tool-form-composite.js","sources":["../../../src/mvc/tool/tool-form-composite.js"],"names":["define","Utils","Deferred","Ui","Form","FormData","ToolFormBase","Modal","Webhooks","WorkflowIcons","View","Backbone","extend","initialize","options","self","this","modal","parent","Galaxy","model","Model","deferred","setElement","$","addClass","append","$message","$header","$steps","$el","_configure","render","_refresh","on","scroll","window","resize","margin","_","reduce","children","memo","child","outerHeight","height","css","_handleWorkflowParameter","value","callback","re","match","exec","String","wp_name","wp_inputs","label","name","type","color","wp_count","style","links","forms","steps","parms","each","get","step","i","emit","debug","icon","step_type","title","parseInt","step_label","step_name","annotation","step_version","merge","index","escape","help","citations","collapsible","collapsed","_isDataStep","sustain_version","sustain_repeats","sustain_conditionals","narrow","text_enable","text_disable","cls_enable","cls_disable","errors","messages","initial_errors","cls","hide_operations","needs_refresh","always_refresh","visitInputs","inputs","input","output_connections","output_connection","sub_step","step_index","input_step_index","push","j","connections_by_name","connection","input_name","step_linked","output_name","wp_input","wp_linked","backdrop","post_job_actions","pja","action_arguments","arg","data_resolved","context","is_data_input","indexOf","data_ref","length","is_workflow","__class__","flavor","optional","isEmpty","collapsible_value","collapsible_preview","reset","_renderHeader","_renderMessage","_renderParameters","_renderHistory","_renderStep","execute_btn","Button","onclick","_execute","empty","Label","Message","message","status","persistent","fade","step_version_changes","wp_form","onchange","input_list","input_def","_refreshStep","_append","history_form","test_param","cases","form","execute","promise","postchange","process","current_state","tool_id","id","tool_version","version","data","create","wait","request","url","root","success","update","resolve","error","response","reject","portlet","html","short_str","is_simple_input","hide_label","link","ignore","show_progress","set","wait_text","percentage","setTimeout","field","field_list","new_value","undefined","values","source_step","v","multiple","wp_field","wp_value","replace","RegExp","trigger","_refreshHistory","history","currHistoryPanel","_refresh_history","clearTimeout","refresh","numOfUnfinishedShownContents","UPDATE_DELAY","_enabled","_submit","history_form_data","job_def","new_history_name","history_id","replacement_params","parameters","parameters_normalized","batch","validated","job_inputs","job_input_id","input_value","input_id","highlight","hide","_templateSuccess","isArray","WebhookView","urlRoot","input_found","err_data","step_related_errors","error_messages","matchResponse","show","body","_templateError","err_msg","buttons","Close","complete","$container","enabled","lst","startsWith","sanitize","text","JSON","stringify"],"mappings":"AACAA,QAAS,cAAe,iBAAkB,iBAAkB,qBAAsB,qBAAsB,0BAA2B,kBAAmB,eAAgB,+BAClK,SAAUC,EAAOC,EAAUC,EAAIC,EAAMC,EAAUC,EAAcC,EAAOC,EAAUC,GAE9E,GAAIC,GAAOC,SAASD,KAAKE,QACrBC,WAAY,SAAUC,GAClB,GAAIC,GAAOC,IACXA,MAAKC,MAAQC,OAAOC,OAAOF,OAAS,GAAIV,GAAMG,KAC9CM,KAAKI,MAAQN,GAAWA,EAAQM,OAAS,GAAIT,UAASU,MAAOP,GAC7DE,KAAKM,SAAW,GAAIpB,GACpBc,KAAKO,WAAYC,EAAG,UAAWC,SAAU,qBACVC,OAAQV,KAAKW,SAAgBH,EAAG,WAChCE,OAAQV,KAAKY,QAAgBJ,EAAG,WAChCE,OAAQV,KAAKa,OAAgBL,EAAG,YAC/DA,EAAG,QAASE,OAAQV,KAAKc,KACzBd,KAAKe,aACLf,KAAKgB,SACLhB,KAAKiB,WACLjB,KAAKc,IAAII,GAAI,QAAS,WAAanB,EAAKkB,aACxCjB,KAAKa,OAAOM,OAAQ,WAAapB,EAAKkB,aACtCT,EAAGY,QAASC,OAAQ,WAAatB,EAAKkB,cAI1CA,SAAU,WACN,GAAIK,GAASC,EAAEC,OAAQxB,KAAKc,IAAIW,WAAY,SAAUC,EAAMC,GACxD,MAAOD,GAAOlB,EAAGmB,GAAQC,eAC1B,GAAM5B,KAAKa,OAAOgB,SAAW,EAChC7B,MAAKa,OAAOiB,IAAK,SAAUtB,EAAGY,QAASS,SAAWP,IAItDP,WAAY,WAoFR,QAASgB,GAA0BC,EAAOC,GAEtC,IADA,GAAIC,GAAK,eACDC,MAAQD,EAAGE,KAAMC,OAAQL,KAAY,CACzC,GAAIM,GAAUH,MAAO,EACrBF,GAAUlC,EAAKwC,UAAWD,GAAYvC,EAAKwC,UAAWD,KAClDE,MAAUF,EACVG,KAAUH,EACVI,KAAU,OACVC,MAAU,QAAyB,MAAXC,EAAmB,eAC3CC,MAAU,oBACVC,YA7FZ,GAAI/C,GAAOC,IACXA,MAAK+C,SACL/C,KAAKgD,SACLhD,KAAK8C,SACL9C,KAAKiD,SACL1B,EAAE2B,KAAMlD,KAAKI,MAAM+C,IAAK,SAAW,SAAUC,EAAMC,GAC/ClD,OAAOmD,KAAKC,MAAO,oCAAqCF,EAAI,8BAC5D,IAAIG,GAAO/D,EAAe2D,EAAKK,WAC3BC,EAAQC,SAAUN,EAAI,GAAM,MAASD,EAAKQ,YAAcR,EAAKS,UAC5DT,GAAKU,aACNJ,GAAS,MAAQN,EAAKU,YAErBV,EAAKW,eACNL,GAAS,oBAAsBN,EAAKW,aAAe,KAEvDX,EAAOnE,EAAM+E,OACTC,MAA0BZ,EAC1BK,MAA0BnC,EAAE2C,OAAQR,GACpCF,KAA0BA,GAAQ,GAClCW,KAA0B,KAC1BC,UAA0B,KAC1BC,aAA0B,EAC1BC,UAA0BjB,EAAI,IAAMtD,EAAKwE,YAAanB,GACtDoB,iBAA0B,EAC1BC,iBAA0B,EAC1BC,sBAA0B,EAC1BC,QAA0B,EAC1BC,YAA0B,OAC1BC,aAA0B,OAC1BC,WAA0B,aAC1BC,YAA0B,aAC1BC,OAA0B5B,EAAK6B,SAC/BC,gBAA0B,EAC1BC,IAA0B,oBAC1BC,iBAA0B,EAC1BC,eAA0B,EAC1BC,eAA4C,QAAlBlC,EAAKK,WAChCL,GACHrD,EAAKiD,MAAOK,GAAMD,EAClBrD,EAAK+C,MAAOO,MACZtD,EAAKkD,MAAOI,QAIhB9B,EAAE2B,KAAMlD,KAAKgD,MAAO,SAAUI,EAAMC,GAChChE,EAASkG,YAAanC,EAAKoC,OAAQ,SAAUC,EAAOhD,GAChD1C,EAAKkD,MAAOI,GAAKZ,GAASgD,MAKlClE,EAAE2B,KAAMlD,KAAKgD,MAAO,SAAUI,EAAMC,GAChC9B,EAAE2B,KAAME,EAAKsC,mBAAoB,SAAUC,GACvCpE,EAAE2B,KAAMnD,EAAKiD,MAAO,SAAU4C,GAC1BA,EAASC,aAAeF,EAAkBG,kBAAoB/F,EAAK+C,MAAOO,GAAI0C,KAAMH,SAOhGrE,EAAE2B,KAAMlD,KAAKgD,MAAO,SAAUI,EAAMC,GAChC9B,EAAE2B,KAAMnD,EAAKiD,MAAO,SAAU4C,EAAUI,GACpC,GAAIC,KACJ1E,GAAE2B,KAAME,EAAKsC,mBAAoB,SAAUQ,GACvCN,EAASC,aAAeK,EAAWJ,mBAAsBG,EAAqBC,EAAWC,YAAeD,KAE5G3E,EAAE2B,KAAMnD,EAAKkD,MAAO+C,GAAK,SAAUP,EAAOhD,GACtC,GAAIyD,GAAaD,EAAqBxD,EACjCyD,KACDT,EAAM/C,KAAO,SACb+C,EAAMtB,KAAOsB,EAAMW,YAAcX,EAAMtB,KAAO,KAAO,GACrDsB,EAAMtB,MAAQ,mBAAsB+B,EAAWG,YAAc,gBAAoB1C,SAAUN,GAAM,GACjGoC,EAAMW,YAAcX,EAAMW,gBAC1BX,EAAMW,YAAYL,KAAM3C,SAOxC,IAAIR,GAAW,CACf5C,MAAKuC,aAeLhB,EAAE2B,KAAMlD,KAAKgD,MAAO,SAAUI,EAAMC,GAChC9B,EAAE2B,KAAMnD,EAAKkD,MAAOI,GAAK,SAAUoC,GAC/B1D,EAA0B0D,EAAMzD,MAAO,SAAUsE,GAC7CA,EAASxD,MAAMiD,KAAM3C,GACrBqC,EAAMc,WAAY,EAClBd,EAAM/C,KAAY,OAClB+C,EAAMe,UAAY,EAClBf,EAAM5C,MAAY,wBAG1BtB,EAAE2B,KAAME,EAAKqD,iBAAkB,SAAUC,GACrCnF,EAAE2B,KAAMwD,EAAIC,iBAAkB,SAAUC,GACpC7E,EAA0B6E,EAAK,oBAO3CrF,EAAE2B,KAAMlD,KAAKgD,MAAO,SAAUI,GAC1B,GAAuB,QAAlBA,EAAKK,UAAsB,CAC5B,GAAIoD,IAAgB,CACpBxH,GAASkG,YAAanC,EAAKoC,OAAQ,SAAWC,EAAOhD,EAAMqE,GACvD,GAAIC,GAAyE,KAAtD,OAAQ,mBAAqBC,QAASvB,EAAM/C,MAC/DuE,EAAWH,EAASrB,EAAMwB,SAC9BxB,GAAMW,cAAgBrG,EAAKwE,YAAakB,EAAMW,eAAmBS,GAAgB,GACjFpB,EAAM3F,UAAuC,GAAxB2F,EAAM3F,QAAQoH,SAAgBL,GAAmBpB,EAAMc,aAAiBd,EAAM0B,aAAc,GACjHF,IAAcxB,EAAM0B,YAAgBF,EAASb,cAAgBrG,EAAKwE,YAAa0C,EAASb,cAAmBX,EAAMc,YAC/GQ,GAAmBtB,EAAMzD,OAAkC,gBAAzByD,EAAMzD,MAAMoF,YAAgC3B,EAAMW,eAAqBhD,EAAKkB,WAAY,GAC5HmB,EAAMzD,OAAkC,gBAAzByD,EAAMzD,MAAMoF,YAAiC3B,EAAMzD,MAAQ,MAC1EyD,EAAM4B,OAAS,WACTN,GAAgC,WAAftB,EAAM/C,MAAsB+C,EAAMc,YAChDd,EAAM6B,WAAerI,EAAMsI,QAAS9B,EAAMzD,QAA2B,KAAhByD,EAAMzD,SAC5DyD,EAAM+B,kBAAoB/B,EAAMzD,MAChCyD,EAAMgC,qBAAsB,SAQpDzG,OAAQ,WACJ,GAAIjB,GAAOC,IACXA,MAAKM,SAASoH,QACd1H,KAAK2H,gBACL3H,KAAK4H,iBACL5H,KAAK6H,oBACL7H,KAAK8H,iBACLvG,EAAE2B,KAAOlD,KAAKgD,MAAO,SAAUI,GAASrD,EAAKgI,YAAa3E,MAI9DuE,cAAe,WACX,GAAI5H,GAAOC,IACXA,MAAKgI,YAAc,GAAI7I,GAAG8I,QACtBzE,KAAc,WACdE,MAAc,eACdyB,IAAc,kBACd+C,QAAc,WAAanI,EAAKoI,cAEpCnI,KAAKY,QAAQH,SAAU,kBAAmB2H,QAC7B1H,OAAQ,GAAIvB,GAAGkJ,OAAS3E,MAAO,aAAe1D,KAAKI,MAAM+C,IAAK,UAAarC,KAC3EJ,OAAQV,KAAKgI,YAAYlH,MAI1C8G,eAAgB,WACZ5H,KAAKW,SAASyH,QACTpI,KAAKI,MAAM+C,IAAK,yBACjBnD,KAAKW,SAASD,OAAQ,GAAIvB,GAAGmJ,SACzBC,QAAc,qRACdC,OAAc,UACdC,YAAc,EACdC,MAAc,IACd5H,IAER,IAAI6H,GAAuB3I,KAAKI,MAAM+C,IAAK,uBACtCwF,IAAwBA,EAAqBzB,OAAS,GACvDlH,KAAKW,SAASD,OAAQ,GAAIvB,GAAGmJ,SACzBC,QAAc,oSACdC,OAAc,UACdC,YAAc,EACdC,MAAc,IACd5H,MAKZ+G,kBAAmB,WACf,GAAI9H,GAAOC,IACXA,MAAK4I,QAAU,KACTrH,EAAEgG,QAASvH,KAAKuC,aAClBvC,KAAK4I,QAAU,GAAIxJ,IAAOsE,MAAO,6BAA8B8B,OAAQxF,KAAKuC,UAAW4C,IAAK,oBAAqB0D,SAAU,WACnHtH,EAAE2B,KAAMnD,EAAK6I,QAAQE,WAAY,SAAUC,GACvCxH,EAAE2B,KAAM6F,EAAUjG,MAAO,SAAUM,GAASrD,EAAKiJ,aAAc5F,UAI3EpD,KAAKiJ,QAASjJ,KAAKa,OAAOuH,QAASpI,KAAK4I,QAAQ9H,OAKxDgH,eAAgB,WACZ9H,KAAKkJ,aAAe,GAAI9J,IACpB+F,IAAS,oBACTzB,MAAS,yBACT8B,SACI9C,KAAc,cACdD,KAAc,cACd0G,YACI1G,KAAc,QACdD,MAAc,gCACdE,KAAc,UACdV,MAAc,QACdmC,KAAc,IAElBiF,QACIpH,MAAU,OACVwD,SACI/C,KAAU,OACVD,MAAU,eACVE,KAAU,OACVV,MAAUhC,KAAKI,MAAM+C,IAAK,gBAK1CnD,KAAKiJ,QAASjJ,KAAKa,OAAQb,KAAKkJ,aAAapI,MAIjDiH,YAAa,SAAU3E,GACnB,GAAIrD,GAAOC,KACPqJ,EAAO,IACXrJ,MAAKM,SAASgJ,QAAS,SAAUC,GAE7B,GADAxJ,EAAKc,OAAOJ,SAAU,YACC,QAAlB2C,EAAKK,UACNL,EAAKoG,WAAa,SAAUC,EAASJ,GACjC,GACIK,IACAC,QAAkBvG,EAAKwG,GACvBC,aAAkBzG,EAAK0G,QACvBtE,OAAkBhF,EAAEZ,QAAQ,KAAUyJ,EAAKU,KAAKC,UAEpDX,GAAKY,MAAM,GACX9J,OAAOmD,KAAKC,MAAO,oCAAqC,yBAA0BmG,GAClFzK,EAAMiL,SACFxH,KAAU,OACVyH,IAAUhK,OAAOiK,KAAO,aAAehH,EAAKwG,GAAK,SACjDG,KAAUL,EACVW,QAAU,SAAUN,GAChBV,EAAKiB,OAAQP,GACbV,EAAKY,MAAM,GACX9J,OAAOmD,KAAKC,MAAO,oCAAqC,sBAAuBwG,GAC/EN,EAAQc,WAEZC,MAAU,SAAUC,GAChBtK,OAAOmD,KAAKC,MAAO,oCAAqC,0BAA2BkH,GACnFhB,EAAQiB,aAIpBrB,EAAO,GAAI/J,GAAc8D,GACpBA,EAAKqD,kBAAoBrD,EAAKqD,iBAAiBS,QAChDmC,EAAKsB,QAAQjK,OAAQF,EAAG,UAAWC,SAAU,4BACxCC,OAAQF,EAAG,UAAWC,SAAU,iBAAkBmK,KAAM,4BACxDlK,OAAQF,EAAG,UAAWC,SAAU,mBAAoBmK,KACjDrJ,EAAEC,OAAQ4B,EAAKqD,iBAAkB,SAAU/E,EAAMM,GAC7C,MAAON,GAAO,IAAMM,EAAM6I,WAC3B,WAGZ,CACH,GAAIC,GAA2F,KAAtE,aAAc,yBAA2B9D,QAAS5D,EAAKK,UAChFlC,GAAE2B,KAAME,EAAKoC,OAAQ,SAAUC,GAAUA,EAAM4B,OAAS,SAAU5B,EAAMsF,WAAaD,IACrFzB,EAAO,GAAIjK,GAAMH,EAAM+E,OACnBN,MAAWN,EAAKM,MAChBmF,SAAW,WAAatH,EAAE2B,KAAMnD,EAAK+C,MAAOM,EAAKa,OAAS,SAAU+G,GAASjL,EAAKiJ,aAAcgC,MAChGxF,OAAWpC,EAAKoC,QAAUpC,EAAKoC,OAAO0B,OAAS,EAAI9D,EAAKoC,SAAa9C,KAAM,SAAUD,KAAM,wBAAyBwI,OAAQ,QAC7H7H,IAEPrD,EAAKgD,MAAOK,EAAKa,OAAUoF,EAC3BtJ,EAAKkJ,QAASlJ,EAAKc,OAAQwI,EAAKvI,KAChCsC,EAAKiC,eAAiBtF,EAAKiJ,aAAc5F,GACzCiG,EAAKsB,QAAU5K,EAAKmL,cAA2B,UAAX,YACpCnL,EAAKmL,eAAiBnL,EAAKiI,YAAY5H,MAAM+K,KAAOlB,MAAc,EACdmB,UAAc,eACdC,WAAmC,KAAnBjI,EAAKa,MAAQ,GAAclE,EAAKiD,MAAMkE,SAC1G/G,OAAOmD,KAAKC,MAAO,oCAAqCH,EAAKa,MAAQ,gCAAiCb,GACtGkI,WAAY,WAAa/B,EAAQgB,WAAa,MAKtDvB,aAAc,SAAU5F,GACpB,GAAIrD,GAAOC,KACPqJ,EAAOrJ,KAAK+C,MAAOK,EAAKa,MACvBoF,IACD9H,EAAE2B,KAAMnD,EAAKkD,MAAOG,EAAKa,OAAS,SAAUwB,EAAOhD,GAC/C,GAAKgD,EAAMW,aAAeX,EAAMc,UAAY,CACxC,GAAIgF,GAAQlC,EAAKmC,WAAYnC,EAAKU,KAAK5H,MAAOM,GAC9C,IAAK8I,EAAQ,CACT,GAAIE,GAAYC,MAChB,IAAKjG,EAAMW,YACPqF,GAAcE,WACdpK,EAAE2B,KAAMuC,EAAMW,YAAa,SAAUwF,GAC5B7L,EAAKwE,YAAaqH,KACnB5J,MAAQjC,EAAKgD,MAAO6I,EAAY3H,OAAQ8F,KAAKC,SAASvE,MACtDzD,OAAST,EAAE2B,KAAMlB,MAAM2J,OAAQ,SAAUE,GAAMJ,EAAUE,OAAO5F,KAAM8F,SAGxEpG,EAAMqG,UAAYL,EAAUE,OAAOzE,OAAS,IAC9CuE,GAAcE,QAAUF,EAAUE,OAAQ,UAE3C,IAAKlG,EAAMc,UAAY,CAC1BkF,EAAYhG,EAAMzD,KAElB,KADA,GAAIE,GAAK,eACDC,MAAQD,EAAGE,KAAMqD,EAAMzD,QAAU,CACrC,GAAI+J,GAAWhM,EAAK6I,QAAQ4C,WAAYzL,EAAK6I,QAAQmB,KAAK5H,MAAOA,MAAO,KACpE6J,EAAWD,GAAYA,EAAS/J,OAC/BgK,KACDP,EAAYA,EAAUQ,QAAS,GAAIC,QAAQ,KAAO/J,MAAO,GAAK,KAAO6J,KAI9DN,SAAdD,GACDF,EAAMvJ,MAAOyJ,OAK7BpC,EAAK8C,QAAS,WAEd/I,EAAKiC,eAAgB,GAK7B+G,gBAAiB,WACb,GAAIrM,GAAOC,KACPqM,EAAUnM,OAAOC,QAAUD,OAAOC,OAAOmM,kBAAoBpM,OAAOC,OAAOmM,iBAAiBlM,KAChGJ,MAAKuM,kBAAoBC,aAAcxM,KAAKuM,kBACvCF,GACDA,EAAQI,UAAUpC,QAAS,WACyB,IAA3CgC,EAAQK,iCACT3M,EAAKwM,iBAAmBjB,WAAY,WAAavL,EAAKqM,mBAAqBC,EAAQM,kBAOnGxE,SAAU,WACN,GAAIpI,GAAOC,IACXA,MAAKkL,eAAgB,EACrBlL,KAAK4M,UAAU,GACf5M,KAAKM,SAASgJ,QAAS,SAAUC,GAC7B+B,WAAY,WAAa/B,EAAQgB,UAAWxK,EAAK8M,WAAc,MAKvEA,QAAS,WACL,GAAI9M,GAAOC,KACP8M,EAAoB9M,KAAKkJ,aAAaa,KAAKC,SAC3C+C,GACAC,iBAAwBF,EAAmB,oBAAuBA,EAAmB,oBAAuB,KAC5GG,WAAyBH,EAAmB,oBAAwD,KAAjC9M,KAAKI,MAAM+C,IAAK,cACnF+J,mBAAwBlN,KAAK4I,QAAU5I,KAAK4I,QAAQmB,KAAKC,YACzDmD,cAIAC,uBAAwB,EAGxBC,OAAwB,GAExBC,GAAY,CAChB,KAAM,GAAIjK,KAAKrD,MAAK+C,MAAQ,CACxB,GAAIsG,GAAOrJ,KAAK+C,MAAOM,GACnBkK,EAAclE,EAAKU,KAAKC,SACxB5G,EAAcrD,EAAKiD,MAAOK,GAC1BwC,EAAczC,EAAKyC,UACvBwD,GAAK8C,QAAS,QACd,KAAM,GAAIqB,KAAgBD,GAAa,CACnC,GAAIE,GAAcF,EAAYC,GAC1BE,EAAcrE,EAAKU,KAAK5H,MAAOqL,GAE/BzE,GADcM,EAAKmC,WAAYkC,GACjBrE,EAAKP,WAAY4E,GACnC,KAAM3E,EAAU3C,YAAc,CAM1B,GAJIkH,EADCtN,KAAKuE,YAAanB,GACPqK,GAAeA,EAAY9B,QAAU8B,EAAY9B,OAAOzE,OAAS,EAEjE6B,EAAUzB,UAAcyB,EAAU5B,aAA+B,KAAhBsG,IAA2B1E,EAAU5B,aAA+B,OAAhBsG,GAE/GH,EAAY,CACdjE,EAAKsE,UAAWD,EAChB,OAEJX,EAAQI,WAAYtH,GAAekH,EAAQI,WAAYtH,OACvDkH,EAAQI,WAAYtH,GAAc2H,GAAiBD,EAAYC,IAGvE,IAAMF,EACF,MAGFA,GAIFnN,OAAOmD,KAAKC,MAAO,gCAAiC,uBAAwBwJ,GAC5E9N,EAAMiL,SACFxH,KAAU,OACVyH,IAAUhK,OAAOiK,KAAO,iBAAmBpK,KAAKI,MAAMwJ,GAAK,eAC3DG,KAAUgD,EACV1C,QAAU,SAAUI,GAMhB,GALAtK,OAAOmD,KAAKC,MAAO,8BAA+B,yBAA0BkH,GAC5E1K,EAAKe,IAAIW,WAAWmM,OACpB7N,EAAKe,IAAIJ,OAAQX,EAAK8N,iBAAkBpD,IAGpCjK,EAAEsN,QAASrD,IAAcA,EAASvD,OAAS,EAAG,CAC9CnH,EAAKe,IAAIJ,OAAQF,EAAG,UAAYoJ,GAAI,iBACpC,EAAiB,GAAIpK,GAASuO,aAC1BC,QAAS7N,OAAOiK,KAAO,2BAI/BrK,EAAKqM,mBAET5B,MAAU,SAAUC,GAChBtK,OAAOmD,KAAKC,MAAO,8BAA+B,qBAAsBkH,EACxE,IAAIwD,IAAc,CAClB,IAAKxD,GAAYA,EAASyD,SACtB,IAAM,GAAI7K,KAAKtD,GAAKgD,MAAQ,CACxB,GAAIsG,GAAOtJ,EAAKgD,MAAOM,GACnB8K,EAAsB1D,EAASyD,SAAU7E,EAAKjJ,MAAM+C,IAAK,cAC7D,IAAKgL,EAAsB,CACvB,GAAIC,GAAiB/E,EAAKU,KAAKsE,cAAeF,EAC9C,KAAM,GAAIT,KAAYU,GAAiB,CACnC/E,EAAKsE,UAAWD,EAAUU,EAAgBV,IAC1CO,GAAc,CACd,SAKVA,GACFlO,EAAKE,MAAMqO,MACP5K,MAAU,6BACV6K,KAAUxO,EAAKyO,eAAgBzB,EAAStC,GAAYA,EAASgE,SAC7DC,SACIC,MAAU,WACN5O,EAAKE,MAAM2N,YAM/BgB,SAAU,WACN7O,EAAK6M,UAAU,QArDvB7M,EAAK6M,UAAU,GACfzM,OAAOmD,KAAKC,MAAO,gCAAiC,qBAAsBwJ,KA2DlF9D,QAAS,SAAU4F,EAAY/N,GAC3B+N,EAAWnO,OAAQ,QAASA,OAAQI,IAIxC8L,SAAU,SAAUkC,GAChB9O,KAAKgI,YAAY5H,MAAM+K,KAAOlB,MAAO6E,EAAS1D,UAAW,aAAcC,WAAY,KACnFrL,KAAK4I,SAAW5I,KAAK4I,QAAQ+B,QAASmE,EAAU,SAAW,aAC3D9O,KAAKkJ,cAAgBlJ,KAAKkJ,aAAayB,QAASmE,EAAU,SAAW,aACrEvN,EAAE2B,KAAMlD,KAAK+C,MAAO,SAAUsG,GAASA,GAAQA,EAAKsB,QAASmE,EAAU,SAAW,gBAItFvK,YAAa,SAAUvB,GACnB+L,IAAMvO,EAAEsN,QAAS9K,GAAUA,GAAUA,EACrC,KAAM,GAAIK,GAAI,EAAGA,EAAI0L,IAAI7H,OAAQ7D,IAAM,CACnC,GAAID,GAAO2L,IAAK1L,EAChB,KAAMD,IAASA,EAAKK,YAAcL,EAAKK,UAAUuL,WAAY,QACzD,OAAO,EAGf,OAAO,GAIXnB,iBAAkB,SAAUpD,GACxB,MAAKjK,GAAEsN,QAASrD,IAAcA,EAASvD,OAAS,EACrC1G,EAAG,UAAWC,SAAU,oBACVC,OAAQF,EAAG,QAASoK,KAAM,oCAAsC3L,EAAMgQ,SAAUjP,KAAKI,MAAM+C,IAAK,SAAa,QAAWsH,EAASvD,OAAS,EAAI,OAASuD,EAASvD,OAAS,aAAe,IAAO,MAC/LxG,OAAQF,EAAG,QAASE,OAAQ,QAASwO,KAAM,yPAEzDlP,KAAKwO,eAAgB/D,EAAU,oDAI9C+D,eAAgB,SAAU/D,EAAUgE,GAChC,MAAQjO,GAAG,UAAWC,SAAU,qBACVC,OAAQF,EAAG,QAAS0O,KAAM,sGAAyGC,KAAKC,UAAWX,IAAa,MAChK/N,OAAQF,EAAG,UAAW0O,KAAMC,KAAKC,UAAW3E,EAAU,KAAM,OAG1F,QACI/K,KAAMA"}
\ No newline at end of file
diff --git a/static/maps/mvc/tool/tool-form-workflow.js.map b/static/maps/mvc/tool/tool-form-workflow.js.map
deleted file mode 100644
index 77464c1f8f2..00000000000
--- a/static/maps/mvc/tool/tool-form-workflow.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"tool-form-workflow.js","sources":["../../../src/mvc/tool/tool-form-workflow.js"],"names":["define","Utils","ToolFormBase","View","Backbone","extend","initialize","options","self","this","workflow","node","setElement","post_job_actions","deepeach","inputs","input","type","indexOf","info","name","textify","extensions","value","__class__","collapsible_value","is_workflow","length","test_param","undefined","_makeSections","form","merge","text_enable","text_disable","narrow","initial_errors","sustain_version","cls","postchange","process","model","attributes","current_state","tool_id","id","tool_version","version","$","data","create","Galaxy","emit","debug","request","url","root","success","update","config_form","errors","update_field_data","resolve","error","response","reject","$el","append","datatypes","push","label","area","help","annotation","output_id","output_terminals","Object","keys","String","Boolean","ignore","payload","host","window","location","i","_makeSection","visit","head","head_list","action","pja_arg","p_id","p","d","j","expanded","action_arguments","slice","input_terminal_names","key",1,"input_terminals","sort","a","b","unshift","input_config","title","flat","output","getWorkflowOutput","onchange","new_value","attemptUpdateOutputLabel","join"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/mvc/tool/tools.js.map b/static/maps/mvc/tool/tools.js.map
index 39ea8d8393c..a93eb107e6e 100644
--- a/static/maps/mvc/tool/tools.js.map
+++ b/static/maps/mvc/tool/tools.js.map
@@ -1 +1 @@
-{"version":3,"file":"tools.js","sources":["../../../src/mvc/tool/tools.js"],"names":["define","_","util","data","ToolForm","VisibilityMixin","hidden","show","this","set","hide","toggle","get","is_visible","attributes","ToolParameter","Backbone","Model","extend","defaults","name","label","type","value","html","num_samples","initialize","unescape","copy","toJSON","set_value","ToolParameterCollection","Collection","model","DataToolParameter","IntegerToolParameter","parseInt","get_samples","d3","scale","linear","domain","ticks","FloatToolParameter","parseFloat","SelectToolParameter","map","option","subModelTypes","integer","float","select","Tool","id","description","target","inputs","outputs","urlRoot","Galaxy","root","options","p","p_class","rval","prototype","call","i","remove_inputs","types","tool","incompatible_inputs","filter","input","indexOf","remove","only_samplable_inputs","valid_inputs","each","push","apply_search_results","results","set_input_value","find","set_input_values","inputs_dict","self","keys","input_name","run","_run","rerun","target_dataset","regions","action","target_dataset_id","get_inputs_dict","input_dict","additional_params","payload","tool_id","run_deferred","$","Deferred","ss_deferred","ServerStateDeferred","ajax_settings","url","JSON","stringify","dataType","contentType","interval","success_fn","response","when","go","then","result","resolve","DatasetCollection","ToolCollection","View","ToolSectionLabel","ToolSection","elems","open","clear_search_results","elt","cur_label","all_hidden","ToolSearch","search_hint_string","min_chars_for_search","clear_btn_url","visible","query","clear_key","on","do_search","length","q","timer","clearTimeout","setTimeout","ga","clear_search","ToolPanel","tool_search","tools","layout","parse","parse_elt","elt_dict","model_class","panel_elt","BaseView","update_visible","$el","ToolLinkView","tagName","render","$link","append","templates","tool_link","formStyle","e","preventDefault","upload","form","version","deferred","execute","app","display","ToolSectionLabelView","className","text","ToolSectionView","update_open","panel_section","section_body","tool_view","label_view","events","click .toolSectionTitle > a","children","slideDown","slideUp","ToolSearchView","click","keyup :input","click #search-clear-btn","is","css","tooltip","focus_and_select","focus","clear","val","query_changed","evData","which","ToolPanelView","handle_search_results","search_view","section_title_view","attr","split","trigger","ToolFormView","tool_form","tool_panel_view","collection","tool_form_view","show_tool","fetch","done","width","template","join","variable"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"tools.js","sources":["../../../src/mvc/tool/tools.js"],"names":["define","_","util","data","VisibilityMixin","hidden","show","this","set","hide","toggle","get","is_visible","attributes","ToolParameter","Backbone","Model","extend","defaults","name","label","type","value","html","num_samples","initialize","unescape","copy","toJSON","set_value","ToolParameterCollection","Collection","model","DataToolParameter","IntegerToolParameter","parseInt","get_samples","d3","scale","linear","domain","ticks","FloatToolParameter","parseFloat","SelectToolParameter","map","option","subModelTypes","integer","float","select","Tool","id","description","target","inputs","outputs","urlRoot","Galaxy","root","options","p","p_class","rval","prototype","call","i","remove_inputs","types","tool","incompatible_inputs","filter","input","indexOf","remove","only_samplable_inputs","valid_inputs","each","push","apply_search_results","results","set_input_value","find","set_input_values","inputs_dict","self","keys","input_name","run","_run","rerun","target_dataset","regions","action","target_dataset_id","get_inputs_dict","input_dict","additional_params","payload","tool_id","run_deferred","$","Deferred","ss_deferred","ServerStateDeferred","ajax_settings","url","JSON","stringify","dataType","contentType","interval","success_fn","response","when","go","then","result","resolve","DatasetCollection","ToolCollection","View","ToolSectionLabel","ToolSection","elems","open","clear_search_results","elt","cur_label","all_hidden","ToolSearch","search_hint_string","min_chars_for_search","clear_btn_url","visible","query","clear_key","on","do_search","length","q","timer","clearTimeout","setTimeout","ga","clear_search","ToolPanel","tool_search","tools","layout","parse","parse_elt","elt_dict","model_class","panel_elt","BaseView","update_visible","$el","ToolLinkView","tagName","render","$link","append","templates","tool_link","formStyle","e","preventDefault","upload","router","version","ToolSectionLabelView","className","text","ToolSectionView","update_open","panel_section","section_body","tool_view","label_view","events","click .toolSectionTitle > a","children","slideDown","slideUp","ToolSearchView","click","keyup :input","click #search-clear-btn","is","css","tooltip","focus_and_select","focus","clear","val","query_changed","evData","which","ToolPanelView","handle_search_results","search_view","section_title_view","attr","split","trigger","ToolFormView","tool_form","tool_panel_view","collection","tool_form_view","show_tool","fetch","done","width","template","join","variable"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/mvc/ui/ui-select-content.js.map b/static/maps/mvc/ui/ui-select-content.js.map
index 889b7c4dc62..314fdbd6029 100644
--- a/static/maps/mvc/ui/ui-select-content.js.map
+++ b/static/maps/mvc/ui/ui-select-content.js.map
@@ -1 +1 @@
-{"version":3,"file":"ui-select-content.js","sources":["../../../src/mvc/ui/ui-select-content.js"],"names":["define","Utils","Ui","Select","Batch","DISABLED","ENABLED","LINKED","Configurations","data","src","icon","tooltip","multiple","batch","data_multiple","data_collection","workflow_data","workflow_data_multiple","workflow_data_collection","module_data","module_data_collection","View","Backbone","extend","initialize","options","self","this","model","Model","src_labels","hda","hdca","pagelimit","set","setElement","$","addClass","button_product","RadioButton","value","$batch_div","append","html","$batch","linked","clone","enabled","$el","css","history","listenTo","_changeData","_changeWait","_changeCurrent","_changeValue","_changeType","render","on","onchange","wait","unwait","update","new_value","undefined","current","get","config","id_list","fields","isArray","length","result","_batch","values","i","details","Galaxy","emit","debug","push","sort","a","b","hid","_","each","field","show","$batchfield","batchmode","button_type","hide","config_id","String","extensions","textify","button_data","c","optional","searchable","selectall","error_text","trigger","empty","button_width","Math","max","margin-left","select_options","items","item","keep","label","name","id","add","list","indexOf","map_over_type"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"ui-select-content.js","sources":["../../../src/mvc/ui/ui-select-content.js"],"names":["define","Utils","Ui","Select","Batch","DISABLED","ENABLED","LINKED","Configurations","data","src","icon","tooltip","multiple","batch","data_multiple","data_collection","workflow_data","workflow_data_multiple","workflow_data_collection","module_data","module_data_collection","View","Backbone","extend","initialize","options","self","this","model","Model","src_labels","hda","hdca","pagelimit","set","setElement","$","addClass","button_product","RadioButton","value","$batch_div","append","html","$batch","linked","clone","enabled","$el","css","history","listenTo","_changeData","_changeWait","_changeCurrent","_changeValue","_changeType","render","on","onchange","wait","unwait","update","new_value","undefined","current","get","config","id_list","fields","isArray","length","result","_batch","values","i","details","Galaxy","emit","debug","push","sort","a","b","hid","_","each","field","show","$batchfield","batchmode","button_type","hide","config_id","String","extensions","textify","button_data","c","optional","searchable","selectall","error_text","trigger","empty","button_width","Math","max","margin-left","select_options","items","item","keep","label","name","id","tags","add","list","indexOf","map_over_type"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/mvc/ui/ui-select-default.js.map b/static/maps/mvc/ui/ui-select-default.js.map
index 8bf51e7e18c..095818a7216 100644
--- a/static/maps/mvc/ui/ui-select-default.js.map
+++ b/static/maps/mvc/ui/ui-select-default.js.map
@@ -1 +1 @@
-{"version":3,"file":"ui-select-default.js","sources":["../../../src/mvc/ui/ui-select-default.js"],"names":["define","Utils","Buttons","View","Backbone","extend","initialize","options","self","this","data","data2","model","Model","id","uid","cls","error_text","empty_text","visible","wait","multiple","searchable","optional","disabled","onchange","value","selectall","pagesize","set","on","get","listenTo","_changeData","_changeDisabled","_changeWait","_changeVisible","_changeValue","render","_renderSearchable","_renderClassic","$el","addClass","attr","$select","empty","prop","_getValue","trigger","append","$","$dropdown","$resize","$resize_icon","hide","show","removeClass","off","event","currentY","pageY","currentHeight","height","minHeight","Math","max","select2","all_button","ButtonCheck","onclick","new_value","_","each","option","push","prepend","label","length","index","order","text","closeOnSelect","query","q","results","filter","e","term","toUpperCase","indexOf","callback","slice","page","more","find","remove","html","escape","_setValue","isArray","first","undefined","exists","findWhere","v","d","unwait","enable","disable","add","sorter","keep","sort","update","setOnChange","val","selected","a","b","isEmpty"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"ui-select-default.js","sources":["../../../src/mvc/ui/ui-select-default.js"],"names":["define","Utils","Buttons","View","Backbone","extend","initialize","options","self","this","data","data2","model","Model","id","uid","cls","error_text","empty_text","visible","wait","multiple","searchable","optional","disabled","onchange","value","selectall","pagesize","set","on","get","listenTo","_changeData","_changeDisabled","_changeWait","_changeVisible","_changeValue","render","_renderSearchable","_renderClassic","$el","addClass","attr","$select","empty","prop","_getValue","trigger","append","$","$dropdown","$resize","$resize_icon","hide","show","removeClass","off","event","currentY","pageY","currentHeight","height","minHeight","Math","max","select2","all_button","ButtonCheck","onclick","new_value","_","each","option","push","prepend","_match","term","text","String","toUpperCase","indexOf","label","length","index","order","tags","matched_tags","closeOnSelect","query","q","results","filter","e","found","tag","callback","slice","page","more","formatResult","result","escape","reduce","memo","find","remove","html","_setValue","isArray","first","undefined","exists","findWhere","v","d","unwait","enable","disable","add","sorter","keep","sort","update","setOnChange","val","selected","a","b","isEmpty"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/mvc/upload/upload-ftp.js.map b/static/maps/mvc/upload/upload-ftp.js.map
index 819a814572f..6db835801b2 100644
--- a/static/maps/mvc/upload/upload-ftp.js.map
+++ b/static/maps/mvc/upload/upload-ftp.js.map
@@ -1 +1 @@
-{"version":3,"file":"upload-ftp.js","sources":["../../../src/mvc/upload/upload-ftp.js"],"names":["define","Utils","Backbone","View","extend","initialize","options","self","this","merge","class_add","class_remove","class_partial","collection","onchange","onadd","onremove","setElement","_template","rows","get","url","Galaxy","root","success","ftp_files","_fill","error","length","$","html","_templateTable","size","index","push","_add","bytesToString","show","$select_all","addClass","on","add","hasClass","ftp_file","model_index","_find","trigger","_refresh","_templateInfo","hide","$it","_templateRow","$icon","find","append","removeClass","filtered","where","file_mode","enabled","item","findWhere","file_path","path","ctime","ftp_upload_site"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"upload-ftp.js","sources":["../../../src/mvc/upload/upload-ftp.js"],"names":["define","Utils","Backbone","View","extend","initialize","options","self","this","merge","class_add","class_remove","class_partial","collection","onchange","onadd","onremove","setElement","_template","rows","get","url","Galaxy","root","success","ftp_files","_fill","error","length","$","html","_templateTable","size","index","push","_add","bytesToString","show","$select_all","addClass","on","add","hasClass","ftp_file","model_index","_find","trigger","_refresh","_templateInfo","hide","$it","_templateRow","$icon","find","append","removeClass","filtered","where","file_mode","enabled","item","findWhere","file_path","path","_","escape","ctime","ftp_upload_site"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/mvc/user/user-preferences.js.map b/static/maps/mvc/user/user-preferences.js.map
index e3f950b442a..ccf2297c0c0 100644
--- a/static/maps/mvc/user/user-preferences.js.map
+++ b/static/maps/mvc/user/user-preferences.js.map
@@ -1 +1 @@
-{"version":3,"file":"user-preferences.js","sources":["../../../src/mvc/user/user-preferences.js"],"names":["define","Form","Ui","View","Backbone","extend","initialize","this","defs","information","title","description","url","Galaxy","user","id","icon","password","submit_title","communication","permissions","api_key","submit_icon","toolbox_filters","openids","onclick","window","location","href","root","logout","modal","show","body","buttons","Cancel","hide","Sign out","message","Message","setElement","render","self","config","$","getJSON","data","$preferences","addClass","append","$el","_","escape","email","$table","use_remote_user","_link","enable_communication_server","has_user_tool_filters","enable_openid","_templateFooter","empty","page","$page_item","_templateRow","find","on","ajax","type","done","response","options","form","inputs","operations","submit","ButtonIcon","tooltip","submit_tooltip","_submit","back","remove","fail","update","status","JSON","stringify","create","contentType","updated_values","matchModel","input","input_id","field_list","value","responseJSON","err_msg","nice_total_disk_usage","enable_quotas","quota"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"user-preferences.js","sources":["../../../src/mvc/user/user-preferences.js"],"names":["define","Form","Ui","Model","Backbone","extend","initialize","options","user_id","Galaxy","user","id","this","set","information","title","description","url","icon","password","submit_title","communication","permissions","api_key","submit_icon","toolbox_filters","openids","onclick","window","location","href","root","logout","modal","show","body","buttons","Cancel","hide","Sign out","View","model","message","Message","setElement","render","self","config","$","getJSON","data","$preferences","addClass","append","$el","_","escape","email","$table","use_remote_user","_addLink","enable_communication_server","has_user_tool_filters","enable_openid","_templateFooter","empty","action","get","$row","_templateLink","$a","find","on","attr","nice_total_disk_usage","enable_quotas","quota","Forms","page","form_id","ajax","type","done","response","form","inputs","operations","submit","ButtonIcon","tooltip","submit_tooltip","_submit","fail","status","persistent","JSON","stringify","create","contentType","updated_values","matchModel","input","input_id","field_list","value","update","console","log","responseJSON","err_msg"],"mappings":"AACAA,QAAU,qBAAsB,kBAAoB,SAAUC,EAAMC,GAGhE,GAAIC,GAAQC,SAASD,MAAME,QACvBC,WAAY,SAAUC,GAClBA,EAAUA,MACVA,EAAQC,QAAUD,EAAQC,SAAWC,OAAOC,KAAKC,GACjDC,KAAKC,KACDL,QAAsBD,EAAQC,QAC9BM,aACIC,MAAkB,qBAClBC,YAAkB,4EAClBC,IAAkB,aAAeV,EAAQC,QAAU,sBACnDU,KAAkB,WAEtBC,UACIJ,MAAkB,kBAClBC,YAAkB,+CAClBE,KAAkB,gBAClBD,IAAkB,aAAeV,EAAQC,QAAU,mBACnDY,aAAkB,iBAEtBC,eACIN,MAAkB,gCAClBC,YAAkB,wEAClBC,IAAkB,aAAeV,EAAQC,QAAU,wBACnDU,KAAkB,iBAEtBI,aACIP,MAAkB,4CAClBC,YAAkB,sJAClBC,IAAkB,aAAeV,EAAQC,QAAU,sBACnDU,KAAkB,WAClBE,aAAkB,oBAEtBG,SACIR,MAAkB,iBAClBC,YAAkB,mDAClBC,IAAkB,aAAeV,EAAQC,QAAU,kBACnDU,KAAkB,SAClBE,aAAkB,mBAClBI,YAAkB,YAEtBC,iBACIV,MAAkB,yBAClBC,YAAkB,kEAClBC,IAAkB,aAAeV,EAAQC,QAAU,0BACnDU,KAAkB,YAClBE,aAAkB,gBAEtBM,SACIX,MAAkB,iBAClBC,YAAkB,uCAClBE,KAAkB,YAClBS,QAAkB,WACdC,OAAOC,SAASC,KAAOrB,OAAOsB,KAAO,qDAG7CC,QACIjB,MAAkB,WAClBC,YAAkB,0CAClBE,KAAkB,cAClBS,QAAkB,WACdlB,OAAOwB,MAAMC,MACTnB,MAAU,WACVoB,KAAU,+DACVC,SACIC,OAAc,WAAa5B,OAAOwB,MAAMK,QACxCC,WAAc,WAAaX,OAAOC,SAASC,KAAOrB,OAAOsB,KAAO,yBAUxFS,EAAOpC,SAASoC,KAAKnC,QAErBC,WAAY,WACRM,KAAK6B,MAAQ,GAAItC,GACjBS,KAAK8B,QAAU,GAAIxC,GAAGyC,QACtB/B,KAAKgC,WAAY,UACjBhC,KAAKiC,UAGTA,OAAQ,WACJ,GAAIC,GAAOlC,KACPmC,EAAStC,OAAOsC,MACpBC,GAAEC,QAASxC,OAAOsB,KAAO,aAAetB,OAAOC,KAAKC,GAAI,SAAUuC,GAC9DJ,EAAKK,aAAeH,EAAG,UAAWI,SAAU,YACVC,OAAQP,EAAKJ,QAAQY,KACrBD,OAAQL,EAAG,SAAUK,OAAQ,qBAC7BA,OAAQL,EAAG,QAASK,OAAQ,gCAAmCE,EAAEC,OAAQN,EAAKO,OAAU,eACxFJ,OAAQP,EAAKY,OAASV,EAAG,YAAaI,SAAU,mBAC7EL,EAAOY,kBACRb,EAAKc,SAAU,eACfd,EAAKc,SAAU,aAEfb,EAAOc,6BACPf,EAAKc,SAAU,iBAEnBd,EAAKc,SAAU,eACfd,EAAKc,SAAU,WACXb,EAAOe,uBACPhB,EAAKc,SAAU,mBAEfb,EAAOgB,gBAAkBhB,EAAOY,iBAChCb,EAAKc,SAAU,WAEnBd,EAAKc,SAAU,UACfd,EAAKK,aAAaE,OAAQP,EAAKkB,gBAAiBd,IAChDJ,EAAKQ,IAAIW,QAAQZ,OAAQP,EAAKK,iBAItCS,SAAU,SAAUM,GAChB,GAAI3D,GAAUK,KAAK6B,MAAM0B,IAAKD,GAC1BE,EAASpB,EAAGpC,KAAKyD,cAAe9D,IAChC+D,EAAKF,EAAKG,KAAM,IACfhE,GAAQoB,QACT2C,EAAGE,GAAI,QAAS,WAAajE,EAAQoB,YAErC2C,EAAGG,KAAM,OAAQhE,OAAOsB,KAAO,QAAUmC,GAE7CtD,KAAK8C,OAAOL,OAAQe,IAGxBC,cAAe,SAAU9D,GACrB,MAAQ,wCAE0CA,EAAQW,KAAO,mEAGSX,EAAQQ,MAAQ,iCAC3CR,EAAQS,YAAc,oBAKzEgD,gBAAiB,SAAUzD,GACvB,MAAQ,oDAC+BA,EAAQmE,sBAAwB,qDACzDjE,OAAOsC,OAAO4B,cAAgB,+BAAiCpE,EAAQqE,MAAQ,cAAgB,IACjG,8MAMhBC,EAAQzE,SAASoC,KAAKnC,QAEtBC,WAAY,SAAUC,GAClBK,KAAK6B,MAAQ,GAAItC,GAAOI,GACxBK,KAAKkE,KAAOlE,KAAK6B,MAAM0B,IAAK5D,EAAQwE,SACpCnE,KAAKgC,WAAY,UACjBhC,KAAKiC,UAGTA,OAAQ,WACJ,GAAIC,GAAOlC,IACXoC,GAAEgC,MACE/D,IAAUR,OAAOsB,KAAOnB,KAAKkE,KAAK7D,IAClCgE,KAAU,QACXC,KAAM,SAAUC,GACf,GAAI5E,GAAUyC,EAAE3C,UAAYyC,EAAKgC,KAAMK,GACnCC,EAAO,GAAInF,IACXc,MAASR,EAAQQ,MACjBG,KAASX,EAAQW,KACjBmE,OAAS9E,EAAQ8E,OACjBC,YACIC,OAAU,GAAIrF,GAAGsF,YACbC,QAAWlF,EAAQmF,eACnB3E,MAAWR,EAAQa,cAAgB,gBACnCF,KAAWX,EAAQiB,aAAe,UAClCG,QAAW,WAAamB,EAAK6C,QAASP,EAAM7E,QAIxDuC,GAAKQ,IAAIW,QAAQZ,OAAQ+B,EAAK9B,OAC/BsC,KAAM,WACL9C,EAAKQ,IAAIW,QAAQZ,OAAQ,GAAInD,GAAGyC,SAC5BD,QAAc,2BAA6BI,EAAKgC,KAAK7D,IAAM,IAC3D4E,OAAc,SACdC,YAAc,IACfxC,QAIXqC,QAAS,SAAUP,EAAM7E,GAErByC,EAAEgC,MACE/D,IAAcR,OAAOsB,KAAOxB,EAAQU,IACpCiC,KAAc6C,KAAKC,UAAWZ,EAAKlC,KAAK+C,UACxChB,KAAc,MACdiB,YAAc,qBACfhB,KAAM,SAAUC,GACf,GAAIgB,IAAiB,CACrBf,GAAKlC,KAAKkD,WAAYjB,EAAU,SAAWkB,EAAOC,GAC9ClB,EAAKmB,WAAYD,GAAWE,MAAOH,EAAMG,OACzCL,GAAiB,IAErBf,EAAK1C,QAAQ+D,QAAU/D,QAASyC,EAASzC,QAASmD,OAAQ,cAC3DD,KAAM,SAAUT,GACfvD,OAAO8E,QAAQC,IAAKxB,GACpBC,EAAK1C,QAAQ+D,QAAU/D,QAASyC,EAASyB,aAAaC,QAAShB,OAAQ,eAKnF,QACIrD,KAAQA,EACRqC,MAAQA"}
\ No newline at end of file
diff --git a/static/maps/mvc/workflow/workflow-forms.js.map b/static/maps/mvc/workflow/workflow-forms.js.map
new file mode 100644
index 00000000000..ebe3f854c17
--- /dev/null
+++ b/static/maps/mvc/workflow/workflow-forms.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"workflow-forms.js","sources":["../../../src/mvc/workflow/workflow-forms.js"],"names":["define","Utils","Form","ToolFormBase","Default","Backbone","View","extend","initialize","options","this","form","Tool","self","workflow","node","post_job_actions","deepeach","inputs","input","type","indexOf","info","name","textify","extensions","value","__class__","fixed","collapsible_value","is_workflow","length","test_param","undefined","_makeSections","merge","text_enable","text_disable","narrow","initial_errors","sustain_version","cls","postchange","process","model","attributes","current_state","tool_id","id","tool_version","version","$","data","create","Galaxy","emit","debug","request","url","root","success","update","config_form","errors","update_field_data","resolve","error","response","reject","datatypes","output_id","output_terminals","Object","keys","push","label","String","Boolean","ignore","help","payload","host","window","location","i","_makeSection","visit","head","head_list","action","pja_arg","p_id","p","d","j","expanded","action_arguments","slice","input_terminal_names","key",1,"input_terminals","sort","a","b","unshift","input_config","title","flat","output","getWorkflowOutput","onchange","new_value","attemptUpdateOutputLabel","join"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/mvc/workflow/workflow-view.js.map b/static/maps/mvc/workflow/workflow-view.js.map
index df8fc4dca71..e98a3eb52d7 100644
--- a/static/maps/mvc/workflow/workflow-view.js.map
+++ b/static/maps/mvc/workflow/workflow-view.js.map
@@ -1 +1 @@
-{"version":3,"file":"workflow-view.js","sources":["../../../src/mvc/workflow/workflow-view.js"],"names":["define","Utils","Globals","Workflow","WorkflowCanvas","Node","WorkflowIcons","ToolForm","Form","Ui","async_save_text","reset_tool_search","initValue","tool_menu_frame","$","contents","length","document","this","removeClass","find","hide","show","each","attr","hasClass","search_input","val","add_node_icon","$to_el","nodeType","iconStyle","$icon","addClass","before","Backbone","View","extend","initialize","options","workflow_save_as","body","window","show_modal","OK","rename_name","self","workflow","name","rename_annotation","ajax","url","urls","type","data","workflow_name","workflow_annotation","workflow_data","JSON","stringify","to_simple","done","id","onbeforeunload","undefined","location","Galaxy","root","hide_modal","fail","alert","Cancel","layout_editor","layout","fit_canvas_to_nodes","scroll_to_nodes","canvas_manager","draw_overview","show_overview","jStorage","set","css","hide_overview","app","close_editor","check_changes_in_active_form","has_changes","do_close","workflow_index","Save Changes","save_current_workflow","Don't Save","eventObj","success_callback","show_message","rectify_workflow_outputs","request","success","text","message","errors","errlist","i","v","appendTo","append","stored","showWorkflowParameters","Ok","error","response","err_msg","click","focus","select","keyup","value","lastValue","q","timer","clearTimeout","setTimeout","get","tool_search","s","map","n","index","parent","this_label","next","no_visible_tools","is","reset","datatypes","parse","async","responseText","datatypes_mapping","ext_to_type","ext_to_class_name","type_to_type","class_to_classes","_workflowLoadAjax","from_simple","upgrade_message","_","steps","step","step_id","details","upgrade_messages","m","parseInt","nodes","Continue","beforeSubmit","make_popupmenu","Save","Save As","Run","run_workflow","Edit Attributes","clear_active_node","Auto Re-layout","Close","overview_size","width","height","bind","e","d","op","offsetParent","opo","offset","new_size","Math","max","offsetX","left","offsetY","top","workflows","_buildToolPanelWorkflows","wrap","last_expanded","slideUp","slideDown","rename_async","annotate_async","$section","copy","ButtonIcon","icon","cls","tooltip","onclick","step_count","copy_into_workflow","modal","title","buttons","Copy","$add","html","on","add_node_for_subworkflow","latest_id","$el","workflowId","k","vv","remove_all","cv","cc","merge","load_workflow","dataType","cache","_moduleInitAjax","node","request_data","init_field_data","update_field_data","activate_node","add_node_for_tool","create_node","tool_id","content_id","add_node_for_module","display_pja","pja","get_pja_form","action_to_rem","closest","children","remove","active_node","post_job_actions","active_form_has_changes","display_pja_list","pja_list","display_file_list","addlist","out_terminal","output_terminals","new_pja","action_type","target","output_name","parameter_re","workflow_parameters","wf_parm_container","wf_parm_box","new_parameter_content","matches","config_form","inputs","deepeach","form_matches","match","concat","action_arguments","action_argument","arg_matches","element","inArray","push","substring","showAttributes","showForm","content","$container","form","unshift","label","help","onchange","new_label","duplicate","input_id","input_element","element_list","model","trigger","annotation","area","create","scrollTop","isSubType","child","prebuildNode","title_text","$f","$title","scrollLeft","tmp","destroy","o","position","p","prependTo","node_changed","po","x","y","terminal","redraw"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"workflow-view.js","sources":["../../../src/mvc/workflow/workflow-view.js"],"names":["define","Utils","Globals","Workflow","WorkflowCanvas","Node","WorkflowIcons","FormWrappers","Ui","async_save_text","reset_tool_search","initValue","tool_menu_frame","$","contents","length","document","this","removeClass","find","hide","show","each","attr","hasClass","search_input","val","add_node_icon","$to_el","nodeType","iconStyle","$icon","addClass","before","Backbone","View","extend","initialize","options","workflow_save_as","body","window","show_modal","OK","rename_name","self","workflow","name","rename_annotation","ajax","url","urls","type","data","workflow_name","workflow_annotation","workflow_data","JSON","stringify","to_simple","done","id","onbeforeunload","undefined","location","Galaxy","root","hide_modal","fail","alert","Cancel","layout_editor","layout","fit_canvas_to_nodes","scroll_to_nodes","canvas_manager","draw_overview","show_overview","jStorage","set","css","hide_overview","app","close_editor","check_changes_in_active_form","has_changes","do_close","workflow_index","Save Changes","save_current_workflow","Don't Save","eventObj","success_callback","show_message","rectify_workflow_outputs","request","success","text","message","errors","errlist","i","v","appendTo","append","stored","showWorkflowParameters","Ok","error","response","err_msg","click","focus","select","keyup","value","lastValue","q","timer","clearTimeout","setTimeout","get","tool_search","s","map","n","index","parent","this_label","next","no_visible_tools","is","reset","datatypes","parse","async","responseText","datatypes_mapping","ext_to_type","ext_to_class_name","type_to_type","class_to_classes","_workflowLoadAjax","from_simple","upgrade_message","_","steps","step","step_id","details","upgrade_messages","m","parseInt","nodes","Continue","beforeSubmit","make_popupmenu","Save","Save As","Run","run_workflow","Edit Attributes","clear_active_node","Auto Re-layout","Close","overview_size","width","height","bind","e","d","op","offsetParent","opo","offset","new_size","Math","max","offsetX","left","offsetY","top","workflows","_buildToolPanelWorkflows","wrap","last_expanded","slideUp","slideDown","rename_async","annotate_async","$section","copy","ButtonIcon","icon","cls","tooltip","onclick","step_count","copy_into_workflow","modal","title","buttons","Copy","$add","html","on","add_node_for_subworkflow","latest_id","$el","workflowId","k","vv","remove_all","cv","cc","merge","load_workflow","dataType","cache","_moduleInitAjax","node","request_data","init_field_data","update_field_data","activate_node","add_node_for_tool","create_node","tool_id","content_id","add_node_for_module","display_pja","pja","get_pja_form","action_to_rem","closest","children","remove","active_node","post_job_actions","active_form_has_changes","display_pja_list","pja_list","display_file_list","addlist","out_terminal","output_terminals","new_pja","action_type","target","output_name","parameter_re","workflow_parameters","wf_parm_container","wf_parm_box","new_parameter_content","matches","config_form","inputs","deepeach","form_matches","match","concat","action_arguments","action_argument","arg_matches","element","inArray","push","substring","showAttributes","showForm","content","$container","form_wrapper","unshift","label","fixed","annotation","area","help","onchange","new_label","duplicate","input_id","form","input_element","element_list","model","trigger","create","Tool","Default","scrollTop","isSubType","child","prebuildNode","title_text","$f","$title","scrollLeft","tmp","destroy","o","position","p","prependTo","node_changed","po","x","y","terminal","redraw"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/mvc/workflow/workflow.js.map b/static/maps/mvc/workflow/workflow.js.map
deleted file mode 100644
index 25e27b43a5e..00000000000
--- a/static/maps/mvc/workflow/workflow.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"workflow.js","sources":["../../../src/mvc/workflow/workflow.js"],"names":["define","Utils","Globals","Workflow","WorkflowCanvas","Node","ToolsForm","Backbone","View","extend","initialize","options","layout_editor","self","workflow","layout","fit_canvas_to_nodes","scroll_to_nodes","canvas_manager","draw_overview","edit_workflow_attributes","clear_active_node","$","hide","show","show_overview","jStorage","set","css","hide_overview","app","this","urls","active_ajax_call","close_editor","check_changes_in_active_form","has_changes","do_close","window","onbeforeunload","undefined","document","location","workflow_index","show_modal","Cancel","hide_modal","Save Changes","save_current_workflow","Don't Save","eventObj","success_callback","show_message","rectify_workflow_outputs","savefn","callback","ajax","url","save_workflow","type","data","id","workflow_data","JSON","stringify","to_simple","_","dataType","success","body","text","message","errors","addClass","errlist","each","i","v","appendTo","append","name","stored","showWorkflowParameters","Ok","bind","unbind","lt_ie_7","click","focus","select","keyup","value","length","reset_tool_search","lastValue","q","timer","clearTimeout","setTimeout","get","tool_search","find","s","map","n","index","parent","this_label","next","no_visible_tools","hasClass","is","reset","datatypes","parse","galaxy_config","root","async","responseText","get_datatypes","cache","ext_to_type","ext_to_class_name","type_to_type","class_to_classes","load_workflow","from_simple","upgrade_message","upgrade_messages","k","parseInt","nodes","vv","Continue","beforeSubmit","ajaxStart","ajaxError","e","x","statusText","Ignore error","make_popupmenu","Save","Run","run_workflow","Edit Attributes","Auto Re-layout","Close","overview_size","width","height","d","op","offsetParent","opo","offset","new_size","Math","max","offsetX","left","offsetY","top","wrap","last_expanded","slideUp","slideDown","async_save_text","rename_async","annotate_async","remove_all","cv","cc","add_node_for_tool","title","node","create_node","get_new_module_info","tool_id","global","init_field_data","error","m","status","add_node_for_module","display_pja","pja","get_pja_form","action_to_rem","closest","children","remove","active_node","post_job_actions","active_form_has_changes","display_pja_list","pja_list","display_file_list","addlist","out_terminal","output_terminals","new_pja","action_type","target","output_name","parameter_re","workflow_parameters","wf_parm_container","wf_parm_box","new_parameter_content","matches","form_matches","form_html","match","concat","action_arguments","action_argument","arg_matches","element","inArray","push","substring","html","showToolForm","cls","$container","$current","$el","isJSON","_genericFormTemplate","scrollTop","after","_genericStepAttributesTemplate","ajaxForm","update_field_data","tool_state","form","change","submit","annotation","isSubType","child","prebuildNode","title_text","f","scrollLeft","b","tmp","buttons","destroy","o","position","p","prependTo","activate_node","node_changed","po","y","terminal","redraw"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/nls/fr/locale.js.map b/static/maps/nls/fr/locale.js.map
new file mode 100644
index 00000000000..d03cea327c1
--- /dev/null
+++ b/static/maps/nls/fr/locale.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"locale.js","sources":["../../../src/nls/fr/locale.js"],"names":["define","Analyze Data","Workflow","Shared Data","Data Libraries","Histories","Workflows","Visualizations","Pages","Visualization","New Track Browser","Saved Visualizations","Interactive Environments","Admin","Help","Support","Search","Mailing Lists","Videos","Wiki","How to Cite Galaxy","Interactive Tours","User","Login","Register","Logged in as","Preferences","Custom Builds","Logout","Saved Histories","Saved Datasets","Saved Pages","History Lists","Histories Shared with Me","Current History","Create New","Copy History","Share or Publish","Show Structure","Extract Workflow","Delete Permanently","Dataset Actions","Copy Datasets","Dataset Security","Resume Paused Jobs","Collapse Expanded Datasets","Unhide Hidden Datasets","Delete Hidden Datasets","Purge Deleted Datasets","Downloads","Export Tool Citations","Export History to File","Other Actions","Import from File","Webhooks","This history is empty","No matching datasets found","An error occurred while getting updates from the server","Please contact a Galaxy administrator if the problem persists","search datasets","You are currently viewing a deleted history!","You are over your disk quota","Tool execution is on hold until your disk usage drops below your allocated quota","All","None","For all selected","Edit history tags","Edit history Annotation","Click to rename history","Operations on multiple datasets","Hide datasets","Unhide datasets","Delete datasets","Undelete datasets","Permanently delete datasets","This will permanently remove the data in your datasets. Are you sure?","Dataset","Annotation","This history is empty. Click 'Get Data' on the left tool menu to start","You must be logged in to create histories","load your own data","get data from an external source","Include Deleted Datasets","Include Hidden Datasets","Unable to purge dataset","Cannot display datasets removed from disk","This dataset must finish uploading before it can be viewed","This dataset is not yet viewable","View data","Download","Download dataset","Additional files","View details","This is a new dataset and not all of its data are available yet","You do not have permission to view this dataset","The job creating this dataset was cancelled before completion","This job is waiting to run","This dataset is currently uploading","Metadata is being auto-detected","This job is currently running","This job is paused. Use the \"Resume Paused Jobs\" in the history menu to resume","An error occurred with this dataset","No data","An error occurred setting the metadata for this dataset","There was an error getting the data for this dataset","This dataset has been deleted and removed from disk","This dataset has been deleted","This dataset has been hidden","format","database","Edit attributes","Cannot edit attributes of datasets removed from disk","Undelete dataset to edit attributes","This dataset must finish uploading before it can be edited","This dataset is not yet editable","Delete","Dataset is already deleted","View or report this error","Run this job again","Visualize","Visualize in","Undelete it","Permanently remove it from disk","Unhide it","You may be able to","set it manually or retry auto-detection","Edit dataset tags","Edit dataset annotation","Tags","Edit annotation"],"mappings":"AACAA,QAEAC,eACI,qBACJC,SACI,WACJC,cACI,oBACJC,iBACI,0BACJC,UACI,cACJC,UACI,YACJC,eACI,iBACJC,MACI,QACJC,cACI,gBACJC,oBACI,sCACJC,uBACI,6BACJC,2BACI,6BACJC,MACI,QACJC,KACI,OACJC,QACI,aACJC,OACI,YACJC,gBACI,qBACJC,OACI,SACJC,KACI,iBACJC,qBACI,uBACJC,oBACI,qBACJC,KACI,cACJC,MACI,mBACJC,SACI,iBACJC,eACI,0BACJC,YACI,cACJC,gBACI,kCACJC,OACI,eACJC,kBACI,0BACJC,iBACI,8BACJC,cACI,qBAGJC,gBACI,2BAIJC,2BACI,gCACJC,kBACI,iBACJC,aACI,mBACJC,eACI,sBACJC,mBACI,sBACJC,iBACI,uBACJC,mBACI,uBAIJC,qBACI,2BACJC,kBACI,kCACJC,gBACI,6BACJC,mBACI,uBACJC,qBACI,mCACJC,6BACI,8BACJC,yBACI,8BACJC,yBACI,+BACJC,yBACI,+BACJC,UACI,cACJC,wBACI,oCACJC,yBACI,wCACJC,gBACI,iBACJC,mBACI,6BACJC,SACI,WAIJC,wBACI,0BACJC,6BACI,mDACJC,0DACI,+EACJC,gEACI,oFAIJC,kBACI,yBACJC,+CACI,sDACJC,+BACI,gDACJC,mFACI,6GACJC,IACI,OACJC,KACI,QACJC,mBACI,0BAGJC,oBACI,uCACJC,0BACI,sCACJC,0BACI,qCAEJC,kCACI,qDACJC,gBACI,6BACJC,kBACI,sCACJC,kBACI,gCACJC,oBACI,0CACJC,8BACI,+CACJC,wEACI,4FAMJC,QACI,iBACJC,WACI,aAGJC,yEACI,oGACJC,4CACI,oDAIJC,qBACI,8BACJC,mCACI,gDAGJC,2BACI,wCACJC,0BACI,qCAKJC,0BACI,yCAIJC,4CACI,mEACJC,6DACI,oFACJC,mCACI,2CACJC,YACI,mBAEJC,SACI,cACJC,mBACI,gCACJC,mBACI,wBAEJC,eACI,mBAIJC,kEACI,sGAEJC,kDACI,0DAEJC,gEACI,2EAEJC,6BACI,yCAEJC,sCACI,kDAEJC,kCACI,sCAEJC,gCACI,6BAEJC,iFACI,0HAEJC,sCACI,gDAEJC,UACI,gBAEJC,0DACI,uFAGJC,uDACI,mFAGJC,sDACI,uDACJC,gCACI,mCACJC,+BACI,gCAEJC,OACI,SACJC,SACI,sBAGJC,kBACI,uBACJC,uDACI,yEACJC,sCACI,2DACJC,6DACI,6EACJC,mCACI,8CAEJC,OACI,YACJC,6BACI,sCAEJC,4BACI,gCAEJC,qBACI,mCAEJC,UACI,aACJC,eACI,iBAEJC,cACI,YACJC,kCACI,qCACJC,YACI,iBAEJC,qBACI,iCACJC,0CACI,+DAEJC,oBACI,yCACJC,0BACI,2CAIJC,KACI,YACJC,kBACI"}
\ No newline at end of file
diff --git a/static/maps/nls/ja/locale.js.map b/static/maps/nls/ja/locale.js.map
index 6a796877713..3505dcac375 100644
--- a/static/maps/nls/ja/locale.js.map
+++ b/static/maps/nls/ja/locale.js.map
@@ -1 +1 @@
-{"version":3,"file":"locale.js","sources":["../../../src/nls/ja/locale.js"],"names":["define","This history is empty","No matching datasets found","Search datasets","You are currently viewing a deleted history!","You are over your disk quota","All","None","For all selected","Click to rename history","Operations on multiple datasets","Permanently delete datasets","This will permanently remove the data in your datasets. Are you sure?","Dataset","This history is empty. Click 'Get Data' on the left tool menu to start","You must be logged in to create histories","View data","Download","Download dataset","View details","This job is waiting to run","This job is currently running","An error occurred with this dataset","No data","This dataset has been deleted and removed from disk","This dataset has been deleted","This dataset has been hidden","format","database","Edit attributes","Delete","View or report this error","Run this job again","Visualize","Undelete it","Permanently remove it from disk","Unhide it"],"mappings":"AACAA,QAKAC,wBACA,YACAC,6BACA,wBAQAC,kBACA,cACAC,+CACA,mBACAC,+BACA,qBAGAC,IACA,KACAC,KACA,KACAC,mBACA,OAOAC,0BACA,sBAEAC,kCACA,kBASAC,8BACA,eACAC,wEACA,mCAGAC,QACA,SAKAC,yEACA,0CACAZ,6BACA,wBACAa,4CACA,8BA6BAC,YACA,SAEAC,SACA,SACAC,mBACA,gBAIAC,eACA,QAaAC,6BACA,aAQAC,gCACA,YAKAC,sCACA,oBAEAC,UACA,QAUAC,sDACA,8BACAC,gCACA,mBACAC,+BACA,oBAEAC,OACA,SACAC,SACA,SAGAC,kBACA,UAUAC,OACA,OAIAC,4BACA,aAEAC,qBACA,iBAEAC,UACA,QAIAC,cACA,OACAC,kCACA,cACAC,YACA"}
\ No newline at end of file
+{"version":3,"file":"locale.js","sources":["../../../src/nls/ja/locale.js"],"names":["define","This history is empty","No matching datasets found","Search datasets","You are currently viewing a deleted history!","You are over your disk quota","All","None","For all selected","Click to rename history","Operations on multiple datasets","Permanently delete datasets","This will permanently remove the data in your datasets. Are you sure?","Dataset","This history is empty. Click 'Get Data' on the left tool menu to start","You must be logged in to create histories","View data","Download","Download dataset","View details","This job is waiting to run","This job is currently running","An error occurred with this dataset","No data","This dataset has been deleted and removed from disk","This dataset has been deleted","This dataset has been hidden","format","database","Edit attributes","Delete","View or report this error","Run this job again","Visualize","Undelete it","Permanently remove it from disk","Unhide it"],"mappings":"AACAA,QAKAC,wBACI,YACJC,6BACI,wBAQJC,kBACI,cACJC,+CACI,mBACJC,+BACI,qBAGJC,IACI,KACJC,KACI,KACJC,mBACI,OAOJC,0BACI,sBAEJC,kCACI,kBASJC,8BACI,eACJC,wEACI,mCAGJC,QACI,SAKJC,yEACI,0CACJC,4CACI,8BA6BJC,YACI,SAEJC,SACI,SACJC,mBACI,gBAIJC,eACI,QAaJC,6BACI,aAQJC,gCACI,YAKJC,sCACI,oBAEJC,UACI,QAUJC,sDACI,8BACJC,gCACI,mBACJC,+BACI,oBAEJC,OACI,SACJC,SACI,SAGJC,kBACI,UAUJC,OACI,OAIJC,4BACI,aAEJC,qBACI,iBAEJC,UACI,QAIJC,cACI,OACJC,kCACI,cACJC,YACI"}
\ No newline at end of file
diff --git a/static/maps/nls/locale.js.map b/static/maps/nls/locale.js.map
index cded8aea8a7..ebc462b1448 100644
--- a/static/maps/nls/locale.js.map
+++ b/static/maps/nls/locale.js.map
@@ -1 +1 @@
-{"version":3,"file":"locale.js","sources":["../../src/nls/locale.js"],"names":["define","root","This history is empty","No matching datasets found","An error occurred while getting updates from the server","Please contact a Galaxy administrator if the problem persists","Search datasets","You are currently viewing a deleted history!","You are over your disk quota","Tool execution is on hold until your disk usage drops below your allocated quota","All","None","For all selected","Edit history tags","Edit history Annotation","Click to rename history","Operations on multiple datasets","Hide datasets","Unhide datasets","Delete datasets","Undelete datasets","Permanently delete datasets","This will permanently remove the data in your datasets. Are you sure?","Dataset","Annotation","This history is empty. Click 'Get Data' on the left tool menu to start","You must be logged in to create histories","Unable to purge dataset","Cannot display datasets removed from disk","This dataset must finish uploading before it can be viewed","This dataset is not yet viewable","View data","Download","Download dataset","Additional files","View details","This is a new dataset and not all of its data are available yet","You do not have permission to view this dataset","The job creating this dataset was cancelled before completion","This job is waiting to run","This dataset is currently uploading","Metadata is being auto-detected","This job is currently running","This job is paused. Use the \"Resume Paused Jobs\" in the history menu to resume","An error occurred with this dataset","No data","An error occurred setting the metadata for this dataset","There was an error getting the data for this dataset","This dataset has been deleted and removed from disk","This dataset has been deleted","This dataset has been hidden","format","database","Edit attributes","Cannot edit attributes of datasets removed from disk","Undelete dataset to edit attributes","This dataset must finish uploading before it can be edited","This dataset is not yet editable","Delete","Dataset is already deleted","View or report this error","Run this job again","Visualize","Visualize in","Undelete it","Permanently remove it from disk","Unhide it","You may be able to","set it manually or retry auto-detection","Edit dataset tags","Edit dataset annotation","Tags","Edit annotation","ja","zh"],"mappings":"AACAA,QACIC,MAKJC,yBACA,EACAC,8BACA,EACAC,2DACA,EACAC,iEACA,EAIAC,mBACA,EACAC,gDACA,EACAC,gCACA,EACAC,oFACA,EACAC,KACA,EACAC,MACA,EACAC,oBACA,EAGAC,qBACA,EACAC,2BACA,EACAC,2BACA,EAEAC,mCACA,EACAC,iBACA,EACAC,mBACA,EACAC,mBACA,EACAC,qBACA,EACAC,+BACA,EACAC,yEACA,EAGAC,SACA,EACAC,YACA,EAGAC,0EACA,EACAtB,8BACA,EACAuB,6CACA,EAkBAC,2BACA,EAIAC,6CACA,EACAC,8DACA,EACAC,oCACA,EACAC,aACA,EAEAC,UACA,EACAC,oBACA,EACAC,oBACA,EAEAC,gBACA,EAIAC,mEACA,EAEAC,mDACA,EAEAC,iEACA,EAEAC,8BACA,EAEAC,uCACA,EAEAC,mCACA,EAEAC,iCACA,EAEAC,kFACA,EAEAC,uCACA,EAEAC,WACA,EAEAC,2DACA,EAGAC,wDACA,EAGAC,uDACA,EACAC,iCACA,EACAC,gCACA,EAEAC,QACA,EACAC,UACA,EAGAC,mBACA,EACAC,wDACA,EACAC,uCACA,EACAC,8DACA,EACAC,oCACA,EAEAC,QACA,EACAC,8BACA,EAEAC,6BACA,EAEAC,sBACA,EAEAC,WACA,EACAC,gBACA,EAEAC,eACA,EACAC,mCACA,EACAC,aACA,EAEAC,sBACA,EACAC,2CACA,EAEAC,qBACA,EACAC,2BACA,EAIAC,MACA,EACA/C,YACA,EACAgD,mBACA,GAKIC,IAAQ,EACRC,IAAQ"}
\ No newline at end of file
+{"version":3,"file":"locale.js","sources":["../../src/nls/locale.js"],"names":["define","root","Analyze Data","Workflow","Shared Data","Data Libraries","Histories","Workflows","Visualizations","Pages","Visualization","New Track Browser","Saved Visualizations","Interactive Environments","Admin","Help","Support","Search","Mailing Lists","Videos","Wiki","How to Cite Galaxy","Interactive Tours","User","Login","Register","Logged in as","Preferences","Custom Builds","Logout","Saved Histories","Saved Datasets","Saved Pages","History Lists","Histories Shared with Me","Current History","Create New","Copy History","Share or Publish","Show Structure","Extract Workflow","Delete Permanently","Dataset Actions","Copy Datasets","Dataset Security","Resume Paused Jobs","Collapse Expanded Datasets","Unhide Hidden Datasets","Delete Hidden Datasets","Purge Deleted Datasets","Downloads","Export Tool Citations","Export History to File","Other Actions","Import from File","Webhooks","This history is empty","No matching datasets found","An error occurred while getting updates from the server","Please contact a Galaxy administrator if the problem persists","search datasets","You are currently viewing a deleted history!","You are over your disk quota","Tool execution is on hold until your disk usage drops below your allocated quota","All","None","For all selected","Edit history tags","Edit history Annotation","Click to rename history","Operations on multiple datasets","Hide datasets","Unhide datasets","Delete datasets","Undelete datasets","Permanently delete datasets","This will permanently remove the data in your datasets. Are you sure?","Dataset","Annotation","This history is empty. Click 'Get Data' on the left tool menu to start","You must be logged in to create histories","Unable to purge dataset","Cannot display datasets removed from disk","This dataset must finish uploading before it can be viewed","This dataset is not yet viewable","View data","Download","Download dataset","Additional files","View details","This is a new dataset and not all of its data are available yet","You do not have permission to view this dataset","The job creating this dataset was cancelled before completion","This job is waiting to run","This dataset is currently uploading","Metadata is being auto-detected","This job is currently running","This job is paused. Use the \"Resume Paused Jobs\" in the history menu to resume","An error occurred with this dataset","No data","An error occurred setting the metadata for this dataset","There was an error getting the data for this dataset","This dataset has been deleted and removed from disk","This dataset has been deleted","This dataset has been hidden","format","database","Edit attributes","Cannot edit attributes of datasets removed from disk","Undelete dataset to edit attributes","This dataset must finish uploading before it can be edited","This dataset is not yet editable","Delete","Dataset is already deleted","View or report this error","Run this job again","Visualize","Visualize in","Undelete it","Permanently remove it from disk","Unhide it","You may be able to","set it manually or retry auto-detection","Edit dataset tags","Edit dataset annotation","Tags","Edit annotation","ja","fr","zh"],"mappings":"AACAA,QACIC,MAEJC,gBACI,EACJC,UACI,EACJC,eACI,EACJC,kBACI,EACJC,WACI,EACJC,WACI,EACJC,gBACI,EACJC,OACI,EACJC,eACI,EACJC,qBACI,EACJC,wBACI,EACJC,4BACI,EACJC,OACI,EACJC,MACI,EACJC,SACI,EACJC,QACI,EACJC,iBACI,EACJC,QACI,EACJC,MACI,EACJC,sBACI,EACJC,qBACI,EACJC,MACI,EACJC,OACI,EACJC,UACI,EACJC,gBACI,EACJC,aACI,EACJC,iBACI,EACJC,QACI,EACJC,mBACI,EACJC,kBACI,EACJC,eACI,EAGJC,iBACI,EAIJC,4BACI,EACJC,mBACI,EACJC,cACI,EACJC,gBACI,EACJC,oBACI,EACJC,kBACI,EACJC,oBACI,EAIJC,sBACI,EACJC,mBACI,EACJC,iBACI,EACJC,oBACI,EACJC,sBACI,EACJC,8BACI,EACJC,0BACI,EACJC,0BACI,EACJC,0BACI,EACJC,WACI,EACJC,yBACI,EACJC,0BACI,EACJC,iBACI,EACJC,oBACI,EACJC,UACI,EAIJC,yBACI,EACJC,8BACI,EACJC,2DACI,EACJC,iEACI,EAIJC,mBACI,EACJC,gDACI,EACJC,gCACI,EACJC,oFACI,EACJC,KACI,EACJC,MACI,EACJC,oBACI,EAGJC,qBACI,EACJC,2BACI,EACJC,2BACI,EAEJC,mCACI,EACJC,iBACI,EACJC,mBACI,EACJC,mBACI,EACJC,qBACI,EACJC,+BACI,EACJC,yEACI,EAGJC,SACI,EACJC,YACA,EAGAC,0EACI,EACJC,6CACI,EAkBJC,2BACI,EAIJC,6CACI,EACJC,8DACI,EACJC,oCACI,EACJC,aACI,EAEJC,UACI,EACJC,oBACI,EACJC,oBACI,EAEJC,gBACI,EAIJC,mEACI,EAEJC,mDACI,EAEJC,iEACI,EAEJC,8BACI,EAEJC,uCACI,EAEJC,mCACI,EAEJC,iCACI,EAEJC,kFACI,EAEJC,uCACI,EAEJC,WACI,EAEJC,2DACI,EAGJC,wDACI,EAGJC,uDACI,EACJC,iCACI,EACJC,gCACI,EAEJC,QACI,EACJC,UACI,EAGJC,mBACI,EACJC,wDACI,EACJC,uCACI,EACJC,8DACI,EACJC,oCACI,EAEJC,QACI,EACJC,8BACI,EAEJC,6BACI,EAEJC,sBACI,EAEJC,WACI,EACJC,gBACI,EAEJC,eACI,EACJC,mCACI,EACJC,aACI,EAEJC,sBACI,EACJC,2CACI,EAEJC,qBACI,EACJC,2BACI,EAIJC,MACI,EACJC,mBACI,GAKAC,IAAO,EACPC,IAAO,EACPC,IAAO"}
\ No newline at end of file
diff --git a/static/maps/nls/zh/locale.js.map b/static/maps/nls/zh/locale.js.map
index e0a07e79447..22fde99402c 100644
--- a/static/maps/nls/zh/locale.js.map
+++ b/static/maps/nls/zh/locale.js.map
@@ -1 +1 @@
-{"version":3,"file":"locale.js","sources":["../../../src/nls/zh/locale.js"],"names":["define","This history is empty","No matching datasets found","Search datasets","You are currently viewing a deleted history!","You are over your disk quota","All","None","For all selected","Click to rename history","Operations on multiple datasets","Permanently delete datasets","This will permanently remove the data in your datasets. Are you sure?","Dataset","This history is empty. Click 'Get Data' on the left tool menu to start","You must be logged in to create histories","View data","Download","Download dataset","View details","This job is waiting to run","This job is currently running","An error occurred with this dataset","No data","This dataset has been deleted","This dataset has been hidden","format","database","Edit attributes","Delete","View or report this error","Run this job again","Visualize","Undelete it","Permanently remove it from disk","Unhide it"],"mappings":"AACAA,QAIAC,wBACA,OACAC,6BACA,YAQAC,kBACA,QACAC,+CACA,aACAC,+BACA,WAGAC,IACA,IACAC,KACA,QACAC,mBACA,QAOAC,0BACA,YAEAC,kCACA,UASAC,8BACA,UACAC,wEACA,sBAGAC,QACA,MAKAC,yEACA,sBACAZ,6BACA,OACAa,4CACA,eAuBAC,YACA,KAEAC,SACA,KACAC,mBACA,QAIAC,eACA,OAaAC,6BACA,UAQAC,gCACA,UAKAC,sCACA,UAEAC,UACA,OAYAC,gCACA,WACAC,+BACA,UAEAC,OACA,KACAC,SACA,MAGAC,kBACA,OAUAC,OACA,KAIAC,4BACA,OAEAC,qBACA,OAEAC,UACA,KAIAC,cACA,MACAC,kCACA,WACAC,YACA"}
\ No newline at end of file
+{"version":3,"file":"locale.js","sources":["../../../src/nls/zh/locale.js"],"names":["define","This history is empty","No matching datasets found","Search datasets","You are currently viewing a deleted history!","You are over your disk quota","All","None","For all selected","Click to rename history","Operations on multiple datasets","Permanently delete datasets","This will permanently remove the data in your datasets. Are you sure?","Dataset","This history is empty. Click 'Get Data' on the left tool menu to start","You must be logged in to create histories","View data","Download","Download dataset","View details","This job is waiting to run","This job is currently running","An error occurred with this dataset","No data","This dataset has been deleted","This dataset has been hidden","format","database","Edit attributes","Delete","View or report this error","Run this job again","Visualize","Undelete it","Permanently remove it from disk","Unhide it"],"mappings":"AACAA,QAIAC,wBACI,OACJC,6BACI,YAQJC,kBACI,QACJC,+CACI,aACJC,+BACI,WAGJC,IACI,IACJC,KACI,QACJC,mBACI,QAOJC,0BACI,YAEJC,kCACI,UASJC,8BACI,UACJC,wEACI,sBAGJC,QACI,MAKJC,yEACI,sBACJC,4CACI,eAuBJC,YACI,KAEJC,SACI,KACJC,mBACI,QAIJC,eACI,OAaJC,6BACI,UAQJC,gCACI,UAKJC,sCACI,UAEJC,UACI,OAYJC,gCACI,WACJC,+BACI,UAEJC,OACI,KACJC,SACI,MAGJC,kBACI,OAUJC,OACI,KAIJC,4BACI,OAEJC,qBACI,OAEJC,UACI,KAIJC,cACI,MACJC,kCACI,WACJC,YACI"}
\ No newline at end of file
diff --git a/static/scripts/analysis.js b/static/scripts/analysis.js
new file mode 100644
index 00000000000..4b0d362f7f4
--- /dev/null
+++ b/static/scripts/analysis.js
@@ -0,0 +1,2 @@
+var jQuery=require("jquery"),$=jQuery,GalaxyApp=require("galaxy").GalaxyApp,QUERY_STRING=require("utils/query-string-parsing"),PANEL=require("layout/panel"),ToolPanel=require("./tool-panel"),HistoryPanel=require("./history-panel"),PAGE=require("layout/page"),ToolForm=require("mvc/tool/tool-form"),UserPreferences=require("mvc/user/user-preferences");Tours=require("mvc/tours"),window.app=function(a,b){window.Galaxy=new GalaxyApp(a,b),Galaxy.debug("analysis app");var c=a.config,d=new ToolPanel({el:"#left",userIsAnonymous:Galaxy.user.isAnonymous(),toolbox:c.toolbox,toolbox_in_panel:c.toolbox_in_panel,stored_workflow_menu_entries:c.stored_workflow_menu_entries,nginx_upload_path:c.nginx_upload_path,ftp_upload_site:c.ftp_upload_site,default_genome:c.default_genome,default_extension:c.default_extension}),e=new PANEL.CenterPanel({el:"#center"}),f=new HistoryPanel({el:"#right",galaxyRoot:Galaxy.root,userIsAnonymous:Galaxy.user.isAnonymous(),allow_user_dataset_purge:c.allow_user_dataset_purge}),g=new PAGE.PageLayoutView(_.extend(a,{el:"body",left:d,center:e,right:f}));Galaxy.page=g,Galaxy.params=Galaxy.config.params,Galaxy.toolPanel=d.tool_panel,Galaxy.upload=d.uploadButton,Galaxy.currHistoryPanel=f.historyView,Galaxy.currHistoryPanel.listenToGalaxy(Galaxy),Galaxy.app={display:function(a){$(".select2-hidden-accessible").remove(),e.display(a)}},Galaxy.router=new(Backbone.Router.extend({initialize:function(a){this.options=a},execute:function(a,b,c){Galaxy.debug("router execute:",a,b,c);var d=QUERY_STRING.parse(b.pop());b.push(d),a&&a.apply(this,b)},routes:{"(/)":"home","(/)root*":"home","(/)tours(/)(:tour_id)":"show_tours","(/)users(/)":"show_users"},show_tours:function(a){a?Tours.giveTour(a):e.display(new Tours.ToursView)},show_users:function(){e.display(new UserPreferences.View)},home:function(a){a.tool_id||a.job_id?"upload1"===a.tool_id?(Galaxy.upload.show(),this._loadCenterIframe("welcome")):this._loadToolForm(a):this._loadCenterIframe(a.workflow_id?"workflow/run?id="+a.workflow_id:a.m_c?a.m_c+"/"+a.m_a:"welcome")},_loadToolForm:function(a){a.id=a.tool_id,e.display(new ToolForm.View(a))},_loadCenterIframe:function(a,b){b=b||Galaxy.root,a=b+a,e.$("#galaxy_main").prop("src",a)}}))(a),$(function(){g.render(),g.right.historyView.loadCurrentHistory(),Galaxy.listenTo(g.right.historyView,"history-size-change",function(){Galaxy.user.fetch({url:Galaxy.user.urlRoot()+"/"+(Galaxy.user.id||"current")})}),g.right.historyView.connectToQuotaMeter(g.masthead.quotaMeter),Backbone.history.start({root:Galaxy.root,pushState:!0})})};
+//# sourceMappingURL=../maps/analysis.js.map
\ No newline at end of file
diff --git a/static/scripts/app.js b/static/scripts/app.js
new file mode 100644
index 00000000000..907558f3fc3
--- /dev/null
+++ b/static/scripts/app.js
@@ -0,0 +1,2 @@
+define(["utils/utils","layout/masthead","mvc/ui/ui-modal","mvc/ui/ui-modal","mvc/user/user-quotameter"],function(a,b,c,d){return Backbone.View.extend({initialize:function(a){Galaxy.app=this,Galaxy.modal=new c.View,Galaxy.masthead=new b.View(a),this.setElement(this._template(a)),this.$el.append(Galaxy.masthead.$el),$("body").append(this.$el),this.render()},render:function(){require(["app/analysis"],function(a){window.console.log(a)},function(a){console.debug(a)})},initialize2:function(e){this.options=a.merge(e,{}),this.params=this.options.params,this.setElement(this._template(e)),Galaxy.app=this,$("body").append(this.$el);var f=$(this.$el.parent()).attr("scroll","no").addClass("full-content");this.options.message_box_visible&&(f.addClass("has-message-box"),this.$("#messagebox").show()),this.options.show_inactivity_warning&&(f.addClass("has-inactivity-box"),this.$("#inactivebox").show()),Galaxy.masthead||(Galaxy.masthead=new b.View(e),Galaxy.modal=new c.View,Galaxy.menu=new Menu.GalaxyMenu({masthead:Galaxy.masthead,config:e}),Galaxy.quotaMeter=new d.UserQuotaMeter({model:Galaxy.user,el:Galaxy.masthead.$(".quota-meter-container")}).render())},display:function(a,b){$(".select2-hidden-accessible").remove(),this.panels&&this.panels[b||"center"].display(a)},_buildPanels:function(b,c){this.panels=[];var d=["left","center","right"];for(var e in d){var f=d[e],g=this.panels[f]=new b[f](c);if("center"==f)this.$("#center").append(g.$el);else{var h=a.merge(g.components,{header:{title:"",cls:"",buttons:[]},body:{cls:""}}),i=$(this._templatePanel(f));i.find(".panel-header-text").html(h.header.title),i.find(".unified-panel-header-inner").addClass(h.header.cls);for(var e in h.header.buttons)i.find(".panel-header-buttons").append(h.header.buttons[e].$el);i.find(".unified-panel-body").addClass(h.body.cls).append(g.$el);{new Panel({center:this.$("#center"),panel:i,drag:i.find(".unified-panel-footer > .drag"),toggle:i.find(".unified-panel-footer > .panel-collapse"),right:"right"==f})}this.$el.append(i)}}},_templatePanel:function(a){return'
").addClass("menu dropdown-menu").addClass("pull-"+e.model.get("pull")).attr("role","menu"),this.$el.append(this.$menu)),this.collection.each(function(t){var i=t.attributes;if(i.visible){var n=a("").addClass("dropdown-item").attr({href:i.href,target:i.target}).append(a("").addClass("fa").addClass(i.icon).css("display",i.icon?"inline-block":"none")).append(i.title).on("click",function(e){i.onclick&&(e.preventDefault(),i.onclick())});e.$menu.append(a("").append(n)),i.divider&&e.$menu.append(a("").addClass("divider"))}})},addMenu:function(t){this.collection.add(e.merge(t,{title:"",target:"",href:"",onclick:null,divider:!1,visible:!0,icon:null,cls:"button-menu btn-group"}))}});return{ButtonDefault:t,ButtonLink:i,ButtonIcon:s,ButtonCheck:n,ButtonMenu:r}}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(3),i(1))},function(e,t,i){var n,s;(function(i,o,a){n=[],s=function(){var e=i.Model.extend({defaults:{title:"",icon_class:"",on_click:null,menu_options:null,is_menu_button:!0,id:null,href:null,target:null,enabled:!0,visible:!0,tooltip_config:{}}}),t=i.View.extend({initialize:function(){this.model.attributes.tooltip_config={placement:"bottom"},this.model.bind("change",this.render,this)},render:function(){this.$el.tooltip("hide");var e=this.template(this.model.toJSON());return e.tooltip(this.model.get("tooltip_config")),this.$el.replaceWith(e),this.setElement(e),this},events:{click:"click"},click:function(e){return!o.isFunction(this.model.get("on_click"))||(this.model.get("on_click")(e),!1)},template:function(e){var t='title="'+e.title+'" class="icon-button';return e.is_menu_button&&(t+=" menu-button"),t+=" "+e.icon_class,e.enabled||(t+="_disabled"),t+='"',e.id&&(t+=' id="'+e.id+'"'),t+=' href="'+e.href+'"',e.target&&(t+=' target="'+e.target+'"'),e.visible||(t+=' style="display: none;"'),t=e.enabled?"":"",a(t)}}),n=i.Collection.extend({model:e}),s=i.View.extend({tagName:"div",initialize:function(){this.render()},render:function(){var e=this;return this.collection.each(function(t){var i=a("").attr("href","javascript:void(0)").attr("title",t.attributes.title).addClass("icon-button menu-button").addClass(t.attributes.icon_class).appendTo(e.$el).click(t.attributes.on_click);t.attributes.tooltip_config&&i.tooltip(t.attributes.tooltip_config);var n=t.get("options");n&&make_popupmenu(i,n)}),this}}),r=function(t,i){i||(i={});var a=new n(o.map(t,function(t){return new e(o.extend(t,i))}));return new s({collection:a})};return{IconButton:e,IconButtonView:t,IconButtonCollection:n,IconButtonMenuView:s,create_icon_buttons_menu:r}}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(3),i(2),i(1))},function(e,t,i){var n,s,o;!function(a){s=[i(1)],n=a,o="function"==typeof n?n.apply(t,s):n,!(void 0!==o&&(e.exports=o))}(function(e){"use_strict";var t=e;t.fn.make_text_editable=function(e){var i="num_cols"in e?e.num_cols:30,n="num_rows"in e?e.num_rows:4,s="use_textarea"in e&&e.use_textarea,o="on_finish"in e?e.on_finish:null,a="help_text"in e?e.help_text:null,r=t(this);return r.addClass("editable-text").click(function(a){if(!(t(this).children(":input").length>0)){r.removeClass("editable-text");var l,c,d=function(e){r.find(":input").remove(),""!==e?r.text(e):r.html(" "),r.addClass("editable-text"),o&&o(e)},h="cur_text"in e?e.cur_text:r.text();s?(l=t("").attr({rows:n,cols:i}).text(t.trim(h)).keyup(function(e){27===e.keyCode&&d(h)}),c=t("").text("Done").click(function(){return d(l.val()),!1})):l=t("").attr({value:t.trim(h),size:i}).blur(function(){d(h)}).keyup(function(e){27===e.keyCode?t(this).trigger("blur"):13===e.keyCode&&d(t(this).val()),e.stopPropagation()}),r.text(""),r.append(l),c&&r.append(c),l.focus(),l.select(),a.stopPropagation()}}),a&&r.attr("title",a).tooltip(),r}})},function(e,t,i){var n;(function(s,o){n=function(){function e(e){e+="";for(var t=/(\d+)(\d{3})/;t.test(e);)e=e.replace(t,"$1,$2");return e}var t=function(e){return"promise"in e},i=s.Model.extend({defaults:{ajax_settings:{},interval:1e3,success_fn:function(e){return!0}},go:function(){var e=o.Deferred(),t=this,i=t.get("ajax_settings"),n=t.get("success_fn"),s=t.get("interval"),a=function(){o.ajax(i).success(function(t){n(t)?e.resolve(t):setTimeout(a,s)})};return a(),e}}),n=function(e){e||(e="#ffffff"),"string"==typeof e&&(e=[e]);for(var t=0;t>16,s=(65280&i)>>8,o=255&i,d=p(n,s,o),f=!0,t=0;t>16,l=(65280&a)>>8,c=255&a,h=p(r,l,c),u=g(n,s,o,r,l,c),Math.abs(d-h)<40||u<200){f=!1;break}m++}while(!f&&m<=10);return"#"+(16777216+i).toString(16).substr(1,6)};return{commatize:e,is_deferred:t,ServerStateDeferred:i,get_random_color:n}}.call(t,i,t,e),!(void 0!==n&&(e.exports=n))}).call(t,i(3),i(1))},function(e,t,i){var n,s;(function(o,a){n=[i(29),i(6),i(5)],s=function(e,t,i){e=e||window.BibtexParser;var n="citation",s=o.Model.extend(t.LoggableMixin).extend({_logNamespace:n,defaults:{content:""},initialize:function(){var t;try{t=e(this.attributes.content)}catch(e){return}if(t.errors.length){var i=t.errors.reduce(function(e,t){return e+"; "+t});this.log("Error parsing bibtex: "+i)}if(this._fields={},this.entry=a.first(t.entries),this.entry){var n=this.entry.Fields;for(var s in n){var o=n[s],r=s.toLowerCase();this._fields[r]=o}}},entryType:function(){return this.entry?this.entry.EntryType:void 0},fields:function(){return this._fields}}),r=o.Collection.extend(t.LoggableMixin).extend({_logNamespace:n,urlRoot:Galaxy.root+"api",partial:!0,model:s}),l=r.extend({url:function(){return this.urlRoot+"/histories/"+this.history_id+"/citations"}}),c=r.extend({url:function(){return this.urlRoot+"/tools/"+this.tool_id+"/citations"},partial:!1});return{Citation:s,HistoryCitationCollection:l,ToolCitationCollection:c}}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(3),i(2))},function(e,t,i){var n,s;(function(o,a,r){n=[i(4),i(7),i(8),i(44),i(27)],s=function(e,t,i,n,s){var l=o.View.extend({initialize:function(s){var o=this;this.modal=parent.Galaxy.modal||new i.View,this.form=new n(e.merge({listen_to_history:!0,always_refresh:!1,customize:function(e){var i=e.model.attributes;i.buttons={execute:execute_btn=new t.Button({icon:"fa-check",tooltip:"Execute: "+i.name+" ("+i.version+")",title:"Execute",cls:"ui-button btn btn-primary",floating:"clear",onclick:function(){execute_btn.wait(),e.portlet.disable(),o.submit(i,function(){execute_btn.unwait(),e.portlet.enable()})}})},i.job_id&&i.job_remap&&i.inputs.push({label:"Resume dependencies from this job",name:"rerun_remap_job_id",type:"select",display:"radio",ignore:"__ignore__",value:"__ignore__",options:[["Yes",i.job_id],["No","__ignore__"]],help:"The previous run of this tool failed and other tools were waiting for it to finish successfully. Use this option to resume those tools using the new output(s) of this tool run."})},postchange:function(t,i){var n={tool_id:i.model.get("id"),tool_version:i.model.get("version"),inputs:a.extend(!0,{},i.data.create())};i.wait(!0),Galaxy.emit.debug("tool-form::postchange()","Sending current state.",n),e.request({type:"POST",url:Galaxy.root+"api/tools/"+i.model.get("id")+"/build",data:n,success:function(e){i.update(e),i.wait(!1),Galaxy.emit.debug("tool-form::postchange()","Received new model.",e),t.resolve()},error:function(e){Galaxy.emit.debug("tool-form::postchange()","Refresh request failed.",e),t.reject()}})}},s)),this.deferred=this.form.deferred,this.setElement(""),this.$el.append(this.form.$el)},submit:function(t,i){var n=this,o={tool_id:t.id,tool_version:t.version,inputs:this.form.data.create()};if(this.form.trigger("reset"),!n.validate(o))return Galaxy.emit.debug("tool-form::submit()","Submission canceled. Validation failed."),void(i&&i());if(t.action!==Galaxy.root+"tool_runner/index"){var l=a("").attr({action:t.action,method:t.method,enctype:t.enctype});return r.each(o.inputs,function(e,t){l.append(a("").attr({name:t,value:e}))}),l.hide().appendTo("body").submit().remove(),void(i&&i())}Galaxy.emit.debug("tool-form::submit()","Validation complete.",o),e.request({type:"POST",url:Galaxy.root+"api/tools",data:o,success:function(e){if(i&&i(),n.$el.children().hide(),n.$el.append(n._templateSuccess(e)),e.jobs&&e.jobs.length>0){n.$el.append(a("",{id:"webhook-view"}));new s.WebhookView({
-urlRoot:Galaxy.root+"api/webhooks/tool"})}parent.Galaxy&&parent.Galaxy.currHistoryPanel&&parent.Galaxy.currHistoryPanel.refreshContents()},error:function(e){i&&i(),Galaxy.emit.debug("tool-form::submit","Submission failed.",e);var t=!1;if(e&&e.err_data){var s=n.form.data.matchResponse(e.err_data);for(var a in s){n.form.highlight(a,s[a]),t=!0;break}}t||n.modal.show({title:"Job submission failed",body:n._templateError(o,e&&e.err_msg),buttons:{Close:function(){n.modal.hide()}}})}})},validate:function(e){var t=e.inputs,i=-1,n=null;for(var s in t){var o=t[s],a=this.form.data.match(s),r=this.form.field_list[a],l=this.form.input_list[a];if(a&&l&&r){if(!l.optional&&null==o)return this.form.highlight(a),!1;if(o&&o.batch){var c=o.values.length,d=c>0&&o.values[0]&&o.values[0].src;if(d)if(null===n)n=d;else if(n!==d)return this.form.highlight(a,"Please select either dataset or dataset list fields for all batch mode fields."),!1;if(i===-1)i=c;else if(i!==c)return this.form.highlight(a,"Please make sure that you select the same number of inputs for all batch mode fields. This field contains "+c+" selection(s) while a previous field contains "+i+"."),!1}}else Galaxy.emit.debug("tool-form::validate()","Retrieving input objects failed.")}return!0},_templateSuccess:function(e){if(e.jobs&&e.jobs.length>0){var t=e.jobs.length,i=1==t?"1 job has":t+" jobs have",n=a("").addClass("donemessagelarge").append(a("").text(i+" been successfully added to the queue - resulting in the following datasets:"));return r.each(e.outputs,function(e){n.append(a("").addClass("messagerow").append(a("").text(e.hid+": "+e.name)))}),n.append(a("").append("").text("You can check the status of queued jobs and view the resulting data by refreshing the History pane. When the job has been run the status will change from 'running' to 'finished' if completed successfully or 'error' if problems were encountered.")),n}return this._templateError(e,"Invalid success response. No jobs found.")},_templateError:function(e,t){return a("").addClass("errormessagelarge").append(a("").text("The server could not complete the request. Please contact the Galaxy Team if this error persists. "+(t||""))).append(a("").text(JSON.stringify(e,null,4)))}});return{View:l}}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(3),i(1),i(2))},function(e,t,i){var n,s;(function(o,a){n=[i(4),i(9),i(7)],s=function(e,t,i){var n=o.View.extend({initialize:function(e){var n=this;this.options=e,this.name=e.name||"element",this.multiple=e.multiple||!1,this.message=new i.Message,this.portlet=new t.View({cls:"ui-portlet-section"}),this.select=new i.Select.View({optional:e.optional}),this.button=new i.ButtonIcon({icon:"fa fa-sign-in",floating:"left",tooltip:"Insert new "+this.name,onclick:function(){n.add({id:n.select.value(),name:n.select.text()})}}),this.setElement(this._template(e)),this.$(".ui-list-message").append(this.message.$el),this.$(".ui-list-portlet").append(this.portlet.$el),this.$(".ui-list-button").append(this.button.$el),this.$(".ui-list-select").append(this.select.$el)},value:function(e){if(void 0!==e){if(this.portlet.empty(),a.isArray(e))for(var t in e){var i=e[t],n=null,s=null;"string"!=a.type(i)?(n=i.id,s=i.name):n=s=i,null!=n&&this.add({id:n,name:s})}this._refresh()}var o=[];return this.$(".ui-list-id").each(function(){o.push({id:a(this).prop("id"),name:a(this).find(".ui-list-name").html()})}),0==o.length?null:o},add:function(t){var i=this;if(0===this.$('[id="'+t.id+'"]').length)if(e.isEmpty(t.id))this.message.update({message:"Please select a valid "+this.name+".",status:"danger"});else{var n=a(this._templateRow({id:t.id,name:t.name}));n.on("click",function(){n.remove(),i._refresh()}),n.on("mouseover",function(){n.addClass("portlet-highlight")}),n.on("mouseout",function(){n.removeClass("portlet-highlight")}),this.portlet.append(n),this._refresh()}else this.message.update({message:"This "+this.name+" is already in the list."})},update:function(e){this.select.update(e)},_refresh:function(){this.$(".ui-list-id").length>0?(!this.multiple&&this.button.disable(),this.$(".ui-list-portlet").show()):(this.button.enable(),this.$(".ui-list-portlet").hide()),this.options.onchange&&this.options.onchange()},_template:function(e){return'
',"Warning: This is a experimental feature. Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' cite Galaxy.',"
"],"element");return o.extend({},t.DatasetListItemView.prototype.templates,{titleBar:e})}();var u=c.extend({className:c.prototype.className+" dataset-collection-element",_swapNewRender:function(e){c.prototype._swapNewRender.call(this,e);var t=this.model.get("state")||"ok";return this.$el.addClass("state-"+t),this.$el},toString:function(){var e=this.model?this.model+"":"(no model)";return"NestedDCDCEListItemView("+e+")"}});return{DCListItemView:c,DCEListItemView:d,DatasetDCEListItemView:h,NestedDCDCEListItemView:u}}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(2),i(1),i(1))},function(e,t,i){var n,s;(function(o,a,r){n=[i(70),i(6),i(5)],s=function(e,t,i){"use strict";var n={defaults:{model_class:"DatasetCollectionElement",element_identifier:null,element_index:null,element_type:null},_mergeObject:function(e){return o.extend(e,e.object,{element_id:e.id}),delete e.object,e},constructor:function(e,t){e=this._mergeObject(e),this.idAttribute="element_id",a.Model.apply(this,arguments)},parse:function(e,t){var i=e;return i=this._mergeObject(i)}},s=a.Model.extend(t.LoggableMixin).extend(n).extend({_logNamespace:"collections"}),l=a.Collection.extend(t.LoggableMixin).extend({_logNamespace:"collections",model:s,toString:function(){return["DatasetCollectionElementCollection(",this.length,")"].join("")}}),c=e.DatasetAssociation.extend(t.mixin(n,{url:function(){return this.has("history_id")?Galaxy.root+"api/histories/"+this.get("history_id")+"/contents/"+this.get("id"):(console.warn("no endpoint for non-hdas within a collection yet"),Galaxy.root+"api/datasets")},defaults:o.extend({},e.DatasetAssociation.prototype.defaults,n.defaults),constructor:function(e,t){this.debug("\t DatasetDCE.constructor:",e,t),n.constructor.call(this,e,t)},hasDetails:function(){return this.elements&&this.elements.length},toString:function(){var e=this.get("element_identifier");return["DatasetDCE(",e,")"].join("")}})),d=l.extend({model:c,toString:function(){return["DatasetDCECollection(",this.length,")"].join("")}}),h=a.Model.extend(t.LoggableMixin).extend(t.SearchableModelMixin).extend({_logNamespace:"collections",defaults:{collection_type:null,deleted:!1},collectionClass:l,initialize:function(e,t){this.debug(this+"(DatasetCollection).initialize:",e,t,this),this.elements=this._createElementsModel(),this.on("change:elements",function(){this.log("change:elements"),this.elements=this._createElementsModel()})},_createElementsModel:function(){this.debug(this+"._createElementsModel",this.collectionClass,this.get("elements"),this.elements);var e=this.get("elements")||[];return this.unset("elements",{silent:!0}),this.elements=new this.collectionClass(e),this.elements},toJSON:function(){var e=a.Model.prototype.toJSON.call(this);return this.elements&&(e.elements=this.elements.toJSON()),e},inReadyState:function(){var e=this.get("populated");return this.isDeletedOrPurged()||e},hasDetails:function(){return 0!==this.elements.length},getVisibleContents:function(e){return this.elements},parse:function(e,t){var i=a.Model.prototype.parse.call(this,e,t);return i.create_time&&(i.create_time=new Date(i.create_time)),i.update_time&&(i.update_time=new Date(i.update_time)),i},delete:function(e){return this.get("deleted")?r.when():this.save({deleted:!0},e)},undelete:function(e){return!this.get("deleted")||this.get("purged")?r.when():this.save({deleted:!1},e)},isDeletedOrPurged:function(){return this.get("deleted")||this.get("purged")},searchAttributes:["name"],toString:function(){var e=[this.get("id"),this.get("name")||this.get("element_identifier")];return"DatasetCollection("+e.join(",")+")"}}),u=h.extend({collectionClass:d,toString:function(){return"List"+h.prototype.toString.call(this)}}),p=u.extend({toString:function(){return"Pair"+h.prototype.toString.call(this)}}),g=h.extend(t.mixin(n,{constructor:function(e,t){this.debug("\t NestedDCDCE.constructor:",e,t),n.constructor.call(this,e,t)},toString:function(){var e=this.object?""+this.object:this.get("element_identifier");return["NestedDCDCE(",e,")"].join("")}})),f=l.extend({model:g,toString:function(){return["NestedDCDCECollection(",this.length,")"].join("")}}),m=p.extend(t.mixin(n,{constructor:function(e,t){this.debug("\t NestedPairDCDCE.constructor:",e,t),n.constructor.call(this,e,t)},toString:function(){var e=this.object?""+this.object:this.get("element_identifier");return["NestedPairDCDCE(",e,")"].join("")}})),v=f.extend({model:m,toString:function(){return["NestedPairDCDCECollection(",this.length,")"].join("")}}),_=h.extend({collectionClass:v,toString:function(){return["ListPairedDatasetCollection(",this.get("name"),")"].join("")}}),y=u.extend(t.mixin(n,{constructor:function(e,t){this.debug("\t NestedListDCDCE.constructor:",e,t),n.constructor.call(this,e,t)},toString:function(){var e=this.object?""+this.object:this.get("element_identifier");return["NestedListDCDCE(",e,")"].join("")}})),w=f.extend({model:y,toString:function(){return["NestedListDCDCECollection(",this.length,")"].join("")}}),b=h.extend({collectionClass:w,toString:function(){return["ListOfListsDatasetCollection(",this.get("name"),")"].join("")}});return{ListDatasetCollection:u,PairDatasetCollection:p,ListPairedDatasetCollection:_,ListOfListsDatasetCollection:b}}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(2),i(3),i(1))},function(e,t,i){var n,s;(function(o,a,r,l){n=[i(40),i(12),i(6),i(8),i(88),i(5),i(85)],s=function(e,t,i,n,s,c){"use strict";function d(e){var t=e.toJSON(),i=f(t,{creationFn:function(t,i){return t=t.map(function(e){return{id:e.id,name:e.name,src:"dataset"===e.history_content_type?"hda":"hdca"}}),e.createHDCA(t,"list",i)}});return i}var h="collections",u=o.View.extend(i.LoggableMixin).extend({_logNamespace:h,tagName:"li",className:"collection-element",initialize:function(e){this.element=e.element||{},this.selected=e.selected||!1},render:function(){return this.$el.attr("data-element-id",this.element.id).attr("draggable",!0).html(this.template({element:this.element})),this.selected&&this.$el.addClass("selected"),this},template:a.template(['',"<%- element.name %>","",'"].join("")),select:function(e){this.$el.toggleClass("selected",e),this.trigger("select",{source:this,selected:this.$el.hasClass("selected")})},discard:function(){var e=this,t=this.$el.parent().width();this.$el.animate({"margin-right":t},"fast",function(){e.trigger("discard",{source:e}),e.destroy()})},destroy:function(){this.off(),this.$el.remove()},events:{click:"_click","click .name":"_clickName","click .discard":"_clickDiscard",dragstart:"_dragstart",dragend:"_dragend",dragover:"_sendToParent",drop:"_sendToParent"},_click:function(e){e.stopPropagation(),this.select(e)},_clickName:function(e){e.stopPropagation(),e.preventDefault();var t=([c("Enter a new name for the element"),":\n(",c("Note that changing the name here will not rename the dataset"),")"].join(""),prompt(c("Enter a new name for the element")+":",this.element.name));t&&(this.element.name=t,this.render())},_clickDiscard:function(e){e.stopPropagation(),this.discard()},_dragstart:function(e){e.originalEvent&&(e=e.originalEvent),e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",JSON.stringify(this.element)),this.$el.addClass("dragging"),this.$el.parent().trigger("collection-element.dragstart",[this])},_dragend:function(e){this.$el.removeClass("dragging"),this.$el.parent().trigger("collection-element.dragend",[this])},_sendToParent:function(e){this.$el.parent().trigger(e)},toString:function(){return"DatasetCollectionElementView()"}}),p=o.View.extend(i.LoggableMixin).extend({_logNamespace:h,elementViewClass:u,collectionClass:e.HistoryListDatasetCollection,className:"list-collection-creator collection-creator flex-row-container",minElements:1,defaultAttributes:{creationFn:function(){throw new TypeError("no creation fn for creator")},oncreate:function(){},oncancel:function(){},autoscrollDist:24,highlightClr:"rgba( 64, 255, 255, 1.0 )"},initialize:function(e){this.metric("ListCollectionCreator.initialize",e);var t=this;a.each(this.defaultAttributes,function(i,n){i=e[n]||i,t[n]=i}),t.initialElements=e.elements||[],this._instanceSetUp(),this._elementsSetUp(),this._setUpBehaviors()},_instanceSetUp:function(){this.selectedIds={},this.$dragging=null,this.blocking=!1},_elementsSetUp:function(){this.invalidElements=[],this.workingElements=[],this.elementViews=[],this.workingElements=this.initialElements.slice(0),this._ensureElementIds(),this._validateElements(),this._mangleDuplicateNames(),this._sortElements()},_ensureElementIds:function(){return this.workingElements.forEach(function(e){e.hasOwnProperty("id")||(e.id=a.uniqueId())}),this.workingElements},_validateElements:function(){var e=this;return e.invalidElements=[],this.workingElements=this.workingElements.filter(function(t){var i=e._isElementInvalid(t);return i&&e.invalidElements.push({element:t,text:i}),!i}),this.workingElements},_isElementInvalid:function(e){return"dataset"!==e.history_content_type?c("is not a dataset"):e.state!==t.OK?c(a.contains(t.NOT_READY_STATES,e.state)?"hasn't finished running yet":"has errored, is paused, or is not accessible"):e.deleted||e.purged?c("has been deleted or purged"):null},_mangleDuplicateNames:function(){var e=900,t=1,i={};this.workingElements.forEach(function(n){for(var s=n.name;i.hasOwnProperty(s);)if(s=n.name+" ("+t+")",t+=1,t>=e)throw new Error("Safety hit in while loop - thats impressive");n.name=s,i[n.name]=!0})},_sortElements:function(e){},render:function(e,t){return this.workingElements.length .clear-selected").show():this.$(".collection-elements-controls > .clear-selected").hide()},_renderList:function(e,t){var i=this,n=l(""),s=i.$list();a.each(this.elementViews,function(e){e.destroy(),i.removeElementView(e)}),i.workingElements.forEach(function(e){var t=i._createElementView(e);n.append(t.$el)}),i._renderClearSelected(),s.empty().append(n.children()),a.invoke(i.elementViews,"render"),s.height()>s.css("max-height")?s.css("border-width","1px 0px 1px 0px"):s.css("border-width","0px")},_createElementView:function(e){var t=new this.elementViewClass({element:e,selected:a.has(this.selectedIds,e.id)});return this.elementViews.push(t),this._listenToElementView(t),t},_listenToElementView:function(e){var t=this;t.listenTo(e,{select:function(e){var i=e.source.element;e.selected?t.selectedIds[i.id]=!0:delete t.selectedIds[i.id],t.trigger("elements:select",e)},discard:function(e){t.trigger("elements:discard",e)}})},addElementView:function(e){},removeElementView:function(e){delete this.selectedIds[e.element.id],this._renderClearSelected(),this.elementViews=a.without(this.elementViews,e),this.stopListening(e)},_renderNoElementsLeft:function(){this._disableNameAndCreate(!0),this.$(".collection-elements").append(this.templates.noElementsLeft())},_elementToJSON:function(e){return e},createList:function(e){if(!this.workingElements.length){var t=c("No valid elements for final list")+". ";return t+=''+c("Cancel")+" ",t+=c("or"),t+=' '+c("start over")+".",void this._showAlert(t)}var i=this,n=this.workingElements.map(function(e){return i._elementToJSON(e)});return i.blocking=!0,i.creationFn(n,e).always(function(){i.blocking=!1}).fail(function(e,t,n){i.trigger("error",{xhr:e,status:t,message:c("An error occurred while creating this collection")})}).done(function(e,t,n){i.trigger("collection:created",e,t,n),i.metric("collection:created",e),"function"==typeof i.oncreate&&i.oncreate.call(this,e,t,n)})},_setUpBehaviors:function(){return this.on("error",this._errorHandler),this.once("rendered",function(){this.trigger("rendered:initial",this)}),this.on("elements:select",function(e){this._renderClearSelected()}),this.on("elements:discard",function(e){var t=e.source.element;this.removeElementView(e.source),this.workingElements=a.without(this.workingElements,t),this.workingElements.length||this._renderNoElementsLeft()}),this},_errorHandler:function(e){this.error(e);var t=this;if(content=e.message||c("An error occurred"),e.xhr){var i=e.xhr,n=e.message;0===i.readyState&&0===i.status?content+=": "+c("Galaxy could not be reached and may be updating.")+c(" Try again in a few minutes."):i.responseJSON?content+=":
",c(["Collections of datasets are permanent, ordered lists of datasets that can be passed to tools and ","workflows in order to have analyses done on each member of the entire group. This interface allows ","you to create a collection and re-order the final collection."].join("")),"
","
","
",c(["Rename elements in the list by clicking on ",'the existing name.'].join("")),"
","
",c(["Discard elements from the final created list by clicking on the ",'"Discard" button.'].join("")),"
","
",c(["Reorder the list by clicking and dragging elements. Select multiple elements by clicking on ",'them and you can then move those selected by dragging the ',"entire group. Deselect them by clicking them again or by clicking the ",'the "Clear selected" link.'].join("")),"
","
",c(['Click the "Start over" link to begin again as if you had just opened ',"the interface."].join("")),"
","
",c(['Click the "Cancel" button to exit the interface.'].join("")),"
","
","
",c(['Once your collection is complete, enter a name and ','click "Create list".'].join("")),"
"].join("")),invalidElements:a.template([c("The following selections could not be included due to problems:"),"
','',"<% if( _.size( problems ) ){ %>",c("The following selections could not be included due to problems"),":","
<% _.each( problems, function( problem ){ %>","
<%- problem.element.name %>: <%- problem.text %>
","<% }); %>
","<% } else if( _.size( elements ) < 1 ){ %>",c("No datasets were selected"),".","<% } %>"," ",c("At least one element is needed for the collection"),". ",c("You may need to "),'',c("cancel")," ",c("and reselect new elements"),".","","
","
",'"].join(""))},toString:function(){return"ListCollectionCreator"}}),g=function(e,t,i){var s,o=l.Deferred(),r=Galaxy.modal||new n.View;return t=a.defaults(t||{},{elements:e,oncancel:function(){r.hide(),o.reject("cancelled")},oncreate:function(e,t){r.hide(),o.resolve(t)}}),s=new i(t),r.show({title:t.title||c("Create a collection"),body:s.$el,width:"80%",height:"100%",closing_events:!0}),s.render(),window._collectionCreator=s,o},f=function(e,t){return t=t||{},t.title=c("Create a collection from a list of datasets"),g(e,t,p)};return{DatasetCollectionElementView:u,ListCollectionCreator:p,collectionCreatorModal:g,listCollectionCreatorModal:f,createListCollection:d}}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(3),i(2),i(1),i(1))},function(e,t,i){var n,s;(function(o,a,r,l){n=[i(43),i(12),i(22),i(6),i(5)],s=function(e,t,i,n,s){"use strict";var c="dataset",d=e.ListItemView,h=d.extend({_logNamespace:c,className:d.prototype.className+" dataset",id:function(){return["dataset",this.model.get("id")].join("-")},initialize:function(e){e.logger&&(this.logger=this.model.logger=e.logger),
-this.log(this+".initialize:",e),d.prototype.initialize.call(this,e),this.linkTarget=e.linkTarget||"_blank"},_setUpListeners:function(){d.prototype._setUpListeners.call(this);var e=this;return e.listenTo(e.model,{change:function(t,i){e.model.changedAttributes().state&&e.model.inReadyState()&&e.expanded&&!e.model.hasDetails()?e.model.fetch({silent:!0}).done(function(){e.render()}):e.render()}})},_fetchModelDetails:function(){var e=this;return e.model.inReadyState()&&!e.model.hasDetails()?e.model.fetch({silent:!0}):o.when()},remove:function(e,t){var i=this;e=e||this.fxSpeed,this.$el.fadeOut(e,function(){a.View.prototype.remove.call(i),t&&t.call(i)})},_swapNewRender:function(e){return d.prototype._swapNewRender.call(this,e),this.model.has("state")&&this.$el.addClass("state-"+this.model.get("state")),this.$el},_renderPrimaryActions:function(){return[this._renderDisplayButton()]},_renderDisplayButton:function(){var e=this.model.get("state");if(e===t.NOT_VIEWABLE||e===t.DISCARDED||!this.model.get("accessible"))return null;var n={target:this.linkTarget,classes:"display-btn"};if(this.model.get("purged"))n.disabled=!0,n.title=s("Cannot display datasets removed from disk");else if(e===t.UPLOAD)n.disabled=!0,n.title=s("This dataset must finish uploading before it can be viewed");else if(e===t.NEW)n.disabled=!0,n.title=s("This dataset is not yet viewable");else{n.title=s("View data"),n.href=this.model.urls.display;var o=this;n.onclick=function(e){Galaxy.frame&&Galaxy.frame.active&&(Galaxy.frame.addDataset(o.model.get("id")),e.preventDefault())}}return n.faIcon="fa-eye",i(n)},_renderDetails:function(){if(this.model.get("state")===t.NOT_VIEWABLE)return r(this.templates.noAccess(this.model.toJSON(),this));var e=d.prototype._renderDetails.call(this);return e.find(".actions .left").empty().append(this._renderSecondaryActions()),e.find(".summary").html(this._renderSummary()).prepend(this._renderDetailMessages()),e.find(".display-applications").html(this._renderDisplayApplications()),this._setUpBehaviors(e),e},_renderSummary:function(){var e=this.model.toJSON(),t=this.templates.summaries[e.state];return(t=t||this.templates.summaries.unknown)(e,this)},_renderDetailMessages:function(){var e=this,t=r(''),i=e.model.toJSON();return l.each(e.templates.detailMessages,function(n){t.append(r(n(i,e)))}),t},_renderDisplayApplications:function(){return this.model.isDeletedOrPurged()?"":[this.templates.displayApplications(this.model.get("display_apps"),this),this.templates.displayApplications(this.model.get("display_types"),this)].join("")},_renderSecondaryActions:function(){switch(this.debug("_renderSecondaryActions"),this.model.get("state")){case t.NOT_VIEWABLE:return[];case t.OK:case t.FAILED_METADATA:case t.ERROR:return[this._renderDownloadButton(),this._renderShowParamsButton()]}return[this._renderShowParamsButton()]},_renderShowParamsButton:function(){return i({title:s("View details"),classes:"params-btn",href:this.model.urls.show_params,target:this.linkTarget,faIcon:"fa-info-circle",onclick:function(e){Galaxy.frame&&Galaxy.frame.active&&(Galaxy.frame.add({title:"Dataset details",url:this.href}),e.preventDefault(),e.stopPropagation())}})},_renderDownloadButton:function(){return this.model.get("purged")||!this.model.hasData()?null:l.isEmpty(this.model.get("meta_files"))?r(['','',""].join("")):this._renderMetaFileDownloadButton()},_renderMetaFileDownloadButton:function(){var e=this.model.urls;return r(['
'}})}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(3),i(1))},function(e,t,n){var s,o;(function(a,r){s=[n(4),n(20)],o=function(e,t){var n=t.BaseIcons.extend({initialize:function(e){e.type=e.display||"checkbox",e.multiple="checkbox"==e.type,t.BaseIcons.prototype.initialize.call(this,e)},_setValue:function(e){if(t.BaseIcons.prototype._setValue.call(this,e),void 0!==e&&null!==e&&this.header_index){var i=this,n=a.isArray(e)?e:[e];r.each(n,function(e){var t=i.header_index[e];r.each(t,function(e){i._setState(e,!0)})})}},_setState:function(e,t){var i=this.$(".button-"+e),n=this.$(".subgroup-"+e);i.data("is_expanded",t),t?(n.show(),i.removeClass("fa-plus-square").addClass("fa-minus-square")):(n.hide(),i.removeClass("fa-minus-square").addClass("fa-plus-square"))},_templateOptions:function(){function t(e,t){var i=e.find(".button-"+t);i.on("click",function(){s._setState(t,!i.data("is_expanded"))})}function n(o,r,l){l=l||[];for(i in r){var c=r[i],d=c.options&&c.options.length>0,h=l.slice(0);s.header_index[c.value]=h.slice(0);var u=a("");if(d){var p=e.uid(),g=a("").addClass("button-"+p).addClass("ui-drilldown-button fa fa-plus-square"),f=a("").addClass("subgroup-"+p).addClass("ui-drilldown-subgroup");u.append(a("").append(g).append(s._templateOption({label:c.name,value:c.value}))),h.push(p),n(f,c.options,h),u.append(f),t(u,p)}else u.append(s._templateOption({label:c.name,value:c.value}));o.append(u)}}var s=this;this.header_index={};var o=a("");return n(o,this.model.get("data")),o},_template:function(){return a("").addClass("ui-options-list drilldown-container").attr("id",this.model.id)}});return{View:n}}.apply(t,s),!(void 0!==o&&(e.exports=o))}).call(t,n(1),n(2))},function(e,t,i){var n,s;(function(o,a,r){n=[i(4),i(7),i(21)],s=function(e,t,i){var n={DISABLED:"disabled",ENABLED:"enabled",LINKED:"linked"},s={data:[{src:"hda",icon:"fa-file-o",tooltip:"Single dataset",multiple:!1,batch:n.DISABLED},{src:"hda",icon:"fa-files-o",tooltip:"Multiple datasets",multiple:!0,batch:n.LINKED},{src:"hdca",icon:"fa-folder-o",tooltip:"Dataset collection",multiple:!1,batch:n.LINKED}],data_multiple:[{src:"hda",icon:"fa-files-o",tooltip:"Multiple datasets",multiple:!0,batch:n.DISABLED},{src:"hdca",icon:"fa-folder-o",tooltip:"Dataset collection",multiple:!1,batch:n.DISABLED}],data_collection:[{src:"hdca",icon:"fa-folder-o",tooltip:"Dataset collection",multiple:!1,batch:n.DISABLED}],workflow_data:[{src:"hda",icon:"fa-file-o",tooltip:"Single dataset",multiple:!1,batch:n.DISABLED}],workflow_data_multiple:[{src:"hda",icon:"fa-files-o",tooltip:"Multiple datasets",multiple:!0,batch:n.DISABLED}],workflow_data_collection:[{src:"hdca",icon:"fa-folder-o",tooltip:"Dataset collection",multiple:!1,batch:n.DISABLED}],module_data:[{src:"hda",icon:"fa-file-o",tooltip:"Single dataset",multiple:!1,batch:n.DISABLED},{src:"hda",icon:"fa-files-o",tooltip:"Multiple datasets",multiple:!0,batch:n.ENABLED}],module_data_collection:[{src:"hdca",icon:"fa-folder-o",tooltip:"Dataset collection",multiple:!1,batch:n.DISABLED},{src:"hdca",icon:"fa-folder",tooltip:"Multiple collections",multiple:!0,batch:n.ENABLED}]},l=o.View.extend({initialize:function(e){var i=this;this.model=e&&e.model||new o.Model({src_labels:{hda:"dataset",hdca:"dataset collection"},pagelimit:100}).set(e),this.setElement(a("").addClass("ui-select-content")),this.button_product=new t.RadioButton.View({value:"false",data:[{icon:"fa fa-chain",value:"false",tooltip:"Linked inputs will be run in matched order with other datasets e.g. use this for matching forward and reverse reads."},{icon:"fa fa-chain-broken",value:"true",tooltip:"Unlinked dataset inputs will be run against *all* other inputs."}]});var n=a("").addClass("ui-form-info").append(a("").addClass("fa fa-sitemap")).append(a("").html("This is a batch mode input field. Separate jobs will be triggered for each dataset selection."));this.$batch={linked:n.clone(),enabled:n.clone().append(a("").append(a("").addClass("ui-form-title").html("Batch options:")).append(this.button_product.$el)).append(a("").css("clear","both"))},this.history={},this.listenTo(this.model,"change:data",this._changeData,this),this.listenTo(this.model,"change:wait",this._changeWait,this),this.listenTo(this.model,"change:current",this._changeCurrent,this),this.listenTo(this.model,"change:value",this._changeValue,this),this.listenTo(this.model,"change:type change:optional change:multiple change:extensions",this._changeType,this),this.render(),this.on("change",function(){e.onchange&&e.onchange(i.value())})},render:function(){this._changeType(),this._changeValue(),this._changeWait()},wait:function(){this.model.set("wait",!0)},unwait:function(){this.model.set("wait",!1)},update:function(e){this.model.set("data",e)},value:function(e){void 0!==e&&this.model.set("value",e);var t=this.model.get("current");if(this.config[t]){var i=this.fields[t].value();if(null!==i&&(i=a.isArray(i)?i:[i],i.length>0)){var n=this._batch({values:[]});for(var s in i){var o=this.history[i[s]+"_"+this.config[t].src];if(!o)return Galaxy.emit.debug("ui-select-content::value()","Requested details not found for '"+i[s]+"'."),null;n.values.push(o)}return n.values.sort(function(e,t){return e.hid-t.hid}),n}}else Galaxy.emit.debug("ui-select-content::value()","Invalid value/source '"+e+"'.");return null},_changeCurrent:function(){var e=this;r.each(this.fields,function(t,i){e.model.get("current")==i?(t.$el.show(),r.each(e.$batch,function(t,n){t[e.config[i].batch==n?"show":"hide"]()}),e.button_type.value(i)):t.$el.hide()})},_changeType:function(){var n=this,o=(this.model.get("flavor")?this.model.get("flavor")+"_":"")+String(this.model.get("type"))+(this.model.get("multiple")?"_multiple":"");s[o]?this.config=s[o]:(this.config=s.data,
-Galaxy.emit.debug("ui-select-content::_changeType()","Invalid configuration/type id '"+o+"'."));var a=n.model.get("data"),l=e.textify(this.model.get("extensions")),c=this.model.get("src_labels");this.fields=[],this.button_data=[],r.each(this.config,function(e,t){n.button_data.push({value:t,icon:e.icon,tooltip:e.tooltip}),n.fields.push(new i.View({optional:n.model.get("optional"),multiple:e.multiple,searchable:!e.multiple||a&&a[e.src]&&a[e.src].length>n.model.get("pagelimit"),selectall:!1,error_text:"No "+(l?l+" ":"")+(c[e.src]||"content")+" available.",onchange:function(){n.trigger("change")}}))}),this.button_type=new t.RadioButton.View({value:this.model.get("current"),data:this.button_data,onchange:function(e){n.model.set("current",e),n.trigger("change")}}),this.$el.empty();var d=0;this.fields.length>1&&(this.$el.append(this.button_type.$el),d=Math.max(0,36*this.fields.length)+"px"),r.each(this.fields,function(e){n.$el.append(e.$el.css({"margin-left":d}))}),r.each(this.$batch,function(e,t){n.$el.append(e.css({"margin-left":d}))}),this.model.set("current",0),this._changeCurrent(),this._changeData()},_changeWait:function(){var e=this;r.each(this.fields,function(t){t[e.model.get("wait")?"wait":"unwait"]()})},_changeData:function(){var e=this.model.get("data"),t=this,i={};r.each(e,function(e,n){i[n]=[],r.each(e,function(e){i[n].push({hid:e.hid,keep:e.keep,label:e.hid+": "+e.name,value:e.id}),t.history[e.id+"_"+n]=e})}),r.each(this.config,function(e,n){i[e.src]&&t.fields[n].add(i[e.src],function(e,t){return t.hid-e.hid})})},_changeValue:function(){var e=this.model.get("value");if(e&&e.values&&e.values.length>0){var t=[];r.each(e.values,function(e){t.push(e.id)});for(var i=e.values[0].src,n=e.values.length>1,s=0;s
','<% if( collection.collection_type === "list" ){ %>',s("a list of datasets"),'<% } else if( collection.collection_type === "paired" ){ %>',s("a pair of datasets"),'<% } else if( collection.collection_type === "list:paired" ){ %>',s("a list of paired datasets"),'<% } else if( collection.collection_type === "list:list" ){ %>',s("a list of dataset lists"),"<% } %>","
","
","
"],"collection");return o.extend(o.clone(r.prototype.templates),{controls:e})}();var c=l.extend({DatasetDCEViewClass:i.DatasetDCEListItemView,toString:function(){return"ListCollectionView("+(this.model?this.model.get("name"):"")+")"}}),d=c.extend({toString:function(){return"PairCollectionView("+(this.model?this.model.get("name"):"")+")"}}),h=l.extend({NestedDCDCEViewClass:i.NestedDCDCEListItemView.extend({foldoutPanelClass:d}),toString:function(){return"ListOfPairsCollectionView("+(this.model?this.model.get("name"):"")+")"}}),u=l.extend({NestedDCDCEViewClass:i.NestedDCDCEListItemView.extend({foldoutPanelClass:d}),toString:function(){return"ListOfListsCollectionView("+(this.model?this.model.get("name"):"")+")"}});return{CollectionView:l,ListCollectionView:c,PairCollectionView:d,ListOfPairsCollectionView:h,ListOfListsCollectionView:u}}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(2))},function(e,t,i){var n,s;(function(o,a){n=[i(12),i(34),i(77),i(66),i(22),i(6),i(5)],s=function(e,t,n,s,r,l,c){"use strict";var d=t.DatasetListItemView,h=d.extend({initialize:function(e){d.prototype.initialize.call(this,e),this.hasUser=e.hasUser,this.purgeAllowed=e.purgeAllowed||!1,this.tagsEditorShown=e.tagsEditorShown||!1,this.annotationEditorShown=e.annotationEditorShown||!1},_renderPrimaryActions:function(){var t=d.prototype._renderPrimaryActions.call(this);return this.model.get("state")===e.NOT_VIEWABLE?t:d.prototype._renderPrimaryActions.call(this).concat([this._renderEditButton(),this._renderDeleteButton()])},_renderEditButton:function(){if(this.model.get("state")===e.DISCARDED||!this.model.get("accessible"))return null;var t=this.model.get("purged"),i=this.model.get("deleted"),n={title:c("Edit attributes"),href:this.model.urls.edit,target:this.linkTarget,faIcon:"fa-pencil",classes:"edit-btn"};return i||t?(n.disabled=!0,t?n.title=c("Cannot edit attributes of datasets removed from disk"):i&&(n.title=c("Undelete dataset to edit attributes"))):o.contains([e.UPLOAD,e.NEW],this.model.get("state"))&&(n.disabled=!0,n.title=c("This dataset is not yet editable")),r(n)},_renderDeleteButton:function(){if(!this.model.get("accessible"))return null;var e=this,t=this.model.isDeletedOrPurged();return r({title:c(t?"Dataset is already deleted":"Delete"),disabled:t,faIcon:"fa-times",classes:"delete-btn",onclick:function(){e.$el.find(".icon-btn.delete-btn").trigger("mouseout"),e.model.delete()}})},_renderDetails:function(){var t=d.prototype._renderDetails.call(this),i=this.model.get("state");return!this.model.isDeletedOrPurged()&&o.contains([e.OK,e.FAILED_METADATA],i)&&(this._renderTags(t),this._renderAnnotation(t),this._makeDbkeyEditLink(t)),this._setUpBehaviors(t),t},_renderToolHelpButton:function(){var e=this.model.attributes.dataset_id,t=this.model.attributes.creating_job,i=this,n=function(t){var n='
';t.name&&t.help?(n+="Tool help for "+t.name+"",n+=t.help):n+="Tool help is unavailable for this dataset.",n+="
",i.$el.find(".details").append(a.parseHTML(n))},s=function(e){a.ajax({url:Galaxy.root+"api/tools/"+e.tool_id+"/build"}).done(function(e){n(e)}).fail(function(){n({})})};return null===Galaxy.user.id?null:r({title:"Tool Help",classes:"icon-btn",href:"#",faIcon:"fa-question",onclick:function(){i.$el.find(".toolhelp").length>0?i.$el.find(".toolhelp").toggle():a.ajax({url:Galaxy.root+"api/jobs/"+t}).done(function(e){s(e)}).fail(function(){console.log('Failed at recovering job information from the Galaxy API for job id "'+t+'".')})}})},_renderSecondaryActions:function(){var t=d.prototype._renderSecondaryActions.call(this);switch(this.model.get("state")){case e.UPLOAD:case e.NOT_VIEWABLE:return t;case e.ERROR:return t.unshift(this._renderErrButton()),t.concat([this._renderRerunButton(),this._renderToolHelpButton()]);case e.OK:case e.FAILED_METADATA:return t.concat([this._renderRerunButton(),this._renderVisualizationsButton(),this._renderToolHelpButton()])}return t.concat([this._renderRerunButton(),this._renderToolHelpButton()])},_renderErrButton:function(){return r({title:c("View or report this error"),href:this.model.urls.report_error,classes:"report-error-btn",target:this.linkTarget,faIcon:"fa-bug"})},_renderRerunButton:function(){var e=this.model.get("creating_job");if(this.model.get("rerunnable"))return r({title:c("Run this job again"),href:this.model.urls.rerun,classes:"rerun-btn",target:this.linkTarget,faIcon:"fa-refresh",onclick:function(t){t.preventDefault(),!function(){var t=[i(18)];(function(t){var i=new t.View({job_id:e});i.deferred.execute(function(){Galaxy.app.display(i)})}).apply(null,t)}()}})},_renderVisualizationsButton:function(){var e=this.model.get("visualizations");if(this.model.isDeletedOrPurged()||!this.hasUser||!this.model.hasData()||o.isEmpty(e))return null;if(!o.isObject(e[0]))return this.warn("Visualizations have been switched off"),null;var t=a(this.templates.visualizations(e,this));return t.find('[target="galaxy_main"]').attr("target",this.linkTarget),this._addScratchBookFn(t.find(".visualization-link").addBack(".visualization-link")),t},_addScratchBookFn:function(e){e.click(function(e){Galaxy.frame&&Galaxy.frame.active&&(Galaxy.frame.add({title:"Visualization",url:a(this).attr("href")}),e.preventDefault(),e.stopPropagation())})},_renderTags:function(e){if(this.hasUser){var t=this;this.tagsEditor=new n.TagsEditor({model:this.model,el:e.find(".tags-display"),onshowFirstTime:function(){this.render()},onshow:function(){t.tagsEditorShown=!0},onhide:function(){t.tagsEditorShown=!1},$activator:r({title:c("Edit dataset tags"),classes:"tag-btn",faIcon:"fa-tags"}).appendTo(e.find(".actions .right"))}),this.tagsEditorShown&&this.tagsEditor.toggle(!0)}},_renderAnnotation:function(e){if(this.hasUser){var t=this;this.annotationEditor=new s.AnnotationEditor({model:this.model,el:e.find(".annotation-display"),onshowFirstTime:function(){this.render()},onshow:function(){t.annotationEditorShown=!0},onhide:function(){t.annotationEditorShown=!1},$activator:r({title:c("Edit dataset annotation"),classes:"annotate-btn",faIcon:"fa-comment"}).appendTo(e.find(".actions .right"))}),this.annotationEditorShown&&this.annotationEditor.toggle(!0)}},_makeDbkeyEditLink:function(e){if("?"===this.model.get("metadata_dbkey")&&!this.model.isDeletedOrPurged()){var t=a('?').attr("href",this.model.urls.edit).attr("target",this.linkTarget);e.find(".dbkey .value").replaceWith(t)}},events:o.extend(o.clone(d.prototype.events),{"click .undelete-link":"_clickUndeleteLink","click .purge-link":"_clickPurgeLink","click .edit-btn":function(e){this.trigger("edit",this,e)},"click .delete-btn":function(e){this.trigger("delete",this,e)},"click .rerun-btn":function(e){this.trigger("rerun",this,e)},"click .report-err-btn":function(e){this.trigger("report-err",this,e)},"click .visualization-btn":function(e){this.trigger("visualize",this,e)},"click .dbkey a":function(e){this.trigger("edit",this,e)}}),_clickUndeleteLink:function(e){return this.model.undelete(),!1},_clickPurgeLink:function(e){return confirm(c("This will permanently remove the data in your dataset. Are you sure?"))&&this.model.purge(),!1},toString:function(){var e=this.model?this.model+"":"(no model)";return"HDAEditView("+e+")"}});return h.prototype.templates=function(){var e=o.extend({},d.prototype.templates.warnings,{failed_metadata:l.wrapTemplate(['<% if( dataset.state === "failed_metadata" ){ %>','
"}}),this.$(".select2-container .select2-search input").off("blur")):(this.$select.find("option").remove(),r.each(this.data,function(t){e.$select.append(a("").attr("value",t.value).html(r.escape(t.label)))})),this.model.set("disabled",0==this.length()),this._changeValue()},_changeDisabled:function(){this.model.get("searchable")?this.$select.select2(this.model.get("disabled")?"disable":"enable"):this.$select.prop("disabled",this.model.get("disabled"))},_changeWait:function(){this.$dropdown.removeClass().addClass("icon-dropdown fa").addClass(this.model.get("wait")?"fa-spinner fa-spin":"fa-caret-down")},_changeVisible:function(){this.$el[this.model.get("visible")?"show":"hide"](),this.$select[this.model.get("visible")?"show":"hide"]()},_changeValue:function(){if(this._setValue(this.model.get("value")),this.model.get("multiple")){if(this.all_button){var e=this._getValue();this.all_button.value(a.isArray(e)?e.length:0,this.length())}}else null!==this._getValue()||this.model.get("optional")||this._setValue(this.first())},value:function(e){return void 0!==e&&this.model.set("value",e),this._getValue()},first:function(){return this.data.length>0?this.data[0].value:null},exists:function(e){return r.findWhere(this.data,{value:e})},text:function(){var e=this._getValue(),t=this.exists(a.isArray(e)?e[0]:e);return t?t.label:""},show:function(){this.model.set("visible",!0)},hide:function(){this.model.set("visible",!1)},wait:function(){this.model.set("wait",!0)},unwait:function(){this.model.set("wait",!1)},disabled:function(){return this.model.get("disabled")},enable:function(){this.model.set("disabled",!1)},disable:function(){this.model.set("disabled",!0)},add:function(e,t){r.each(this.model.get("data"),function(t){t.keep&&!r.findWhere(e,{value:t.value})&&e.push(t)}),t&&e&&e.sort(t),this.model.set("data",e)},update:function(e){this.model.set("data",e)},setOnChange:function(e){this.model.set("onchange",e)},length:function(){return a.isArray(this.model.get("data"))?this.model.get("data").length:0},_setValue:function(e){var t=this;if(null!==e&&void 0!==e||(e="__null__"),this.model.get("multiple")?e=a.isArray(e)?e:[e]:a.isArray(e)&&(e=e.length>0?e[0]:"__null__"),this.model.get("searchable")){if(a.isArray(e))val=[],r.each(e,function(e){var i=r.findWhere(t.data2,{id:e});i&&val.push(i)}),e=val;else{var i=r.findWhere(this.data2,{id:e});e=i}this.$select.select2("data",e)}else this.$select.val(e)},_getValue:function(){var t=null;if(this.model.get("searchable")){var i=this.$select.select2("data");i&&(a.isArray(i)?(t=[],i.sort(function(e,t){return e.order-t.order}),r.each(i,function(e){t.push(e.id)})):t=i.id)}else t=this.$select.val();return e.isEmpty(t)?null:t}});return{View:i}}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(3),i(1),i(2))},function(e,t,i){var n,s,o;(function(i,a){!function(i,a){s=[],n=a,o="function"==typeof n?n.apply(t,s):n,!(void 0!==o&&(e.exports=o))}(this,function(){var e=function(e){e=e||{},e.tooltipConfig=e.tooltipConfig||{placement:"bottom"},e.classes=["icon-btn"].concat(e.classes||[]),e.disabled&&e.classes.push("disabled");var t=['','',""].join(""),n=i(t).tooltip(e.tooltipConfig);return a.isFunction(e.onclick)&&n.click(e.onclick),n};return e})}).call(t,i(1),i(2))},function(e,t,i){var n,s;(function(o,a,r){n=[i(4),i(9),i(7),i(38),i(34)],s=function(e,t,i,n,s){return o.View.extend({initialize:function(e){this.model=new o.Model({initial_errors:!1,cls:"ui-portlet-limited",icon:null,always_refresh:!0,message_status:"warning"}).set(e),this.setElement(""),this.render()},update:function(e){var t=this;this.data.matchModel(e,function(e,i){var n=t.input_list[i];if(n&&n.options&&!a.isEqual(n.options,e.options)){n.options=e.options;var s=t.field_list[i];if(s.update){var o=[];if(["data","data_collection","drill_down"].indexOf(n.type)!=-1)o=n.options;else for(var r in e.options){var l=e.options[r];l.length>2&&o.push({label:l[0],value:l[1]})}s.update(o),s.trigger("change"),Galaxy.emit.debug("form-view::update()","Updating options for "+i)}}})},wait:function(e){for(var t in this.input_list){var i=this.field_list[t],n=this.input_list[t];n.is_dynamic&&i.wait&&i.unwait&&i[e?"wait":"unwait"]()}},highlight:function(e,t,i){var n=this.element_list[e];if(n&&(n.error(t||"Please verify this parameter."),this.portlet.expand(),this.trigger("expand",e),!i)){var s=this.$el.parents().filter(function(){return["auto","scroll"].indexOf(r(this).css("overflow"))!=-1}).first();s.animate({scrollTop:s.scrollTop()+n.$el.offset().top-120},500)}},errors:function(e){if(this.trigger("reset"),e&&e.errors){var t=this.data.matchResponse(e.errors);for(var i in this.element_list){this.element_list[i];t[i]&&this.highlight(i,t[i],!0)}}},render:function(){var e=this;this.off("change"),this.off("reset"),this.field_list={},this.input_list={},this.element_list={},this.data=new s.Manager(this),this._renderForm(),this.data.create(),this.model.get("initial_errors")&&this.errors(this.model.attributes);var t=this.data.checksum();return this.on("change",function(i){var n=e.input_list[i];if(!n||n.refresh_on_change||e.model.get("always_refresh")){var s=e.data.checksum();s!=t&&(t=s,e.model.get("onchange")&&e.model.get("onchange")())}}),this.on("reset",function(){a.each(e.element_list,function(e){e.reset()})}),this},_renderForm:function(){r(".tooltip").remove();var e=this.model.attributes;this.message=new i.UnescapedMessage,this.section=new n.View(this,{inputs:e.inputs}),this.portlet=new t.View({icon:e.icon,title:e.title,cls:e.cls,operations:e.operations,buttons:e.buttons,collapsible:e.collapsible,collapsed:e.collapsed,onchange_title:e.onchange_title}),this.portlet.append(this.message.$el),this.portlet.append(this.section.$el),this.$el.empty(),e.inputs&&this.$el.append(this.portlet.$el),e.message&&this.message.update({persistent:!0,status:e.message_status,message:e.message}),Galaxy.emit.debug("form-view::initialize()","Completed")}})}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(3),i(2),i(1))},function(e,t,i){var n,s;(function(o,a,r){n=[i(4),i(7),i(8),i(43),i(27)],s=function(e,t,i,n,s){var l=o.View.extend({initialize:function(s){var o=this;this.modal=parent.Galaxy.modal||new i.View,this.form=new n(e.merge({listen_to_history:!0,always_refresh:!1,customize:function(e){var i=e.model.attributes;i.buttons={execute:execute_btn=new t.Button({icon:"fa-check",tooltip:"Execute: "+i.name+" ("+i.version+")",title:"Execute",cls:"ui-button btn btn-primary",floating:"clear",onclick:function(){execute_btn.wait(),e.portlet.disable(),o.submit(i,function(){execute_btn.unwait(),e.portlet.enable()})}})},i.job_id&&i.job_remap&&i.inputs.push({label:"Resume dependencies from this job",name:"rerun_remap_job_id",type:"select",display:"radio",ignore:"__ignore__",value:"__ignore__",options:[["Yes",i.job_id],["No","__ignore__"]],help:"The previous run of this tool failed and other tools were waiting for it to finish successfully. Use this option to resume those tools using the new output(s) of this tool run."})},postchange:function(t,i){var n={tool_id:i.model.get("id"),tool_version:i.model.get("version"),inputs:a.extend(!0,{},i.data.create())};i.wait(!0),Galaxy.emit.debug("tool-form::postchange()","Sending current state.",n),e.request({type:"POST",url:Galaxy.root+"api/tools/"+i.model.get("id")+"/build",data:n,success:function(e){i.update(e),i.wait(!1),Galaxy.emit.debug("tool-form::postchange()","Received new model.",e),t.resolve()},error:function(e){Galaxy.emit.debug("tool-form::postchange()","Refresh request failed.",e),t.reject()}})}},s)),this.deferred=this.form.deferred,this.setElement(""),this.$el.append(this.form.$el)},submit:function(t,i){var n=this,o={tool_id:t.id,tool_version:t.version,inputs:this.form.data.create()};if(this.form.trigger("reset"),!n.validate(o))return Galaxy.emit.debug("tool-form::submit()","Submission canceled. Validation failed."),void(i&&i());if(t.action!==Galaxy.root+"tool_runner/index"){var l=a("").attr({action:t.action,method:t.method,enctype:t.enctype});return r.each(o.inputs,function(e,t){l.append(a("").attr({name:t,value:e}))}),l.hide().appendTo("body").submit().remove(),void(i&&i())}Galaxy.emit.debug("tool-form::submit()","Validation complete.",o),e.request({type:"POST",url:Galaxy.root+"api/tools",data:o,success:function(e){if(i&&i(),n.$el.children().hide(),n.$el.append(n._templateSuccess(e)),e.jobs&&e.jobs.length>0){n.$el.append(a("",{id:"webhook-view"}));new s.WebhookView({urlRoot:Galaxy.root+"api/webhooks/tool"})}parent.Galaxy&&parent.Galaxy.currHistoryPanel&&parent.Galaxy.currHistoryPanel.refreshContents()},error:function(e){i&&i(),Galaxy.emit.debug("tool-form::submit","Submission failed.",e);var t=!1;if(e&&e.err_data){var s=n.form.data.matchResponse(e.err_data);for(var a in s){n.form.highlight(a,s[a]),t=!0;break}}t||n.modal.show({title:"Job submission failed",body:n._templateError(o,e&&e.err_msg),buttons:{Close:function(){n.modal.hide()}}})}})},validate:function(e){var t=e.inputs,i=-1,n=null;for(var s in t){var o=t[s],a=this.form.data.match(s),r=this.form.field_list[a],l=this.form.input_list[a];if(a&&l&&r){if(!l.optional&&null==o)return this.form.highlight(a),!1;if(o&&o.batch){var c=o.values.length,d=c>0&&o.values[0]&&o.values[0].src;if(d)if(null===n)n=d;else if(n!==d)return this.form.highlight(a,"Please select either dataset or dataset list fields for all batch mode fields."),!1;if(i===-1)i=c;else if(i!==c)return this.form.highlight(a,"Please make sure that you select the same number of inputs for all batch mode fields. This field contains "+c+" selection(s) while a previous field contains "+i+"."),!1}}else Galaxy.emit.debug("tool-form::validate()","Retrieving input objects failed.")}return!0},_templateSuccess:function(e){if(e.jobs&&e.jobs.length>0){var t=e.jobs.length,i=1==t?"1 job has":t+" jobs have",n=a("").addClass("donemessagelarge").append(a("").text(i+" been successfully added to the queue - resulting in the following datasets:"));return r.each(e.outputs,function(e){n.append(a("").addClass("messagerow").append(a("").text(e.hid+": "+e.name)))}),n.append(a("").append("").text("You can check the status of queued jobs and view the resulting data by refreshing the History pane. When the job has been run the status will change from 'running' to 'finished' if completed successfully or 'error' if problems were encountered.")),n}return this._templateError(e,"Invalid success response. No jobs found.")},_templateError:function(e,t){return a("").addClass("errormessagelarge").append(a("").text("The server could not complete the request. Please contact the Galaxy Team if this error persists. "+(t||""))).append(a("").text(JSON.stringify(e,null,4)))}});return{View:l}}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(3),i(1),i(2))},,function(e,t,i){var n,s;(function(o,a,r){n=[i(4)],s=function(e){var t=o.View.extend({optionsDefault:{with_close:!0,title:null,placement:"top",container:"body",body:null},initialize:function(t){this.setElement(this._template()),this.uid=e.uid(),this.options=a.defaults(t||{},this.optionsDefault),this.options.container.parent().append(this.el),this.$title=this.$(".popover-title-label"),this.$close=this.$(".popover-close"),this.$body=this.$(".popover-content"),this.options.body&&this.append(this.options.body);var i=this;r("body").on("mousedown."+this.uid,function(e){i.visible&&!r(i.options.container).is(e.target)&&!r(i.el).is(e.target)&&0===r(i.el).has(e.target).length&&i.hide()})},render:function(){this.$title.html(this.options.title),this.$el.removeClass().addClass("ui-popover popover fade in").addClass(this.options.placement),this.$el.css(this._get_placement(this.options.placement));var e=this;this.options.with_close?this.$close.on("click",function(){e.hide()}).show():this.$close.off().hide()},title:function(e){void 0!==e&&(this.options.title=e,this.$title.html(e))},show:function(){this.render(),this.$el.show(),this.visible=!0},hide:function(){this.$el.hide(),this.visible=!1},append:function(e){this.$body.append(e)},empty:function(){this.$body.empty()},remove:function(){r("body").off("mousedown."+this.uid),this.$el.remove()},_get_placement:function(e){var t=this._get_width(this.$el),i=this.$el.height(),n=this.options.container,s=this._get_width(n),o=this._get_height(n),a=n.position(),r=left=0;if(["top","bottom"].indexOf(e)!=-1)switch(left=a.left-t+(s+t)/2,e){case"top":r=a.top-i-5;break;case"bottom":r=a.top+o+5}else switch(r=a.top-i+(o+i)/2,e){case"right":left=a.left+s}return{top:r,left:left}},_get_width:function(e){return e.width()+parseInt(e.css("padding-left"))+parseInt(e.css("margin-left"))+parseInt(e.css("padding-right"))+parseInt(e.css("margin-right"))},_get_height:function(e){return e.height()+parseInt(e.css("padding-top"))+parseInt(e.css("padding-bottom"))},_template:function(e){return'
',"Warning: This is a experimental feature. Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' cite Galaxy.',"
'}})}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(3),i(1))},function(e,t,n){var s,o;(function(a,r){s=[n(4),n(19)],o=function(e,t){var n=t.BaseIcons.extend({initialize:function(e){e.type=e.display||"checkbox",e.multiple="checkbox"==e.type,t.BaseIcons.prototype.initialize.call(this,e)},_setValue:function(e){if(t.BaseIcons.prototype._setValue.call(this,e),void 0!==e&&null!==e&&this.header_index){var i=this,n=a.isArray(e)?e:[e];r.each(n,function(e){var t=i.header_index[e];r.each(t,function(e){i._setState(e,!0)})})}},_setState:function(e,t){var i=this.$(".button-"+e),n=this.$(".subgroup-"+e);i.data("is_expanded",t),t?(n.show(),i.removeClass("fa-plus-square").addClass("fa-minus-square")):(n.hide(),i.removeClass("fa-minus-square").addClass("fa-plus-square"))},_templateOptions:function(){function t(e,t){var i=e.find(".button-"+t);i.on("click",function(){s._setState(t,!i.data("is_expanded"))})}function n(o,r,l){l=l||[];for(i in r){var c=r[i],d=c.options&&c.options.length>0,h=l.slice(0);s.header_index[c.value]=h.slice(0);var u=a("");if(d){var p=e.uid(),g=a("").addClass("button-"+p).addClass("ui-drilldown-button fa fa-plus-square"),f=a("").addClass("subgroup-"+p).addClass("ui-drilldown-subgroup");u.append(a("").append(g).append(s._templateOption({label:c.name,value:c.value}))),h.push(p),n(f,c.options,h),u.append(f),t(u,p)}else u.append(s._templateOption({label:c.name,value:c.value}));o.append(u)}}var s=this;this.header_index={};var o=a("");return n(o,this.model.get("data")),o},_template:function(){return a("").addClass("ui-options-list drilldown-container").attr("id",this.model.id)}});return{View:n}}.apply(t,s),!(void 0!==o&&(e.exports=o))}).call(t,n(1),n(2))},function(e,t,i){var n,s;(function(o,a,r){n=[i(4),i(7),i(20)],s=function(e,t,i){var n={DISABLED:"disabled",ENABLED:"enabled",LINKED:"linked"},s={data:[{src:"hda",icon:"fa-file-o",tooltip:"Single dataset",multiple:!1,batch:n.DISABLED},{src:"hda",icon:"fa-files-o",tooltip:"Multiple datasets",multiple:!0,batch:n.LINKED},{src:"hdca",icon:"fa-folder-o",tooltip:"Dataset collection",multiple:!1,batch:n.LINKED}],data_multiple:[{src:"hda",icon:"fa-files-o",tooltip:"Multiple datasets",multiple:!0,batch:n.DISABLED},{src:"hdca",icon:"fa-folder-o",tooltip:"Dataset collection",multiple:!1,batch:n.DISABLED}],data_collection:[{src:"hdca",icon:"fa-folder-o",tooltip:"Dataset collection",multiple:!1,batch:n.DISABLED}],workflow_data:[{src:"hda",icon:"fa-file-o",tooltip:"Single dataset",multiple:!1,batch:n.DISABLED}],workflow_data_multiple:[{src:"hda",icon:"fa-files-o",tooltip:"Multiple datasets",multiple:!0,batch:n.DISABLED}],workflow_data_collection:[{src:"hdca",icon:"fa-folder-o",tooltip:"Dataset collection",multiple:!1,batch:n.DISABLED}],module_data:[{src:"hda",icon:"fa-file-o",tooltip:"Single dataset",multiple:!1,batch:n.DISABLED},{src:"hda",icon:"fa-files-o",tooltip:"Multiple datasets",multiple:!0,batch:n.ENABLED}],module_data_collection:[{src:"hdca",icon:"fa-folder-o",tooltip:"Dataset collection",multiple:!1,batch:n.DISABLED},{src:"hdca",icon:"fa-folder",tooltip:"Multiple collections",multiple:!0,batch:n.ENABLED}]},l=o.View.extend({initialize:function(e){var i=this;this.model=e&&e.model||new o.Model({src_labels:{hda:"dataset",hdca:"dataset collection"},pagelimit:100}).set(e),this.setElement(a("").addClass("ui-select-content")),this.button_product=new t.RadioButton.View({value:"false",data:[{icon:"fa fa-chain",value:"false",tooltip:"Linked inputs will be run in matched order with other datasets e.g. use this for matching forward and reverse reads."},{icon:"fa fa-chain-broken",value:"true",tooltip:"Unlinked dataset inputs will be run against *all* other inputs."}]});var n=a("").addClass("ui-form-info").append(a("").addClass("fa fa-sitemap")).append(a("").html("This is a batch mode input field. Separate jobs will be triggered for each dataset selection."));this.$batch={linked:n.clone(),enabled:n.clone().append(a("").append(a("").addClass("ui-form-title").html("Batch options:")).append(this.button_product.$el)).append(a("").css("clear","both"))},this.history={},this.listenTo(this.model,"change:data",this._changeData,this),this.listenTo(this.model,"change:wait",this._changeWait,this),this.listenTo(this.model,"change:current",this._changeCurrent,this),this.listenTo(this.model,"change:value",this._changeValue,this),this.listenTo(this.model,"change:type change:optional change:multiple change:extensions",this._changeType,this),this.render(),this.on("change",function(){e.onchange&&e.onchange(i.value())})},render:function(){this._changeType(),this._changeValue(),this._changeWait()},wait:function(){this.model.set("wait",!0)},unwait:function(){this.model.set("wait",!1)},update:function(e){this.model.set("data",e)},value:function(e){void 0!==e&&this.model.set("value",e);var t=this.model.get("current");if(this.config[t]){var i=this.fields[t].value();if(null!==i&&(i=a.isArray(i)?i:[i],i.length>0)){var n=this._batch({values:[]});for(var s in i){var o=this.history[i[s]+"_"+this.config[t].src];if(!o)return Galaxy.emit.debug("ui-select-content::value()","Requested details not found for '"+i[s]+"'."),null;n.values.push(o)}return n.values.sort(function(e,t){return e.hid-t.hid}),n}}else Galaxy.emit.debug("ui-select-content::value()","Invalid value/source '"+e+"'.");return null},_changeCurrent:function(){var e=this;r.each(this.fields,function(t,i){e.model.get("current")==i?(t.$el.show(),r.each(e.$batch,function(t,n){t[e.config[i].batch==n?"show":"hide"]()}),e.button_type.value(i)):t.$el.hide()})},_changeType:function(){var n=this,o=(this.model.get("flavor")?this.model.get("flavor")+"_":"")+String(this.model.get("type"))+(this.model.get("multiple")?"_multiple":"");s[o]?this.config=s[o]:(this.config=s.data,Galaxy.emit.debug("ui-select-content::_changeType()","Invalid configuration/type id '"+o+"'."));var a=n.model.get("data"),l=e.textify(this.model.get("extensions")),c=this.model.get("src_labels");this.fields=[],this.button_data=[],r.each(this.config,function(e,t){n.button_data.push({value:t,icon:e.icon,tooltip:e.tooltip}),n.fields.push(new i.View({optional:n.model.get("optional"),multiple:e.multiple,searchable:!e.multiple||a&&a[e.src]&&a[e.src].length>n.model.get("pagelimit"),selectall:!1,error_text:"No "+(l?l+" ":"")+(c[e.src]||"content")+" available.",onchange:function(){n.trigger("change")}}))}),this.button_type=new t.RadioButton.View({value:this.model.get("current"),data:this.button_data,onchange:function(e){n.model.set("current",e),n.trigger("change")}}),this.$el.empty();var d=0;this.fields.length>1&&(this.$el.append(this.button_type.$el),d=Math.max(0,36*this.fields.length)+"px"),r.each(this.fields,function(e){n.$el.append(e.$el.css({"margin-left":d}))}),r.each(this.$batch,function(e,t){n.$el.append(e.css({"margin-left":d}))}),this.model.set("current",0),this._changeCurrent(),this._changeData()},_changeWait:function(){var e=this;r.each(this.fields,function(t){t[e.model.get("wait")?"wait":"unwait"]()})},_changeData:function(){var e=this.model.get("data"),t=this,i={};r.each(e,function(e,n){i[n]=[],r.each(e,function(e){i[n].push({hid:e.hid,keep:e.keep,label:e.hid+": "+e.name,value:e.id,tags:e.tags}),t.history[e.id+"_"+n]=e})}),r.each(this.config,function(e,n){i[e.src]&&t.fields[n].add(i[e.src],function(e,t){return t.hid-e.hid})})},_changeValue:function(){var e=this.model.get("value");if(e&&e.values&&e.values.length>0){var t=[];r.each(e.values,function(e){t.push(e.id)});for(var i=e.values[0].src,n=e.values.length>1,s=0;s
','<% if( collection.collection_type === "list" ){ %>',s("a list of datasets"),'<% } else if( collection.collection_type === "paired" ){ %>',s("a pair of datasets"),'<% } else if( collection.collection_type === "list:paired" ){ %>',s("a list of paired datasets"),'<% } else if( collection.collection_type === "list:list" ){ %>',s("a list of dataset lists"),"<% } %>","
","
","
"],"collection");return o.extend(o.clone(r.prototype.templates),{controls:e})}();var c=l.extend({DatasetDCEViewClass:i.DatasetDCEListItemView,toString:function(){return"ListCollectionView("+(this.model?this.model.get("name"):"")+")"}}),d=c.extend({toString:function(){return"PairCollectionView("+(this.model?this.model.get("name"):"")+")"}}),h=l.extend({NestedDCDCEViewClass:i.NestedDCDCEListItemView.extend({foldoutPanelClass:d}),toString:function(){return"ListOfPairsCollectionView("+(this.model?this.model.get("name"):"")+")"}}),u=l.extend({NestedDCDCEViewClass:i.NestedDCDCEListItemView.extend({foldoutPanelClass:d}),toString:function(){return"ListOfListsCollectionView("+(this.model?this.model.get("name"):"")+")"}});return{CollectionView:l,ListCollectionView:c,PairCollectionView:d,ListOfPairsCollectionView:h,ListOfListsCollectionView:u}}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(2))},function(e,t,i){var n,s;(function(o,a,r,l){n=[i(39),i(12),i(6),i(67),i(8),i(89),i(5),i(86)],s=function(e,t,i,n,s,c,d){"use strict";function h(e){var t=e.toJSON(),i=m(t,{creationFn:function(t,i){return t=t.map(function(e){return{id:e.id,name:e.name,src:"dataset"===e.history_content_type?"hda":"hdca"}}),e.createHDCA(t,"list",i)}});return i}var u="collections",p=o.View.extend(i.LoggableMixin).extend({_logNamespace:u,tagName:"li",className:"collection-element",initialize:function(e){this.element=e.element||{},this.selected=e.selected||!1},render:function(){return this.$el.attr("data-element-id",this.element.id).attr("draggable",!0).html(this.template({element:this.element})),this.selected&&this.$el.addClass("selected"),this},template:a.template(['',"<%- element.name %>","",'"].join("")),select:function(e){this.$el.toggleClass("selected",e),this.trigger("select",{source:this,selected:this.$el.hasClass("selected")})},discard:function(){var e=this,t=this.$el.parent().width();this.$el.animate({"margin-right":t},"fast",function(){e.trigger("discard",{source:e}),e.destroy()})},destroy:function(){this.off(),this.$el.remove()},events:{click:"_click","click .name":"_clickName","click .discard":"_clickDiscard",dragstart:"_dragstart",dragend:"_dragend",dragover:"_sendToParent",drop:"_sendToParent"},_click:function(e){e.stopPropagation(),this.select(e)},_clickName:function(e){e.stopPropagation(),e.preventDefault();var t=([d("Enter a new name for the element"),":\n(",d("Note that changing the name here will not rename the dataset"),")"].join(""),prompt(d("Enter a new name for the element")+":",this.element.name));t&&(this.element.name=t,this.render())},_clickDiscard:function(e){e.stopPropagation(),this.discard()},_dragstart:function(e){e.originalEvent&&(e=e.originalEvent),e.dataTransfer.effectAllowed="move",e.dataTransfer.setData("text/plain",JSON.stringify(this.element)),this.$el.addClass("dragging"),this.$el.parent().trigger("collection-element.dragstart",[this])},_dragend:function(e){this.$el.removeClass("dragging"),this.$el.parent().trigger("collection-element.dragend",[this])},_sendToParent:function(e){this.$el.parent().trigger(e)},toString:function(){return"DatasetCollectionElementView()"}}),g=o.View.extend(i.LoggableMixin).extend(n.CollectionCreatorMixin).extend({_logNamespace:u,elementViewClass:p,collectionClass:e.HistoryListDatasetCollection,className:"list-collection-creator collection-creator flex-row-container",minElements:1,defaultAttributes:{creationFn:function(){throw new TypeError("no creation fn for creator")},oncreate:function(){},oncancel:function(){},autoscrollDist:24,highlightClr:"rgba( 64, 255, 255, 1.0 )"},initialize:function(e){this.metric("ListCollectionCreator.initialize",e);var t=this;a.each(this.defaultAttributes,function(i,n){i=e[n]||i,t[n]=i}),t.initialElements=e.elements||[],this._instanceSetUp(),this._elementsSetUp(),this._setUpBehaviors()},_instanceSetUp:function(){this.selectedIds={},this.$dragging=null,this.blocking=!1},_elementsSetUp:function(){this.invalidElements=[],this.workingElements=[],this.elementViews=[],this.workingElements=this.initialElements.slice(0),this._ensureElementIds(),this._validateElements(),this._mangleDuplicateNames(),this._sortElements()},_ensureElementIds:function(){return this.workingElements.forEach(function(e){e.hasOwnProperty("id")||(e.id=a.uniqueId())}),this.workingElements},_validateElements:function(){var e=this;return e.invalidElements=[],this.workingElements=this.workingElements.filter(function(t){var i=e._isElementInvalid(t);return i&&e.invalidElements.push({element:t,text:i}),!i}),this.workingElements},_isElementInvalid:function(e){return"dataset"!==e.history_content_type?d("is not a dataset"):e.state!==t.OK?d(a.contains(t.NOT_READY_STATES,e.state)?"hasn't finished running yet":"has errored, is paused, or is not accessible"):e.deleted||e.purged?d("has been deleted or purged"):null},_mangleDuplicateNames:function(){var e=900,t=1,i={};this.workingElements.forEach(function(n){for(var s=n.name;i.hasOwnProperty(s);)if(s=n.name+" ("+t+")",t+=1,t>=e)throw new Error("Safety hit in while loop - thats impressive");n.name=s,i[n.name]=!0})},_sortElements:function(e){},render:function(e,t){return this.workingElements.length .clear-selected").show():this.$(".collection-elements-controls > .clear-selected").hide()},_renderList:function(e,t){var i=this,n=l(""),s=i.$list();a.each(this.elementViews,function(e){e.destroy(),i.removeElementView(e)}),i.workingElements.forEach(function(e){var t=i._createElementView(e);n.append(t.$el)}),i._renderClearSelected(),s.empty().append(n.children()),a.invoke(i.elementViews,"render"),s.height()>s.css("max-height")?s.css("border-width","1px 0px 1px 0px"):s.css("border-width","0px")},_createElementView:function(e){var t=new this.elementViewClass({element:e,selected:a.has(this.selectedIds,e.id)});return this.elementViews.push(t),this._listenToElementView(t),t},_listenToElementView:function(e){var t=this;t.listenTo(e,{select:function(e){var i=e.source.element;e.selected?t.selectedIds[i.id]=!0:delete t.selectedIds[i.id],t.trigger("elements:select",e)},discard:function(e){t.trigger("elements:discard",e)}})},addElementView:function(e){},removeElementView:function(e){delete this.selectedIds[e.element.id],this._renderClearSelected(),this.elementViews=a.without(this.elementViews,e),this.stopListening(e)},_renderNoElementsLeft:function(){this._disableNameAndCreate(!0),this.$(".collection-elements").append(this.templates.noElementsLeft())},_elementToJSON:function(e){return e},createList:function(e){if(!this.workingElements.length){var t=d("No valid elements for final list")+". ";return t+=''+d("Cancel")+" ",t+=d("or"),t+=' '+d("start over")+".",void this._showAlert(t)}var i=this,n=this.workingElements.map(function(e){return i._elementToJSON(e)});return i.blocking=!0,i.creationFn(n,e).always(function(){i.blocking=!1}).fail(function(e,t,n){i.trigger("error",{xhr:e,status:t,message:d("An error occurred while creating this collection")})}).done(function(e,t,n){i.trigger("collection:created",e,t,n),i.metric("collection:created",e),"function"==typeof i.oncreate&&i.oncreate.call(this,e,t,n)})},_setUpBehaviors:function(){return this.on("error",this._errorHandler),this.once("rendered",function(){this.trigger("rendered:initial",this)}),this.on("elements:select",function(e){this._renderClearSelected()}),this.on("elements:discard",function(e){var t=e.source.element;this.removeElementView(e.source),this.workingElements=a.without(this.workingElements,t),this.workingElements.length||this._renderNoElementsLeft()}),this},_errorHandler:function(e){this.error(e);var t=this;if(content=e.message||d("An error occurred"),e.xhr){var i=e.xhr,n=e.message;0===i.readyState&&0===i.status?content+=": "+d("Galaxy could not be reached and may be updating.")+d(" Try again in a few minutes."):i.responseJSON?content+=":
",d(["Collections of datasets are permanent, ordered lists of datasets that can be passed to tools and ","workflows in order to have analyses done on each member of the entire group. This interface allows ","you to create a collection and re-order the final collection."].join("")),"
","
","
",d(["Rename elements in the list by clicking on ",'the existing name.'].join("")),"
","
",d(["Discard elements from the final created list by clicking on the ",'"Discard" button.'].join("")),"
","
",d(["Reorder the list by clicking and dragging elements. Select multiple elements by clicking on ",'them and you can then move those selected by dragging the ',"entire group. Deselect them by clicking them again or by clicking the ",'the "Clear selected" link.'].join("")),"
","
",d(['Click the "Start over" link to begin again as if you had just opened ',"the interface."].join("")),"
","
",d(['Click the "Cancel" button to exit the interface.'].join("")),"
","
","
",d(['Once your collection is complete, enter a name and ','click "Create list".'].join("")),"
"].join("")),invalidElements:a.template([d("The following selections could not be included due to problems:"),"
','',"<% if( _.size( problems ) ){ %>",d("The following selections could not be included due to problems"),":","
<% _.each( problems, function( problem ){ %>","
<%- problem.element.name %>: <%- problem.text %>
","<% }); %>
","<% } else if( _.size( elements ) < 1 ){ %>",d("No datasets were selected"),".","<% } %>"," ",d("At least one element is needed for the collection"),". ",d("You may need to "),'',d("cancel")," ",d("and reselect new elements"),".","","
","
",'"].join(""))}),toString:function(){return"ListCollectionCreator"}}),f=function(e,t,i){var n,o=l.Deferred(),r=Galaxy.modal||new s.View;return t=a.defaults(t||{},{elements:e,oncancel:function(){r.hide(),o.reject("cancelled")},oncreate:function(e,t){r.hide(),o.resolve(t)}}),n=new i(t),r.show({title:t.title||d("Create a collection"),body:n.$el,width:"80%",height:"100%",closing_events:!0}),n.render(),window._collectionCreator=n,o},m=function(e,t){return t=t||{},t.title=d("Create a collection from a list of datasets"),f(e,t,g)};return{DatasetCollectionElementView:p,ListCollectionCreator:g,collectionCreatorModal:f,listCollectionCreatorModal:m,createListCollection:h}}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(3),i(2),i(1),i(1))},function(e,t,i){var n,s;(function(o,a){n=[i(12),i(33),i(78),i(65),i(21),i(6),i(5)],s=function(e,t,i,n,s,r,l){"use strict";var c=t.DatasetListItemView,d=c.extend({initialize:function(e){c.prototype.initialize.call(this,e),this.hasUser=e.hasUser,this.purgeAllowed=e.purgeAllowed||!1,this.tagsEditorShown=e.tagsEditorShown||!1,this.annotationEditorShown=e.annotationEditorShown||!1},_renderPrimaryActions:function(){var t=c.prototype._renderPrimaryActions.call(this);return this.model.get("state")===e.NOT_VIEWABLE?t:c.prototype._renderPrimaryActions.call(this).concat([this._renderEditButton(),this._renderDeleteButton()])},_renderEditButton:function(){if(this.model.get("state")===e.DISCARDED||!this.model.get("accessible"))return null;var t=this.model.get("purged"),i=this.model.get("deleted"),n={title:l("Edit attributes"),href:this.model.urls.edit,target:this.linkTarget,faIcon:"fa-pencil",classes:"edit-btn"};return i||t?(n.disabled=!0,t?n.title=l("Cannot edit attributes of datasets removed from disk"):i&&(n.title=l("Undelete dataset to edit attributes"))):o.contains([e.UPLOAD,e.NEW],this.model.get("state"))&&(n.disabled=!0,n.title=l("This dataset is not yet editable")),s(n)},_renderDeleteButton:function(){if(!this.model.get("accessible"))return null;var e=this,t=this.model.isDeletedOrPurged();return s({title:l(t?"Dataset is already deleted":"Delete"),disabled:t,faIcon:"fa-times",classes:"delete-btn",onclick:function(){e.$el.find(".icon-btn.delete-btn").trigger("mouseout"),e.model.delete()}})},_renderDetails:function(){var t=c.prototype._renderDetails.call(this),i=this.model.get("state");return!this.model.isDeletedOrPurged()&&o.contains([e.OK,e.FAILED_METADATA],i)&&(this._renderTags(t),this._renderAnnotation(t),this._makeDbkeyEditLink(t)),this._setUpBehaviors(t),t},_renderToolHelpButton:function(){var e=this.model.attributes.dataset_id,t=this.model.attributes.creating_job,i=this,n=function(t){var n='
';t.name&&t.help?(n+="Tool help for "+t.name+"",n+=t.help):n+="Tool help is unavailable for this dataset.",n+="
",i.$el.find(".details").append(a.parseHTML(n))},o=function(e){a.ajax({url:Galaxy.root+"api/tools/"+e.tool_id+"/build"}).done(function(e){n(e)}).fail(function(){n({})})};return null===Galaxy.user.id?null:s({title:"Tool Help",classes:"icon-btn",href:"#",faIcon:"fa-question",onclick:function(){i.$el.find(".toolhelp").length>0?i.$el.find(".toolhelp").toggle():a.ajax({url:Galaxy.root+"api/jobs/"+t}).done(function(e){o(e)}).fail(function(){console.log('Failed at recovering job information from the Galaxy API for job id "'+t+'".')})}})},_renderSecondaryActions:function(){var t=c.prototype._renderSecondaryActions.call(this);switch(this.model.get("state")){case e.UPLOAD:case e.NOT_VIEWABLE:return t;case e.ERROR:return t.unshift(this._renderErrButton()),t.concat([this._renderRerunButton(),this._renderToolHelpButton()]);case e.OK:case e.FAILED_METADATA:return t.concat([this._renderRerunButton(),this._renderVisualizationsButton(),this._renderToolHelpButton()])}return t.concat([this._renderRerunButton(),this._renderToolHelpButton()])},_renderErrButton:function(){return s({title:l("View or report this error"),href:this.model.urls.report_error,classes:"report-error-btn",target:this.linkTarget,faIcon:"fa-bug"})},_renderRerunButton:function(){var e=this.model.get("creating_job");if(this.model.get("rerunnable"))return s({title:l("Run this job again"),href:this.model.urls.rerun,classes:"rerun-btn",target:this.linkTarget,faIcon:"fa-refresh",onclick:function(t){t.preventDefault(),Galaxy.router.push("/",{job_id:e})}})},_renderVisualizationsButton:function(){var e=this.model.get("visualizations");if(this.model.isDeletedOrPurged()||!this.hasUser||!this.model.hasData()||o.isEmpty(e))return null;if(!o.isObject(e[0]))return this.warn("Visualizations have been switched off"),null;var t=a(this.templates.visualizations(e,this));return t.find('[target="galaxy_main"]').attr("target",this.linkTarget),this._addScratchBookFn(t.find(".visualization-link").addBack(".visualization-link")),t},_addScratchBookFn:function(e){e.click(function(e){Galaxy.frame&&Galaxy.frame.active&&(Galaxy.frame.add({title:"Visualization",url:a(this).attr("href")}),e.preventDefault(),e.stopPropagation())})},_renderTags:function(e){if(this.hasUser){var t=this;this.tagsEditor=new i.TagsEditor({model:this.model,el:e.find(".tags-display"),onshowFirstTime:function(){this.render()},onshow:function(){t.tagsEditorShown=!0},onhide:function(){t.tagsEditorShown=!1},$activator:s({title:l("Edit dataset tags"),classes:"tag-btn",faIcon:"fa-tags"}).appendTo(e.find(".actions .right"))}),this.tagsEditorShown&&this.tagsEditor.toggle(!0)}},_renderAnnotation:function(e){if(this.hasUser){var t=this;this.annotationEditor=new n.AnnotationEditor({model:this.model,el:e.find(".annotation-display"),onshowFirstTime:function(){this.render()},onshow:function(){t.annotationEditorShown=!0},onhide:function(){t.annotationEditorShown=!1},$activator:s({title:l("Edit dataset annotation"),classes:"annotate-btn",faIcon:"fa-comment"}).appendTo(e.find(".actions .right"))}),this.annotationEditorShown&&this.annotationEditor.toggle(!0)}},_makeDbkeyEditLink:function(e){if("?"===this.model.get("metadata_dbkey")&&!this.model.isDeletedOrPurged()){var t=a('?').attr("href",this.model.urls.edit).attr("target",this.linkTarget);e.find(".dbkey .value").replaceWith(t)}},events:o.extend(o.clone(c.prototype.events),{"click .undelete-link":"_clickUndeleteLink","click .purge-link":"_clickPurgeLink","click .edit-btn":function(e){this.trigger("edit",this,e)},"click .delete-btn":function(e){this.trigger("delete",this,e)},"click .rerun-btn":function(e){this.trigger("rerun",this,e)},"click .report-err-btn":function(e){this.trigger("report-err",this,e)},"click .visualization-btn":function(e){this.trigger("visualize",this,e)},"click .dbkey a":function(e){this.trigger("edit",this,e)}}),_clickUndeleteLink:function(e){return this.model.undelete(),!1},_clickPurgeLink:function(e){return confirm(l("This will permanently remove the data in your dataset. Are you sure?"))&&this.model.purge(),!1},toString:function(){var e=this.model?this.model+"":"(no model)";return"HDAEditView("+e+")"}});return d.prototype.templates=function(){var e=o.extend({},c.prototype.templates.warnings,{failed_metadata:r.wrapTemplate(['<% if( dataset.state === "failed_metadata" ){ %>','
"]);return a.extend(a.clone(l.prototype.templates),{controls:e})}(),{ListPanel:l,ModelListPanel:c}}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(3),i(2),i(1))},function(e,t,i){var n,s;(function(o,a){n=[i(6),i(5)],s=function(e,t){var i=o.View.extend(e.LoggableMixin).extend(e.HiddenUntilActivatedViewMixin).extend({tagName:"div",className:"tags-display",initialize:function(e){this.listenTo(this.model,"change:tags",function(){this.render()}),this.hiddenUntilActivated(e.$activator,e)},render:function(){var e=this;return this.$el.html(this._template()),this.$input().select2({placeholder:"Add tags",width:"100%",tags:function(){return e._getTagsUsed()}}),this._setUpBehaviors(),this},_template:function(){return['",''].join("")},tagsToCSV:function(){var e=this.model.get("tags");return!a.isArray(e)||a.isEmpty(e)?"":e.map(function(e){return a.escape(e)}).sort().join(",")},$input:function(){return this.$el.find("input.tags-input")},_getTagsUsed:function(){return Galaxy.user.get("tags_used")},_setUpBehaviors:function(){var e=this;this.$input().on("change",function(t){e.model.save({tags:t.val},{silent:!0}),t.added&&e._addNewTagToTagsUsed(t.added.text+"")})},_addNewTagToTagsUsed:function(e){var t=Galaxy.user.get("tags_used");a.contains(t,e)||(t.push(e),t.sort(),Galaxy.user.set("tags_used",t))},remove:function(){this.$input.off(),this.stopListening(this.model),o.View.prototype.remove.call(this)},toString:function(){return["TagsEditor(",this.model+"",")"].join("")}});return{TagsEditor:i}}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(3),i(2))},,function(e,t,i){var n,s;(function(o,a){n=[i(5)],s=function(e){"use strict";function t(t,i,n){return Galaxy.modal.show({title:i,body:t,closing_events:!0,buttons:{Ok:function(){Galaxy.modal.hide()}}}),Galaxy.modal.$el.addClass("error-modal"),n&&(Galaxy.modal.$(".error-details").add(Galaxy.modal.$('button:contains("Details")')).remove(),o("").addClass("error-details").hide().appendTo(Galaxy.modal.$(".modal-content")).append([o("").text(h),o("").text(JSON.stringify(n,null," "))]),o('").appendTo(Galaxy.modal.$(".buttons")).click(function(){Galaxy.modal.$(".error-details").toggle()})),Galaxy.modal}function i(i,n,s){if(i){if(i=e(i),n=e(n)||e("Error:"),window.Galaxy&&Galaxy.modal)return t(i,n,s);alert(n+"\n\n"+i),console.log("error details:",JSON.stringify(s))}}function n(){return i(e("You appear to be offline. Please check your connection and try again."),e("Offline?"))}function s(){return i(e("Galaxy is currently unreachable. Please try again in a few minutes.")+" "+c,e("Cannot connect to Galaxy"))}function r(t,n,s,o,a){o=o||d,o+=" "+c,a=a||e("An error occurred");var r=l(t,n,s);return i(o,a,r)}function l(e,t,i){return{raven:a.result(window.Raven,"lastEventId"),userAgent:navigator.userAgent,onLine:navigator.onLine,version:a.result(Galaxy.config,"version_major"),xhr:a.omit(t,a.functions(t)),options:a.omit(i,"xhr"),url:a.result(Galaxy.lastAjax,"url"),data:a.result(Galaxy.lastAjax,"data"),model:a.result(e,"toJSON",e+""),user:a.omit(a.result(Galaxy.user,"toJSON"),"email")}}var c=e("Please contact a Galaxy administrator if the problem persists."),d=e("An error occurred while updating information with the server."),h=e("The following information can assist the developers in finding the source of the error:");return{errorModal:i,offlineErrorModal:n,badGatewayErrorModal:s,ajaxErrorModal:r}}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(1),i(2))},function(e,t,i){var n,s;(function(i,o,a,r){n=[],s=function(){var e=i.View.extend({initialize:function(e,t){this.$button=e,this.$button.length||(this.$button=o("")),this.options=t||[],this.$button.data("popupmenu",this);var i=this;this.$button.click(function(e){return o(".popmenu-wrapper").remove(),i._renderAndShow(e),!1})},_renderAndShow:function(e){this.render(),this.$el.appendTo("body").css(this._getShownPosition(e)).show(),this._setUpCloseBehavior()},render:function(){if(this.$el.addClass("popmenu-wrapper").hide().css({position:"absolute"}).html(this.template(this.$button.attr("id"),this.options)),
-this.options.length){var e=this;this.$el.find("li").each(function(t,i){var n=e.options[t];n.func&&o(this).children("a.popupmenu-option").click(function(t){n.func.call(e,t,n),t.preventDefault()})})}return this},template:function(e,t){return['
This Galaxy server allows you to upload files via FTP. To upload some files, log in to the FTP server at '+this.options.ftp_upload_site+' using your Galaxy credentials (email address and password).
'}})}.apply(t,n),!(void 0!==s&&(e.exports=s))}).call(t,i(3),i(1))},function(e,t,i){var n,s;(function(o,a,r){n=[i(4)],s=function(e){return o.View.extend({options:{class_check:"fa-check-square-o",class_uncheck:"fa-square-o",parameters:[{id:"space_to_tab",title:"Convert spaces to tabs"},{id:"to_posix_lines",title:"Use POSIX standard"}]},initialize:function(e){this.model=e.model,this.setElement(a("").addClass("upload-settings")),this.$el.append(a("").addClass("upload-settings-cover")),this.$el.append(a("