From 1898e7712b55ffdb5d845cf5ea4763d76c48e91d Mon Sep 17 00:00:00 2001 From: Kanwei Li Date: Tue, 3 Aug 2010 15:10:30 -0400 Subject: [PATCH] trackster: Add new dbkey column to viz tables, finish "Visualize in Trackster" button functionality - Dbkey now shown in "Saved Visualizations" grid - "Visualize in Trackster" icon in history pane for supported dataset now works, letting you add that dataset to an existing browser or to a new browser. Dbkey for existing browsers is also shown. --- lib/galaxy/model/mapping.py | 2 + .../versions/0054_visualization_dbkey.py | 58 +++++++++++++++++++ lib/galaxy/web/controllers/tracks.py | 28 ++++----- lib/galaxy/web/controllers/visualization.py | 2 +- static/scripts/galaxy.base.js | 7 ++- static/scripts/packed/galaxy.base.js | 2 +- templates/root/history_common.mako | 3 +- templates/tracks/browser.mako | 39 ++++++++----- templates/tracks/new_browser.mako | 6 ++ 9 files changed, 108 insertions(+), 39 deletions(-) create mode 100644 lib/galaxy/model/migrate/versions/0054_visualization_dbkey.py diff --git a/lib/galaxy/model/mapping.py b/lib/galaxy/model/mapping.py index 97c564ed6ec..8c3cc6155aa 100644 --- a/lib/galaxy/model/mapping.py +++ b/lib/galaxy/model/mapping.py @@ -641,6 +641,7 @@ Visualization.table = Table( "visualization", metadata, ForeignKey( "visualization_revision.id", use_alter=True, name='visualization_latest_revision_id_fk' ), index=True ), Column( "title", TEXT ), Column( "type", TEXT ), + Column( "dbkey", TEXT, index=True ), Column( "deleted", Boolean, default=False, index=True ), Column( "importable", Boolean, default=False, index=True ), Column( "slug", TEXT, index=True ), @@ -653,6 +654,7 @@ VisualizationRevision.table = Table( "visualization_revision", metadata, Column( "update_time", DateTime, default=now, onupdate=now ), Column( "visualization_id", Integer, ForeignKey( "visualization.id" ), index=True, nullable=False ), Column( "title", TEXT ), + Column( "dbkey", TEXT, index=True ), Column( "config", JSONType ) ) diff --git a/lib/galaxy/model/migrate/versions/0054_visualization_dbkey.py b/lib/galaxy/model/migrate/versions/0054_visualization_dbkey.py new file mode 100644 index 00000000000..4812ebe0d9e --- /dev/null +++ b/lib/galaxy/model/migrate/versions/0054_visualization_dbkey.py @@ -0,0 +1,58 @@ +""" +Migration script to add dbkey column for visualization. +""" + +from sqlalchemy import * +from sqlalchemy.orm import * +from migrate import * +from migrate.changeset import * +from galaxy.util.json import from_json_string + +import logging +log = logging.getLogger( __name__ ) + +metadata = MetaData( migrate_engine ) +db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) ) + +Visualization_table = Table( "visualization", metadata, autoload=True ) +Visualization_revision_table = Table( "visualization_revision", metadata, autoload=True ) + +def upgrade(): + + print __doc__ + metadata.reflect() + + # Create dbkey columns. + x = Column( "dbkey", TEXT, index=True ) + y = Column( "dbkey", TEXT, index=True ) + x.create( Visualization_table ) + y.create( Visualization_revision_table ) + assert x is Visualization_table.c.dbkey + assert y is Visualization_revision_table.c.dbkey + + try: + i = Index( "ix_visualization_dbkey", Visualization_table.c.dbkey ) + i.create() + except: + pass + + try: + i = Index( "ix_visualization_revision_dbkey", Visualization_revision_table.c.dbkey ) + i.create() + except: + pass + + all_viz = db_session.execute( "SELECT visualization.id as viz_id, visualization_revision.id as viz_rev_id, visualization_revision.config FROM visualization_revision \ + LEFT JOIN visualization ON visualization.id=visualization_revision.visualization_id" ) + for viz in all_viz: + viz_id = viz['viz_id'] + viz_rev_id = viz['viz_rev_id'] + dbkey = from_json_string(viz[Visualization_revision_table.c.config]).get('dbkey', "").replace("'", "\\'") + db_session.execute("UPDATE visualization_revision SET dbkey='%s' WHERE id=%s" % (dbkey, viz_rev_id)) + db_session.execute("UPDATE visualization SET dbkey='%s' WHERE id=%s" % (dbkey, viz_id)) + +def downgrade(): + metadata.reflect() + + Visualization_table.c.dbkey.drop() + Visualization_revision_table.c.dbkey.drop() diff --git a/lib/galaxy/web/controllers/tracks.py b/lib/galaxy/web/controllers/tracks.py index 2b19d9e37d4..770acb02e45 100644 --- a/lib/galaxy/web/controllers/tracks.py +++ b/lib/galaxy/web/controllers/tracks.py @@ -7,10 +7,6 @@ of datasets associated with the same dbkey to display. Once selected, jobs are started to create any necessary indexes in the background, and the user is redirected to the browser interface, which loads the appropriate datasets. -Problems --------- - - Must have a LEN file, not currently able to infer from data (not sure we - need to support that, but need to make user defined build support better) """ import math, re, logging, glob, pkg_resources @@ -88,12 +84,6 @@ class DatasetSelectionGrid( grids.Grid ): .filter( model.HistoryDatasetAssociation.deleted == False ) class TracksterSelectionGrid( grids.Grid ): -# class DbKeyColumn( grids.GridColumn ): -# def filter( self, trans, user, query, dbkey ): -# """ Filter by dbkey. """ -# # use raw SQL b/c metadata is a BLOB -# dbkey = dbkey.replace("'", "\\'") -# return query.filter( or_( "metadata like '%%\"dbkey\": [\"%s\"]%%'" % dbkey, "metadata like '%%\"dbkey\": \"%s\"%%'" % dbkey ) ) # Grid definition. title = "Insert into visualization" @@ -105,7 +95,8 @@ class TracksterSelectionGrid( grids.Grid ): use_async = True use_paging = False columns = [ - grids.TextColumn( "Title", key="title", model_class=model.Visualization ) + grids.TextColumn( "Title", key="title", model_class=model.Visualization ), + grids.TextColumn( "Dbkey", key="dbkey", model_class=model.Visualization ) ] columns.append( grids.MulticolFilterColumn( "Search", cols_to_filter=[ columns[0] ], @@ -138,15 +129,16 @@ class TracksController( BaseController, UsesVisualization ): @web.expose @web.require_login() - def index( self, trans ): + def index( self, trans, **kwargs ): config = {} - return trans.fill_template( "tracks/browser.mako", config=config ) + return trans.fill_template( "tracks/browser.mako", config=config, add_dataset=kwargs.get("dataset_id", None), \ + default_dbkey=kwargs.get("default_dbkey", None) ) @web.expose @web.require_login() - def new_browser( self, trans ): - return trans.fill_template( "tracks/new_browser.mako", dbkeys=self._get_dbkeys( trans ) ) + def new_browser( self, trans, **kwargs ): + return trans.fill_template( "tracks/new_browser.mako", dbkeys=self._get_dbkeys( trans ), default_dbkey=kwargs.get("default_dbkey", None) ) @web.json @web.require_login() @@ -204,7 +196,7 @@ class TracksController( BaseController, UsesVisualization ): visualization = self.get_visualization( trans, vis_id, check_ownership=False, check_accessible=True ) visualization.config = self.get_visualization_config( trans, visualization ) vis_user = visualization.user - vis_dbkey = visualization.config['dbkey'] + vis_dbkey = visualization.dbkey else: # No vis_id, so visualization is new. User is current user, dbkey must be given. vis_user = trans.user @@ -330,6 +322,7 @@ class TracksController( BaseController, UsesVisualization ): vis.user = trans.user vis.title = kwargs['vis_title'] vis.type = "trackster" + vis.dbkey = dbkey session.add( vis ) else: decoded_id = trans.security.decode_id( vis_id ) @@ -339,6 +332,7 @@ class TracksController( BaseController, UsesVisualization ): vis_rev = model.VisualizationRevision() vis_rev.visualization = vis vis_rev.title = vis.title + vis_rev.dbkey = dbkey tracks = [] for track in decoded_payload: tracks.append( { "dataset_id": str(track['dataset_id']), @@ -346,7 +340,7 @@ class TracksController( BaseController, UsesVisualization ): "track_type": track['track_type'], "prefs": track['prefs'] } ) - vis_rev.config = { "dbkey": dbkey, "tracks": tracks } + vis_rev.config = { "tracks": tracks } vis.latest_revision = vis_rev session.add( vis_rev ) session.flush() diff --git a/lib/galaxy/web/controllers/visualization.py b/lib/galaxy/web/controllers/visualization.py index cdb8780d61c..d0721076aa9 100644 --- a/lib/galaxy/web/controllers/visualization.py +++ b/lib/galaxy/web/controllers/visualization.py @@ -14,7 +14,7 @@ class VisualizationListGrid( grids.Grid ): columns = [ grids.TextColumn( "Title", key="title", model_class=model.Visualization, attach_popup=True, link=( lambda item: dict( controller="tracks", action="browser", id=item.id ) ) ), - grids.TextColumn( "Type", key="type", model_class=model.Visualization ), + grids.TextColumn( "Dbkey", key="dbkey", model_class=model.Visualization ), grids.IndividualTagsColumn( "Tags", "tags", model.Visualization, model.VisualizationTagAssociation, filterable="advanced", grid_name="VisualizationListGrid" ), grids.SharingStatusColumn( "Sharing", key="sharing", model_class=model.Visualization, filterable="advanced", sortable=False ), grids.GridColumn( "Created", key="create_time", format=time_ago ), diff --git a/static/scripts/galaxy.base.js b/static/scripts/galaxy.base.js index e842e25194b..e5db853f21f 100644 --- a/static/scripts/galaxy.base.js +++ b/static/scripts/galaxy.base.js @@ -559,18 +559,19 @@ $(".trackster-add").live("click", function() { dataset_jquery = $(this); $.ajax({ url: dataset_jquery.attr("data-url"), - data: { "f-dbkey": "hi" }, dataType: "html", error: function() { alert( "Could not add this dataset to browser." ); }, success: function(table_html) { var parent = window.parent; parent.show_modal("Add to Browser:", table_html, { - "Insert Dataset Into": function() { + "Insert into selected": function() { $(parent.document).find('input[name=id]:checked').each(function() { var vis_id = $(this).val(); parent.location = dataset_jquery.attr("action-url") + "&id=" + vis_id; }); - parent.hide_modal(); + }, + "Insert into new browser": function() { + parent.location = dataset_jquery.attr("new-url"); }, "Cancel": function() { parent.hide_modal(); diff --git a/static/scripts/packed/galaxy.base.js b/static/scripts/packed/galaxy.base.js index 5de07ed83ad..08b96fef19c 100644 --- a/static/scripts/packed/galaxy.base.js +++ b/static/scripts/packed/galaxy.base.js @@ -1 +1 @@ -$.fn.makeAbsolute=function(a){return this.each(function(){var b=$(this);var c=b.position();b.css({position:"absolute",marginLeft:0,marginTop:0,top:c.top,left:c.left,right:$(window).width()-(c.left+b.width())});if(a){b.remove().appendTo("body")}})};function ensure_popup_helper(){if($("#popup-helper").length===0){$("