diff --git a/eggs.ini b/eggs.ini index a462166cf65..8aac2d67857 100644 --- a/eggs.ini +++ b/eggs.ini @@ -28,6 +28,7 @@ PSI = 0.3b1.1 [eggs:noplatform] amqplib = 0.6.1 Beaker = 1.4 +decorator = 3.1.2 docutils = 0.4 elementtree = 1.2.6_20050316 lrucache = 0.2 @@ -41,8 +42,8 @@ PasteDeploy = 1.3.1 PasteScript = 1.3.6 Routes = 1.6.3 simplejson = 1.5 -SQLAlchemy = 0.4.7p1 -sqlalchemy_migrate = 0.4.5 +SQLAlchemy = 0.5.6 +sqlalchemy_migrate = 0.5.4 Tempita = 0.1 twill = 0.9 WebError = 0.8a @@ -77,6 +78,7 @@ threadframe = http://www.majid.info/python/threadframe/threadframe-0.2.tar.gz guppy = http://pypi.python.org/packages/source/g/guppy/guppy-0.1.8.tar.gz amqplib = http://py-amqplib.googlecode.com/files/amqplib-0.6.1.tgz Beaker = http://cheeseshop.python.org/packages/source/B/Beaker/Beaker-1.4.tar.gz +decorator = http://pypi.python.org/packages/source/d/decorator/decorator-3.1.2.tar.gz docutils = http://downloads.sourceforge.net/docutils/docutils-0.4.tar.gz elementtree = http://effbot.org/downloads/elementtree-1.2.6-20050316.tar.gz lrucache = http://evan.prodromou.name/lrucache/lrucache-0.2.tar.gz @@ -90,8 +92,8 @@ PasteScript = http://cheeseshop.python.org/packages/source/P/PasteScript/PasteSc PSI = http://pypi.python.org/packages/source/P/PSI/PSI-0.3b1.1.tar.gz Routes = http://pypi.python.org/packages/source/R/Routes/Routes-1.6.3.tar.gz simplejson = http://cheeseshop.python.org/packages/source/s/simplejson/simplejson-1.5.tar.gz -SQLAlchemy = http://pypi.python.org/packages/source/S/SQLAlchemy/SQLAlchemy-0.4.7p1.tar.gz -sqlalchemy_migrate = http://pypi.python.org/packages/source/s/sqlalchemy-migrate/sqlalchemy-migrate-0.4.5.tar.gz +SQLAlchemy = http://pypi.python.org/packages/source/S/SQLAlchemy/SQLAlchemy-0.5.6.tar.gz +sqlalchemy_migrate = http://pypi.python.org/packages/source/s/sqlalchemy-migrate/sqlalchemy-migrate-0.5.4.tar.gz Tempita = http://pypi.python.org/packages/source/T/Tempita/Tempita-0.1.tar.gz twill = http://darcs.idyll.org/~t/projects/twill-0.9.tar.gz WebError = http://pypi.python.org/packages/source/W/WebError/WebError-0.8a.tar.gz diff --git a/lib/galaxy/model/mapping.py b/lib/galaxy/model/mapping.py index e9dbf4f3e11..1093c39c5f4 100644 --- a/lib/galaxy/model/mapping.py +++ b/lib/galaxy/model/mapping.py @@ -18,7 +18,7 @@ from sqlalchemy.orm.collections import attribute_mapped_collection from sqlalchemy.ext.associationproxy import association_proxy metadata = MetaData() -context = Session = scoped_session( sessionmaker( autoflush=False, transactional=False ) ) +context = Session = scoped_session( sessionmaker( autoflush=False, autocommit=True ) ) # For backward compatibility with "context.current" context.current = Session diff --git a/lib/galaxy/model/migrate/check.py b/lib/galaxy/model/migrate/check.py index a240e2d69b5..3ca81a319a9 100644 --- a/lib/galaxy/model/migrate/check.py +++ b/lib/galaxy/model/migrate/check.py @@ -7,7 +7,7 @@ pkg_resources.require( "sqlalchemy-migrate" ) from migrate.versioning import repository, schema from sqlalchemy import * -from sqlalchemy.exceptions import NoSuchTableError +from sqlalchemy.exc import NoSuchTableError log = logging.getLogger( __name__ ) diff --git a/lib/galaxy/model/migrate/versions/0003_security_and_libraries.py b/lib/galaxy/model/migrate/versions/0003_security_and_libraries.py index b33b7038529..2146f37404d 100644 --- a/lib/galaxy/model/migrate/versions/0003_security_and_libraries.py +++ b/lib/galaxy/model/migrate/versions/0003_security_and_libraries.py @@ -1,6 +1,6 @@ from sqlalchemy import * from sqlalchemy.orm import * -from sqlalchemy.exceptions import * +from sqlalchemy.exc import * from migrate import * from migrate.changeset import * @@ -20,7 +20,7 @@ log.addHandler( handler ) from galaxy.model.custom_types import * metadata = MetaData( migrate_engine ) -db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, transactional=False ) ) +db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) ) if migrate_engine.name == 'postgres': # http://blog.pythonisito.com/2008/01/cascading-drop-table-with-sqlalchemy.html diff --git a/lib/galaxy/model/migrate/versions/0004_indexes_and_defaults.py b/lib/galaxy/model/migrate/versions/0004_indexes_and_defaults.py index 6efa10af143..fd5c290134a 100644 --- a/lib/galaxy/model/migrate/versions/0004_indexes_and_defaults.py +++ b/lib/galaxy/model/migrate/versions/0004_indexes_and_defaults.py @@ -12,7 +12,7 @@ handler.setFormatter( formatter ) log.addHandler( handler ) metadata = MetaData( migrate_engine ) -db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, transactional=False ) ) +db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) ) User_table = Table( "galaxy_user", metadata, autoload=True ) HistoryDatasetAssociation_table = Table( "history_dataset_association", metadata, autoload=True ) diff --git a/lib/galaxy/model/migrate/versions/0005_cleanup_datasets_fix.py b/lib/galaxy/model/migrate/versions/0005_cleanup_datasets_fix.py index ac12d06411e..f05a3c85098 100644 --- a/lib/galaxy/model/migrate/versions/0005_cleanup_datasets_fix.py +++ b/lib/galaxy/model/migrate/versions/0005_cleanup_datasets_fix.py @@ -23,7 +23,7 @@ from galaxy.util.bunch import Bunch metadata = MetaData( migrate_engine ) -context = scoped_session( sessionmaker( autoflush=False, transactional=False ) ) +context = scoped_session( sessionmaker( autoflush=False, autocommit=True ) ) ## classes @@ -662,7 +662,7 @@ def upgrade(): log.debug( "Fixing a discrepancy concerning deleted shared history items." ) affected_items = 0 start_time = time.time() - for dataset in context.query( Dataset ).filter( and_( Dataset.c.deleted == True, Dataset.c.purged == False ) ): + for dataset in context.query( Dataset ).filter( and_( Dataset.deleted == True, Dataset.purged == False ) ): for dataset_instance in dataset.history_associations + dataset.library_associations: if not dataset_instance.deleted: dataset.deleted = False diff --git a/lib/galaxy/model/migrate/versions/0006_change_qual_datatype.py b/lib/galaxy/model/migrate/versions/0006_change_qual_datatype.py index bfeddbff592..ef327b6b34b 100644 --- a/lib/galaxy/model/migrate/versions/0006_change_qual_datatype.py +++ b/lib/galaxy/model/migrate/versions/0006_change_qual_datatype.py @@ -16,7 +16,7 @@ handler.setFormatter( formatter ) log.addHandler( handler ) metadata = MetaData( migrate_engine ) -db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, transactional=False ) ) +db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) ) def display_migration_details(): print "========================================" diff --git a/lib/galaxy/model/migrate/versions/0008_galaxy_forms.py b/lib/galaxy/model/migrate/versions/0008_galaxy_forms.py index e1f79051a9a..fd62c795448 100644 --- a/lib/galaxy/model/migrate/versions/0008_galaxy_forms.py +++ b/lib/galaxy/model/migrate/versions/0008_galaxy_forms.py @@ -11,7 +11,7 @@ This migration script adds the following new tables for supporting Galaxy forms: """ from sqlalchemy import * from sqlalchemy.orm import * -from sqlalchemy.exceptions import * +from sqlalchemy.exc import * from migrate import * from migrate.changeset import * @@ -31,7 +31,7 @@ log.addHandler( handler ) from galaxy.model.custom_types import * metadata = MetaData( migrate_engine ) -db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, transactional=False ) ) +db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) ) def display_migration_details(): print "========================================" diff --git a/lib/galaxy/model/migrate/versions/0009_request_table.py b/lib/galaxy/model/migrate/versions/0009_request_table.py index 218aa824e22..793ae12e638 100644 --- a/lib/galaxy/model/migrate/versions/0009_request_table.py +++ b/lib/galaxy/model/migrate/versions/0009_request_table.py @@ -9,7 +9,7 @@ from migrate import * from migrate.changeset import * import sys, logging from galaxy.model.custom_types import * -from sqlalchemy.exceptions import * +from sqlalchemy.exc import * log = logging.getLogger( __name__ ) log.setLevel(logging.DEBUG) diff --git a/lib/galaxy/model/migrate/versions/0010_hda_display_at_authz_table.py b/lib/galaxy/model/migrate/versions/0010_hda_display_at_authz_table.py index 12926283578..7a0efa7ba8f 100644 --- a/lib/galaxy/model/migrate/versions/0010_hda_display_at_authz_table.py +++ b/lib/galaxy/model/migrate/versions/0010_hda_display_at_authz_table.py @@ -10,7 +10,7 @@ is too long """ from sqlalchemy import * from sqlalchemy.orm import * -from sqlalchemy.exceptions import * +from sqlalchemy.exc import * from migrate import * from migrate.changeset import * @@ -30,7 +30,7 @@ log.addHandler( handler ) from galaxy.model.custom_types import * metadata = MetaData( migrate_engine ) -db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, transactional=False ) ) +db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) ) def display_migration_details(): print "========================================" diff --git a/lib/galaxy/model/migrate/versions/0011_v0010_mysql_index_fix.py b/lib/galaxy/model/migrate/versions/0011_v0010_mysql_index_fix.py index f3907a371e9..8f96aa8eef1 100644 --- a/lib/galaxy/model/migrate/versions/0011_v0010_mysql_index_fix.py +++ b/lib/galaxy/model/migrate/versions/0011_v0010_mysql_index_fix.py @@ -5,7 +5,7 @@ manually created. """ from sqlalchemy import * from sqlalchemy.orm import * -from sqlalchemy.exceptions import * +from sqlalchemy.exc import * from migrate import * from migrate.changeset import * @@ -25,7 +25,7 @@ log.addHandler( handler ) from galaxy.model.custom_types import * metadata = MetaData( migrate_engine ) -db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, transactional=False ) ) +db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) ) def display_migration_details(): print "========================================" diff --git a/lib/galaxy/model/migrate/versions/0012_user_address.py b/lib/galaxy/model/migrate/versions/0012_user_address.py index 8f541a57eaa..9c8f7cddea3 100644 --- a/lib/galaxy/model/migrate/versions/0012_user_address.py +++ b/lib/galaxy/model/migrate/versions/0012_user_address.py @@ -6,7 +6,7 @@ which is a string, allowing for more flexibility with request states. """ from sqlalchemy import * from sqlalchemy.orm import * -from sqlalchemy.exceptions import * +from sqlalchemy.exc import * from migrate import * from migrate.changeset import * import datetime @@ -24,7 +24,7 @@ handler.setFormatter( formatter ) log.addHandler( handler ) metadata = MetaData( migrate_engine ) -db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, transactional=False ) ) +db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) ) def display_migration_details(): print "========================================" diff --git a/lib/galaxy/model/migrate/versions/0013_change_lib_item_templates_to_forms.py b/lib/galaxy/model/migrate/versions/0013_change_lib_item_templates_to_forms.py index 98a73e55141..55db4aa0d23 100644 --- a/lib/galaxy/model/migrate/versions/0013_change_lib_item_templates_to_forms.py +++ b/lib/galaxy/model/migrate/versions/0013_change_lib_item_templates_to_forms.py @@ -17,7 +17,7 @@ with a shortened name. """ from sqlalchemy import * from sqlalchemy.orm import * -from sqlalchemy.exceptions import * +from sqlalchemy.exc import * from migrate import * from migrate.changeset import * import sys, logging diff --git a/lib/galaxy/model/migrate/versions/0017_library_item_indexes.py b/lib/galaxy/model/migrate/versions/0017_library_item_indexes.py index 159b36a7a6d..6d0e2104c89 100644 --- a/lib/galaxy/model/migrate/versions/0017_library_item_indexes.py +++ b/lib/galaxy/model/migrate/versions/0017_library_item_indexes.py @@ -16,7 +16,7 @@ handler.setFormatter( formatter ) log.addHandler( handler ) metadata = MetaData( migrate_engine ) -db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, transactional=False ) ) +db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) ) LibraryFolder_table = Table( "library_folder", metadata, autoload=True ) LibraryDatasetDatasetAssociation_table = Table( "library_dataset_dataset_association", metadata, autoload=True ) LibraryDataset_table = Table( "library_dataset", metadata, autoload=True ) diff --git a/lib/galaxy/model/migrate/versions/0018_ordered_tags_and_page_tags.py b/lib/galaxy/model/migrate/versions/0018_ordered_tags_and_page_tags.py index 6260845934d..1df905318dc 100644 --- a/lib/galaxy/model/migrate/versions/0018_ordered_tags_and_page_tags.py +++ b/lib/galaxy/model/migrate/versions/0018_ordered_tags_and_page_tags.py @@ -5,7 +5,7 @@ This migration script provides support for (a) ordering tags by recency and from sqlalchemy import * from sqlalchemy.orm import * -from sqlalchemy.exceptions import * +from sqlalchemy.exc import * from migrate import * import migrate.changeset diff --git a/lib/galaxy/model/migrate/versions/0019_request_library_folder.py b/lib/galaxy/model/migrate/versions/0019_request_library_folder.py index 5f438b2afba..e2772c00953 100644 --- a/lib/galaxy/model/migrate/versions/0019_request_library_folder.py +++ b/lib/galaxy/model/migrate/versions/0019_request_library_folder.py @@ -1,6 +1,6 @@ from sqlalchemy import * from sqlalchemy.orm import * -from sqlalchemy.exceptions import * +from sqlalchemy.exc import * from migrate import * from migrate.changeset import * import datetime @@ -18,7 +18,7 @@ handler.setFormatter( formatter ) log.addHandler( handler ) metadata = MetaData( migrate_engine ) -db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, transactional=False ) ) +db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) ) def display_migration_details(): print "========================================" diff --git a/lib/galaxy/model/migrate/versions/0020_library_upload_job.py b/lib/galaxy/model/migrate/versions/0020_library_upload_job.py index 461fd7610e1..dd2395f2d4d 100644 --- a/lib/galaxy/model/migrate/versions/0020_library_upload_job.py +++ b/lib/galaxy/model/migrate/versions/0020_library_upload_job.py @@ -1,6 +1,6 @@ from sqlalchemy import * from sqlalchemy.orm import * -from sqlalchemy.exceptions import * +from sqlalchemy.exc import * from migrate import * from migrate.changeset import * import datetime @@ -18,7 +18,7 @@ handler.setFormatter( formatter ) log.addHandler( handler ) metadata = MetaData( migrate_engine ) -db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, transactional=False ) ) +db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) ) def display_migration_details(): print "" diff --git a/lib/galaxy/model/orm/ext/assignmapper.py b/lib/galaxy/model/orm/ext/assignmapper.py index 08bf1dd7c32..8b7cc27751a 100644 --- a/lib/galaxy/model/orm/ext/assignmapper.py +++ b/lib/galaxy/model/orm/ext/assignmapper.py @@ -15,22 +15,36 @@ __all__ = [ 'assign_mapper' ] from sqlalchemy import util, exceptions import types -from sqlalchemy.orm import mapper, Query +from sqlalchemy.orm import Query +from sqlalchemy.orm import mapper as sqla_mapper -def _monkeypatch_session_method(name, session, class_, make_list=False): - def do(self, *args, **kwargs): - if make_list: - self = [ self ] - return getattr(session, name)( self, *args, **kwargs ) +def _monkeypatch_session_method( name, session, class_ ): + # TODO: eliminate this method by fixing the session flushes + def do( self, *args, **kwargs ): + if self not in session.deleted: + session.add( self ) + return session.flush() try: do.__name__ = name except: pass - if not hasattr(class_, name): - setattr(class_, name, do) - + if not hasattr( class_, name ): + setattr( class_, name, do ) +def session_mapper( scoped_session, class_, *args, **kwargs ): + def mapper( cls, *arg, **kw ): + validate = kw.pop( 'validate', False ) + if cls.__init__ is object.__init__: + def __init__( self, **kwargs ): + for key, value in kwargs.items(): + if validate: + if not cls_mapper.has_property( key ): + raise TypeError( "Invalid __init__ argument: '%s'" % key ) + setattr( self, key, value ) + cls.__init__ = __init__ + cls.query = scoped_session.query_property() + _monkeypatch_session_method( 'flush', scoped_session, cls ) + return sqla_mapper( cls, *arg, **kw ) + return mapper( class_, *args, **kwargs ) def assign_mapper( session, class_, *args, **kwargs ): - m = class_.mapper = session.mapper( class_, *args, **kwargs ) - for name in ( 'flush', ): - _monkeypatch_session_method( name, session, class_, make_list=True ) + m = class_.mapper = session_mapper( session, class_, *args, **kwargs ) return m diff --git a/lib/galaxy/web/controllers/forms.py b/lib/galaxy/web/controllers/forms.py index be48d993319..30515b238a5 100644 --- a/lib/galaxy/web/controllers/forms.py +++ b/lib/galaxy/web/controllers/forms.py @@ -450,7 +450,7 @@ class Forms( BaseController ): # create corresponding row in the form_definition_current table fd.form_definition_current = fdc fdc.latest_form = fd - trans.sa_session.save_or_update( fdc ) + trans.sa_session.add( fdc ) trans.sa_session.flush() msg = "The new form named '%s' has been created. " % (fd.name) return fd, msg diff --git a/lib/galaxy/web/controllers/history.py b/lib/galaxy/web/controllers/history.py index fe3f3e36187..ca539603be2 100644 --- a/lib/galaxy/web/controllers/history.py +++ b/lib/galaxy/web/controllers/history.py @@ -726,7 +726,7 @@ class HistoryController( BaseController ): share.history = history share.user = send_to_user session = trans.sa_session - session.save_or_update( share ) + session.add( share ) session.flush() if history not in shared_histories: shared_histories.append( history ) diff --git a/lib/galaxy/web/controllers/page.py b/lib/galaxy/web/controllers/page.py index 09a0771bf55..1cca24b74f8 100644 --- a/lib/galaxy/web/controllers/page.py +++ b/lib/galaxy/web/controllers/page.py @@ -135,7 +135,7 @@ class PageController( BaseController ): page_revision.content = "" # Persist session = trans.sa_session - session.save_or_update( page ) + session.add( page ) session.flush() # Display the management page ## trans.set_message( "Page '%s' created" % page.title ) @@ -240,4 +240,4 @@ class PageController( BaseController ): raise web.httpexceptions.HTTPNotFound() return trans.fill_template( "page/display.mako", page=page ) - \ No newline at end of file + diff --git a/lib/galaxy/web/controllers/workflow.py b/lib/galaxy/web/controllers/workflow.py index 7b06b997f67..1d80915e369 100644 --- a/lib/galaxy/web/controllers/workflow.py +++ b/lib/galaxy/web/controllers/workflow.py @@ -30,7 +30,7 @@ class WorkflowController( BaseController ): user = trans.get_user() workflows = trans.sa_session.query( model.StoredWorkflow ) \ .filter_by( user=user, deleted=False ) \ - .order_by( desc( model.StoredWorkflow.c.update_time ) ) \ + .order_by( desc( model.StoredWorkflow.table.c.update_time ) ) \ .all() shared_by_others = trans.sa_session \ .query( model.StoredWorkflowUserShareAssociation ) \ @@ -53,13 +53,13 @@ class WorkflowController( BaseController ): user = trans.get_user() workflows = trans.sa_session.query( model.StoredWorkflow ) \ .filter_by( user=user, deleted=False ) \ - .order_by( desc( model.StoredWorkflow.c.update_time ) ) \ + .order_by( desc( model.StoredWorkflow.table.c.update_time ) ) \ .all() shared_by_others = trans.sa_session \ .query( model.StoredWorkflowUserShareAssociation ) \ .filter_by( user=user ) \ - .filter( model.StoredWorkflow.c.deleted == False ) \ - .order_by( desc( model.StoredWorkflow.c.update_time ) ) \ + .filter( model.StoredWorkflow.deleted == False ) \ + .order_by( desc( model.StoredWorkflow.table.c.update_time ) ) \ .all() return trans.fill_template( "workflow/list_for_run.mako", workflows = workflows, @@ -91,7 +91,7 @@ class WorkflowController( BaseController ): share.stored_workflow = stored share.user = other session = trans.sa_session - session.save_or_update( share ) + session.add( share ) session.flush() trans.set_message( "Workflow '%s' shared with user '%s'" % ( stored.name, other.email ) ) return trans.response.send_redirect( url_for( controller='workflow', action='sharing', id=id ) ) @@ -142,7 +142,7 @@ class WorkflowController( BaseController ): share.stored_workflow = stored share.user = trans.user session = trans.sa_session - session.save_or_update( share ) + session.add( share ) session.flush() # Redirect to load galaxy frames. return trans.response.send_redirect( url_for( controller='workflow' ) ) @@ -180,7 +180,7 @@ class WorkflowController( BaseController ): new_stored.user = user # Persist session = trans.sa_session - session.save_or_update( new_stored ) + session.add( new_stored ) session.flush() # Display the management page trans.set_message( 'Clone created with name "%s"' % new_stored.name ) @@ -205,7 +205,7 @@ class WorkflowController( BaseController ): stored_workflow.latest_workflow = workflow # Persist session = trans.sa_session - session.save_or_update( stored_workflow ) + session.add( stored_workflow ) session.flush() # Display the management page trans.set_message( "Workflow '%s' created" % stored_workflow.name ) @@ -514,7 +514,7 @@ class WorkflowController( BaseController ): stored.name = workflow_name workflow.stored_workflow = stored stored.latest_workflow = workflow - trans.sa_session.save_or_update( stored ) + trans.sa_session.add( stored ) trans.sa_session.flush() # Index page with message return trans.show_message( "Workflow '%s' created from current history." % workflow_name ) @@ -656,12 +656,12 @@ class WorkflowController( BaseController ): ids_in_menu = set( [ x.stored_workflow_id for x in user.stored_workflow_menu_entries ] ) workflows = trans.sa_session.query( model.StoredWorkflow ) \ .filter_by( user=user, deleted=False ) \ - .order_by( desc( model.StoredWorkflow.c.update_time ) ) \ + .order_by( desc( model.StoredWorkflow.table.c.update_time ) ) \ .all() shared_by_others = trans.sa_session \ .query( model.StoredWorkflowUserShareAssociation ) \ .filter_by( user=user ) \ - .filter( model.StoredWorkflow.c.deleted == False ) \ + .filter( model.StoredWorkflow.deleted == False ) \ .all() return trans.fill_template( "workflow/configure_menu.mako", workflows=workflows, diff --git a/lib/galaxy/web/framework/helpers/grids.py b/lib/galaxy/web/framework/helpers/grids.py index b364b613a24..3f4f6040e53 100644 --- a/lib/galaxy/web/framework/helpers/grids.py +++ b/lib/galaxy/web/framework/helpers/grids.py @@ -111,10 +111,10 @@ class Grid( object ): if sort_key.startswith( "-" ): sort_key = sort_key[1:] sort_order = 'desc' - query = query.order_by( self.model_class.c.get( sort_key ).desc() ) + query = query.order_by( self.model_class.table.c.get( sort_key ).desc() ) else: sort_order = 'asc' - query = query.order_by( self.model_class.c.get( sort_key ).asc() ) + query = query.order_by( self.model_class.table.c.get( sort_key ).asc() ) extra_url_args['sort'] = encoded_sort_key # There might be a current row