galaxy-commits
Threads by month
- ----- 2026 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions
commit/galaxy-central: martenson: degrade Whoosh egg to 2.4.1, adjust util fnc for pretty intervals
by commits-noreply@bitbucket.org 30 Jan '15
by commits-noreply@bitbucket.org 30 Jan '15
30 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/18dacdf8674e/
Changeset: 18dacdf8674e
User: martenson
Date: 2015-01-30 18:21:35+00:00
Summary: degrade Whoosh egg to 2.4.1, adjust util fnc for pretty intervals
remove debugs
Affected #: 3 files
diff -r 75739a5f696e57362238ec5c022a17963dd31929 -r 18dacdf8674e21c5e9a2bb61036382e44f6842bc eggs.ini
--- a/eggs.ini
+++ b/eggs.ini
@@ -73,7 +73,7 @@
wsgiref = 0.1.2
Babel = 1.3
wchartype = 0.1
-Whoosh = 2.5.7
+Whoosh = 2.4.1
; fluent_logger = 0.3.3
raven = 3.1.8
diff -r 75739a5f696e57362238ec5c022a17963dd31929 -r 18dacdf8674e21c5e9a2bb61036382e44f6842bc lib/galaxy/util/__init__.py
--- a/lib/galaxy/util/__init__.py
+++ b/lib/galaxy/util/__init__.py
@@ -371,7 +371,7 @@
if second_diff < 86400:
return str(second_diff / 3600) + " hours ago"
if day_diff == 1:
- return "Yesterday"
+ return "yesterday"
if day_diff < 7:
return str( day_diff ) + " days ago"
if day_diff < 31:
@@ -381,16 +381,16 @@
return str( day_diff / 365 ) + " years ago"
else:
if day_diff == 0:
- return "Today"
+ return "today"
if day_diff == 1:
- return "Yesterday"
+ return "yesterday"
if day_diff < 7:
- return "this week"
+ return "less than a week"
if day_diff < 31:
- return "this month"
+ return "less than a month"
if day_diff < 365:
- return "this year"
- return str( day_diff / 365 ) + " years ago"
+ return "less than a year"
+ return "a few years ago"
def pretty_print_json(json_data, is_json_string=False):
diff -r 75739a5f696e57362238ec5c022a17963dd31929 -r 18dacdf8674e21c5e9a2bb61036382e44f6842bc lib/galaxy/webapps/tool_shed/search/repo_search.py
--- a/lib/galaxy/webapps/tool_shed/search/repo_search.py
+++ b/lib/galaxy/webapps/tool_shed/search/repo_search.py
@@ -45,7 +45,7 @@
use_final = True
def final( self, searcher, docnum, score ):
- log.debug('score before: ' + str(score) )
+ # log.debug('score before: ' + str(score) )
# Arbitrary for now
reasonable_hits = 100.0
@@ -59,15 +59,15 @@
if times_downloaded == 0:
times_downloaded = 1
popularity_modifier = ( times_downloaded / reasonable_hits )
- log.debug('popularity_modifier: ' + str(popularity_modifier) )
+ # log.debug('popularity_modifier: ' + str(popularity_modifier) )
cert_modifier = 2 if searcher.stored_fields( docnum )[ "approved" ] == 'yes' else 1
- log.debug('cert_modifier: ' + str(cert_modifier) )
+ # log.debug('cert_modifier: ' + str(cert_modifier) )
# Adjust the computed score for this document by the popularity
# and by the certification level.
final_score = score * popularity_modifier * cert_modifier
- log.debug('score after: ' + str( final_score ) )
+ # log.debug('score after: ' + str( final_score ) )
return final_score
@@ -108,16 +108,14 @@
'remote_repository_url',
'repo_owner_username' ], schema = schema )
- # user_query = parser.parse( search_term )
user_query = parser.parse( '*' + search_term + '*' )
+ hits = searcher.search_page( user_query, page, pagelen = 10, terms = True )
- # hits = searcher.search( user_query, terms = True )
- hits = searcher.search_page( user_query, page, pagelen = 10, terms = True )
log.debug( 'searching for: #' + str( search_term ) )
log.debug( 'total hits: ' + str( len( hits ) ) )
log.debug( 'scored hits: ' + str( hits.scored_length() ) )
results = {}
- results[ 'total_results'] = str( hits.scored_length() )
+ results[ 'total_results'] = str( len( hits ) )
results[ 'hits' ] = []
for hit in hits:
hit_dict = {}
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: natefoo: Update tag latest_2015.01.13 for changeset c5e7535b4d22
by commits-noreply@bitbucket.org 30 Jan '15
by commits-noreply@bitbucket.org 30 Jan '15
30 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/a7ae7afffa8f/
Changeset: a7ae7afffa8f
Branch: stable
User: natefoo
Date: 2015-01-30 18:00:22+00:00
Summary: Update tag latest_2015.01.13 for changeset c5e7535b4d22
Affected #: 1 file
diff -r c5e7535b4d229dbbe52d48ea35a27ab601205b7b -r a7ae7afffa8fa7551ea760ca01e9c1808809391b .hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -22,4 +22,4 @@
2092948937ac30ef82f71463a235c66d34987088 release_2014.10.06
9bd6f8b5b8153db752f4e61ed62f2b6c01ae4a11 latest_2014.10.06
2e8dd2949dd3eee0f56f9a3a5ebf1b2baca24aee release_2015.01.13
-a481d17c04482b069e6b2ebdda4fbca01448fa9c latest_2015.01.13
+c5e7535b4d229dbbe52d48ea35a27ab601205b7b latest_2015.01.13
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: davebgx: Set time to epoch instead of throwing server error if repository_metadata.time_last_tested is unset.
by commits-noreply@bitbucket.org 30 Jan '15
by commits-noreply@bitbucket.org 30 Jan '15
30 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c5e7535b4d22/
Changeset: c5e7535b4d22
Branch: stable
User: davebgx
Date: 2015-01-29 16:23:35+00:00
Summary: Set time to epoch instead of throwing server error if repository_metadata.time_last_tested is unset.
Affected #: 1 file
diff -r d386cf71d4f71faeb49ec871b742e81011bee266 -r c5e7535b4d229dbbe52d48ea35a27ab601205b7b lib/galaxy/webapps/tool_shed/controllers/repository.py
--- a/lib/galaxy/webapps/tool_shed/controllers/repository.py
+++ b/lib/galaxy/webapps/tool_shed/controllers/repository.py
@@ -1690,7 +1690,10 @@
description_lines = []
# Per the RSS 2.0 specification, all dates in RSS feeds must be formatted as specified in RFC 822
# section 5.1, e.g. Sat, 07 Sep 2002 00:00:01 UT
- time_tested = repository_metadata.time_last_tested.strftime( '%a, %d %b %Y %H:%M:%S UT' )
+ if repository_metadata.time_last_tested is None:
+ time_tested = 'Thu, 01 Jan 1970 00:00:00 UT'
+ else:
+ time_tested = repository_metadata.time_last_tested.strftime( '%a, %d %b %Y %H:%M:%S UT' )
# Generate a citable URL for this repository with owner and changeset revision.
repository_citable_url = common_util.url_join( tool_shed_url,
'view',
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: davebgx: Add script to update the paths to tool config files in installed repositories' metadata.
by commits-noreply@bitbucket.org 30 Jan '15
by commits-noreply@bitbucket.org 30 Jan '15
30 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/75739a5f696e/
Changeset: 75739a5f696e
User: davebgx
Date: 2015-01-30 17:17:01+00:00
Summary: Add script to update the paths to tool config files in installed repositories' metadata.
Affected #: 1 file
diff -r 3618b7a91e23096ecf7ce5842c1e16c749251a4d -r 75739a5f696e57362238ec5c022a17963dd31929 scripts/update_shed_config_path.py
--- /dev/null
+++ b/scripts/update_shed_config_path.py
@@ -0,0 +1,80 @@
+import os
+import argparse
+import ConfigParser
+import sys
+new_path = [ os.path.join( os.getcwd(), "lib" ) ]
+new_path.extend( sys.path[1:] )
+sys.path = new_path
+
+import logging
+import galaxy.model.tool_shed_install
+import galaxy.model.tool_shed_install.mapping as mapping
+from galaxy.model.orm import *
+from galaxy import eggs
+eggs.require('sqlalchemy')
+import sqlalchemy
+
+def main( opts, session, model ):
+ '''
+ Find all tool shed repositories with the bad path and update with the correct path.
+ '''
+ for row in session.query( model.ToolShedRepository ).all():
+ if 'shed_config_filename' in row.metadata:
+ if row.metadata['shed_config_filename'] == opts.bad_filename:
+ row.metadata['shed_config_filename'] = opts.good_filename
+ session.add( row )
+ session.flush()
+ return 0
+
+def create_database( config_file ):
+ parser = ConfigParser.SafeConfigParser()
+ parser.read( config_file )
+ # Determine which database connection to use.
+ database_connection = parser.get( 'app:main', 'install_database_connection' )
+ if database_connection is None:
+ database_connection = parser.get( 'app:main', 'database_connection' )
+ if database_connection is None:
+ database_connection = 'sqlite:///%s' % parser.get( 'app:main', 'database_file' )
+ if database_connection is None:
+ print 'Unable to determine correct database connection.'
+ exit(1)
+
+ '''Initialize the database file.'''
+ dialect_to_egg = {
+ "sqlite" : "pysqlite>=2",
+ "postgres" : "psycopg2",
+ "postgresql" : "psycopg2",
+ "mysql" : "MySQL_python"
+ }
+ dialect = ( database_connection.split( ':', 1 ) )[0]
+ try:
+ egg = dialect_to_egg[ dialect ]
+ try:
+ eggs.require( egg )
+ print( "%s egg successfully loaded for %s dialect" % ( egg, dialect ) )
+ except:
+ # If the module is in the path elsewhere (i.e. non-egg), it'll still load.
+ print( "%s egg not found, but an attempt will be made to use %s anyway" % ( egg, dialect ) )
+ except KeyError:
+ # Let this go, it could possibly work with db's we don't support.
+ print( "database_connection contains an unknown SQLAlchemy database dialect: %s" % dialect )
+
+ # Initialize the database connection.
+ engine = create_engine( database_connection )
+ meta = MetaData( bind=engine )
+ install_session = Session = scoped_session( sessionmaker( bind=engine, autoflush=False, autocommit=True ) )
+ model = mapping.init( database_connection )
+ return install_session, model
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser()
+ parser.add_argument( '--config_file', dest='config_file', required=True, help="The path to your Galaxy configuration .ini file." )
+ parser.add_argument( '--from', dest='bad_filename', required=True, help="The old, invalid path to the shed_tool_conf.xml or migrated_tools_conf.xml file." )
+ parser.add_argument( '--to', dest='good_filename', required=True, help="The updated path to the shed_tool_conf.xml or migrated_tools_conf.xml file." )
+ parser.add_argument( '--force', dest='force', action='store_true', help="Use this flag to set the new path even if the file does not (yet) exist there." )
+ opts = parser.parse_args()
+ if not os.path.exists( opts.good_filename ) and not opts.force:
+ print 'The file %s does not exist, use the --force option to proceed.' % opts.good_filename
+ exit(1)
+ session, model = create_database( opts.config_file )
+ exit( main( opts, session, model ) )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/0fe529fb7881/
Changeset: 0fe529fb7881
User: dannon
Date: 2015-01-30 16:52:12+00:00
Summary: Add sentry logging to config.
Affected #: 1 file
diff -r 81c215f35665f2361ead5d60fe0a12ee24f31a0b -r 0fe529fb7881daef76b08eb113bd5a3d4480e358 lib/galaxy/webapps/tool_shed/config.py
--- a/lib/galaxy/webapps/tool_shed/config.py
+++ b/lib/galaxy/webapps/tool_shed/config.py
@@ -8,6 +8,7 @@
import logging.config
from optparse import OptionParser
import ConfigParser
+from galaxy import eggs
from galaxy.util import string_as_bool, listify
log = logging.getLogger( __name__ )
@@ -288,3 +289,11 @@
# Hook everything up
handler.setFormatter( formatter )
root.addHandler( handler )
+ # If sentry is configured, also log to it
+ if config.sentry_dsn:
+ eggs.require( "raven" )
+ from raven.handlers.logging import SentryHandler
+ sentry_handler = SentryHandler( config.sentry_dsn )
+ sentry_handler.setLevel( logging.WARN )
+ root.addHandler( sentry_handler )
+
https://bitbucket.org/galaxy/galaxy-central/commits/3618b7a91e23/
Changeset: 3618b7a91e23
User: dannon
Date: 2015-01-30 16:55:51+00:00
Summary: First of probably many changes related to elementtree replacement and futurewarnings.
Affected #: 1 file
diff -r 0fe529fb7881daef76b08eb113bd5a3d4480e358 -r 3618b7a91e23096ecf7ce5842c1e16c749251a4d lib/galaxy/datatypes/registry.py
--- a/lib/galaxy/datatypes/registry.py
+++ b/lib/galaxy/datatypes/registry.py
@@ -346,7 +346,7 @@
"""
sniffer_elem_classes = [ e.attrib[ 'type' ] for e in self.sniffer_elems ]
sniffers = root.find( 'sniffers' )
- if sniffers:
+ if sniffers is not None:
for elem in sniffers.findall( 'sniffer' ):
# Keep a status of the process steps to enable stopping the process of handling the sniffer if necessary.
ok = True
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: Core, controllers: when parsing ids, stringify to prevent all numeric (but valid) ids from being pre-processed as integers
by commits-noreply@bitbucket.org 30 Jan '15
by commits-noreply@bitbucket.org 30 Jan '15
30 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/81c215f35665/
Changeset: 81c215f35665
User: carlfeberhard
Date: 2015-01-30 16:40:21+00:00
Summary: Core, controllers: when parsing ids, stringify to prevent all numeric (but valid) ids from being pre-processed as integers
Affected #: 1 file
diff -r 1e0f1acf3c54ac7ed12d174f40c2f2f62b01f043 -r 81c215f35665f2361ead5d60fe0a12ee24f31a0b lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -103,9 +103,11 @@
# ---- parsing query params
def decode_id( self, id ):
try:
- return self.app.security.decode_id( id )
- except:
- msg = "Malformed History id ( %s ) specified, unable to decode" % ( str( id ) )
+ # note: use str - occasionally a fully numeric id will be placed in post body and parsed as int via JSON
+ # resulting in error for valid id
+ return self.app.security.decode_id( str( id ) )
+ except ( ValueError, TypeError ):
+ msg = "Malformed id ( %s ) specified, unable to decode" % ( str( id ) )
raise exceptions.MalformedId( msg, id=str( id ) )
def encode_all_ids( self, trans, rval, recursive=False ):
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/8ebc6c5b1cbd/
Changeset: 8ebc6c5b1cbd
User: dannon
Date: 2015-01-30 16:21:25+00:00
Summary: Make toolshed compatible with sentry reporting.
Affected #: 1 file
diff -r a917e3d871f2782ae4cf1b57bb4775c0e0224efe -r 8ebc6c5b1cbd974df125b9e9d5ec885efd916949 lib/galaxy/webapps/tool_shed/config.py
--- a/lib/galaxy/webapps/tool_shed/config.py
+++ b/lib/galaxy/webapps/tool_shed/config.py
@@ -2,6 +2,7 @@
Universe configuration builder.
"""
import os
+import re
import sys
import logging
import logging.config
@@ -133,6 +134,19 @@
self.citation_cache_data_dir = resolve_path( kwargs.get( "citation_cache_data_dir", "database/tool_shed_citations/data" ), self.root )
self.citation_cache_lock_dir = resolve_path( kwargs.get( "citation_cache_lock_dir", "database/tool_shed_citations/locks" ), self.root )
+ @property
+ def sentry_dsn_public( self ):
+ """
+ Sentry URL with private key removed for use in client side scripts,
+ sentry server will need to be configured to accept events
+ """
+ # TODO refactor this to a common place between toolshed/galaxy config, along
+ # with other duplicated methods.
+ if self.sentry_dsn:
+ return re.sub( r"^([^:/?#]+:)?//(\w+):(\w+)", r"\1//\2", self.sentry_dsn )
+ else:
+ return None
+
def __parse_config_file_options( self, kwargs ):
defaults = dict(
datatypes_config_file = [ 'config/datatypes_conf.xml', 'datatypes_conf.xml', 'config/datatypes_conf.xml.sample' ],
https://bitbucket.org/galaxy/galaxy-central/commits/1e0f1acf3c54/
Changeset: 1e0f1acf3c54
User: dannon
Date: 2015-01-30 16:23:36+00:00
Summary: Add sentry_dsn to toolshed sample.
Affected #: 1 file
diff -r 8ebc6c5b1cbd974df125b9e9d5ec885efd916949 -r 1e0f1acf3c54ac7ed12d174f40c2f2f62b01f043 config/tool_shed.ini.sample
--- a/config/tool_shed.ini.sample
+++ b/config/tool_shed.ini.sample
@@ -125,3 +125,6 @@
#static_favicon_dir = static/favicon.ico
#static_scripts_dir = static/scripts/
#static_style_dir = static/style/blue
+
+# Sentry (getsentry.com) DSN for catching bugs.
+#sentry_dsn = None
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
[galaxyproject/usegalaxy-playbook] 967336: Pull/distribute mutable configs on Main.
by GitHub 30 Jan '15
by GitHub 30 Jan '15
30 Jan '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: 9673364495809bffd6697cc7e04c65218a0519d8
https://github.com/galaxyproject/usegalaxy-playbook/commit/9673364495809bff…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-01-30 (Fri, 30 Jan 2015)
Changed paths:
M files/galaxy/usegalaxy.org/var/integrated_tool_panel.xml
M files/galaxy/usegalaxy.org/var/migrated_tools_conf.xml
M files/galaxy/usegalaxy.org/var/shed_tool_conf.xml
Log Message:
-----------
Pull/distribute mutable configs on Main.
1
0
commit/galaxy-central: carlfeberhard: UI, history multi-view: fix column height response in firefox
by commits-noreply@bitbucket.org 30 Jan '15
by commits-noreply@bitbucket.org 30 Jan '15
30 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/a917e3d871f2/
Changeset: a917e3d871f2
User: carlfeberhard
Date: 2015-01-29 22:51:57+00:00
Summary: UI, history multi-view: fix column height response in firefox
Affected #: 1 file
diff -r a0c2bd2de611ab95292f9ae5f759dae9fa4939aa -r a917e3d871f2782ae4cf1b57bb4775c0e0224efe templates/webapps/galaxy/history/view_multiple.mako
--- a/templates/webapps/galaxy/history/view_multiple.mako
+++ b/templates/webapps/galaxy/history/view_multiple.mako
@@ -33,6 +33,11 @@
display: -ms-flexbox;
display: flex;
+ /* force ff to squish beyond content:
+ https://developer.mozilla.org/en-US/Firefox/Releases/34/Site_Compatibility#… */
+ min-width: 0px;
+ min-height: 0px;
+
-webkit-align-items: stretch;
-ms-align-items: stretch;
align-items: stretch;
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
[galaxyproject/usegalaxy-playbook] 80a4db: Update Main and fetch mutable configs.
by GitHub 30 Jan '15
by GitHub 30 Jan '15
30 Jan '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: 80a4db0bb9a8365d1e9fa3e522522f8d361addc7
https://github.com/galaxyproject/usegalaxy-playbook/commit/80a4db0bb9a8365d…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-01-29 (Thu, 29 Jan 2015)
Changed paths:
M files/galaxy/usegalaxy.org/var/shed_tool_conf.xml
M files/galaxy/usegalaxy.org/var/shed_tool_data_table_conf.xml
M production/group_vars/all.yml
Log Message:
-----------
Update Main and fetch mutable configs.
1
0
3 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/f760a391f14a/
Changeset: f760a391f14a
User: dannon
Date: 2015-01-29 21:10:56+00:00
Summary: Convert everything from elementtree to stdlib xml module.
Affected #: 24 files
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 cron/parse_builds.py
--- a/cron/parse_builds.py
+++ b/cron/parse_builds.py
@@ -8,12 +8,7 @@
import sys
import urllib
-if sys.version_info[:2] >= ( 2, 5 ):
- import xml.etree.ElementTree as ElementTree
-else:
- from galaxy import eggs
- import pkg_resources; pkg_resources.require( "elementtree" )
- from elementtree import ElementTree
+import xml.etree.ElementTree as ElementTree
URL = "http://genome.cse.ucsc.edu/cgi-bin/das/dsn"
@@ -38,7 +33,7 @@
for dsn in tree:
build = dsn.find("SOURCE").attrib['id']
description = dsn.find("DESCRIPTION").text.replace(" - Genome at UCSC","").replace(" Genome at UCSC","")
-
+
fields = description.split(" ")
temp = fields[0]
for i in range(len(fields)-1):
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 cron/parse_builds_3_sites.py
--- a/cron/parse_builds_3_sites.py
+++ b/cron/parse_builds_3_sites.py
@@ -5,12 +5,7 @@
import sys
import urllib
-if sys.version_info[:2] >= ( 2, 5 ):
- import xml.etree.ElementTree as ElementTree
-else:
- from galaxy import eggs
- import pkg_resources; pkg_resources.require( "elementtree" )
- from elementtree import ElementTree
+import xml.etree.ElementTree as ElementTree
sites = ['http://genome.ucsc.edu/cgi-bin/',
'http://archaea.ucsc.edu/cgi-bin/',
@@ -38,7 +33,7 @@
print "#Invalid xml passed back from " + site
continue
print "#Harvested from",site
-
+
for dsn in tree:
build = dsn.find("SOURCE").attrib['id']
builds.append(build)
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 eggs.ini
--- a/eggs.ini
+++ b/eggs.ini
@@ -38,7 +38,6 @@
decorator = 3.1.2
docutils = 0.7
drmaa = 0.7.6
-elementtree = 1.2.6_20050316
Fabric = 1.7.0
importlib = 1.0.3
kombu = 3.0.13
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 lib/galaxy/datatypes/dataproviders/hierarchy.py
--- a/lib/galaxy/datatypes/dataproviders/hierarchy.py
+++ b/lib/galaxy/datatypes/dataproviders/hierarchy.py
@@ -3,7 +3,7 @@
"""
import line
-import xml.etree.ElementTree as elementtree
+from xml.etree.ElementTree import Element, iterparse
_TODO = """
"""
@@ -30,7 +30,7 @@
"""
Data provider that converts selected XML elements to dictionaries.
"""
- # using elementtree's iterparse method to keep mem down
+ # using xml.etree's iterparse method to keep mem down
#TODO: this, however (AFAIK), prevents the use of xpath
settings = {
'selector' : 'str', #urlencoded
@@ -54,7 +54,7 @@
"""
Returns true if the ``element`` matches the ``selector``.
- :param element: an XML ``ElementTree.Element``
+ :param element: an XML ``Element``
:param selector: some partial string in the desired tags to return
Change point for more sophisticated selectors.
@@ -64,13 +64,13 @@
#TODO: fails with '#' - browser thinks it's an anchor - use urlencode
#TODO: need removal/replacement of etree namespacing here - then move to string match
return bool( ( selector == None )
- or ( isinstance( element, elementtree.Element ) and selector in element.tag ) )
+ or ( isinstance( element, Element ) and selector in element.tag ) )
def element_as_dict( self, element ):
"""
Converts an XML element (its text, tag, and attributes) to dictionary form.
- :param element: an XML ``ElementTree.Element``
+ :param element: an XML ``Element``
"""
#TODO: Key collision is unlikely here, but still should be better handled
return {
@@ -84,7 +84,7 @@
"""
Yield all children of element (and their children - recursively)
in dictionary form.
- :param element: an XML ``ElementTree.Element``
+ :param element: an XML ``Element``
:param max_depth: the number of generations of descendents to return
"""
if not isinstance( max_depth, int ) or max_depth >= 1:
@@ -99,7 +99,7 @@
yield child_data
def __iter__( self ):
- context = elementtree.iterparse( self.source, events=self.ITERPARSE_ALL_EVENTS )
+ context = iterparse( self.source, events=self.ITERPARSE_ALL_EVENTS )
context = iter( context )
selected_element = None
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 lib/galaxy/sample_tracking/external_service_types.py
--- a/lib/galaxy/sample_tracking/external_service_types.py
+++ b/lib/galaxy/sample_tracking/external_service_types.py
@@ -4,7 +4,6 @@
from galaxy import util, jobs, model
from galaxy.forms.forms import form_factory
from galaxy.external_services.service import ExternalServiceActionsGroup
-from elementtree.ElementTree import XML
from galaxy.sample_tracking.data_transfer import data_transfer_factories
log = logging.getLogger( __name__ )
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -18,12 +18,11 @@
eggs.require( "MarkupSafe" ) # MarkupSafe must load before mako
eggs.require( "Mako" )
-eggs.require( "elementtree" )
eggs.require( "Paste" )
eggs.require( "SQLAlchemy >= 0.4" )
from cgi import FieldStorage
-from elementtree import ElementTree
+from xml.etree import ElementTree
from mako.template import Template
from paste import httpexceptions
@@ -2280,7 +2279,7 @@
trans.response.status = 500
log.error('Failed to get job information.')
return { 'error': 'Failed to get job information.' }
-
+
# load job parameters into incoming
tool_message = ''
if job:
@@ -2295,7 +2294,7 @@
# create parameter object
params = galaxy.util.Params( kwd, sanitize = False )
-
+
# convert value to jsonifiable value
def jsonify(v):
# check if value is numeric
@@ -2344,16 +2343,16 @@
# update and return
dict[key] = value
-
+
# check the current state of a value and update it if necessary
def check_state(trans, input, default_value, context):
value = default_value
error = 'State validation failed.'
-
+
# skip dynamic fields if deactivated
if not is_dynamic and input.is_dynamic:
return [value, None]
-
+
# validate value content
try:
# resolves the inconsistent definition of boolean parameters (see base.py) without modifying shared code
@@ -2365,7 +2364,7 @@
log.error('Checking parameter failed. %s', str(err))
pass
return [value, error]
-
+
# populates state with incoming url parameters
def populate_state(trans, inputs, state, errors, incoming, prefix="", context=None ):
context = ExpressionContext(state, context)
@@ -2410,7 +2409,7 @@
if error:
errors[key] = error
state[input.name] = value
-
+
# builds tool model including all attributes
def iterate(group_inputs, inputs, state_inputs, other_values=None):
other_values = ExpressionContext( state_inputs, other_values )
@@ -2442,13 +2441,13 @@
tool_dict = input.to_dict(trans, other_values=other_values)
except Exception:
pass
-
+
# identify name
input_name = tool_dict.get('name')
if input_name:
# backup default value
tool_dict['default_value'] = input.get_initial_value(trans, other_values)
-
+
# update input value from tool state
if input_name in state_inputs:
tool_dict['value'] = state_inputs[input_name]
@@ -2481,7 +2480,7 @@
# do param translation here, used by datasource tools
if self.input_translator:
self.input_translator.translate( params )
-
+
# initialize and populate tool state
state_inputs = {}
state_errors = {}
@@ -2490,7 +2489,7 @@
# create basic tool model
tool_model = self.to_dict(trans)
tool_model['inputs'] = {}
-
+
# build tool model and tool state
iterate(tool_model['inputs'], self.inputs, state_inputs, '')
@@ -2504,18 +2503,18 @@
tool_help = tool_help.render( static_path=url_for( '/static' ), host_url=url_for('/', qualified=True) )
if type( tool_help ) is not unicode:
tool_help = unicode( tool_help, 'utf-8')
-
+
# check if citations exist
tool_citations = False
if self.citations:
tool_citations = True
-
+
# get tool versions
tool_versions = []
tools = self.app.toolbox.get_loaded_tools_by_lineage(self.id)
for t in tools:
tool_versions.append(t.version)
-
+
## add information with underlying requirements and their versions
tool_requirements = []
if self.requirements:
@@ -2577,13 +2576,13 @@
except Exception, error:
trans.response.status = 500
return { 'error': str (error) }
-
+
# can't rerun upload, external data sources, et cetera. workflow compatible will proxy this for now
#if not self.is_workflow_compatible:
# trans.response.status = 500
# return { 'error': 'The \'%s\' tool does currently not support re-running.' % self.name }
return message
-
+
def get_default_history_by_trans( self, trans, create=False ):
return trans.get_history( create=create )
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 lib/galaxy/tools/parameters/basic.py
--- a/lib/galaxy/tools/parameters/basic.py
+++ b/lib/galaxy/tools/parameters/basic.py
@@ -8,7 +8,7 @@
import os
import os.path
import urllib
-from elementtree.ElementTree import XML, Element
+from xml.etree.ElementTree import XML
from galaxy import config, datatypes, util
from galaxy.web import form_builder
from galaxy.util.bunch import Bunch
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 lib/galaxy/tools/parameters/input_translation.py
--- a/lib/galaxy/tools/parameters/input_translation.py
+++ b/lib/galaxy/tools/parameters/input_translation.py
@@ -13,7 +13,7 @@
This is used for data source tools
>>> from galaxy.util import Params
- >>> from elementtree.ElementTree import XML
+ >>> from xml.etree.ElementTree import XML
>>> translator = ToolInputTranslator.from_element( XML(
... '''
... <request_param_translation>
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 lib/galaxy/tools/parameters/sanitize.py
--- a/lib/galaxy/tools/parameters/sanitize.py
+++ b/lib/galaxy/tools/parameters/sanitize.py
@@ -12,7 +12,7 @@
"""
Handles tool parameter specific sanitizing.
- >>> from elementtree.ElementTree import XML
+ >>> from xml.etree.ElementTree import XML
>>> sanitizer = ToolParameterSanitizer.from_element( XML(
... '''
... <sanitizer invalid_char="">
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 lib/galaxy/tools/parameters/validation.py
--- a/lib/galaxy/tools/parameters/validation.py
+++ b/lib/galaxy/tools/parameters/validation.py
@@ -3,7 +3,7 @@
"""
import os, re, logging
-from elementtree.ElementTree import XML
+from xml.etree.ElementTree import XML
from galaxy import model
log = logging.getLogger( __name__ )
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 lib/galaxy/util/__init__.py
--- a/lib/galaxy/util/__init__.py
+++ b/lib/galaxy/util/__init__.py
@@ -40,8 +40,7 @@
import docutils.core
import docutils.writers.html4css1
-eggs.require( 'elementtree' )
-from elementtree import ElementTree, ElementInclude
+from xml.etree import ElementTree, ElementInclude
eggs.require( "wchartype" )
import wchartype
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 lib/galaxy/webapps/galaxy/api/forms.py
--- a/lib/galaxy/webapps/galaxy/api/forms.py
+++ b/lib/galaxy/webapps/galaxy/api/forms.py
@@ -5,7 +5,7 @@
from galaxy.web.base.controller import BaseAPIController, url_for
from galaxy import web
from galaxy.forms.forms import form_factory
-from elementtree.ElementTree import XML
+from xml.etree.ElementTree import XML
log = logging.getLogger( __name__ )
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 lib/galaxy/webapps/galaxy/api/request_types.py
--- a/lib/galaxy/webapps/galaxy/api/request_types.py
+++ b/lib/galaxy/webapps/galaxy/api/request_types.py
@@ -5,7 +5,7 @@
from galaxy.web.base.controller import BaseAPIController, url_for
from galaxy import web
from galaxy.sample_tracking.request_types import request_type_factory
-from elementtree.ElementTree import XML
+from xml.etree.ElementTree import XML
log = logging.getLogger( __name__ )
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 lib/galaxy/webapps/galaxy/controllers/forms.py
--- a/lib/galaxy/webapps/galaxy/controllers/forms.py
+++ b/lib/galaxy/webapps/galaxy/controllers/forms.py
@@ -5,7 +5,7 @@
import logging, os, sys
from galaxy.web.form_builder import *
from galaxy.tools.parameters.basic import parameter_types
-from elementtree.ElementTree import XML, Element
+from xml.etree.ElementTree import XML, Element
from galaxy.util.odict import odict
import copy
from galaxy.web.framework.helpers import time_ago, iff, grids
@@ -65,7 +65,7 @@
global_actions = [
grids.GridAction( "Create new form", dict( controller='forms', action='create_form_definition' ) )
]
-
+
def build_initial_query( self, trans, **kwargs ):
return trans.sa_session.query( self.model_class ).join (model.FormDefinition, self.model_class.latest_form_id == model.FormDefinition.id)
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 lib/galaxy/workflow/modules.py
--- a/lib/galaxy/workflow/modules.py
+++ b/lib/galaxy/workflow/modules.py
@@ -6,9 +6,8 @@
import re
from galaxy import eggs
-eggs.require( "elementtree" )
-from elementtree.ElementTree import Element
+from xml.etree.ElementTree import Element
import galaxy.tools
from galaxy import exceptions
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 scripts/loc_files/create_all_fasta_loc.py
--- a/scripts/loc_files/create_all_fasta_loc.py
+++ b/scripts/loc_files/create_all_fasta_loc.py
@@ -1,5 +1,5 @@
import optparse, os, sys
-import elementtree.ElementTree as etree
+from xml.etree.ElementTree import parse
"""
Generates a loc file containing names of all the fasta files that match the
@@ -212,7 +212,7 @@
# get column names
col_values = []
loc_path = None
- tree = etree.parse( options.data_table_xml )
+ tree = parse( options.data_table_xml )
tables = tree.getroot()
for table in tables.getiterator():
name = table.attrib.get( 'name' )
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 scripts/microbes/ncbi_to_ucsc.py
--- a/scripts/microbes/ncbi_to_ucsc.py
+++ b/scripts/microbes/ncbi_to_ucsc.py
@@ -7,7 +7,7 @@
import sys, os
import urllib
-from elementtree import ElementTree
+from xml.etree import ElementTree
from BeautifulSoup import BeautifulSoup
from shutil import move
@@ -17,7 +17,7 @@
base_dir = sys.argv[1]
except:
print "using default base_dir:", base_dir
-
+
organisms = {}
for result in os.walk(base_dir):
this_base_dir,sub_dirs,files = result
@@ -76,7 +76,7 @@
org_page.pop(0)
if org_page[-1]=="":
org_page.pop(-1)
-
+
for row in org_page:
chr = row.split("</a>")[0].split(">")[-1]
refseq = row.split("</a>")[-2].split(">")[-1]
@@ -87,20 +87,20 @@
builds[org]={'chrs':{},'build':build}
builds[org]['chrs'][refseq]=chr
#print build,org,chr,refseq
-
+
print
ext_to_edit = ['bed', 'info', ]
for org in builds:
print org,"changed to",builds[org]['build']
-
+
#org info file
info_file_old = os.path.join(base_dir+org,org+".info")
info_file_new = os.path.join(base_dir+org,builds[org]['build']+".info")
-
-
+
+
old_dir = base_dir+org
new_dir = base_dir+builds[org]['build']
-
+
#open and edit org info file
info_file_contents = open(info_file_old).read()
info_file_contents = info_file_contents+"build="+builds[org]['build']+"\n"
@@ -114,31 +114,31 @@
old_name = os.path.join(this_base_dir,file)
new_name = os.path.join(this_base_dir,builds[org]['chrs'][chrom]+file[len(chrom):])
move(old_name,new_name)
-
+
#edit contents of file, skiping those in list
if file.split(".")[-1] not in ext_to_edit: continue
-
+
file_contents = open(new_name).read()
file_contents = file_contents.replace(chrom,builds[org]['chrs'][chrom])
-
+
#special case fixes...
if file[-5:] == ".info":
file_contents = file_contents.replace("organism="+org,"organism="+builds[org]['build'])
file_contents = file_contents.replace("refseq="+builds[org]['chrs'][chrom],"refseq="+chrom)
-
+
#write out new file
file_out = open(new_name,'w')
file_out.write(file_contents)
file_out.close()
-
-
-
+
+
+
#write out org info file and remove old file
org_info_out = open(info_file_new,'w')
org_info_out.write(info_file_contents)
org_info_out.close()
os.unlink(info_file_old)
-
+
#change org directory name
move(old_dir,new_dir)
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 test/base/asserts/xml.py
--- a/test/base/asserts/xml.py
+++ b/test/base/asserts/xml.py
@@ -1,10 +1,10 @@
-import elementtree.ElementTree
+import xml.etree
import re
# Helper functions used to work with XML output.
def to_xml(output):
- return elementtree.ElementTree.fromstring(output)
+ return xml.etree.fromstring(output)
def xml_find_text(output, path):
@@ -31,8 +31,7 @@
def assert_has_element_with_path(output, path):
""" Asserts the specified output has at least one XML element with a
path matching the specified path argument. Valid paths are the
- simplified subsets of XPath implemented by elementtree (currently
- Galaxy makes use of elementtree 1.2). See
+ simplified subsets of XPath implemented by xml.etree;
http://effbot.org/zone/element-xpath.htm for more information."""
if xml_find(output, path) is None:
errmsg = "Expected to find XML element matching expression %s, not such match was found." % path
@@ -74,13 +73,13 @@
errmsg = "Expected attribute '%s' on element with path '%s' to match '%s', instead attribute value was '%s'." % (attribute, path, expression, attribute_value)
raise AssertionError(errmsg)
-
+
def assert_attribute_is(output, path, attribute, text):
""" Asserts the specified attribute of the first element matching
the specified path matches exactly the specified text."""
assert_attribute_matches(output, path, attribute, re.escape(text))
-
+
def assert_element_text(output, path, verify_assertions_function, children):
""" Recursively checks the specified assertions against the text of
the first element matching the specified path."""
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 test/base/twilltestcase.py
--- a/test/base/twilltestcase.py
+++ b/test/base/twilltestcase.py
@@ -22,10 +22,9 @@
from urlparse import urlparse
from galaxy import eggs
-eggs.require( "elementtree" )
eggs.require( 'twill' )
-from elementtree import ElementTree
+from xml.etree import ElementTree
import twill
import twill.commands as tc
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 test/unit/tools/test_actions.py
--- a/test/unit/tools/test_actions.py
+++ b/test/unit/tools/test_actions.py
@@ -6,7 +6,7 @@
from galaxy.tools.actions import DefaultToolAction
from galaxy.tools.actions import on_text_for_names
from galaxy.tools.actions import determine_output_format
-from elementtree.ElementTree import XML
+from xml.etree.ElementTree import XML
import tools_support
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 test/unit/tools/test_dataset_matcher.py
--- a/test/unit/tools/test_dataset_matcher.py
+++ b/test/unit/tools/test_dataset_matcher.py
@@ -1,12 +1,11 @@
from unittest import TestCase
+from xml.etree.ElementTree import XML
from galaxy import model
from galaxy.util import bunch
from galaxy.tools.parameters import basic
from galaxy.tools.parameters import dataset_matcher
-from elementtree.ElementTree import XML
-
import tools_support
from .test_data_parameters import MockHistoryDatasetAssociation
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 test/unit/tools/test_evaluation.py
--- a/test/unit/tools/test_evaluation.py
+++ b/test/unit/tools/test_evaluation.py
@@ -1,6 +1,7 @@
import os
+from xml.etree.ElementTree import XML
+from unittest import TestCase
-from unittest import TestCase
from galaxy.model import Job
from galaxy.model import History
from galaxy.model import Dataset
@@ -21,7 +22,6 @@
from galaxy.tools.parameters.basic import IntegerToolParameter
from galaxy.tools.parameters.basic import SelectToolParameter
from galaxy.tools.parameters.basic import DataToolParameter
-from elementtree.ElementTree import XML # Import after model, to ensure elementtree
# Test fixtures for Galaxy infrastructure.
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 test/unit/tools/test_parameter_parsing.py
--- a/test/unit/tools/test_parameter_parsing.py
+++ b/test/unit/tools/test_parameter_parsing.py
@@ -2,7 +2,7 @@
from galaxy.tools.parameters import basic
from galaxy.util import bunch
-from elementtree.ElementTree import XML
+from xml.etree.ElementTree import XML
import tools_support
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 test/unit/tools/test_wrappers.py
--- a/test/unit/tools/test_wrappers.py
+++ b/test/unit/tools/test_wrappers.py
@@ -10,7 +10,7 @@
from galaxy.tools.wrappers import DatasetFilenameWrapper
from galaxy.jobs.datasets import DatasetPath
from galaxy.util.bunch import Bunch
-from elementtree.ElementTree import XML
+from xml.etree.ElementTree import XML
from galaxy.datatypes.metadata import MetadataSpecCollection
https://bitbucket.org/galaxy/galaxy-central/commits/cfb7985afbea/
Changeset: cfb7985afbea
User: dannon
Date: 2015-01-29 21:15:48+00:00
Summary: Add TODO to follow up and simplify logic in tools/loader related to elementtree.
Affected #: 1 file
diff -r f760a391f14af4a518bbf3b4ef47c9c1c4b1e898 -r cfb7985afbea9726297ebd6076bcd4cb191c8c45 lib/galaxy/tools/loader.py
--- a/lib/galaxy/tools/loader.py
+++ b/lib/galaxy/tools/loader.py
@@ -120,6 +120,7 @@
# HACK for elementtree, newer implementations (etree/lxml) won't
# require this parent_map data structure but elementtree does not
# track parents or recongnize .find('..').
+ # TODO fix this now that we're not using elementtree
parent_map = dict((c, p) for p in element.getiterator() for c in p)
_xml_replace(expand_el, macro_def, parent_map)
https://bitbucket.org/galaxy/galaxy-central/commits/a0c2bd2de611/
Changeset: a0c2bd2de611
User: dannon
Date: 2015-01-29 21:22:59+00:00
Summary: Merge.
Affected #: 6 files
diff -r cfb7985afbea9726297ebd6076bcd4cb191c8c45 -r a0c2bd2de611ab95292f9ae5f759dae9fa4939aa client/galaxy/scripts/mvc/history/history-panel-edit.js
--- a/client/galaxy/scripts/mvc/history/history-panel-edit.js
+++ b/client/galaxy/scripts/mvc/history/history-panel-edit.js
@@ -75,13 +75,17 @@
/** Override to handle history as drag-drop target */
_setUpListeners : function(){
- _super.prototype._setUpListeners.call( this );
+ var panel = this;
+ _super.prototype._setUpListeners.call( panel );
- this.on( 'drop', function( ev, data ){
- this.dataDropped( data );
+ panel.on( 'drop', function( ev, data ){
+ panel.dataDropped( data );
// remove the drop target
- this.dropTargetOff();
+ panel.dropTargetOff();
});
+ panel.on( 'view:attached view:removed', function(){
+ panel._renderCounts();
+ }, panel );
},
// ------------------------------------------------------------------------ listeners
@@ -332,7 +336,10 @@
// override to control where the view is added, how/whether it's rendered
panel.views.unshift( view );
panel.$list().prepend( view.render( 0 ).$el.hide() );
- view.$el.slideDown( panel.fxSpeed );
+ panel.trigger( 'view:attached', view );
+ view.$el.slideDown( panel.fxSpeed, function(){
+ panel.trigger( 'view:attached:rendered' );
+ });
},
/** In this override, add purgeAllowed and whether tags/annotation editors should be shown */
diff -r cfb7985afbea9726297ebd6076bcd4cb191c8c45 -r a0c2bd2de611ab95292f9ae5f759dae9fa4939aa client/galaxy/scripts/mvc/list/list-panel.js
--- a/client/galaxy/scripts/mvc/list/list-panel.js
+++ b/client/galaxy/scripts/mvc/list/list-panel.js
@@ -477,7 +477,10 @@
// override to control where the view is added, how/whether it's rendered
panel.views.push( view );
panel.$list().append( view.render( 0 ).$el.hide() );
- view.$el.slideDown( panel.fxSpeed );
+ panel.trigger( 'view:attached', view );
+ view.$el.slideDown( panel.fxSpeed, function(){
+ panel.trigger( 'view:attached:rendered' );
+ });
},
/** Remove a view from the panel (if found) */
@@ -487,6 +490,7 @@
view = panel.viewFromModel( model );
if( !view ){ return undefined; }
panel.views = _.without( panel.views, view );
+ panel.trigger( 'view:removed', view );
// potentially show the empty message if no views left
// use anonymous queue here - since remove can happen multiple times
@@ -494,6 +498,7 @@
function( next ){ view.$el.fadeOut( panel.fxSpeed, next ); },
function( next ){
view.remove();
+ panel.trigger( 'view:removed:rendered' );
if( !panel.views.length ){
panel._renderEmptyMessage().fadeIn( panel.fxSpeed, next );
} else {
diff -r cfb7985afbea9726297ebd6076bcd4cb191c8c45 -r a0c2bd2de611ab95292f9ae5f759dae9fa4939aa static/scripts/mvc/history/history-panel-edit.js
--- a/static/scripts/mvc/history/history-panel-edit.js
+++ b/static/scripts/mvc/history/history-panel-edit.js
@@ -75,13 +75,17 @@
/** Override to handle history as drag-drop target */
_setUpListeners : function(){
- _super.prototype._setUpListeners.call( this );
+ var panel = this;
+ _super.prototype._setUpListeners.call( panel );
- this.on( 'drop', function( ev, data ){
- this.dataDropped( data );
+ panel.on( 'drop', function( ev, data ){
+ panel.dataDropped( data );
// remove the drop target
- this.dropTargetOff();
+ panel.dropTargetOff();
});
+ panel.on( 'view:attached view:removed', function(){
+ panel._renderCounts();
+ }, panel );
},
// ------------------------------------------------------------------------ listeners
@@ -332,7 +336,10 @@
// override to control where the view is added, how/whether it's rendered
panel.views.unshift( view );
panel.$list().prepend( view.render( 0 ).$el.hide() );
- view.$el.slideDown( panel.fxSpeed );
+ panel.trigger( 'view:attached', view );
+ view.$el.slideDown( panel.fxSpeed, function(){
+ panel.trigger( 'view:attached:rendered' );
+ });
},
/** In this override, add purgeAllowed and whether tags/annotation editors should be shown */
diff -r cfb7985afbea9726297ebd6076bcd4cb191c8c45 -r a0c2bd2de611ab95292f9ae5f759dae9fa4939aa static/scripts/mvc/list/list-panel.js
--- a/static/scripts/mvc/list/list-panel.js
+++ b/static/scripts/mvc/list/list-panel.js
@@ -477,7 +477,10 @@
// override to control where the view is added, how/whether it's rendered
panel.views.push( view );
panel.$list().append( view.render( 0 ).$el.hide() );
- view.$el.slideDown( panel.fxSpeed );
+ panel.trigger( 'view:attached', view );
+ view.$el.slideDown( panel.fxSpeed, function(){
+ panel.trigger( 'view:attached:rendered' );
+ });
},
/** Remove a view from the panel (if found) */
@@ -487,6 +490,7 @@
view = panel.viewFromModel( model );
if( !view ){ return undefined; }
panel.views = _.without( panel.views, view );
+ panel.trigger( 'view:removed', view );
// potentially show the empty message if no views left
// use anonymous queue here - since remove can happen multiple times
@@ -494,6 +498,7 @@
function( next ){ view.$el.fadeOut( panel.fxSpeed, next ); },
function( next ){
view.remove();
+ panel.trigger( 'view:removed:rendered' );
if( !panel.views.length ){
panel._renderEmptyMessage().fadeIn( panel.fxSpeed, next );
} else {
diff -r cfb7985afbea9726297ebd6076bcd4cb191c8c45 -r a0c2bd2de611ab95292f9ae5f759dae9fa4939aa static/scripts/packed/mvc/history/history-panel-edit.js
--- a/static/scripts/packed/mvc/history/history-panel-edit.js
+++ b/static/scripts/packed/mvc/history/history-panel-edit.js
@@ -1,1 +1,1 @@
-define(["mvc/history/history-panel","mvc/history/history-contents","mvc/dataset/states","mvc/history/hda-model","mvc/history/hda-li-edit","mvc/history/hdca-li-edit","mvc/tags","mvc/annotations","ui/fa-icon-button","mvc/ui/popup-menu","utils/localization"],function(h,j,m,f,e,i,l,c,b,a,d){var k=h.HistoryPanel;var g=k.extend({HDAViewClass:e.HDAListItemEdit,HDCAViewClass:i.HDCAListItemEdit,initialize:function(n){n=n||{};k.prototype.initialize.call(this,n);this.tagsEditor=null;this.annotationEditor=null;this.purgeAllowed=n.purgeAllowed||false;this.annotationEditorShown=n.annotationEditorShown||false;this.tagsEditorShown=n.tagsEditorShown||false;this.multiselectActions=n.multiselectActions||this._getActions()},_setUpListeners:function(){k.prototype._setUpListeners.call(this);this.on("drop",function(n,o){this.dataDropped(o);this.dropTargetOff()})},_setUpCollectionListeners:function(){k.prototype._setUpCollectionListeners.call(this);this.collection.on("change:deleted",this._handleHdaDeletionChange,this);this.collection.on("change:visible",this._handleHdaVisibleChange,this);this.collection.on("change:purged",function(n){this.model.fetch()},this);return this},_setUpModelListeners:function(){k.prototype._setUpModelListeners.call(this);this.model.on("change:nice_size",this.updateHistoryDiskSize,this);return this},_buildNewRender:function(){var n=k.prototype._buildNewRender.call(this);if(!this.model){return n}if(Galaxy&&Galaxy.currUser&&Galaxy.currUser.id&&Galaxy.currUser.id===this.model.get("user_id")){this._renderTags(n);this._renderAnnotation(n)}return n},renderItems:function(o){var n=k.prototype.renderItems.call(this,o);this._renderCounts(o);return n},_renderCounts:function(p){function o(s,t){return['<a class="',s,'" href="javascript:void(0);">',t,"</a>"].join("")}p=p||this.$el;var n=this.collection.where({deleted:true}),r=this.collection.where({visible:false}),q=[];if(this.views.length){q.push([this.views.length,d("shown")].join(" "))}if(n.length){q.push((!this.showDeleted)?([n.length,o("toggle-deleted-link",d("deleted"))].join(" ")):(o("toggle-deleted-link",d("hide deleted"))))}if(r.length){q.push((!this.showHidden)?([r.length,o("toggle-hidden-link",d("hidden"))].join(" ")):(o("toggle-hidden-link",d("hide hidden"))))}return p.find("> .controls .subtitle").html(q.join(", "))},_renderTags:function(n){var o=this;this.tagsEditor=new l.TagsEditor({model:this.model,el:n.find(".controls .tags-display"),onshowFirstTime:function(){this.render()},onshow:function(){o.toggleHDATagEditors(true,o.fxSpeed)},onhide:function(){o.toggleHDATagEditors(false,o.fxSpeed)},$activator:b({title:d("Edit history tags"),classes:"history-tag-btn",faIcon:"fa-tags"}).appendTo(n.find(".controls .actions"))})},_renderAnnotation:function(n){var o=this;this.annotationEditor=new c.AnnotationEditor({model:this.model,el:n.find(".controls .annotation-display"),onshowFirstTime:function(){this.render()},onshow:function(){o.toggleHDAAnnotationEditors(true,o.fxSpeed)},onhide:function(){o.toggleHDAAnnotationEditors(false,o.fxSpeed)},$activator:b({title:d("Edit history annotation"),classes:"history-annotate-btn",faIcon:"fa-comment"}).appendTo(n.find(".controls .actions"))})},_setUpBehaviors:function(n){n=n||this.$el;k.prototype._setUpBehaviors.call(this,n);if(!this.model){return}if(this.multiselectActions.length){this.actionsPopup=new a(n.find(".list-action-popup-btn"),this.multiselectActions)}if((!Galaxy.currUser||Galaxy.currUser.isAnonymous())||(Galaxy.currUser.id!==this.model.get("user_id"))){return}var o=this,p=".controls .name";n.find(p).attr("title",d("Click to rename history")).tooltip({placement:"bottom"}).make_text_editable({on_finish:function(q){var r=o.model.get("name");if(q&&q!==r){o.$el.find(p).text(q);o.model.save({name:q}).fail(function(){o.$el.find(p).text(o.model.previous("name"))})}else{o.$el.find(p).text(r)}}})},_getActions:function(){var n=this,o=[{html:d("Hide datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype.hide;n.getSelectedModels().ajaxQueue(p)}},{html:d("Unhide datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype.unhide;n.getSelectedModels().ajaxQueue(p)}},{html:d("Delete datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype["delete"];n.getSelectedModels().ajaxQueue(p)}},{html:d("Undelete datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype.undelete;n.getSelectedModels().ajaxQueue(p)}}];if(n.purgeAllowed){o.push({html:d("Permanently delete datasets"),func:function(){if(confirm(d("This will permanently remove the data in your datasets. Are you sure?"))){var p=f.HistoryDatasetAssociation.prototype.purge;n.getSelectedModels().ajaxQueue(p)}}})}o.push({html:d("Build Dataset List"),func:function(){n.getSelectedModels().promoteToHistoryDatasetCollection(n.model,"list")}});o.push({html:d("Build Dataset Pair"),func:function(){n.getSelectedModels().promoteToHistoryDatasetCollection(n.model,"paired")}});o.push({html:d("Build List of Dataset Pairs"),func:_.bind(n._showPairedCollectionModal,n)});return o},_showPairedCollectionModal:function(){var n=this,o=n.getSelectedModels().toJSON().filter(function(p){return p.history_content_type==="dataset"&&p.state===m.OK});if(o.length){require(["mvc/collection/paired-collection-creator"],function(p){window.creator=p.pairedCollectionCreatorModal(o,{historyId:n.model.id})})}else{}},_attachItems:function(n){this.$list(n).append(this.views.reverse().map(function(o){return o.$el}));return this},_attachView:function(o){var n=this;n.views.unshift(o);n.$list().prepend(o.render(0).$el.hide());o.$el.slideDown(n.fxSpeed)},_getItemViewOptions:function(o){var n=k.prototype._getItemViewOptions.call(this,o);_.extend(n,{purgeAllowed:this.purgeAllowed,tagsEditorShown:(this.tagsEditor&&!this.tagsEditor.hidden),annotationEditorShown:(this.annotationEditor&&!this.annotationEditor.hidden)});return n},_handleHdaDeletionChange:function(n){if(n.get("deleted")&&!this.showDeleted){this.removeItemView(n)}this._renderCounts()},_handleHdaVisibleChange:function(n){if(n.hidden()&&!this.storage.showHidden){this.removeItemView(n)}this._renderCounts()},toggleHDATagEditors:function(n){var o=Array.prototype.slice.call(arguments,1);_.each(this.views,function(p){if(p.tagsEditor){p.tagsEditor.toggle.apply(p.tagsEditor,o)}})},toggleHDAAnnotationEditors:function(n){var o=Array.prototype.slice.call(arguments,1);_.each(this.views,function(p){if(p.annotationEditor){p.annotationEditor.toggle.apply(p.annotationEditor,o)}})},events:_.extend(_.clone(k.prototype.events),{"click .show-selectors-btn":"toggleSelectors","click .toggle-deleted-link":function(n){this.toggleShowDeleted()},"click .toggle-hidden-link":function(n){this.toggleShowHidden()}}),updateHistoryDiskSize:function(){this.$el.find(".history-size").text(this.model.get("nice_size"))},dropTargetOn:function(){if(this.dropTarget){return this}this.dropTarget=true;var o={dragenter:_.bind(this.dragenter,this),dragover:_.bind(this.dragover,this),dragleave:_.bind(this.dragleave,this),drop:_.bind(this.drop,this)};var p=this._renderDropTarget();this.$list().before([this._renderDropTargetHelp(),p]);for(var n in o){if(o.hasOwnProperty(n)){p.on(n,o[n])}}return this},_renderDropTarget:function(){return $("<div/>").addClass("history-drop-target").css({height:"64px",margin:"0px 10px 10px 10px",border:"1px dashed black","border-radius":"3px"})},_renderDropTargetHelp:function(){return $("<div/>").addClass("history-drop-target-help").css({margin:"10px 10px 4px 10px",color:"grey","font-size":"80%","font-style":"italic"}).text(d("Drag datasets here to copy them to the current history"))},dropTargetOff:function(){if(!this.dropTarget){return this}this.dropTarget=false;this.$(".history-drop-target").remove();this.$(".history-drop-target-help").remove();return this},dropTargetToggle:function(){if(this.dropTarget){this.dropTargetOff()}else{this.dropTargetOn()}return this},dragenter:function(n){n.preventDefault();n.stopPropagation();this.$(".history-drop-target").css("border","2px solid black")},dragover:function(n){n.preventDefault();n.stopPropagation()},dragleave:function(n){n.preventDefault();n.stopPropagation();this.$(".history-drop-target").css("border","1px dashed black")},drop:function(p){p.preventDefault();p.dataTransfer.dropEffect="move";var n=this,q=p.dataTransfer.getData("text");try{q=JSON.parse(q)}catch(o){this.warn("error parsing JSON from drop:",q)}this.trigger("droptarget:drop",p,q,n);return false},dataDropped:function(o){var n=this;if(_.isObject(o)&&o.model_class==="HistoryDatasetAssociation"&&o.id){return n.model.contents.copy(o.id)}return jQuery.when()},toString:function(){return"HistoryPanelEdit("+((this.model)?(this.model.get("name")):(""))+")"}});return{HistoryPanelEdit:g}});
\ No newline at end of file
+define(["mvc/history/history-panel","mvc/history/history-contents","mvc/dataset/states","mvc/history/hda-model","mvc/history/hda-li-edit","mvc/history/hdca-li-edit","mvc/tags","mvc/annotations","ui/fa-icon-button","mvc/ui/popup-menu","utils/localization"],function(h,j,m,f,e,i,l,c,b,a,d){var k=h.HistoryPanel;var g=k.extend({HDAViewClass:e.HDAListItemEdit,HDCAViewClass:i.HDCAListItemEdit,initialize:function(n){n=n||{};k.prototype.initialize.call(this,n);this.tagsEditor=null;this.annotationEditor=null;this.purgeAllowed=n.purgeAllowed||false;this.annotationEditorShown=n.annotationEditorShown||false;this.tagsEditorShown=n.tagsEditorShown||false;this.multiselectActions=n.multiselectActions||this._getActions()},_setUpListeners:function(){var n=this;k.prototype._setUpListeners.call(n);n.on("drop",function(o,p){n.dataDropped(p);n.dropTargetOff()});n.on("view:attached view:removed",function(){n._renderCounts()},n)},_setUpCollectionListeners:function(){k.prototype._setUpCollectionListeners.call(this);this.collection.on("change:deleted",this._handleHdaDeletionChange,this);this.collection.on("change:visible",this._handleHdaVisibleChange,this);this.collection.on("change:purged",function(n){this.model.fetch()},this);return this},_setUpModelListeners:function(){k.prototype._setUpModelListeners.call(this);this.model.on("change:nice_size",this.updateHistoryDiskSize,this);return this},_buildNewRender:function(){var n=k.prototype._buildNewRender.call(this);if(!this.model){return n}if(Galaxy&&Galaxy.currUser&&Galaxy.currUser.id&&Galaxy.currUser.id===this.model.get("user_id")){this._renderTags(n);this._renderAnnotation(n)}return n},renderItems:function(o){var n=k.prototype.renderItems.call(this,o);this._renderCounts(o);return n},_renderCounts:function(p){function o(s,t){return['<a class="',s,'" href="javascript:void(0);">',t,"</a>"].join("")}p=p||this.$el;var n=this.collection.where({deleted:true}),r=this.collection.where({visible:false}),q=[];if(this.views.length){q.push([this.views.length,d("shown")].join(" "))}if(n.length){q.push((!this.showDeleted)?([n.length,o("toggle-deleted-link",d("deleted"))].join(" ")):(o("toggle-deleted-link",d("hide deleted"))))}if(r.length){q.push((!this.showHidden)?([r.length,o("toggle-hidden-link",d("hidden"))].join(" ")):(o("toggle-hidden-link",d("hide hidden"))))}return p.find("> .controls .subtitle").html(q.join(", "))},_renderTags:function(n){var o=this;this.tagsEditor=new l.TagsEditor({model:this.model,el:n.find(".controls .tags-display"),onshowFirstTime:function(){this.render()},onshow:function(){o.toggleHDATagEditors(true,o.fxSpeed)},onhide:function(){o.toggleHDATagEditors(false,o.fxSpeed)},$activator:b({title:d("Edit history tags"),classes:"history-tag-btn",faIcon:"fa-tags"}).appendTo(n.find(".controls .actions"))})},_renderAnnotation:function(n){var o=this;this.annotationEditor=new c.AnnotationEditor({model:this.model,el:n.find(".controls .annotation-display"),onshowFirstTime:function(){this.render()},onshow:function(){o.toggleHDAAnnotationEditors(true,o.fxSpeed)},onhide:function(){o.toggleHDAAnnotationEditors(false,o.fxSpeed)},$activator:b({title:d("Edit history annotation"),classes:"history-annotate-btn",faIcon:"fa-comment"}).appendTo(n.find(".controls .actions"))})},_setUpBehaviors:function(n){n=n||this.$el;k.prototype._setUpBehaviors.call(this,n);if(!this.model){return}if(this.multiselectActions.length){this.actionsPopup=new a(n.find(".list-action-popup-btn"),this.multiselectActions)}if((!Galaxy.currUser||Galaxy.currUser.isAnonymous())||(Galaxy.currUser.id!==this.model.get("user_id"))){return}var o=this,p=".controls .name";n.find(p).attr("title",d("Click to rename history")).tooltip({placement:"bottom"}).make_text_editable({on_finish:function(q){var r=o.model.get("name");if(q&&q!==r){o.$el.find(p).text(q);o.model.save({name:q}).fail(function(){o.$el.find(p).text(o.model.previous("name"))})}else{o.$el.find(p).text(r)}}})},_getActions:function(){var n=this,o=[{html:d("Hide datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype.hide;n.getSelectedModels().ajaxQueue(p)}},{html:d("Unhide datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype.unhide;n.getSelectedModels().ajaxQueue(p)}},{html:d("Delete datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype["delete"];n.getSelectedModels().ajaxQueue(p)}},{html:d("Undelete datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype.undelete;n.getSelectedModels().ajaxQueue(p)}}];if(n.purgeAllowed){o.push({html:d("Permanently delete datasets"),func:function(){if(confirm(d("This will permanently remove the data in your datasets. Are you sure?"))){var p=f.HistoryDatasetAssociation.prototype.purge;n.getSelectedModels().ajaxQueue(p)}}})}o.push({html:d("Build Dataset List"),func:function(){n.getSelectedModels().promoteToHistoryDatasetCollection(n.model,"list")}});o.push({html:d("Build Dataset Pair"),func:function(){n.getSelectedModels().promoteToHistoryDatasetCollection(n.model,"paired")}});o.push({html:d("Build List of Dataset Pairs"),func:_.bind(n._showPairedCollectionModal,n)});return o},_showPairedCollectionModal:function(){var n=this,o=n.getSelectedModels().toJSON().filter(function(p){return p.history_content_type==="dataset"&&p.state===m.OK});if(o.length){require(["mvc/collection/paired-collection-creator"],function(p){window.creator=p.pairedCollectionCreatorModal(o,{historyId:n.model.id})})}else{}},_attachItems:function(n){this.$list(n).append(this.views.reverse().map(function(o){return o.$el}));return this},_attachView:function(o){var n=this;n.views.unshift(o);n.$list().prepend(o.render(0).$el.hide());n.trigger("view:attached",o);o.$el.slideDown(n.fxSpeed,function(){n.trigger("view:attached:rendered")})},_getItemViewOptions:function(o){var n=k.prototype._getItemViewOptions.call(this,o);_.extend(n,{purgeAllowed:this.purgeAllowed,tagsEditorShown:(this.tagsEditor&&!this.tagsEditor.hidden),annotationEditorShown:(this.annotationEditor&&!this.annotationEditor.hidden)});return n},_handleHdaDeletionChange:function(n){if(n.get("deleted")&&!this.showDeleted){this.removeItemView(n)}this._renderCounts()},_handleHdaVisibleChange:function(n){if(n.hidden()&&!this.storage.showHidden){this.removeItemView(n)}this._renderCounts()},toggleHDATagEditors:function(n){var o=Array.prototype.slice.call(arguments,1);_.each(this.views,function(p){if(p.tagsEditor){p.tagsEditor.toggle.apply(p.tagsEditor,o)}})},toggleHDAAnnotationEditors:function(n){var o=Array.prototype.slice.call(arguments,1);_.each(this.views,function(p){if(p.annotationEditor){p.annotationEditor.toggle.apply(p.annotationEditor,o)}})},events:_.extend(_.clone(k.prototype.events),{"click .show-selectors-btn":"toggleSelectors","click .toggle-deleted-link":function(n){this.toggleShowDeleted()},"click .toggle-hidden-link":function(n){this.toggleShowHidden()}}),updateHistoryDiskSize:function(){this.$el.find(".history-size").text(this.model.get("nice_size"))},dropTargetOn:function(){if(this.dropTarget){return this}this.dropTarget=true;var o={dragenter:_.bind(this.dragenter,this),dragover:_.bind(this.dragover,this),dragleave:_.bind(this.dragleave,this),drop:_.bind(this.drop,this)};var p=this._renderDropTarget();this.$list().before([this._renderDropTargetHelp(),p]);for(var n in o){if(o.hasOwnProperty(n)){p.on(n,o[n])}}return this},_renderDropTarget:function(){return $("<div/>").addClass("history-drop-target").css({height:"64px",margin:"0px 10px 10px 10px",border:"1px dashed black","border-radius":"3px"})},_renderDropTargetHelp:function(){return $("<div/>").addClass("history-drop-target-help").css({margin:"10px 10px 4px 10px",color:"grey","font-size":"80%","font-style":"italic"}).text(d("Drag datasets here to copy them to the current history"))},dropTargetOff:function(){if(!this.dropTarget){return this}this.dropTarget=false;this.$(".history-drop-target").remove();this.$(".history-drop-target-help").remove();return this},dropTargetToggle:function(){if(this.dropTarget){this.dropTargetOff()}else{this.dropTargetOn()}return this},dragenter:function(n){n.preventDefault();n.stopPropagation();this.$(".history-drop-target").css("border","2px solid black")},dragover:function(n){n.preventDefault();n.stopPropagation()},dragleave:function(n){n.preventDefault();n.stopPropagation();this.$(".history-drop-target").css("border","1px dashed black")},drop:function(p){p.preventDefault();p.dataTransfer.dropEffect="move";var n=this,q=p.dataTransfer.getData("text");try{q=JSON.parse(q)}catch(o){this.warn("error parsing JSON from drop:",q)}this.trigger("droptarget:drop",p,q,n);return false},dataDropped:function(o){var n=this;if(_.isObject(o)&&o.model_class==="HistoryDatasetAssociation"&&o.id){return n.model.contents.copy(o.id)}return jQuery.when()},toString:function(){return"HistoryPanelEdit("+((this.model)?(this.model.get("name")):(""))+")"}});return{HistoryPanelEdit:g}});
\ No newline at end of file
diff -r cfb7985afbea9726297ebd6076bcd4cb191c8c45 -r a0c2bd2de611ab95292f9ae5f759dae9fa4939aa static/scripts/packed/mvc/list/list-panel.js
--- a/static/scripts/packed/mvc/list/list-panel.js
+++ b/static/scripts/packed/mvc/list/list-panel.js
@@ -1,1 +1,1 @@
-define(["mvc/list/list-item","ui/loading-indicator","mvc/base-mvc","utils/localization","ui/search-input"],function(d,f,b,c){var e=Backbone.View.extend(b.LoggableMixin).extend({viewClass:d.ListItemView,collectionClass:Backbone.Collection,tagName:"div",className:"list-panel",fxSpeed:"fast",emptyMsg:c("This list is empty"),noneFoundMsg:c("No matching items found"),searchPlaceholder:c("search"),multiselectActions:[],initialize:function(g,h){g=g||{};if(g.logger){this.logger=g.logger}this.log(this+".initialize:",g);this.fxSpeed=_.has(g,"fxSpeed")?(g.fxSpeed):(this.fxSpeed);this.filters=[];this.searchFor=g.searchFor||"";this.indicator=new f(this.$el);this.selecting=(g.selecting!==undefined)?g.selecting:true;this.selected=g.selected||[];this.lastSelected=null;this.dragItems=g.dragItems||false;this.viewClass=g.viewClass||this.viewClass;this.views=[];this.collection=g.collection||(new this.collectionClass([]));this.filters=g.filters||[];this.$scrollContainer=g.$scrollContainer||this.$scrollContainer;this.title=g.title||"";this.subtitle=g.subtitle||"";this.multiselectActions=g.multiselectActions||this.multiselectActions;this.actionsPopup=null;this._setUpListeners()},freeViews:function(){_.each(this.views,function(g){g.off()});this.views=[];return this},_setUpListeners:function(){this.off();this.on("error",function(h,k,g,j,i){console.error(h,k,g,j,i)},this);this.on("loading",function(){this._showLoadingIndicator("loading...",40)},this);this.on("loading-done",function(){this._hideLoadingIndicator(40)},this);this.once("rendered",function(){this.trigger("rendered:initial",this)},this);if(this.logger){this.on("all",function(g){this.log(this+"",arguments)},this)}this._setUpCollectionListeners();this._setUpViewListeners();return this},_setUpCollectionListeners:function(){this.log(this+"._setUpCollectionListeners",this.collection);this.collection.off();this.collection.on("error",function(h,k,g,j,i){this.trigger("error",h,k,g,j,i)},this);this.collection.on("reset",function(){this.renderItems()},this);this.collection.on("add",this.addItemView,this);this.collection.on("remove",this.removeItemView,this);if(this.logger){this.collection.on("all",function(g){this.info(this+"(collection)",arguments)},this)}return this},_setUpViewListeners:function(){this.log(this+"._setUpViewListeners");this.on("view:selected",function(g,h){if(h&&h.shiftKey&&this.lastSelected){var i=this.viewFromModelId(this.lastSelected);if(i){this.selectRange(g,i)}}else{if(h&&h.altKey&&!this.selecting){this.showSelectors()}}this.selected.push(g.model.id);this.lastSelected=g.model.id},this);this.on("view:de-selected",function(g,h){this.selected=_.without(this.selected,g.model.id)},this)},render:function(h){this.log(this+".render",h);var g=this._buildNewRender();this._setUpBehaviors(g);this._queueNewRender(g,h);return this},_buildNewRender:function(){this.debug(this+"(ListPanel)._buildNewRender");var g=$(this.templates.el({},this));this._renderControls(g);this._renderTitle(g);this._renderSubtitle(g);this._renderSearch(g);this.renderItems(g);return g},_renderControls:function(h){this.debug(this+"(ListPanel)._renderControls");var g=$(this.templates.controls({},this));h.find(".controls").replaceWith(g);return g},_renderTitle:function(g){},_renderSubtitle:function(g){},_queueNewRender:function(h,i){i=(i===undefined)?(this.fxSpeed):(i);var g=this;g.log("_queueNewRender:",h,i);$(g).queue("fx",[function(j){this.$el.fadeOut(i,j)},function(j){g._swapNewRender(h);j()},function(j){this.$el.fadeIn(i,j)},function(j){g.trigger("rendered",g);j()}])},_swapNewRender:function(g){this.$el.empty().attr("class",this.className).append(g.children());if(this.selecting){this.showSelectors(0)}return this},_setUpBehaviors:function(g){g=g||this.$el;g.find(".controls [title]").tooltip({placement:"bottom"});return this},$scrollContainer:function(){return this.$el.parent().parent()},$list:function(g){return(g||this.$el).find("> .list-items")},$messages:function(g){return(g||this.$el).find("> .controls .messages")},$emptyMessage:function(g){return(g||this.$el).find("> .empty-message")},renderItems:function(i){i=i||this.$el;var g=this;g.log(this+".renderItems",i);var h=g.$list(i);g.views=g._filterCollection().map(function(j){return g._createItemView(j).render(0)});h.empty();if(g.views.length){g._attachItems(i);g.$emptyMessage(i).hide()}else{g._renderEmptyMessage(i).show()}return g.views},_filterCollection:function(){var g=this;return g.collection.filter(_.bind(g._filterItem,g))},_filterItem:function(h){var g=this;return(_.every(g.filters.map(function(i){return i.call(h)})))&&(!g.searchFor||h.matchesAll(g.searchFor))},_createItemView:function(i){var j=this._getItemViewClass(i),h=_.extend(this._getItemViewOptions(i),{model:i}),g=new j(h);this._setUpItemViewListeners(g);return g},_getItemViewClass:function(g){return this.viewClass},_getItemViewOptions:function(g){return{fxSpeed:this.fxSpeed,expanded:false,selectable:this.selecting,selected:_.contains(this.selected,g.id),draggable:this.dragItems}},_setUpItemViewListeners:function(h){var g=this;h.on("all",function(){var i=Array.prototype.slice.call(arguments,0);i[0]="view:"+i[0];g.trigger.apply(g,i)});h.on("draggable:dragstart",function(l,i){var j={},k=this.getSelectedModels();if(k.length){j=k.toJSON()}else{j=[i.model.toJSON()]}l.dataTransfer.setData("text",JSON.stringify(j))},this);return g},_attachItems:function(g){this.$list(g).append(this.views.map(function(h){return h.$el}));return this},_renderEmptyMessage:function(g){this.debug("_renderEmptyMessage",g,this.searchFor);var h=this.searchFor?this.noneFoundMsg:this.emptyMsg;return this.$emptyMessage(g).text(h)},expandAll:function(){_.each(this.views,function(g){g.expand()})},collapseAll:function(){_.each(this.views,function(g){g.collapse()})},addItemView:function(j,k,i){this.log(this+".addItemView:",j);var h=this;if(!h._filterItem(j)){return undefined}var g=h._createItemView(j);$(g).queue("fx",[function(l){h.$emptyMessage().fadeOut(h.fxSpeed,l)},function(l){h._attachView(g);l()}]);return g},_attachView:function(h){var g=this;g.views.push(h);g.$list().append(h.render(0).$el.hide());h.$el.slideDown(g.fxSpeed)},removeItemView:function(j,k,i){this.log(this+".removeItemView:",j);var h=this,g=h.viewFromModel(j);if(!g){return undefined}h.views=_.without(h.views,g);$({}).queue("fx",[function(l){g.$el.fadeOut(h.fxSpeed,l)},function(l){g.remove();if(!h.views.length){h._renderEmptyMessage().fadeIn(h.fxSpeed,l)}else{l()}}]);return g},viewFromModelId:function(h){for(var g=0;g<this.views.length;g++){if(this.views[g].model.id===h){return this.views[g]}}return undefined},viewFromModel:function(g){if(!g){return undefined}return this.viewFromModelId(g.id)},viewsWhereModel:function(g){return this.views.filter(function(h){var j=h.model.toJSON();for(var i in g){if(g.hasOwnProperty(i)){if(j[i]!==h.model.get(i)){return false}}}return true})},viewRange:function(j,i){if(j===i){return(j)?([j]):([])}var h=this.views.indexOf(j),g=this.views.indexOf(i);if(h===-1||g===-1){if(h===g){return[]}return(h===-1)?([i]):([j])}return(h<g)?this.views.slice(h,g+1):this.views.slice(g,h+1)},_renderSearch:function(g){g.find(".controls .search-input").searchInput({placeholder:this.searchPlaceholder,initialVal:this.searchFor,onfirstsearch:_.bind(this._firstSearch,this),onsearch:_.bind(this.searchItems,this),onclear:_.bind(this.clearSearch,this)});return g},_firstSearch:function(g){this.log("onFirstSearch",g);return this.searchItems(g)},searchItems:function(g){this.searchFor=g;this.trigger("search:searching",g,this);this.renderItems();this.$("> .controls .search-query").val(g);return this},clearSearch:function(g){this.searchFor="";this.trigger("search:clear",this);this.renderItems();this.$("> .controls .search-query").val("");return this},showSelectors:function(g){g=(g!==undefined)?(g):(this.fxSpeed);this.selecting=true;this.$(".list-actions").slideDown(g);_.each(this.views,function(h){h.showSelector(g)})},hideSelectors:function(g){g=(g!==undefined)?(g):(this.fxSpeed);this.selecting=false;this.$(".list-actions").slideUp(g);_.each(this.views,function(h){h.hideSelector(g)});this.selected=[];this.lastSelected=null},toggleSelectors:function(){if(!this.selecting){this.showSelectors()}else{this.hideSelectors()}},selectAll:function(g){_.each(this.views,function(h){h.select(g)})},deselectAll:function(g){this.lastSelected=null;_.each(this.views,function(h){h.deselect(g)})},selectRange:function(i,h){var g=this.viewRange(i,h);_.each(g,function(j){j.select()});return g},getSelectedViews:function(){return _.filter(this.views,function(g){return g.selected})},getSelectedModels:function(){return new this.collection.constructor(_.map(this.getSelectedViews(),function(g){return g.model}))},_showLoadingIndicator:function(h,g,i){this.debug("_showLoadingIndicator",this.indicator,h,g,i);g=(g!==undefined)?(g):(this.fxSpeed);if(!this.indicator){this.indicator=new f(this.$el,this.$el.parent());this.debug("\t created",this.indicator)}if(!this.$el.is(":visible")){this.indicator.show(0,i)}else{this.$el.fadeOut(g);this.indicator.show(h,g,i)}},_hideLoadingIndicator:function(g,h){this.debug("_hideLoadingIndicator",this.indicator,g,h);g=(g!==undefined)?(g):(this.fxSpeed);if(this.indicator){this.indicator.hide(g,h)}},scrollPosition:function(){return this.$scrollContainer().scrollTop()},scrollTo:function(h,g){g=g||0;this.$scrollContainer().animate({scrollTop:h},g);return this},scrollToTop:function(g){return this.scrollTo(0,g)},scrollToItem:function(g,i){if(!g){return this}var h=g.$el.position().top;return this.scrollTo(h,i)},scrollToId:function(h,g){return this.scrollToItem(this.viewFromModelId(h),g)},events:{"click .select-all":"selectAll","click .deselect-all":"deselectAll"},toString:function(){return"ListPanel("+this.collection+")"}});e.prototype.templates=(function(){var h=b.wrapTemplate(["<div>",'<div class="controls"></div>','<div class="list-items"></div>','<div class="empty-message infomessagesmall"></div>',"</div>"]);var g=b.wrapTemplate(['<div class="controls">','<div class="title">','<div class="name"><%= view.title %></div>',"</div>",'<div class="subtitle"><%= view.subtitle %></div>','<div class="actions"></div>','<div class="messages"></div>','<div class="search">','<div class="search-input"></div>',"</div>",'<div class="list-actions">','<div class="btn-group">','<button class="select-all btn btn-default"','data-mode="select">',c("All"),"</button>",'<button class="deselect-all btn btn-default"','data-mode="select">',c("None"),"</button>","</div>","</div>","</div>"]);return{el:h,controls:g}}());var a=e.extend({modelCollectionKey:"contents",initialize:function(g){e.prototype.initialize.call(this,g);this.selecting=(g.selecting!==undefined)?g.selecting:false;this.setModel(this.model,g)},setModel:function(h,g){g=g||{};this.debug(this+".setModel:",h,g);this.freeModel();this.freeViews();if(h){var i=this.model?this.model.get("id"):null;this.model=h;if(this.logger){this.model.logger=this.logger}this._setUpModelListeners();this.collection.off();this.collection=(this.model[this.modelCollectionKey])?this.model[this.modelCollectionKey]:(g.collection||(new this.collectionClass([])));this._setUpCollectionListeners();if(i&&h.get("id")!==i){this.trigger("new-model",this)}}return this},freeModel:function(){if(this.model){this.stopListening(this.model)}return this},_setUpModelListeners:function(){this.log(this+"._setUpModelListeners",this.model);this.model.on("error",function(){var g=Array.prototype.slice.call(arguments,0);g.unshift("error");this.trigger.apply(this,g)},this);return this},_renderControls:function(h){this.debug(this+"(ListPanel)._renderControls");var i=this.model?this.model.toJSON():{},g=$(this.templates.controls(i,this));h.find(".controls").replaceWith(g);return g},toString:function(){return"ModelListPanel("+this.model+")"}});a.prototype.templates=(function(){var g=b.wrapTemplate(['<div class="controls">','<div class="title">','<div class="name"><%= model.name %></div>',"</div>",'<div class="subtitle"><%= view.subtitle %></div>','<div class="actions"></div>','<div class="messages"></div>','<div class="search">','<div class="search-input"></div>',"</div>",'<div class="list-actions">','<div class="btn-group">','<button class="select-all btn btn-default"','data-mode="select">',c("All"),"</button>",'<button class="deselect-all btn btn-default"','data-mode="select">',c("None"),"</button>","</div>","</div>","</div>"]);return _.extend(_.clone(e.prototype.templates),{controls:g})}());return{ListPanel:e,ModelListPanel:a}});
\ No newline at end of file
+define(["mvc/list/list-item","ui/loading-indicator","mvc/base-mvc","utils/localization","ui/search-input"],function(d,f,b,c){var e=Backbone.View.extend(b.LoggableMixin).extend({viewClass:d.ListItemView,collectionClass:Backbone.Collection,tagName:"div",className:"list-panel",fxSpeed:"fast",emptyMsg:c("This list is empty"),noneFoundMsg:c("No matching items found"),searchPlaceholder:c("search"),multiselectActions:[],initialize:function(g,h){g=g||{};if(g.logger){this.logger=g.logger}this.log(this+".initialize:",g);this.fxSpeed=_.has(g,"fxSpeed")?(g.fxSpeed):(this.fxSpeed);this.filters=[];this.searchFor=g.searchFor||"";this.indicator=new f(this.$el);this.selecting=(g.selecting!==undefined)?g.selecting:true;this.selected=g.selected||[];this.lastSelected=null;this.dragItems=g.dragItems||false;this.viewClass=g.viewClass||this.viewClass;this.views=[];this.collection=g.collection||(new this.collectionClass([]));this.filters=g.filters||[];this.$scrollContainer=g.$scrollContainer||this.$scrollContainer;this.title=g.title||"";this.subtitle=g.subtitle||"";this.multiselectActions=g.multiselectActions||this.multiselectActions;this.actionsPopup=null;this._setUpListeners()},freeViews:function(){_.each(this.views,function(g){g.off()});this.views=[];return this},_setUpListeners:function(){this.off();this.on("error",function(h,k,g,j,i){console.error(h,k,g,j,i)},this);this.on("loading",function(){this._showLoadingIndicator("loading...",40)},this);this.on("loading-done",function(){this._hideLoadingIndicator(40)},this);this.once("rendered",function(){this.trigger("rendered:initial",this)},this);if(this.logger){this.on("all",function(g){this.log(this+"",arguments)},this)}this._setUpCollectionListeners();this._setUpViewListeners();return this},_setUpCollectionListeners:function(){this.log(this+"._setUpCollectionListeners",this.collection);this.collection.off();this.collection.on("error",function(h,k,g,j,i){this.trigger("error",h,k,g,j,i)},this);this.collection.on("reset",function(){this.renderItems()},this);this.collection.on("add",this.addItemView,this);this.collection.on("remove",this.removeItemView,this);if(this.logger){this.collection.on("all",function(g){this.info(this+"(collection)",arguments)},this)}return this},_setUpViewListeners:function(){this.log(this+"._setUpViewListeners");this.on("view:selected",function(g,h){if(h&&h.shiftKey&&this.lastSelected){var i=this.viewFromModelId(this.lastSelected);if(i){this.selectRange(g,i)}}else{if(h&&h.altKey&&!this.selecting){this.showSelectors()}}this.selected.push(g.model.id);this.lastSelected=g.model.id},this);this.on("view:de-selected",function(g,h){this.selected=_.without(this.selected,g.model.id)},this)},render:function(h){this.log(this+".render",h);var g=this._buildNewRender();this._setUpBehaviors(g);this._queueNewRender(g,h);return this},_buildNewRender:function(){this.debug(this+"(ListPanel)._buildNewRender");var g=$(this.templates.el({},this));this._renderControls(g);this._renderTitle(g);this._renderSubtitle(g);this._renderSearch(g);this.renderItems(g);return g},_renderControls:function(h){this.debug(this+"(ListPanel)._renderControls");var g=$(this.templates.controls({},this));h.find(".controls").replaceWith(g);return g},_renderTitle:function(g){},_renderSubtitle:function(g){},_queueNewRender:function(h,i){i=(i===undefined)?(this.fxSpeed):(i);var g=this;g.log("_queueNewRender:",h,i);$(g).queue("fx",[function(j){this.$el.fadeOut(i,j)},function(j){g._swapNewRender(h);j()},function(j){this.$el.fadeIn(i,j)},function(j){g.trigger("rendered",g);j()}])},_swapNewRender:function(g){this.$el.empty().attr("class",this.className).append(g.children());if(this.selecting){this.showSelectors(0)}return this},_setUpBehaviors:function(g){g=g||this.$el;g.find(".controls [title]").tooltip({placement:"bottom"});return this},$scrollContainer:function(){return this.$el.parent().parent()},$list:function(g){return(g||this.$el).find("> .list-items")},$messages:function(g){return(g||this.$el).find("> .controls .messages")},$emptyMessage:function(g){return(g||this.$el).find("> .empty-message")},renderItems:function(i){i=i||this.$el;var g=this;g.log(this+".renderItems",i);var h=g.$list(i);g.views=g._filterCollection().map(function(j){return g._createItemView(j).render(0)});h.empty();if(g.views.length){g._attachItems(i);g.$emptyMessage(i).hide()}else{g._renderEmptyMessage(i).show()}return g.views},_filterCollection:function(){var g=this;return g.collection.filter(_.bind(g._filterItem,g))},_filterItem:function(h){var g=this;return(_.every(g.filters.map(function(i){return i.call(h)})))&&(!g.searchFor||h.matchesAll(g.searchFor))},_createItemView:function(i){var j=this._getItemViewClass(i),h=_.extend(this._getItemViewOptions(i),{model:i}),g=new j(h);this._setUpItemViewListeners(g);return g},_getItemViewClass:function(g){return this.viewClass},_getItemViewOptions:function(g){return{fxSpeed:this.fxSpeed,expanded:false,selectable:this.selecting,selected:_.contains(this.selected,g.id),draggable:this.dragItems}},_setUpItemViewListeners:function(h){var g=this;h.on("all",function(){var i=Array.prototype.slice.call(arguments,0);i[0]="view:"+i[0];g.trigger.apply(g,i)});h.on("draggable:dragstart",function(l,i){var j={},k=this.getSelectedModels();if(k.length){j=k.toJSON()}else{j=[i.model.toJSON()]}l.dataTransfer.setData("text",JSON.stringify(j))},this);return g},_attachItems:function(g){this.$list(g).append(this.views.map(function(h){return h.$el}));return this},_renderEmptyMessage:function(g){this.debug("_renderEmptyMessage",g,this.searchFor);var h=this.searchFor?this.noneFoundMsg:this.emptyMsg;return this.$emptyMessage(g).text(h)},expandAll:function(){_.each(this.views,function(g){g.expand()})},collapseAll:function(){_.each(this.views,function(g){g.collapse()})},addItemView:function(j,k,i){this.log(this+".addItemView:",j);var h=this;if(!h._filterItem(j)){return undefined}var g=h._createItemView(j);$(g).queue("fx",[function(l){h.$emptyMessage().fadeOut(h.fxSpeed,l)},function(l){h._attachView(g);l()}]);return g},_attachView:function(h){var g=this;g.views.push(h);g.$list().append(h.render(0).$el.hide());g.trigger("view:attached",h);h.$el.slideDown(g.fxSpeed,function(){g.trigger("view:attached:rendered")})},removeItemView:function(j,k,i){this.log(this+".removeItemView:",j);var h=this,g=h.viewFromModel(j);if(!g){return undefined}h.views=_.without(h.views,g);h.trigger("view:removed",g);$({}).queue("fx",[function(l){g.$el.fadeOut(h.fxSpeed,l)},function(l){g.remove();h.trigger("view:removed:rendered");if(!h.views.length){h._renderEmptyMessage().fadeIn(h.fxSpeed,l)}else{l()}}]);return g},viewFromModelId:function(h){for(var g=0;g<this.views.length;g++){if(this.views[g].model.id===h){return this.views[g]}}return undefined},viewFromModel:function(g){if(!g){return undefined}return this.viewFromModelId(g.id)},viewsWhereModel:function(g){return this.views.filter(function(h){var j=h.model.toJSON();for(var i in g){if(g.hasOwnProperty(i)){if(j[i]!==h.model.get(i)){return false}}}return true})},viewRange:function(j,i){if(j===i){return(j)?([j]):([])}var h=this.views.indexOf(j),g=this.views.indexOf(i);if(h===-1||g===-1){if(h===g){return[]}return(h===-1)?([i]):([j])}return(h<g)?this.views.slice(h,g+1):this.views.slice(g,h+1)},_renderSearch:function(g){g.find(".controls .search-input").searchInput({placeholder:this.searchPlaceholder,initialVal:this.searchFor,onfirstsearch:_.bind(this._firstSearch,this),onsearch:_.bind(this.searchItems,this),onclear:_.bind(this.clearSearch,this)});return g},_firstSearch:function(g){this.log("onFirstSearch",g);return this.searchItems(g)},searchItems:function(g){this.searchFor=g;this.trigger("search:searching",g,this);this.renderItems();this.$("> .controls .search-query").val(g);return this},clearSearch:function(g){this.searchFor="";this.trigger("search:clear",this);this.renderItems();this.$("> .controls .search-query").val("");return this},showSelectors:function(g){g=(g!==undefined)?(g):(this.fxSpeed);this.selecting=true;this.$(".list-actions").slideDown(g);_.each(this.views,function(h){h.showSelector(g)})},hideSelectors:function(g){g=(g!==undefined)?(g):(this.fxSpeed);this.selecting=false;this.$(".list-actions").slideUp(g);_.each(this.views,function(h){h.hideSelector(g)});this.selected=[];this.lastSelected=null},toggleSelectors:function(){if(!this.selecting){this.showSelectors()}else{this.hideSelectors()}},selectAll:function(g){_.each(this.views,function(h){h.select(g)})},deselectAll:function(g){this.lastSelected=null;_.each(this.views,function(h){h.deselect(g)})},selectRange:function(i,h){var g=this.viewRange(i,h);_.each(g,function(j){j.select()});return g},getSelectedViews:function(){return _.filter(this.views,function(g){return g.selected})},getSelectedModels:function(){return new this.collection.constructor(_.map(this.getSelectedViews(),function(g){return g.model}))},_showLoadingIndicator:function(h,g,i){this.debug("_showLoadingIndicator",this.indicator,h,g,i);g=(g!==undefined)?(g):(this.fxSpeed);if(!this.indicator){this.indicator=new f(this.$el,this.$el.parent());this.debug("\t created",this.indicator)}if(!this.$el.is(":visible")){this.indicator.show(0,i)}else{this.$el.fadeOut(g);this.indicator.show(h,g,i)}},_hideLoadingIndicator:function(g,h){this.debug("_hideLoadingIndicator",this.indicator,g,h);g=(g!==undefined)?(g):(this.fxSpeed);if(this.indicator){this.indicator.hide(g,h)}},scrollPosition:function(){return this.$scrollContainer().scrollTop()},scrollTo:function(h,g){g=g||0;this.$scrollContainer().animate({scrollTop:h},g);return this},scrollToTop:function(g){return this.scrollTo(0,g)},scrollToItem:function(g,i){if(!g){return this}var h=g.$el.position().top;return this.scrollTo(h,i)},scrollToId:function(h,g){return this.scrollToItem(this.viewFromModelId(h),g)},events:{"click .select-all":"selectAll","click .deselect-all":"deselectAll"},toString:function(){return"ListPanel("+this.collection+")"}});e.prototype.templates=(function(){var h=b.wrapTemplate(["<div>",'<div class="controls"></div>','<div class="list-items"></div>','<div class="empty-message infomessagesmall"></div>',"</div>"]);var g=b.wrapTemplate(['<div class="controls">','<div class="title">','<div class="name"><%= view.title %></div>',"</div>",'<div class="subtitle"><%= view.subtitle %></div>','<div class="actions"></div>','<div class="messages"></div>','<div class="search">','<div class="search-input"></div>',"</div>",'<div class="list-actions">','<div class="btn-group">','<button class="select-all btn btn-default"','data-mode="select">',c("All"),"</button>",'<button class="deselect-all btn btn-default"','data-mode="select">',c("None"),"</button>","</div>","</div>","</div>"]);return{el:h,controls:g}}());var a=e.extend({modelCollectionKey:"contents",initialize:function(g){e.prototype.initialize.call(this,g);this.selecting=(g.selecting!==undefined)?g.selecting:false;this.setModel(this.model,g)},setModel:function(h,g){g=g||{};this.debug(this+".setModel:",h,g);this.freeModel();this.freeViews();if(h){var i=this.model?this.model.get("id"):null;this.model=h;if(this.logger){this.model.logger=this.logger}this._setUpModelListeners();this.collection.off();this.collection=(this.model[this.modelCollectionKey])?this.model[this.modelCollectionKey]:(g.collection||(new this.collectionClass([])));this._setUpCollectionListeners();if(i&&h.get("id")!==i){this.trigger("new-model",this)}}return this},freeModel:function(){if(this.model){this.stopListening(this.model)}return this},_setUpModelListeners:function(){this.log(this+"._setUpModelListeners",this.model);this.model.on("error",function(){var g=Array.prototype.slice.call(arguments,0);g.unshift("error");this.trigger.apply(this,g)},this);return this},_renderControls:function(h){this.debug(this+"(ListPanel)._renderControls");var i=this.model?this.model.toJSON():{},g=$(this.templates.controls(i,this));h.find(".controls").replaceWith(g);return g},toString:function(){return"ModelListPanel("+this.model+")"}});a.prototype.templates=(function(){var g=b.wrapTemplate(['<div class="controls">','<div class="title">','<div class="name"><%= model.name %></div>',"</div>",'<div class="subtitle"><%= view.subtitle %></div>','<div class="actions"></div>','<div class="messages"></div>','<div class="search">','<div class="search-input"></div>',"</div>",'<div class="list-actions">','<div class="btn-group">','<button class="select-all btn btn-default"','data-mode="select">',c("All"),"</button>",'<button class="deselect-all btn btn-default"','data-mode="select">',c("None"),"</button>","</div>","</div>","</div>"]);return _.extend(_.clone(e.prototype.templates),{controls:g})}());return{ListPanel:e,ModelListPanel:a}});
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: UI, History edit panel: correctly update counts when adding or removing sub-views
by commits-noreply@bitbucket.org 30 Jan '15
by commits-noreply@bitbucket.org 30 Jan '15
30 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/560220a444c1/
Changeset: 560220a444c1
User: carlfeberhard
Date: 2015-01-29 21:14:47+00:00
Summary: UI, History edit panel: correctly update counts when adding or removing sub-views
Affected #: 6 files
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r 560220a444c189541721c8772eb0956bd0ba0a4e client/galaxy/scripts/mvc/history/history-panel-edit.js
--- a/client/galaxy/scripts/mvc/history/history-panel-edit.js
+++ b/client/galaxy/scripts/mvc/history/history-panel-edit.js
@@ -75,13 +75,17 @@
/** Override to handle history as drag-drop target */
_setUpListeners : function(){
- _super.prototype._setUpListeners.call( this );
+ var panel = this;
+ _super.prototype._setUpListeners.call( panel );
- this.on( 'drop', function( ev, data ){
- this.dataDropped( data );
+ panel.on( 'drop', function( ev, data ){
+ panel.dataDropped( data );
// remove the drop target
- this.dropTargetOff();
+ panel.dropTargetOff();
});
+ panel.on( 'view:attached view:removed', function(){
+ panel._renderCounts();
+ }, panel );
},
// ------------------------------------------------------------------------ listeners
@@ -332,7 +336,10 @@
// override to control where the view is added, how/whether it's rendered
panel.views.unshift( view );
panel.$list().prepend( view.render( 0 ).$el.hide() );
- view.$el.slideDown( panel.fxSpeed );
+ panel.trigger( 'view:attached', view );
+ view.$el.slideDown( panel.fxSpeed, function(){
+ panel.trigger( 'view:attached:rendered' );
+ });
},
/** In this override, add purgeAllowed and whether tags/annotation editors should be shown */
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r 560220a444c189541721c8772eb0956bd0ba0a4e client/galaxy/scripts/mvc/list/list-panel.js
--- a/client/galaxy/scripts/mvc/list/list-panel.js
+++ b/client/galaxy/scripts/mvc/list/list-panel.js
@@ -477,7 +477,10 @@
// override to control where the view is added, how/whether it's rendered
panel.views.push( view );
panel.$list().append( view.render( 0 ).$el.hide() );
- view.$el.slideDown( panel.fxSpeed );
+ panel.trigger( 'view:attached', view );
+ view.$el.slideDown( panel.fxSpeed, function(){
+ panel.trigger( 'view:attached:rendered' );
+ });
},
/** Remove a view from the panel (if found) */
@@ -487,6 +490,7 @@
view = panel.viewFromModel( model );
if( !view ){ return undefined; }
panel.views = _.without( panel.views, view );
+ panel.trigger( 'view:removed', view );
// potentially show the empty message if no views left
// use anonymous queue here - since remove can happen multiple times
@@ -494,6 +498,7 @@
function( next ){ view.$el.fadeOut( panel.fxSpeed, next ); },
function( next ){
view.remove();
+ panel.trigger( 'view:removed:rendered' );
if( !panel.views.length ){
panel._renderEmptyMessage().fadeIn( panel.fxSpeed, next );
} else {
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r 560220a444c189541721c8772eb0956bd0ba0a4e static/scripts/mvc/history/history-panel-edit.js
--- a/static/scripts/mvc/history/history-panel-edit.js
+++ b/static/scripts/mvc/history/history-panel-edit.js
@@ -75,13 +75,17 @@
/** Override to handle history as drag-drop target */
_setUpListeners : function(){
- _super.prototype._setUpListeners.call( this );
+ var panel = this;
+ _super.prototype._setUpListeners.call( panel );
- this.on( 'drop', function( ev, data ){
- this.dataDropped( data );
+ panel.on( 'drop', function( ev, data ){
+ panel.dataDropped( data );
// remove the drop target
- this.dropTargetOff();
+ panel.dropTargetOff();
});
+ panel.on( 'view:attached view:removed', function(){
+ panel._renderCounts();
+ }, panel );
},
// ------------------------------------------------------------------------ listeners
@@ -332,7 +336,10 @@
// override to control where the view is added, how/whether it's rendered
panel.views.unshift( view );
panel.$list().prepend( view.render( 0 ).$el.hide() );
- view.$el.slideDown( panel.fxSpeed );
+ panel.trigger( 'view:attached', view );
+ view.$el.slideDown( panel.fxSpeed, function(){
+ panel.trigger( 'view:attached:rendered' );
+ });
},
/** In this override, add purgeAllowed and whether tags/annotation editors should be shown */
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r 560220a444c189541721c8772eb0956bd0ba0a4e static/scripts/mvc/list/list-panel.js
--- a/static/scripts/mvc/list/list-panel.js
+++ b/static/scripts/mvc/list/list-panel.js
@@ -477,7 +477,10 @@
// override to control where the view is added, how/whether it's rendered
panel.views.push( view );
panel.$list().append( view.render( 0 ).$el.hide() );
- view.$el.slideDown( panel.fxSpeed );
+ panel.trigger( 'view:attached', view );
+ view.$el.slideDown( panel.fxSpeed, function(){
+ panel.trigger( 'view:attached:rendered' );
+ });
},
/** Remove a view from the panel (if found) */
@@ -487,6 +490,7 @@
view = panel.viewFromModel( model );
if( !view ){ return undefined; }
panel.views = _.without( panel.views, view );
+ panel.trigger( 'view:removed', view );
// potentially show the empty message if no views left
// use anonymous queue here - since remove can happen multiple times
@@ -494,6 +498,7 @@
function( next ){ view.$el.fadeOut( panel.fxSpeed, next ); },
function( next ){
view.remove();
+ panel.trigger( 'view:removed:rendered' );
if( !panel.views.length ){
panel._renderEmptyMessage().fadeIn( panel.fxSpeed, next );
} else {
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r 560220a444c189541721c8772eb0956bd0ba0a4e static/scripts/packed/mvc/history/history-panel-edit.js
--- a/static/scripts/packed/mvc/history/history-panel-edit.js
+++ b/static/scripts/packed/mvc/history/history-panel-edit.js
@@ -1,1 +1,1 @@
-define(["mvc/history/history-panel","mvc/history/history-contents","mvc/dataset/states","mvc/history/hda-model","mvc/history/hda-li-edit","mvc/history/hdca-li-edit","mvc/tags","mvc/annotations","ui/fa-icon-button","mvc/ui/popup-menu","utils/localization"],function(h,j,m,f,e,i,l,c,b,a,d){var k=h.HistoryPanel;var g=k.extend({HDAViewClass:e.HDAListItemEdit,HDCAViewClass:i.HDCAListItemEdit,initialize:function(n){n=n||{};k.prototype.initialize.call(this,n);this.tagsEditor=null;this.annotationEditor=null;this.purgeAllowed=n.purgeAllowed||false;this.annotationEditorShown=n.annotationEditorShown||false;this.tagsEditorShown=n.tagsEditorShown||false;this.multiselectActions=n.multiselectActions||this._getActions()},_setUpListeners:function(){k.prototype._setUpListeners.call(this);this.on("drop",function(n,o){this.dataDropped(o);this.dropTargetOff()})},_setUpCollectionListeners:function(){k.prototype._setUpCollectionListeners.call(this);this.collection.on("change:deleted",this._handleHdaDeletionChange,this);this.collection.on("change:visible",this._handleHdaVisibleChange,this);this.collection.on("change:purged",function(n){this.model.fetch()},this);return this},_setUpModelListeners:function(){k.prototype._setUpModelListeners.call(this);this.model.on("change:nice_size",this.updateHistoryDiskSize,this);return this},_buildNewRender:function(){var n=k.prototype._buildNewRender.call(this);if(!this.model){return n}if(Galaxy&&Galaxy.currUser&&Galaxy.currUser.id&&Galaxy.currUser.id===this.model.get("user_id")){this._renderTags(n);this._renderAnnotation(n)}return n},renderItems:function(o){var n=k.prototype.renderItems.call(this,o);this._renderCounts(o);return n},_renderCounts:function(p){function o(s,t){return['<a class="',s,'" href="javascript:void(0);">',t,"</a>"].join("")}p=p||this.$el;var n=this.collection.where({deleted:true}),r=this.collection.where({visible:false}),q=[];if(this.views.length){q.push([this.views.length,d("shown")].join(" "))}if(n.length){q.push((!this.showDeleted)?([n.length,o("toggle-deleted-link",d("deleted"))].join(" ")):(o("toggle-deleted-link",d("hide deleted"))))}if(r.length){q.push((!this.showHidden)?([r.length,o("toggle-hidden-link",d("hidden"))].join(" ")):(o("toggle-hidden-link",d("hide hidden"))))}return p.find("> .controls .subtitle").html(q.join(", "))},_renderTags:function(n){var o=this;this.tagsEditor=new l.TagsEditor({model:this.model,el:n.find(".controls .tags-display"),onshowFirstTime:function(){this.render()},onshow:function(){o.toggleHDATagEditors(true,o.fxSpeed)},onhide:function(){o.toggleHDATagEditors(false,o.fxSpeed)},$activator:b({title:d("Edit history tags"),classes:"history-tag-btn",faIcon:"fa-tags"}).appendTo(n.find(".controls .actions"))})},_renderAnnotation:function(n){var o=this;this.annotationEditor=new c.AnnotationEditor({model:this.model,el:n.find(".controls .annotation-display"),onshowFirstTime:function(){this.render()},onshow:function(){o.toggleHDAAnnotationEditors(true,o.fxSpeed)},onhide:function(){o.toggleHDAAnnotationEditors(false,o.fxSpeed)},$activator:b({title:d("Edit history annotation"),classes:"history-annotate-btn",faIcon:"fa-comment"}).appendTo(n.find(".controls .actions"))})},_setUpBehaviors:function(n){n=n||this.$el;k.prototype._setUpBehaviors.call(this,n);if(!this.model){return}if(this.multiselectActions.length){this.actionsPopup=new a(n.find(".list-action-popup-btn"),this.multiselectActions)}if((!Galaxy.currUser||Galaxy.currUser.isAnonymous())||(Galaxy.currUser.id!==this.model.get("user_id"))){return}var o=this,p=".controls .name";n.find(p).attr("title",d("Click to rename history")).tooltip({placement:"bottom"}).make_text_editable({on_finish:function(q){var r=o.model.get("name");if(q&&q!==r){o.$el.find(p).text(q);o.model.save({name:q}).fail(function(){o.$el.find(p).text(o.model.previous("name"))})}else{o.$el.find(p).text(r)}}})},_getActions:function(){var n=this,o=[{html:d("Hide datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype.hide;n.getSelectedModels().ajaxQueue(p)}},{html:d("Unhide datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype.unhide;n.getSelectedModels().ajaxQueue(p)}},{html:d("Delete datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype["delete"];n.getSelectedModels().ajaxQueue(p)}},{html:d("Undelete datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype.undelete;n.getSelectedModels().ajaxQueue(p)}}];if(n.purgeAllowed){o.push({html:d("Permanently delete datasets"),func:function(){if(confirm(d("This will permanently remove the data in your datasets. Are you sure?"))){var p=f.HistoryDatasetAssociation.prototype.purge;n.getSelectedModels().ajaxQueue(p)}}})}o.push({html:d("Build Dataset List"),func:function(){n.getSelectedModels().promoteToHistoryDatasetCollection(n.model,"list")}});o.push({html:d("Build Dataset Pair"),func:function(){n.getSelectedModels().promoteToHistoryDatasetCollection(n.model,"paired")}});o.push({html:d("Build List of Dataset Pairs"),func:_.bind(n._showPairedCollectionModal,n)});return o},_showPairedCollectionModal:function(){var n=this,o=n.getSelectedModels().toJSON().filter(function(p){return p.history_content_type==="dataset"&&p.state===m.OK});if(o.length){require(["mvc/collection/paired-collection-creator"],function(p){window.creator=p.pairedCollectionCreatorModal(o,{historyId:n.model.id})})}else{}},_attachItems:function(n){this.$list(n).append(this.views.reverse().map(function(o){return o.$el}));return this},_attachView:function(o){var n=this;n.views.unshift(o);n.$list().prepend(o.render(0).$el.hide());o.$el.slideDown(n.fxSpeed)},_getItemViewOptions:function(o){var n=k.prototype._getItemViewOptions.call(this,o);_.extend(n,{purgeAllowed:this.purgeAllowed,tagsEditorShown:(this.tagsEditor&&!this.tagsEditor.hidden),annotationEditorShown:(this.annotationEditor&&!this.annotationEditor.hidden)});return n},_handleHdaDeletionChange:function(n){if(n.get("deleted")&&!this.showDeleted){this.removeItemView(n)}this._renderCounts()},_handleHdaVisibleChange:function(n){if(n.hidden()&&!this.storage.showHidden){this.removeItemView(n)}this._renderCounts()},toggleHDATagEditors:function(n){var o=Array.prototype.slice.call(arguments,1);_.each(this.views,function(p){if(p.tagsEditor){p.tagsEditor.toggle.apply(p.tagsEditor,o)}})},toggleHDAAnnotationEditors:function(n){var o=Array.prototype.slice.call(arguments,1);_.each(this.views,function(p){if(p.annotationEditor){p.annotationEditor.toggle.apply(p.annotationEditor,o)}})},events:_.extend(_.clone(k.prototype.events),{"click .show-selectors-btn":"toggleSelectors","click .toggle-deleted-link":function(n){this.toggleShowDeleted()},"click .toggle-hidden-link":function(n){this.toggleShowHidden()}}),updateHistoryDiskSize:function(){this.$el.find(".history-size").text(this.model.get("nice_size"))},dropTargetOn:function(){if(this.dropTarget){return this}this.dropTarget=true;var o={dragenter:_.bind(this.dragenter,this),dragover:_.bind(this.dragover,this),dragleave:_.bind(this.dragleave,this),drop:_.bind(this.drop,this)};var p=this._renderDropTarget();this.$list().before([this._renderDropTargetHelp(),p]);for(var n in o){if(o.hasOwnProperty(n)){p.on(n,o[n])}}return this},_renderDropTarget:function(){return $("<div/>").addClass("history-drop-target").css({height:"64px",margin:"0px 10px 10px 10px",border:"1px dashed black","border-radius":"3px"})},_renderDropTargetHelp:function(){return $("<div/>").addClass("history-drop-target-help").css({margin:"10px 10px 4px 10px",color:"grey","font-size":"80%","font-style":"italic"}).text(d("Drag datasets here to copy them to the current history"))},dropTargetOff:function(){if(!this.dropTarget){return this}this.dropTarget=false;this.$(".history-drop-target").remove();this.$(".history-drop-target-help").remove();return this},dropTargetToggle:function(){if(this.dropTarget){this.dropTargetOff()}else{this.dropTargetOn()}return this},dragenter:function(n){n.preventDefault();n.stopPropagation();this.$(".history-drop-target").css("border","2px solid black")},dragover:function(n){n.preventDefault();n.stopPropagation()},dragleave:function(n){n.preventDefault();n.stopPropagation();this.$(".history-drop-target").css("border","1px dashed black")},drop:function(p){p.preventDefault();p.dataTransfer.dropEffect="move";var n=this,q=p.dataTransfer.getData("text");try{q=JSON.parse(q)}catch(o){this.warn("error parsing JSON from drop:",q)}this.trigger("droptarget:drop",p,q,n);return false},dataDropped:function(o){var n=this;if(_.isObject(o)&&o.model_class==="HistoryDatasetAssociation"&&o.id){return n.model.contents.copy(o.id)}return jQuery.when()},toString:function(){return"HistoryPanelEdit("+((this.model)?(this.model.get("name")):(""))+")"}});return{HistoryPanelEdit:g}});
\ No newline at end of file
+define(["mvc/history/history-panel","mvc/history/history-contents","mvc/dataset/states","mvc/history/hda-model","mvc/history/hda-li-edit","mvc/history/hdca-li-edit","mvc/tags","mvc/annotations","ui/fa-icon-button","mvc/ui/popup-menu","utils/localization"],function(h,j,m,f,e,i,l,c,b,a,d){var k=h.HistoryPanel;var g=k.extend({HDAViewClass:e.HDAListItemEdit,HDCAViewClass:i.HDCAListItemEdit,initialize:function(n){n=n||{};k.prototype.initialize.call(this,n);this.tagsEditor=null;this.annotationEditor=null;this.purgeAllowed=n.purgeAllowed||false;this.annotationEditorShown=n.annotationEditorShown||false;this.tagsEditorShown=n.tagsEditorShown||false;this.multiselectActions=n.multiselectActions||this._getActions()},_setUpListeners:function(){var n=this;k.prototype._setUpListeners.call(n);n.on("drop",function(o,p){n.dataDropped(p);n.dropTargetOff()});n.on("view:attached view:removed",function(){n._renderCounts()},n)},_setUpCollectionListeners:function(){k.prototype._setUpCollectionListeners.call(this);this.collection.on("change:deleted",this._handleHdaDeletionChange,this);this.collection.on("change:visible",this._handleHdaVisibleChange,this);this.collection.on("change:purged",function(n){this.model.fetch()},this);return this},_setUpModelListeners:function(){k.prototype._setUpModelListeners.call(this);this.model.on("change:nice_size",this.updateHistoryDiskSize,this);return this},_buildNewRender:function(){var n=k.prototype._buildNewRender.call(this);if(!this.model){return n}if(Galaxy&&Galaxy.currUser&&Galaxy.currUser.id&&Galaxy.currUser.id===this.model.get("user_id")){this._renderTags(n);this._renderAnnotation(n)}return n},renderItems:function(o){var n=k.prototype.renderItems.call(this,o);this._renderCounts(o);return n},_renderCounts:function(p){function o(s,t){return['<a class="',s,'" href="javascript:void(0);">',t,"</a>"].join("")}p=p||this.$el;var n=this.collection.where({deleted:true}),r=this.collection.where({visible:false}),q=[];if(this.views.length){q.push([this.views.length,d("shown")].join(" "))}if(n.length){q.push((!this.showDeleted)?([n.length,o("toggle-deleted-link",d("deleted"))].join(" ")):(o("toggle-deleted-link",d("hide deleted"))))}if(r.length){q.push((!this.showHidden)?([r.length,o("toggle-hidden-link",d("hidden"))].join(" ")):(o("toggle-hidden-link",d("hide hidden"))))}return p.find("> .controls .subtitle").html(q.join(", "))},_renderTags:function(n){var o=this;this.tagsEditor=new l.TagsEditor({model:this.model,el:n.find(".controls .tags-display"),onshowFirstTime:function(){this.render()},onshow:function(){o.toggleHDATagEditors(true,o.fxSpeed)},onhide:function(){o.toggleHDATagEditors(false,o.fxSpeed)},$activator:b({title:d("Edit history tags"),classes:"history-tag-btn",faIcon:"fa-tags"}).appendTo(n.find(".controls .actions"))})},_renderAnnotation:function(n){var o=this;this.annotationEditor=new c.AnnotationEditor({model:this.model,el:n.find(".controls .annotation-display"),onshowFirstTime:function(){this.render()},onshow:function(){o.toggleHDAAnnotationEditors(true,o.fxSpeed)},onhide:function(){o.toggleHDAAnnotationEditors(false,o.fxSpeed)},$activator:b({title:d("Edit history annotation"),classes:"history-annotate-btn",faIcon:"fa-comment"}).appendTo(n.find(".controls .actions"))})},_setUpBehaviors:function(n){n=n||this.$el;k.prototype._setUpBehaviors.call(this,n);if(!this.model){return}if(this.multiselectActions.length){this.actionsPopup=new a(n.find(".list-action-popup-btn"),this.multiselectActions)}if((!Galaxy.currUser||Galaxy.currUser.isAnonymous())||(Galaxy.currUser.id!==this.model.get("user_id"))){return}var o=this,p=".controls .name";n.find(p).attr("title",d("Click to rename history")).tooltip({placement:"bottom"}).make_text_editable({on_finish:function(q){var r=o.model.get("name");if(q&&q!==r){o.$el.find(p).text(q);o.model.save({name:q}).fail(function(){o.$el.find(p).text(o.model.previous("name"))})}else{o.$el.find(p).text(r)}}})},_getActions:function(){var n=this,o=[{html:d("Hide datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype.hide;n.getSelectedModels().ajaxQueue(p)}},{html:d("Unhide datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype.unhide;n.getSelectedModels().ajaxQueue(p)}},{html:d("Delete datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype["delete"];n.getSelectedModels().ajaxQueue(p)}},{html:d("Undelete datasets"),func:function(){var p=f.HistoryDatasetAssociation.prototype.undelete;n.getSelectedModels().ajaxQueue(p)}}];if(n.purgeAllowed){o.push({html:d("Permanently delete datasets"),func:function(){if(confirm(d("This will permanently remove the data in your datasets. Are you sure?"))){var p=f.HistoryDatasetAssociation.prototype.purge;n.getSelectedModels().ajaxQueue(p)}}})}o.push({html:d("Build Dataset List"),func:function(){n.getSelectedModels().promoteToHistoryDatasetCollection(n.model,"list")}});o.push({html:d("Build Dataset Pair"),func:function(){n.getSelectedModels().promoteToHistoryDatasetCollection(n.model,"paired")}});o.push({html:d("Build List of Dataset Pairs"),func:_.bind(n._showPairedCollectionModal,n)});return o},_showPairedCollectionModal:function(){var n=this,o=n.getSelectedModels().toJSON().filter(function(p){return p.history_content_type==="dataset"&&p.state===m.OK});if(o.length){require(["mvc/collection/paired-collection-creator"],function(p){window.creator=p.pairedCollectionCreatorModal(o,{historyId:n.model.id})})}else{}},_attachItems:function(n){this.$list(n).append(this.views.reverse().map(function(o){return o.$el}));return this},_attachView:function(o){var n=this;n.views.unshift(o);n.$list().prepend(o.render(0).$el.hide());n.trigger("view:attached",o);o.$el.slideDown(n.fxSpeed,function(){n.trigger("view:attached:rendered")})},_getItemViewOptions:function(o){var n=k.prototype._getItemViewOptions.call(this,o);_.extend(n,{purgeAllowed:this.purgeAllowed,tagsEditorShown:(this.tagsEditor&&!this.tagsEditor.hidden),annotationEditorShown:(this.annotationEditor&&!this.annotationEditor.hidden)});return n},_handleHdaDeletionChange:function(n){if(n.get("deleted")&&!this.showDeleted){this.removeItemView(n)}this._renderCounts()},_handleHdaVisibleChange:function(n){if(n.hidden()&&!this.storage.showHidden){this.removeItemView(n)}this._renderCounts()},toggleHDATagEditors:function(n){var o=Array.prototype.slice.call(arguments,1);_.each(this.views,function(p){if(p.tagsEditor){p.tagsEditor.toggle.apply(p.tagsEditor,o)}})},toggleHDAAnnotationEditors:function(n){var o=Array.prototype.slice.call(arguments,1);_.each(this.views,function(p){if(p.annotationEditor){p.annotationEditor.toggle.apply(p.annotationEditor,o)}})},events:_.extend(_.clone(k.prototype.events),{"click .show-selectors-btn":"toggleSelectors","click .toggle-deleted-link":function(n){this.toggleShowDeleted()},"click .toggle-hidden-link":function(n){this.toggleShowHidden()}}),updateHistoryDiskSize:function(){this.$el.find(".history-size").text(this.model.get("nice_size"))},dropTargetOn:function(){if(this.dropTarget){return this}this.dropTarget=true;var o={dragenter:_.bind(this.dragenter,this),dragover:_.bind(this.dragover,this),dragleave:_.bind(this.dragleave,this),drop:_.bind(this.drop,this)};var p=this._renderDropTarget();this.$list().before([this._renderDropTargetHelp(),p]);for(var n in o){if(o.hasOwnProperty(n)){p.on(n,o[n])}}return this},_renderDropTarget:function(){return $("<div/>").addClass("history-drop-target").css({height:"64px",margin:"0px 10px 10px 10px",border:"1px dashed black","border-radius":"3px"})},_renderDropTargetHelp:function(){return $("<div/>").addClass("history-drop-target-help").css({margin:"10px 10px 4px 10px",color:"grey","font-size":"80%","font-style":"italic"}).text(d("Drag datasets here to copy them to the current history"))},dropTargetOff:function(){if(!this.dropTarget){return this}this.dropTarget=false;this.$(".history-drop-target").remove();this.$(".history-drop-target-help").remove();return this},dropTargetToggle:function(){if(this.dropTarget){this.dropTargetOff()}else{this.dropTargetOn()}return this},dragenter:function(n){n.preventDefault();n.stopPropagation();this.$(".history-drop-target").css("border","2px solid black")},dragover:function(n){n.preventDefault();n.stopPropagation()},dragleave:function(n){n.preventDefault();n.stopPropagation();this.$(".history-drop-target").css("border","1px dashed black")},drop:function(p){p.preventDefault();p.dataTransfer.dropEffect="move";var n=this,q=p.dataTransfer.getData("text");try{q=JSON.parse(q)}catch(o){this.warn("error parsing JSON from drop:",q)}this.trigger("droptarget:drop",p,q,n);return false},dataDropped:function(o){var n=this;if(_.isObject(o)&&o.model_class==="HistoryDatasetAssociation"&&o.id){return n.model.contents.copy(o.id)}return jQuery.when()},toString:function(){return"HistoryPanelEdit("+((this.model)?(this.model.get("name")):(""))+")"}});return{HistoryPanelEdit:g}});
\ No newline at end of file
diff -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 -r 560220a444c189541721c8772eb0956bd0ba0a4e static/scripts/packed/mvc/list/list-panel.js
--- a/static/scripts/packed/mvc/list/list-panel.js
+++ b/static/scripts/packed/mvc/list/list-panel.js
@@ -1,1 +1,1 @@
-define(["mvc/list/list-item","ui/loading-indicator","mvc/base-mvc","utils/localization","ui/search-input"],function(d,f,b,c){var e=Backbone.View.extend(b.LoggableMixin).extend({viewClass:d.ListItemView,collectionClass:Backbone.Collection,tagName:"div",className:"list-panel",fxSpeed:"fast",emptyMsg:c("This list is empty"),noneFoundMsg:c("No matching items found"),searchPlaceholder:c("search"),multiselectActions:[],initialize:function(g,h){g=g||{};if(g.logger){this.logger=g.logger}this.log(this+".initialize:",g);this.fxSpeed=_.has(g,"fxSpeed")?(g.fxSpeed):(this.fxSpeed);this.filters=[];this.searchFor=g.searchFor||"";this.indicator=new f(this.$el);this.selecting=(g.selecting!==undefined)?g.selecting:true;this.selected=g.selected||[];this.lastSelected=null;this.dragItems=g.dragItems||false;this.viewClass=g.viewClass||this.viewClass;this.views=[];this.collection=g.collection||(new this.collectionClass([]));this.filters=g.filters||[];this.$scrollContainer=g.$scrollContainer||this.$scrollContainer;this.title=g.title||"";this.subtitle=g.subtitle||"";this.multiselectActions=g.multiselectActions||this.multiselectActions;this.actionsPopup=null;this._setUpListeners()},freeViews:function(){_.each(this.views,function(g){g.off()});this.views=[];return this},_setUpListeners:function(){this.off();this.on("error",function(h,k,g,j,i){console.error(h,k,g,j,i)},this);this.on("loading",function(){this._showLoadingIndicator("loading...",40)},this);this.on("loading-done",function(){this._hideLoadingIndicator(40)},this);this.once("rendered",function(){this.trigger("rendered:initial",this)},this);if(this.logger){this.on("all",function(g){this.log(this+"",arguments)},this)}this._setUpCollectionListeners();this._setUpViewListeners();return this},_setUpCollectionListeners:function(){this.log(this+"._setUpCollectionListeners",this.collection);this.collection.off();this.collection.on("error",function(h,k,g,j,i){this.trigger("error",h,k,g,j,i)},this);this.collection.on("reset",function(){this.renderItems()},this);this.collection.on("add",this.addItemView,this);this.collection.on("remove",this.removeItemView,this);if(this.logger){this.collection.on("all",function(g){this.info(this+"(collection)",arguments)},this)}return this},_setUpViewListeners:function(){this.log(this+"._setUpViewListeners");this.on("view:selected",function(g,h){if(h&&h.shiftKey&&this.lastSelected){var i=this.viewFromModelId(this.lastSelected);if(i){this.selectRange(g,i)}}else{if(h&&h.altKey&&!this.selecting){this.showSelectors()}}this.selected.push(g.model.id);this.lastSelected=g.model.id},this);this.on("view:de-selected",function(g,h){this.selected=_.without(this.selected,g.model.id)},this)},render:function(h){this.log(this+".render",h);var g=this._buildNewRender();this._setUpBehaviors(g);this._queueNewRender(g,h);return this},_buildNewRender:function(){this.debug(this+"(ListPanel)._buildNewRender");var g=$(this.templates.el({},this));this._renderControls(g);this._renderTitle(g);this._renderSubtitle(g);this._renderSearch(g);this.renderItems(g);return g},_renderControls:function(h){this.debug(this+"(ListPanel)._renderControls");var g=$(this.templates.controls({},this));h.find(".controls").replaceWith(g);return g},_renderTitle:function(g){},_renderSubtitle:function(g){},_queueNewRender:function(h,i){i=(i===undefined)?(this.fxSpeed):(i);var g=this;g.log("_queueNewRender:",h,i);$(g).queue("fx",[function(j){this.$el.fadeOut(i,j)},function(j){g._swapNewRender(h);j()},function(j){this.$el.fadeIn(i,j)},function(j){g.trigger("rendered",g);j()}])},_swapNewRender:function(g){this.$el.empty().attr("class",this.className).append(g.children());if(this.selecting){this.showSelectors(0)}return this},_setUpBehaviors:function(g){g=g||this.$el;g.find(".controls [title]").tooltip({placement:"bottom"});return this},$scrollContainer:function(){return this.$el.parent().parent()},$list:function(g){return(g||this.$el).find("> .list-items")},$messages:function(g){return(g||this.$el).find("> .controls .messages")},$emptyMessage:function(g){return(g||this.$el).find("> .empty-message")},renderItems:function(i){i=i||this.$el;var g=this;g.log(this+".renderItems",i);var h=g.$list(i);g.views=g._filterCollection().map(function(j){return g._createItemView(j).render(0)});h.empty();if(g.views.length){g._attachItems(i);g.$emptyMessage(i).hide()}else{g._renderEmptyMessage(i).show()}return g.views},_filterCollection:function(){var g=this;return g.collection.filter(_.bind(g._filterItem,g))},_filterItem:function(h){var g=this;return(_.every(g.filters.map(function(i){return i.call(h)})))&&(!g.searchFor||h.matchesAll(g.searchFor))},_createItemView:function(i){var j=this._getItemViewClass(i),h=_.extend(this._getItemViewOptions(i),{model:i}),g=new j(h);this._setUpItemViewListeners(g);return g},_getItemViewClass:function(g){return this.viewClass},_getItemViewOptions:function(g){return{fxSpeed:this.fxSpeed,expanded:false,selectable:this.selecting,selected:_.contains(this.selected,g.id),draggable:this.dragItems}},_setUpItemViewListeners:function(h){var g=this;h.on("all",function(){var i=Array.prototype.slice.call(arguments,0);i[0]="view:"+i[0];g.trigger.apply(g,i)});h.on("draggable:dragstart",function(l,i){var j={},k=this.getSelectedModels();if(k.length){j=k.toJSON()}else{j=[i.model.toJSON()]}l.dataTransfer.setData("text",JSON.stringify(j))},this);return g},_attachItems:function(g){this.$list(g).append(this.views.map(function(h){return h.$el}));return this},_renderEmptyMessage:function(g){this.debug("_renderEmptyMessage",g,this.searchFor);var h=this.searchFor?this.noneFoundMsg:this.emptyMsg;return this.$emptyMessage(g).text(h)},expandAll:function(){_.each(this.views,function(g){g.expand()})},collapseAll:function(){_.each(this.views,function(g){g.collapse()})},addItemView:function(j,k,i){this.log(this+".addItemView:",j);var h=this;if(!h._filterItem(j)){return undefined}var g=h._createItemView(j);$(g).queue("fx",[function(l){h.$emptyMessage().fadeOut(h.fxSpeed,l)},function(l){h._attachView(g);l()}]);return g},_attachView:function(h){var g=this;g.views.push(h);g.$list().append(h.render(0).$el.hide());h.$el.slideDown(g.fxSpeed)},removeItemView:function(j,k,i){this.log(this+".removeItemView:",j);var h=this,g=h.viewFromModel(j);if(!g){return undefined}h.views=_.without(h.views,g);$({}).queue("fx",[function(l){g.$el.fadeOut(h.fxSpeed,l)},function(l){g.remove();if(!h.views.length){h._renderEmptyMessage().fadeIn(h.fxSpeed,l)}else{l()}}]);return g},viewFromModelId:function(h){for(var g=0;g<this.views.length;g++){if(this.views[g].model.id===h){return this.views[g]}}return undefined},viewFromModel:function(g){if(!g){return undefined}return this.viewFromModelId(g.id)},viewsWhereModel:function(g){return this.views.filter(function(h){var j=h.model.toJSON();for(var i in g){if(g.hasOwnProperty(i)){if(j[i]!==h.model.get(i)){return false}}}return true})},viewRange:function(j,i){if(j===i){return(j)?([j]):([])}var h=this.views.indexOf(j),g=this.views.indexOf(i);if(h===-1||g===-1){if(h===g){return[]}return(h===-1)?([i]):([j])}return(h<g)?this.views.slice(h,g+1):this.views.slice(g,h+1)},_renderSearch:function(g){g.find(".controls .search-input").searchInput({placeholder:this.searchPlaceholder,initialVal:this.searchFor,onfirstsearch:_.bind(this._firstSearch,this),onsearch:_.bind(this.searchItems,this),onclear:_.bind(this.clearSearch,this)});return g},_firstSearch:function(g){this.log("onFirstSearch",g);return this.searchItems(g)},searchItems:function(g){this.searchFor=g;this.trigger("search:searching",g,this);this.renderItems();this.$("> .controls .search-query").val(g);return this},clearSearch:function(g){this.searchFor="";this.trigger("search:clear",this);this.renderItems();this.$("> .controls .search-query").val("");return this},showSelectors:function(g){g=(g!==undefined)?(g):(this.fxSpeed);this.selecting=true;this.$(".list-actions").slideDown(g);_.each(this.views,function(h){h.showSelector(g)})},hideSelectors:function(g){g=(g!==undefined)?(g):(this.fxSpeed);this.selecting=false;this.$(".list-actions").slideUp(g);_.each(this.views,function(h){h.hideSelector(g)});this.selected=[];this.lastSelected=null},toggleSelectors:function(){if(!this.selecting){this.showSelectors()}else{this.hideSelectors()}},selectAll:function(g){_.each(this.views,function(h){h.select(g)})},deselectAll:function(g){this.lastSelected=null;_.each(this.views,function(h){h.deselect(g)})},selectRange:function(i,h){var g=this.viewRange(i,h);_.each(g,function(j){j.select()});return g},getSelectedViews:function(){return _.filter(this.views,function(g){return g.selected})},getSelectedModels:function(){return new this.collection.constructor(_.map(this.getSelectedViews(),function(g){return g.model}))},_showLoadingIndicator:function(h,g,i){this.debug("_showLoadingIndicator",this.indicator,h,g,i);g=(g!==undefined)?(g):(this.fxSpeed);if(!this.indicator){this.indicator=new f(this.$el,this.$el.parent());this.debug("\t created",this.indicator)}if(!this.$el.is(":visible")){this.indicator.show(0,i)}else{this.$el.fadeOut(g);this.indicator.show(h,g,i)}},_hideLoadingIndicator:function(g,h){this.debug("_hideLoadingIndicator",this.indicator,g,h);g=(g!==undefined)?(g):(this.fxSpeed);if(this.indicator){this.indicator.hide(g,h)}},scrollPosition:function(){return this.$scrollContainer().scrollTop()},scrollTo:function(h,g){g=g||0;this.$scrollContainer().animate({scrollTop:h},g);return this},scrollToTop:function(g){return this.scrollTo(0,g)},scrollToItem:function(g,i){if(!g){return this}var h=g.$el.position().top;return this.scrollTo(h,i)},scrollToId:function(h,g){return this.scrollToItem(this.viewFromModelId(h),g)},events:{"click .select-all":"selectAll","click .deselect-all":"deselectAll"},toString:function(){return"ListPanel("+this.collection+")"}});e.prototype.templates=(function(){var h=b.wrapTemplate(["<div>",'<div class="controls"></div>','<div class="list-items"></div>','<div class="empty-message infomessagesmall"></div>',"</div>"]);var g=b.wrapTemplate(['<div class="controls">','<div class="title">','<div class="name"><%= view.title %></div>',"</div>",'<div class="subtitle"><%= view.subtitle %></div>','<div class="actions"></div>','<div class="messages"></div>','<div class="search">','<div class="search-input"></div>',"</div>",'<div class="list-actions">','<div class="btn-group">','<button class="select-all btn btn-default"','data-mode="select">',c("All"),"</button>",'<button class="deselect-all btn btn-default"','data-mode="select">',c("None"),"</button>","</div>","</div>","</div>"]);return{el:h,controls:g}}());var a=e.extend({modelCollectionKey:"contents",initialize:function(g){e.prototype.initialize.call(this,g);this.selecting=(g.selecting!==undefined)?g.selecting:false;this.setModel(this.model,g)},setModel:function(h,g){g=g||{};this.debug(this+".setModel:",h,g);this.freeModel();this.freeViews();if(h){var i=this.model?this.model.get("id"):null;this.model=h;if(this.logger){this.model.logger=this.logger}this._setUpModelListeners();this.collection.off();this.collection=(this.model[this.modelCollectionKey])?this.model[this.modelCollectionKey]:(g.collection||(new this.collectionClass([])));this._setUpCollectionListeners();if(i&&h.get("id")!==i){this.trigger("new-model",this)}}return this},freeModel:function(){if(this.model){this.stopListening(this.model)}return this},_setUpModelListeners:function(){this.log(this+"._setUpModelListeners",this.model);this.model.on("error",function(){var g=Array.prototype.slice.call(arguments,0);g.unshift("error");this.trigger.apply(this,g)},this);return this},_renderControls:function(h){this.debug(this+"(ListPanel)._renderControls");var i=this.model?this.model.toJSON():{},g=$(this.templates.controls(i,this));h.find(".controls").replaceWith(g);return g},toString:function(){return"ModelListPanel("+this.model+")"}});a.prototype.templates=(function(){var g=b.wrapTemplate(['<div class="controls">','<div class="title">','<div class="name"><%= model.name %></div>',"</div>",'<div class="subtitle"><%= view.subtitle %></div>','<div class="actions"></div>','<div class="messages"></div>','<div class="search">','<div class="search-input"></div>',"</div>",'<div class="list-actions">','<div class="btn-group">','<button class="select-all btn btn-default"','data-mode="select">',c("All"),"</button>",'<button class="deselect-all btn btn-default"','data-mode="select">',c("None"),"</button>","</div>","</div>","</div>"]);return _.extend(_.clone(e.prototype.templates),{controls:g})}());return{ListPanel:e,ModelListPanel:a}});
\ No newline at end of file
+define(["mvc/list/list-item","ui/loading-indicator","mvc/base-mvc","utils/localization","ui/search-input"],function(d,f,b,c){var e=Backbone.View.extend(b.LoggableMixin).extend({viewClass:d.ListItemView,collectionClass:Backbone.Collection,tagName:"div",className:"list-panel",fxSpeed:"fast",emptyMsg:c("This list is empty"),noneFoundMsg:c("No matching items found"),searchPlaceholder:c("search"),multiselectActions:[],initialize:function(g,h){g=g||{};if(g.logger){this.logger=g.logger}this.log(this+".initialize:",g);this.fxSpeed=_.has(g,"fxSpeed")?(g.fxSpeed):(this.fxSpeed);this.filters=[];this.searchFor=g.searchFor||"";this.indicator=new f(this.$el);this.selecting=(g.selecting!==undefined)?g.selecting:true;this.selected=g.selected||[];this.lastSelected=null;this.dragItems=g.dragItems||false;this.viewClass=g.viewClass||this.viewClass;this.views=[];this.collection=g.collection||(new this.collectionClass([]));this.filters=g.filters||[];this.$scrollContainer=g.$scrollContainer||this.$scrollContainer;this.title=g.title||"";this.subtitle=g.subtitle||"";this.multiselectActions=g.multiselectActions||this.multiselectActions;this.actionsPopup=null;this._setUpListeners()},freeViews:function(){_.each(this.views,function(g){g.off()});this.views=[];return this},_setUpListeners:function(){this.off();this.on("error",function(h,k,g,j,i){console.error(h,k,g,j,i)},this);this.on("loading",function(){this._showLoadingIndicator("loading...",40)},this);this.on("loading-done",function(){this._hideLoadingIndicator(40)},this);this.once("rendered",function(){this.trigger("rendered:initial",this)},this);if(this.logger){this.on("all",function(g){this.log(this+"",arguments)},this)}this._setUpCollectionListeners();this._setUpViewListeners();return this},_setUpCollectionListeners:function(){this.log(this+"._setUpCollectionListeners",this.collection);this.collection.off();this.collection.on("error",function(h,k,g,j,i){this.trigger("error",h,k,g,j,i)},this);this.collection.on("reset",function(){this.renderItems()},this);this.collection.on("add",this.addItemView,this);this.collection.on("remove",this.removeItemView,this);if(this.logger){this.collection.on("all",function(g){this.info(this+"(collection)",arguments)},this)}return this},_setUpViewListeners:function(){this.log(this+"._setUpViewListeners");this.on("view:selected",function(g,h){if(h&&h.shiftKey&&this.lastSelected){var i=this.viewFromModelId(this.lastSelected);if(i){this.selectRange(g,i)}}else{if(h&&h.altKey&&!this.selecting){this.showSelectors()}}this.selected.push(g.model.id);this.lastSelected=g.model.id},this);this.on("view:de-selected",function(g,h){this.selected=_.without(this.selected,g.model.id)},this)},render:function(h){this.log(this+".render",h);var g=this._buildNewRender();this._setUpBehaviors(g);this._queueNewRender(g,h);return this},_buildNewRender:function(){this.debug(this+"(ListPanel)._buildNewRender");var g=$(this.templates.el({},this));this._renderControls(g);this._renderTitle(g);this._renderSubtitle(g);this._renderSearch(g);this.renderItems(g);return g},_renderControls:function(h){this.debug(this+"(ListPanel)._renderControls");var g=$(this.templates.controls({},this));h.find(".controls").replaceWith(g);return g},_renderTitle:function(g){},_renderSubtitle:function(g){},_queueNewRender:function(h,i){i=(i===undefined)?(this.fxSpeed):(i);var g=this;g.log("_queueNewRender:",h,i);$(g).queue("fx",[function(j){this.$el.fadeOut(i,j)},function(j){g._swapNewRender(h);j()},function(j){this.$el.fadeIn(i,j)},function(j){g.trigger("rendered",g);j()}])},_swapNewRender:function(g){this.$el.empty().attr("class",this.className).append(g.children());if(this.selecting){this.showSelectors(0)}return this},_setUpBehaviors:function(g){g=g||this.$el;g.find(".controls [title]").tooltip({placement:"bottom"});return this},$scrollContainer:function(){return this.$el.parent().parent()},$list:function(g){return(g||this.$el).find("> .list-items")},$messages:function(g){return(g||this.$el).find("> .controls .messages")},$emptyMessage:function(g){return(g||this.$el).find("> .empty-message")},renderItems:function(i){i=i||this.$el;var g=this;g.log(this+".renderItems",i);var h=g.$list(i);g.views=g._filterCollection().map(function(j){return g._createItemView(j).render(0)});h.empty();if(g.views.length){g._attachItems(i);g.$emptyMessage(i).hide()}else{g._renderEmptyMessage(i).show()}return g.views},_filterCollection:function(){var g=this;return g.collection.filter(_.bind(g._filterItem,g))},_filterItem:function(h){var g=this;return(_.every(g.filters.map(function(i){return i.call(h)})))&&(!g.searchFor||h.matchesAll(g.searchFor))},_createItemView:function(i){var j=this._getItemViewClass(i),h=_.extend(this._getItemViewOptions(i),{model:i}),g=new j(h);this._setUpItemViewListeners(g);return g},_getItemViewClass:function(g){return this.viewClass},_getItemViewOptions:function(g){return{fxSpeed:this.fxSpeed,expanded:false,selectable:this.selecting,selected:_.contains(this.selected,g.id),draggable:this.dragItems}},_setUpItemViewListeners:function(h){var g=this;h.on("all",function(){var i=Array.prototype.slice.call(arguments,0);i[0]="view:"+i[0];g.trigger.apply(g,i)});h.on("draggable:dragstart",function(l,i){var j={},k=this.getSelectedModels();if(k.length){j=k.toJSON()}else{j=[i.model.toJSON()]}l.dataTransfer.setData("text",JSON.stringify(j))},this);return g},_attachItems:function(g){this.$list(g).append(this.views.map(function(h){return h.$el}));return this},_renderEmptyMessage:function(g){this.debug("_renderEmptyMessage",g,this.searchFor);var h=this.searchFor?this.noneFoundMsg:this.emptyMsg;return this.$emptyMessage(g).text(h)},expandAll:function(){_.each(this.views,function(g){g.expand()})},collapseAll:function(){_.each(this.views,function(g){g.collapse()})},addItemView:function(j,k,i){this.log(this+".addItemView:",j);var h=this;if(!h._filterItem(j)){return undefined}var g=h._createItemView(j);$(g).queue("fx",[function(l){h.$emptyMessage().fadeOut(h.fxSpeed,l)},function(l){h._attachView(g);l()}]);return g},_attachView:function(h){var g=this;g.views.push(h);g.$list().append(h.render(0).$el.hide());g.trigger("view:attached",h);h.$el.slideDown(g.fxSpeed,function(){g.trigger("view:attached:rendered")})},removeItemView:function(j,k,i){this.log(this+".removeItemView:",j);var h=this,g=h.viewFromModel(j);if(!g){return undefined}h.views=_.without(h.views,g);h.trigger("view:removed",g);$({}).queue("fx",[function(l){g.$el.fadeOut(h.fxSpeed,l)},function(l){g.remove();h.trigger("view:removed:rendered");if(!h.views.length){h._renderEmptyMessage().fadeIn(h.fxSpeed,l)}else{l()}}]);return g},viewFromModelId:function(h){for(var g=0;g<this.views.length;g++){if(this.views[g].model.id===h){return this.views[g]}}return undefined},viewFromModel:function(g){if(!g){return undefined}return this.viewFromModelId(g.id)},viewsWhereModel:function(g){return this.views.filter(function(h){var j=h.model.toJSON();for(var i in g){if(g.hasOwnProperty(i)){if(j[i]!==h.model.get(i)){return false}}}return true})},viewRange:function(j,i){if(j===i){return(j)?([j]):([])}var h=this.views.indexOf(j),g=this.views.indexOf(i);if(h===-1||g===-1){if(h===g){return[]}return(h===-1)?([i]):([j])}return(h<g)?this.views.slice(h,g+1):this.views.slice(g,h+1)},_renderSearch:function(g){g.find(".controls .search-input").searchInput({placeholder:this.searchPlaceholder,initialVal:this.searchFor,onfirstsearch:_.bind(this._firstSearch,this),onsearch:_.bind(this.searchItems,this),onclear:_.bind(this.clearSearch,this)});return g},_firstSearch:function(g){this.log("onFirstSearch",g);return this.searchItems(g)},searchItems:function(g){this.searchFor=g;this.trigger("search:searching",g,this);this.renderItems();this.$("> .controls .search-query").val(g);return this},clearSearch:function(g){this.searchFor="";this.trigger("search:clear",this);this.renderItems();this.$("> .controls .search-query").val("");return this},showSelectors:function(g){g=(g!==undefined)?(g):(this.fxSpeed);this.selecting=true;this.$(".list-actions").slideDown(g);_.each(this.views,function(h){h.showSelector(g)})},hideSelectors:function(g){g=(g!==undefined)?(g):(this.fxSpeed);this.selecting=false;this.$(".list-actions").slideUp(g);_.each(this.views,function(h){h.hideSelector(g)});this.selected=[];this.lastSelected=null},toggleSelectors:function(){if(!this.selecting){this.showSelectors()}else{this.hideSelectors()}},selectAll:function(g){_.each(this.views,function(h){h.select(g)})},deselectAll:function(g){this.lastSelected=null;_.each(this.views,function(h){h.deselect(g)})},selectRange:function(i,h){var g=this.viewRange(i,h);_.each(g,function(j){j.select()});return g},getSelectedViews:function(){return _.filter(this.views,function(g){return g.selected})},getSelectedModels:function(){return new this.collection.constructor(_.map(this.getSelectedViews(),function(g){return g.model}))},_showLoadingIndicator:function(h,g,i){this.debug("_showLoadingIndicator",this.indicator,h,g,i);g=(g!==undefined)?(g):(this.fxSpeed);if(!this.indicator){this.indicator=new f(this.$el,this.$el.parent());this.debug("\t created",this.indicator)}if(!this.$el.is(":visible")){this.indicator.show(0,i)}else{this.$el.fadeOut(g);this.indicator.show(h,g,i)}},_hideLoadingIndicator:function(g,h){this.debug("_hideLoadingIndicator",this.indicator,g,h);g=(g!==undefined)?(g):(this.fxSpeed);if(this.indicator){this.indicator.hide(g,h)}},scrollPosition:function(){return this.$scrollContainer().scrollTop()},scrollTo:function(h,g){g=g||0;this.$scrollContainer().animate({scrollTop:h},g);return this},scrollToTop:function(g){return this.scrollTo(0,g)},scrollToItem:function(g,i){if(!g){return this}var h=g.$el.position().top;return this.scrollTo(h,i)},scrollToId:function(h,g){return this.scrollToItem(this.viewFromModelId(h),g)},events:{"click .select-all":"selectAll","click .deselect-all":"deselectAll"},toString:function(){return"ListPanel("+this.collection+")"}});e.prototype.templates=(function(){var h=b.wrapTemplate(["<div>",'<div class="controls"></div>','<div class="list-items"></div>','<div class="empty-message infomessagesmall"></div>',"</div>"]);var g=b.wrapTemplate(['<div class="controls">','<div class="title">','<div class="name"><%= view.title %></div>',"</div>",'<div class="subtitle"><%= view.subtitle %></div>','<div class="actions"></div>','<div class="messages"></div>','<div class="search">','<div class="search-input"></div>',"</div>",'<div class="list-actions">','<div class="btn-group">','<button class="select-all btn btn-default"','data-mode="select">',c("All"),"</button>",'<button class="deselect-all btn btn-default"','data-mode="select">',c("None"),"</button>","</div>","</div>","</div>"]);return{el:h,controls:g}}());var a=e.extend({modelCollectionKey:"contents",initialize:function(g){e.prototype.initialize.call(this,g);this.selecting=(g.selecting!==undefined)?g.selecting:false;this.setModel(this.model,g)},setModel:function(h,g){g=g||{};this.debug(this+".setModel:",h,g);this.freeModel();this.freeViews();if(h){var i=this.model?this.model.get("id"):null;this.model=h;if(this.logger){this.model.logger=this.logger}this._setUpModelListeners();this.collection.off();this.collection=(this.model[this.modelCollectionKey])?this.model[this.modelCollectionKey]:(g.collection||(new this.collectionClass([])));this._setUpCollectionListeners();if(i&&h.get("id")!==i){this.trigger("new-model",this)}}return this},freeModel:function(){if(this.model){this.stopListening(this.model)}return this},_setUpModelListeners:function(){this.log(this+"._setUpModelListeners",this.model);this.model.on("error",function(){var g=Array.prototype.slice.call(arguments,0);g.unshift("error");this.trigger.apply(this,g)},this);return this},_renderControls:function(h){this.debug(this+"(ListPanel)._renderControls");var i=this.model?this.model.toJSON():{},g=$(this.templates.controls(i,this));h.find(".controls").replaceWith(g);return g},toString:function(){return"ModelListPanel("+this.model+")"}});a.prototype.templates=(function(){var g=b.wrapTemplate(['<div class="controls">','<div class="title">','<div class="name"><%= model.name %></div>',"</div>",'<div class="subtitle"><%= view.subtitle %></div>','<div class="actions"></div>','<div class="messages"></div>','<div class="search">','<div class="search-input"></div>',"</div>",'<div class="list-actions">','<div class="btn-group">','<button class="select-all btn btn-default"','data-mode="select">',c("All"),"</button>",'<button class="deselect-all btn btn-default"','data-mode="select">',c("None"),"</button>","</div>","</div>","</div>"]);return _.extend(_.clone(e.prototype.templates),{controls:g})}());return{ListPanel:e,ModelListPanel:a}});
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: Managers: normalize mixin names (remove Interface, Model, add where appropriate); Fix 'has' substr filter name in tests
by commits-noreply@bitbucket.org 30 Jan '15
by commits-noreply@bitbucket.org 30 Jan '15
30 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c8da6ac751e7/
Changeset: c8da6ac751e7
User: carlfeberhard
Date: 2015-01-29 20:20:46+00:00
Summary: Managers: normalize mixin names (remove Interface, Model, add where appropriate); Fix 'has' substr filter name in tests
Affected #: 9 files
diff -r 65ff8e5a5c21d82fd216841af7ab914eaecaf4d6 -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 lib/galaxy/managers/annotatable.py
--- a/lib/galaxy/managers/annotatable.py
+++ b/lib/galaxy/managers/annotatable.py
@@ -6,7 +6,7 @@
log = logging.getLogger( __name__ )
-class AnnotatableManagerInterface( object ):
+class AnnotatableManagerMixin( object ):
#: class of AnnotationAssociation (e.g. HistoryAnnotationAssociation)
annotation_assoc = None
@@ -33,7 +33,7 @@
# pass
-class AnnotatableSerializer( object ):
+class AnnotatableSerializerMixin( object ):
def add_serializers( self ):
self.serializers[ 'annotation' ] = self.serialize_annotation
@@ -50,7 +50,7 @@
return returned
-class AnnotatableDeserializer( object ):
+class AnnotatableDeserializerMixin( object ):
def add_deserializers( self ):
self.deserializers[ 'annotation' ] = self.deserialize_annotation
diff -r 65ff8e5a5c21d82fd216841af7ab914eaecaf4d6 -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 lib/galaxy/managers/base.py
--- a/lib/galaxy/managers/base.py
+++ b/lib/galaxy/managers/base.py
@@ -760,7 +760,7 @@
# ==== Building query filters based on model data
-class FilterParser( object ):
+class ModelFilterParser( object ):
"""
Converts string tuples (partially converted query string params) of
attr, op, val into either:
@@ -996,7 +996,7 @@
# ==== Security Mixins
-class AccessibleModelInterface( object ):
+class AccessibleManagerMixin( object ):
"""
A security interface to check if a User can read/view an item's.
@@ -1009,7 +1009,7 @@
Return True if the item accessible to user.
"""
# override in subclasses
- raise exceptions.NotImplemented( "Abstract Interface Method" )
+ raise exceptions.NotImplemented( "Abstract interface Method" )
def get_accessible( self, trans, id, user, **kwargs ):
"""
@@ -1039,7 +1039,7 @@
:raises exceptions.ItemAccessibilityException:
"""
- raise exceptions.NotImplemented( "Abstract Interface Method" )
+ raise exceptions.NotImplemented( "Abstract interface Method" )
# NOTE: this will be a large, inefficient list if filters are not passed in kwargs
# items = ModelManager.list( self, trans, **kwargs )
# return [ self.error_unless_accessible( trans, item, user ) for item in items ]
@@ -1048,13 +1048,13 @@
"""
Return a list of items accessible to the user.
"""
- raise exceptions.NotImplemented( "Abstract Interface Method" )
+ raise exceptions.NotImplemented( "Abstract interface Method" )
# NOTE: this will be a large, inefficient list if filters are not passed in kwargs
# items = ModelManager.list( self, trans, **kwargs )
# return filter( lambda item: self.is_accessible( trans, item, user ), items )
-class OwnableModelInterface( object ):
+class OwnableManagerMixin( object ):
"""
A security interface to check if a User is an item's owner.
@@ -1069,7 +1069,7 @@
Return True if user owns the item.
"""
# override in subclasses
- raise exceptions.NotImplemented( "Abstract Interface Method" )
+ raise exceptions.NotImplemented( "Abstract interface Method" )
def get_owned( self, trans, id, user, **kwargs ):
"""
@@ -1098,7 +1098,7 @@
:raises exceptions.ItemAccessibilityException:
"""
- raise exceptions.NotImplemented( "Abstract Interface Method" )
+ raise exceptions.NotImplemented( "Abstract interface Method" )
# just alias to by_user (easier/same thing)
#return self.by_user( trans, user, **kwargs )
@@ -1111,7 +1111,7 @@
# ---- Deletable and Purgable models
-class DeletableModelInterface( object ):
+class DeletableManagerMixin( object ):
"""
A mixin/interface for a model that is deletable (i.e. has a 'deleted' attr).
@@ -1141,14 +1141,14 @@
return item
-class DeletableModelSerializer( object ):
+class DeletableSerializerMixin( object ):
def add_serializers( self ):
pass
# TODO: these are of questionable value if we don't want to enable users to delete/purge via update
-class DeletableModelDeserializer( object ):
+class DeletableDeserializerMixin( object ):
def add_deserializers( self ):
self.deserializers[ 'deleted' ] = self.deserialize_deleted
@@ -1168,7 +1168,7 @@
return item.deleted
-class DeletableModelFilters( object ):
+class DeletableFiltersMixin( object ):
def _add_parsers( self ):
self.orm_filter_parsers.update({
@@ -1176,7 +1176,7 @@
})
-class PurgableModelInterface( DeletableModelInterface ):
+class PurgableManagerMixin( DeletableManagerMixin ):
"""
A manager interface/mixin for a resource that allows deleting and purging where
purging is often removal of some additional, non-db resource (e.g. a dataset's
@@ -1196,16 +1196,16 @@
return item
-class PurgableModelSerializer( DeletableModelSerializer ):
+class PurgableSerializerMixin( DeletableSerializerMixin ):
def add_serializers( self ):
- DeletableModelSerializer.add_serializers( self )
+ DeletableSerializerMixin.add_serializers( self )
-class PurgableModelDeserializer( DeletableModelDeserializer ):
+class PurgableDeserializerMixin( DeletableDeserializerMixin ):
def add_deserializers( self ):
- DeletableModelDeserializer.add_deserializers( self )
+ DeletableDeserializerMixin.add_deserializers( self )
self.deserializers[ 'purged' ] = self.deserialize_purged
def deserialize_purged( self, trans, item, key, val ):
@@ -1220,10 +1220,10 @@
return self.purged
-class PurgableModelFilters( DeletableModelFilters ):
+class PurgableFiltersMixin( DeletableFiltersMixin ):
def _add_parsers( self ):
- DeletableModelFilters._add_parsers( self )
+ DeletableFiltersMixin._add_parsers( self )
self.orm_filter_parsers.update({
'purged' : { 'op': ( 'eq' ), 'val': self.parse_bool }
})
diff -r 65ff8e5a5c21d82fd216841af7ab914eaecaf4d6 -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 lib/galaxy/managers/datasets.py
--- a/lib/galaxy/managers/datasets.py
+++ b/lib/galaxy/managers/datasets.py
@@ -11,7 +11,7 @@
log = logging.getLogger( __name__ )
-class DatasetManager( base.ModelManager, base.AccessibleModelInterface, base.PurgableModelInterface ):
+class DatasetManager( base.ModelManager, base.AccessibleManagerMixin, base.PurgableManagerMixin ):
"""
Manipulate datasets: the components contained in DatasetAssociations/DatasetInstances/HDAs/LDDAs
"""
@@ -185,7 +185,7 @@
# .... data, object_store
-class DatasetSerializer( base.ModelSerializer, base.PurgableModelSerializer ):
+class DatasetSerializer( base.ModelSerializer, base.PurgableSerializerMixin ):
def __init__( self, app ):
super( DatasetSerializer, self ).__init__( app )
@@ -212,7 +212,8 @@
self.default_view = 'summary'
def add_serializers( self ):
- base.PurgableModelSerializer.add_serializers( self )
+ super( DatasetSerializer, self ).add_serializers()
+ base.PurgableSerializerMixin.add_serializers( self )
self.serializers.update({
'id' : self.serialize_id,
'create_time' : self.serialize_date,
@@ -221,16 +222,16 @@
})
-class DatasetDeserializer( base.ModelDeserializer, base.PurgableModelDeserializer ):
+class DatasetDeserializer( base.ModelDeserializer, base.PurgableDeserializerMixin ):
model_manager_class = DatasetManager
def add_deserializers( self ):
super( DatasetDeserializer, self ).add_deserializers()
- base.PurgableModelDeserializer.add_deserializers( self )
+ base.PurgableDeserializerMixin.add_deserializers( self )
-class DatasetAssociationManager( base.ModelManager, base.AccessibleModelInterface, base.PurgableModelInterface ):
+class DatasetAssociationManager( base.ModelManager, base.AccessibleManagerMixin, base.PurgableManagerMixin ):
"""
DatasetAssociation/DatasetInstances are intended to be working
proxies to a Dataset, associated with either a library or a
@@ -265,15 +266,15 @@
# pass
-class DatasetAssociationSerializer( base.ModelSerializer, base.PurgableModelSerializer ):
+class DatasetAssociationSerializer( base.ModelSerializer, base.PurgableSerializerMixin ):
def add_serializers( self ):
super( DatasetAssociationSerializer, self ).add_serializers()
- base.PurgableModelSerializer.add_serializers( self )
+ base.PurgableSerializerMixin.add_serializers( self )
-class DatasetAssociationDeserializer( base.ModelDeserializer, base.PurgableModelDeserializer ):
+class DatasetAssociationDeserializer( base.ModelDeserializer, base.PurgableDeserializerMixin ):
def add_deserializers( self ):
super( DatasetAssociationDeserializer, self ).add_deserializers()
- base.PurgableModelDeserializer.add_deserializers( self )
+ base.PurgableDeserializerMixin.add_deserializers( self )
diff -r 65ff8e5a5c21d82fd216841af7ab914eaecaf4d6 -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 lib/galaxy/managers/hdas.py
--- a/lib/galaxy/managers/hdas.py
+++ b/lib/galaxy/managers/hdas.py
@@ -25,8 +25,8 @@
log = logging.getLogger( __name__ )
-class HDAManager( datasets.DatasetAssociationManager, base.OwnableModelInterface,
- taggable.TaggableManagerInterface, annotatable.AnnotatableManagerInterface ):
+class HDAManager( datasets.DatasetAssociationManager, base.OwnableManagerMixin,
+ taggable.TaggableManagerMixin, annotatable.AnnotatableManagerMixin ):
"""
Interface/service object for interacting with HDAs.
"""
@@ -308,7 +308,7 @@
class HDASerializer( datasets.DatasetAssociationSerializer,
- taggable.TaggableSerializer, annotatable.AnnotatableSerializer ):
+ taggable.TaggableSerializerMixin, annotatable.AnnotatableSerializerMixin ):
#TODO: inherit from datasets.DatasetAssociationSerializer
#TODO: move what makes sense into DatasetSerializer
@@ -379,8 +379,8 @@
def add_serializers( self ):
super( HDASerializer, self ).add_serializers()
- taggable.TaggableSerializer.add_serializers( self )
- annotatable.AnnotatableSerializer.add_serializers( self )
+ taggable.TaggableSerializerMixin.add_serializers( self )
+ annotatable.AnnotatableSerializerMixin.add_serializers( self )
self.serializers.update({
'model_class' : lambda *a: 'HistoryDatasetAssociation',
@@ -568,7 +568,7 @@
class HDADeserializer( datasets.DatasetAssociationDeserializer,
- taggable.TaggableDeserializer, annotatable.AnnotatableDeserializer ):
+ taggable.TaggableDeserializerMixin, annotatable.AnnotatableDeserializerMixin ):
"""
Interface/service object for validating and deserializing dictionaries into histories.
"""
@@ -580,8 +580,8 @@
def add_deserializers( self ):
super( HDADeserializer, self ).add_deserializers()
- taggable.TaggableDeserializer.add_deserializers( self )
- annotatable.AnnotatableDeserializer.add_deserializers( self )
+ taggable.TaggableDeserializerMixin.add_deserializers( self )
+ annotatable.AnnotatableDeserializerMixin.add_deserializers( self )
self.deserializers.update({
'name' : self.deserialize_basestring,
diff -r 65ff8e5a5c21d82fd216841af7ab914eaecaf4d6 -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 lib/galaxy/managers/histories.py
--- a/lib/galaxy/managers/histories.py
+++ b/lib/galaxy/managers/histories.py
@@ -16,7 +16,7 @@
log = logging.getLogger( __name__ )
-class HistoryManager( sharable.SharableModelManager, base.PurgableModelInterface ):
+class HistoryManager( sharable.SharableModelManager, base.PurgableManagerMixin ):
model_class = model.History
foreign_key_name = 'history'
@@ -234,7 +234,7 @@
return state
-class HistorySerializer( sharable.SharableModelSerializer, base.PurgableModelSerializer ):
+class HistorySerializer( sharable.SharableModelSerializer, base.PurgableSerializerMixin ):
"""
Interface/service object for serializing histories into dictionaries.
"""
@@ -288,7 +288,7 @@
#assumes: outgoing to json.dumps and sanitized
def add_serializers( self ):
super( HistorySerializer, self ).add_serializers()
- base.PurgableModelSerializer.add_serializers( self )
+ base.PurgableSerializerMixin.add_serializers( self )
self.serializers.update({
'model_class' : lambda *a: 'History',
@@ -333,7 +333,7 @@
security=self.app.security, parent=dataset_collection_instance.history, view="element" )
-class HistoryDeserializer( sharable.SharableModelDeserializer, base.PurgableModelDeserializer ):
+class HistoryDeserializer( sharable.SharableModelDeserializer, base.PurgableDeserializerMixin ):
"""
Interface/service object for validating and deserializing dictionaries into histories.
"""
@@ -345,7 +345,7 @@
def add_deserializers( self ):
super( HistoryDeserializer, self ).add_deserializers()
- base.PurgableModelDeserializer.add_deserializers( self )
+ base.PurgableDeserializerMixin.add_deserializers( self )
self.deserializers.update({
'name' : self.deserialize_basestring,
@@ -353,12 +353,12 @@
})
-class HistoryFilters( sharable.SharableModelFilters, base.PurgableModelFilters ):
+class HistoryFilters( sharable.SharableModelFilters, base.PurgableFiltersMixin ):
model_class = model.History
def _add_parsers( self ):
super( HistoryFilters, self )._add_parsers()
- base.PurgableModelFilters._add_parsers( self )
+ base.PurgableFiltersMixin._add_parsers( self )
self.orm_filter_parsers.update({
# history specific
diff -r 65ff8e5a5c21d82fd216841af7ab914eaecaf4d6 -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 lib/galaxy/managers/ratable.py
--- a/lib/galaxy/managers/ratable.py
+++ b/lib/galaxy/managers/ratable.py
@@ -10,7 +10,7 @@
#TODO: stub
-class RatableManagerInterface( object ):
+class RatableManagerMixin( object ):
#: class of RatingAssociation (e.g. HistoryRatingAssociation)
rating_assoc = None
@@ -20,7 +20,7 @@
# pass
-class RatableSerializer( object ):
+class RatableSerializerMixin( object ):
def add_serializers( self ):
self.serializers[ 'user_rating' ] = self.serialize_user_rating
@@ -37,7 +37,7 @@
pass
-class RatableDeserializer( object ):
+class RatableDeserializerMixin( object ):
def add_deserializers( self ):
pass
diff -r 65ff8e5a5c21d82fd216841af7ab914eaecaf4d6 -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 lib/galaxy/managers/sharable.py
--- a/lib/galaxy/managers/sharable.py
+++ b/lib/galaxy/managers/sharable.py
@@ -24,10 +24,10 @@
log = logging.getLogger( __name__ )
-class SharableModelManager( base.ModelManager, base.OwnableModelInterface, base.AccessibleModelInterface,
- taggable.TaggableManagerInterface, annotatable.AnnotatableManagerInterface, ratable.RatableManagerInterface ):
+class SharableModelManager( base.ModelManager, base.OwnableManagerMixin, base.AccessibleManagerMixin,
+ taggable.TaggableManagerMixin, annotatable.AnnotatableManagerMixin, ratable.RatableManagerMixin ):
# e.g. histories, pages, stored workflows, visualizations
- # base.DeleteableModelInterface? (all four are deletable)
+ # base.DeleteableModelMixin? (all four are deletable)
#: the model used for UserShareAssociations with this model
user_share_model = None
@@ -333,15 +333,15 @@
class SharableModelSerializer( base.ModelSerializer,
- taggable.TaggableSerializer, annotatable.AnnotatableSerializer, ratable.RatableSerializer ):
+ taggable.TaggableSerializerMixin, annotatable.AnnotatableSerializerMixin, ratable.RatableSerializerMixin ):
#TODO: stub
SINGLE_CHAR_ABBR = None
def add_serializers( self ):
super( SharableModelSerializer, self ).add_serializers()
- taggable.TaggableSerializer.add_serializers( self )
- annotatable.AnnotatableSerializer.add_serializers( self )
- ratable.RatableSerializer.add_serializers( self )
+ taggable.TaggableSerializerMixin.add_serializers( self )
+ annotatable.AnnotatableSerializerMixin.add_serializers( self )
+ ratable.RatableSerializerMixin.add_serializers( self )
self.serializers.update({
'user_id' : self.serialize_id,
@@ -370,13 +370,13 @@
class SharableModelDeserializer( base.ModelDeserializer,
- taggable.TaggableDeserializer, annotatable.AnnotatableDeserializer, ratable.RatableDeserializer ):
+ taggable.TaggableDeserializerMixin, annotatable.AnnotatableDeserializerMixin, ratable.RatableDeserializerMixin ):
def add_deserializers( self ):
super( SharableModelDeserializer, self ).add_deserializers()
- taggable.TaggableDeserializer.add_deserializers( self )
- annotatable.AnnotatableDeserializer.add_deserializers( self )
- ratable.RatableDeserializer.add_deserializers( self )
+ taggable.TaggableDeserializerMixin.add_deserializers( self )
+ annotatable.AnnotatableDeserializerMixin.add_deserializers( self )
+ ratable.RatableDeserializerMixin.add_deserializers( self )
self.deserializers.update({
'published' : self.deserialize_published,
@@ -418,7 +418,7 @@
#def deserialize_user_shares():
-class SharableModelFilters( base.FilterParser ):
+class SharableModelFilters( base.ModelFilterParser ):
def _add_parsers( self ):
super( SharableModelFilters, self )._add_parsers()
diff -r 65ff8e5a5c21d82fd216841af7ab914eaecaf4d6 -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 lib/galaxy/managers/taggable.py
--- a/lib/galaxy/managers/taggable.py
+++ b/lib/galaxy/managers/taggable.py
@@ -9,7 +9,7 @@
log = logging.getLogger( __name__ )
-class TaggableManagerInterface( object ):
+class TaggableManagerMixin( object ):
#: class of TagAssociation (e.g. HistoryTagAssociation)
tag_assoc = None
@@ -19,7 +19,7 @@
# pass
-class TaggableSerializer( object ):
+class TaggableSerializerMixin( object ):
def add_serializers( self ):
self.serializers[ 'tags' ] = self.serialize_tags
@@ -40,7 +40,7 @@
return tags_str_list
-class TaggableDeserializer( object ):
+class TaggableDeserializerMixin( object ):
def add_deserializers( self ):
self.deserializers[ 'tags' ] = self.deserialize_tags
diff -r 65ff8e5a5c21d82fd216841af7ab914eaecaf4d6 -r c8da6ac751e7ba5c7eddd5dd3231bd914ecd5ba2 test/unit/managers/test_HistoryManager.py
--- a/test/unit/managers/test_HistoryManager.py
+++ b/test/unit/managers/test_HistoryManager.py
@@ -311,7 +311,7 @@
filters = filter_parser.parse_filters([
( 'name', 'eq', 'wot' ),
( 'deleted', 'eq', 'True' ),
- ( 'annotation', 'in', 'hrrmm' )
+ ( 'annotation', 'has', 'hrrmm' )
])
self.log( 'both orm and fn filters should be parsed and returned' )
self.assertEqual( len( filters ), 3 )
@@ -387,7 +387,7 @@
history2 = self.history_mgr.create( self.trans, name='history2', user=user2 )
history3 = self.history_mgr.create( self.trans, name='history3', user=user2 )
- filters = filter_parser.parse_filters([ ( 'annotation', 'in', 'no play' ), ])
+ filters = filter_parser.parse_filters([ ( 'annotation', 'has', 'no play' ), ])
anno_filter = filters[0]
history3.add_item_annotation( self.trans.sa_session, user2, history3, "All work and no play" )
@@ -406,7 +406,7 @@
shining_examples = self.history_mgr.list( self.trans, filters=filter_parser.parse_filters([
( 'importable', 'eq', 'True' ),
- ( 'annotation', 'in', 'no play' ),
+ ( 'annotation', 'has', 'no play' ),
]))
self.assertEqual( shining_examples, [ history3 ])
@@ -491,7 +491,7 @@
found = self.history_mgr.list( self.trans, filters=filters, offset=1, limit=1 )
self.assertEqual( found, [ history2 ] )
- filters = filter_parser.parse_filters([ ( 'annotation', 'in', test_annotation ) ])
+ filters = filter_parser.parse_filters([ ( 'annotation', 'has', test_annotation ) ])
self.log( "fn filtered, no offset, no limit should work" )
found = self.history_mgr.list( self.trans, filters=filters )
self.assertEqual( found, [ history2, history3, history4 ] )
@@ -507,7 +507,7 @@
filters = filter_parser.parse_filters([
( 'deleted', 'eq', 'True' ),
- ( 'annotation', 'in', test_annotation )
+ ( 'annotation', 'has', test_annotation )
])
self.log( "orm and fn filtered, no offset, no limit should work" )
found = self.history_mgr.list( self.trans, filters=filters )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: Managers: move FilterParsers into base classes
by commits-noreply@bitbucket.org 30 Jan '15
by commits-noreply@bitbucket.org 30 Jan '15
30 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/65ff8e5a5c21/
Changeset: 65ff8e5a5c21
User: carlfeberhard
Date: 2015-01-29 19:30:45+00:00
Summary: Managers: move FilterParsers into base classes
Affected #: 3 files
diff -r b2b09f9e85130662ef02ee4ae887530e442f0e37 -r 65ff8e5a5c21d82fd216841af7ab914eaecaf4d6 lib/galaxy/managers/base.py
--- a/lib/galaxy/managers/base.py
+++ b/lib/galaxy/managers/base.py
@@ -807,7 +807,13 @@
"""
Set up, extend, or alter `orm_filter_parsers` and `fn_filter_parsers`.
"""
- pass
+ self.orm_filter_parsers.update({
+ # (prob.) applicable to all models
+ 'id' : { 'op': ( 'in' ), 'val': self.parse_id_list },
+ # dates can be directly passed through the orm into a filter (no need to parse into datetime object)
+ 'create_time' : { 'op': ( 'le', 'ge' ) },
+ 'update_time' : { 'op': ( 'le', 'ge' ) },
+ })
def parse_filters( self, filter_tuple_list ):
"""
@@ -899,6 +905,8 @@
#UNCHANGED_OPS = ( 'like' )
def _convert_op_string_to_fn( self, column, op_string ):
"""
+ Convert the query string filter op shorthand into actual ORM usable
+ function names, then return the ORM function.
"""
# correct op_string to usable function key
fn_name = op_string
@@ -971,7 +979,7 @@
"""
Parse a boolean from a string.
"""
- #Be strict here to remove complexity of options.
+ # Be strict here to remove complexity of options (but allow already parsed).
if bool_string in ( 'True', True ):
return True
if bool_string in ( 'False', False ):
@@ -982,7 +990,9 @@
"""
Split `id_list_string` at `sep`.
"""
- return id_list_string.split( sep )
+ #TODO: move id decoding out
+ id_list = [ self.app.security.decode_id( id_ ) for id_ in id_list_string.split( sep ) ]
+ return id_list
# ==== Security Mixins
@@ -1158,6 +1168,14 @@
return item.deleted
+class DeletableModelFilters( object ):
+
+ def _add_parsers( self ):
+ self.orm_filter_parsers.update({
+ 'deleted' : { 'op': ( 'eq' ), 'val': self.parse_bool }
+ })
+
+
class PurgableModelInterface( DeletableModelInterface ):
"""
A manager interface/mixin for a resource that allows deleting and purging where
@@ -1200,3 +1218,12 @@
if new_purged:
self.manager.purge( trans, item, flush=False )
return self.purged
+
+
+class PurgableModelFilters( DeletableModelFilters ):
+
+ def _add_parsers( self ):
+ DeletableModelFilters._add_parsers( self )
+ self.orm_filter_parsers.update({
+ 'purged' : { 'op': ( 'eq' ), 'val': self.parse_bool }
+ })
diff -r b2b09f9e85130662ef02ee4ae887530e442f0e37 -r 65ff8e5a5c21d82fd216841af7ab914eaecaf4d6 lib/galaxy/managers/histories.py
--- a/lib/galaxy/managers/histories.py
+++ b/lib/galaxy/managers/histories.py
@@ -353,32 +353,17 @@
})
-class HistoryFilters( base.FilterParser ):
+class HistoryFilters( sharable.SharableModelFilters, base.PurgableModelFilters ):
model_class = model.History
def _add_parsers( self ):
super( HistoryFilters, self )._add_parsers()
+ base.PurgableModelFilters._add_parsers( self )
+
self.orm_filter_parsers.update({
- #TODO: these three are (prob.) applicable to all models
- 'id' : { 'op': ( 'in' ), 'val': self.parse_id_list },
- # dates can be directly passed through the orm into a filter (no need to parse into datetime object)
- 'create_time' : { 'op': ( 'le', 'ge' ) },
- 'update_time' : { 'op': ( 'le', 'ge' ) },
-
# history specific
'name' : { 'op': ( 'eq', 'contains', 'like' ) },
'genome_build' : { 'op': ( 'eq', 'contains', 'like' ) },
-
- #TODO: purgable
- 'deleted' : { 'op': ( 'eq' ), 'val': self.parse_bool },
- 'purged' : { 'op': ( 'eq' ), 'val': self.parse_bool },
-
- #TODO: sharable
- 'importable' : { 'op': ( 'eq' ), 'val': self.parse_bool },
- 'published' : { 'op': ( 'eq' ), 'val': self.parse_bool },
- 'slug' : { 'op': ( 'eq', 'contains', 'like' ) },
- # chose by user should prob. only be available for admin? (most often we'll only need trans.user)
- #'user' : { 'op': ( 'eq' ), 'val': self.parse_id_list },
})
#TODO: I'm not entirely convinced this (or tags) are a good idea for filters since they involve a/the user
diff -r b2b09f9e85130662ef02ee4ae887530e442f0e37 -r 65ff8e5a5c21d82fd216841af7ab914eaecaf4d6 lib/galaxy/managers/sharable.py
--- a/lib/galaxy/managers/sharable.py
+++ b/lib/galaxy/managers/sharable.py
@@ -416,3 +416,16 @@
# pass
#def deserialize_user_shares():
+
+
+class SharableModelFilters( base.FilterParser ):
+
+ def _add_parsers( self ):
+ super( SharableModelFilters, self )._add_parsers()
+ self.orm_filter_parsers.update({
+ 'importable' : { 'op': ( 'eq' ), 'val': self.parse_bool },
+ 'published' : { 'op': ( 'eq' ), 'val': self.parse_bool },
+ 'slug' : { 'op': ( 'eq', 'contains', 'like' ) },
+ # chose by user should prob. only be available for admin? (most often we'll only need trans.user)
+ #'user' : { 'op': ( 'eq' ), 'val': self.parse_id_list },
+ })
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: API, Histories: fix (and simplify) tag filter
by commits-noreply@bitbucket.org 30 Jan '15
by commits-noreply@bitbucket.org 30 Jan '15
30 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/b2b09f9e8513/
Changeset: b2b09f9e8513
User: carlfeberhard
Date: 2015-01-29 18:50:05+00:00
Summary: API, Histories: fix (and simplify) tag filter
Affected #: 1 file
diff -r bcedc1c97e346fff6b3458b5339cac35ef37ffd0 -r b2b09f9e85130662ef02ee4ae887530e442f0e37 lib/galaxy/managers/base.py
--- a/lib/galaxy/managers/base.py
+++ b/lib/galaxy/managers/base.py
@@ -938,31 +938,34 @@
return val in owner_annotation
#TODO: to taggable
- def _filter_tags( self, item, val, fn_name='__eq__' ):
+ def _tag_str_gen( self, item ):
"""
- Test whether the string version of any tag `fn_name`s (__eq__, contains)
- `val`.
+ Return a list of strings built from the item's tags.
"""
#TODO: which user is this? all?
for tag in item.tags:
tag_str = tag.user_tname
if tag.value is not None:
tag_str += ":" + tag.user_value
- if tag_str[ fn_name ]( val ):
- return True
- return False
+ yield tag_str
def filter_has_partial_tag( self, item, val ):
"""
Return True if any tag partially contains `val`.
"""
- return self._filter_tags( item, val, fn_name='contains' )
+ for tag_str in self._tag_str_gen( item ):
+ if val in tag_str:
+ return True
+ return False
def filter_has_tag( self, item, val ):
"""
Return True if any tag exactly equals `val`.
"""
- return self._filter_tags( item, val, fn_name='__eq__' )
+ for tag_str in self._tag_str_gen( item ):
+ if val == tag_str:
+ return True
+ return False
def parse_bool( self, bool_string ):
"""
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
29 Jan '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: f3789f9687f10869ffff010021be8266f1c90b34
https://github.com/galaxyproject/usegalaxy-playbook/commit/f3789f9687f10869…
Author: Nate Coraor <nate(a)bx.psu.edu>
Date: 2015-01-29 (Thu, 29 Jan 2015)
Changed paths:
M production/group_vars/galaxyservers.yml
M stage/group_vars/galaxyservers.yml
Log Message:
-----------
Forgot to start the reports app.
1
0
commit/galaxy-central: guerler: ToolForm: Replace default value after validation
by commits-noreply@bitbucket.org 29 Jan '15
by commits-noreply@bitbucket.org 29 Jan '15
29 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/bcedc1c97e34/
Changeset: bcedc1c97e34
User: guerler
Date: 2015-01-29 17:55:02+00:00
Summary: ToolForm: Replace default value after validation
Affected #: 1 file
diff -r c424fac760796619ded60968ad57c8e9f51e9ca7 -r bcedc1c97e346fff6b3458b5339cac35ef37ffd0 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -2405,9 +2405,7 @@
pass
group_state[input.test_param.name] = value
else:
- default_value = incoming.get(key, None)
- if not default_value:
- default_value = state[input.name]
+ default_value = incoming.get(key, state.get(input.name, None))
value, error = check_state(trans, input, default_value, context)
if error:
errors[key] = error
@@ -2458,7 +2456,11 @@
# sanitize values
sanitize(tool_dict, 'value')
sanitize(tool_dict, 'default_value')
-
+
+ # use default value
+ if not tool_dict['value']:
+ tool_dict['value'] = tool_dict['default_value']
+
# backup final input dictionary
group_inputs[input_index] = tool_dict
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
29 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c424fac76079/
Changeset: c424fac76079
User: guerler
Date: 2015-01-29 17:39:21+00:00
Summary: Remove spaces
Affected #: 2 files
diff -r b546c920a9785ed1edc4ec6126b8d58258ea0f5d -r c424fac760796619ded60968ad57c8e9f51e9ca7 client/galaxy/scripts/mvc/upload/upload-view.js
--- a/client/galaxy/scripts/mvc/upload/upload-view.js
+++ b/client/galaxy/scripts/mvc/upload/upload-view.js
@@ -593,7 +593,7 @@
}
});
},
-
+
// update genome for all models
updateGenome: function(genome) {
var self = this;
@@ -603,7 +603,7 @@
}
});
},
-
+
// update uset
_updateUser: function() {
// backup current history
diff -r b546c920a9785ed1edc4ec6126b8d58258ea0f5d -r c424fac760796619ded60968ad57c8e9f51e9ca7 static/scripts/mvc/upload/upload-view.js
--- a/static/scripts/mvc/upload/upload-view.js
+++ b/static/scripts/mvc/upload/upload-view.js
@@ -593,7 +593,7 @@
}
});
},
-
+
// update genome for all models
updateGenome: function(genome) {
var self = this;
@@ -603,7 +603,7 @@
}
});
},
-
+
// update uset
_updateUser: function() {
// backup current history
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: guerler: Upload: More user interaction
by commits-noreply@bitbucket.org 29 Jan '15
by commits-noreply@bitbucket.org 29 Jan '15
29 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/b546c920a978/
Changeset: b546c920a978
User: guerler
Date: 2015-01-29 17:38:11+00:00
Summary: Upload: More user interaction
Affected #: 6 files
diff -r e38653b24ade2d72db2ad6196f8b85780311671c -r b546c920a9785ed1edc4ec6126b8d58258ea0f5d client/galaxy/scripts/mvc/upload/upload-row.js
--- a/client/galaxy/scripts/mvc/upload/upload-row.js
+++ b/client/galaxy/scripts/mvc/upload/upload-row.js
@@ -67,8 +67,9 @@
// select genomes
this.select_genome = new Select.View({
css: 'genome',
- onchange : function() {
- self.model.set('genome', self.select_genome.value());
+ onchange : function(genome) {
+ self.model.set('genome', genome);
+ self.app.updateGenome(genome);
},
data: self.app.list_genomes,
container: it.find('#genome'),
@@ -84,8 +85,9 @@
// select extension
this.select_extension = new Select.View({
css: 'extension',
- onchange : function() {
- self.model.set('extension', self.select_extension.value());
+ onchange : function(extension) {
+ self.model.set('extension', extension);
+ self.app.updateExtension(extension);
},
data: self.app.list_extensions,
container: it.find('#extension'),
diff -r e38653b24ade2d72db2ad6196f8b85780311671c -r b546c920a9785ed1edc4ec6126b8d58258ea0f5d client/galaxy/scripts/mvc/upload/upload-view.js
--- a/client/galaxy/scripts/mvc/upload/upload-view.js
+++ b/client/galaxy/scripts/mvc/upload/upload-view.js
@@ -232,11 +232,7 @@
container : this.$el.parent().find('#header-extension'),
value : this.default_extension,
onchange : function(extension) {
- self.collection.each(function(item) {
- if (item.get('status') == 'init' && item.get('extension') == self.default_extension) {
- item.set('extension', extension);
- }
- });
+ self.updateExtension(extension);
}
});
@@ -257,11 +253,7 @@
container : this.$el.parent().find('#header-genome'),
value : this.default_genome,
onchange : function(genome) {
- self.collection.each(function(item) {
- if (item.get('status') == 'init' && item.get('genome') == self.default_genome) {
- item.set('genome', genome);
- }
- });
+ self.updateGenome(genome);
}
});
}
@@ -592,6 +584,26 @@
}
},
+ // update extension for all models
+ updateExtension: function(extension) {
+ var self = this;
+ this.collection.each(function(item) {
+ if (item.get('status') == 'init' && item.get('extension') == self.default_extension) {
+ item.set('extension', extension);
+ }
+ });
+ },
+
+ // update genome for all models
+ updateGenome: function(genome) {
+ var self = this;
+ this.collection.each(function(item) {
+ if (item.get('status') == 'init' && item.get('genome') == self.default_genome) {
+ item.set('genome', genome);
+ }
+ });
+ },
+
// update uset
_updateUser: function() {
// backup current history
diff -r e38653b24ade2d72db2ad6196f8b85780311671c -r b546c920a9785ed1edc4ec6126b8d58258ea0f5d static/scripts/mvc/upload/upload-row.js
--- a/static/scripts/mvc/upload/upload-row.js
+++ b/static/scripts/mvc/upload/upload-row.js
@@ -67,8 +67,9 @@
// select genomes
this.select_genome = new Select.View({
css: 'genome',
- onchange : function() {
- self.model.set('genome', self.select_genome.value());
+ onchange : function(genome) {
+ self.model.set('genome', genome);
+ self.app.updateGenome(genome);
},
data: self.app.list_genomes,
container: it.find('#genome'),
@@ -84,8 +85,9 @@
// select extension
this.select_extension = new Select.View({
css: 'extension',
- onchange : function() {
- self.model.set('extension', self.select_extension.value());
+ onchange : function(extension) {
+ self.model.set('extension', extension);
+ self.app.updateExtension(extension);
},
data: self.app.list_extensions,
container: it.find('#extension'),
diff -r e38653b24ade2d72db2ad6196f8b85780311671c -r b546c920a9785ed1edc4ec6126b8d58258ea0f5d static/scripts/mvc/upload/upload-view.js
--- a/static/scripts/mvc/upload/upload-view.js
+++ b/static/scripts/mvc/upload/upload-view.js
@@ -232,11 +232,7 @@
container : this.$el.parent().find('#header-extension'),
value : this.default_extension,
onchange : function(extension) {
- self.collection.each(function(item) {
- if (item.get('status') == 'init' && item.get('extension') == self.default_extension) {
- item.set('extension', extension);
- }
- });
+ self.updateExtension(extension);
}
});
@@ -257,11 +253,7 @@
container : this.$el.parent().find('#header-genome'),
value : this.default_genome,
onchange : function(genome) {
- self.collection.each(function(item) {
- if (item.get('status') == 'init' && item.get('genome') == self.default_genome) {
- item.set('genome', genome);
- }
- });
+ self.updateGenome(genome);
}
});
}
@@ -592,6 +584,26 @@
}
},
+ // update extension for all models
+ updateExtension: function(extension) {
+ var self = this;
+ this.collection.each(function(item) {
+ if (item.get('status') == 'init' && item.get('extension') == self.default_extension) {
+ item.set('extension', extension);
+ }
+ });
+ },
+
+ // update genome for all models
+ updateGenome: function(genome) {
+ var self = this;
+ this.collection.each(function(item) {
+ if (item.get('status') == 'init' && item.get('genome') == self.default_genome) {
+ item.set('genome', genome);
+ }
+ });
+ },
+
// update uset
_updateUser: function() {
// backup current history
diff -r e38653b24ade2d72db2ad6196f8b85780311671c -r b546c920a9785ed1edc4ec6126b8d58258ea0f5d static/scripts/packed/mvc/upload/upload-row.js
--- a/static/scripts/packed/mvc/upload/upload-row.js
+++ b/static/scripts/packed/mvc/upload/upload-row.js
@@ -1,1 +1,1 @@
-define(["utils/utils","mvc/upload/upload-model","mvc/upload/upload-settings","mvc/ui/ui-popover","mvc/ui/ui-select"],function(d,b,a,c,e){return Backbone.View.extend({options:{padding:8},status_classes:{init:"upload-icon-button fa fa-trash-o",queued:"upload-icon fa fa-spinner fa-spin",running:"upload-icon fa fa-spinner fa-spin",success:"upload-icon-button fa fa-check",error:"upload-icon-button fa fa-exclamation-triangle"},settings:null,select_genome:null,select_extension:null,initialize:function(k,h){this.app=k;var f=this;this.model=new b.Model(h);this.setElement(this._template(h));var j=this.$el;this.settings=new c.View({title:"Upload configuration",container:j.find("#settings"),placement:"bottom"});var i=this.app.select_genome.value();this.select_genome=new e.View({css:"genome",onchange:function(){f.model.set("genome",f.select_genome.value())},data:f.app.list_genomes,container:j.find("#genome"),value:i});this.model.set("genome",i);var g=this.app.select_extension.value();this.select_extension=new e.View({css:"extension",onchange:function(){f.model.set("extension",f.select_extension.value())},data:f.app.list_extensions,container:j.find("#extension"),value:g});this.model.set("extension",g);j.find("#symbol").on("click",function(){f._removeRow()});j.find("#extension-info").on("click",function(l){f.app.showExtensionInfo({$el:$(l.target),title:f.select_extension.text(),extension:f.select_extension.value()})}).on("mousedown",function(l){l.preventDefault()});j.find("#settings").on("click",function(l){f._showSettings()}).on("mousedown",function(l){l.preventDefault()});j.find("#text-content").on("keyup",function(l){f.model.set("url_paste",$(l.target).val());f.model.set("file_size",$(l.target).val().length)});j.find("#space_to_tabs").on("change",function(l){f.model.set("space_to_tabs",$(l.target).prop("checked"))});this.model.on("change:percentage",function(){f._refreshPercentage()});this.model.on("change:status",function(){f._refreshStatus()});this.model.on("change:info",function(){f._refreshInfo()});this.model.on("change:genome",function(){f._refreshGenome()});this.model.on("change:extension",function(){f._refreshExtension()});this.model.on("change:file_size",function(){f._refreshFileSize()});this.model.on("remove",function(){f.remove()});this.app.collection.on("reset",function(){f.remove()})},render:function(){var m=this.model.get("file_name");var g=this.model.get("file_size");var j=this.model.get("file_mode");var i=this.$el;i.find("#title").html(m);i.find("#size").html(d.bytesToString(g));i.find("#mode").removeClass().addClass("mode");if(j=="new"){var l=i.find("#text");var k=this.options.padding;var h=i.width()-2*k;var f=i.height()-k;l.css("width",h+"px");l.css("top",f+"px");i.height(f+l.height()+2*k);l.show();i.find("#mode").addClass("fa fa-pencil")}if(j=="local"){i.find("#mode").addClass("fa fa-laptop")}if(j=="ftp"){i.find("#mode").addClass("fa fa-code-fork")}},remove:function(){this.select_genome.remove();this.select_extension.remove();Backbone.View.prototype.remove.apply(this)},_refreshExtension:function(){this.select_extension.value(this.model.get("extension"))},_refreshGenome:function(){this.select_genome.value(this.model.get("genome"))},_refreshInfo:function(){var f=this.model.get("info");if(f){this.$el.find("#info").html("<strong>Failed: </strong>"+f).show()}else{this.$el.find("#info").hide()}},_refreshPercentage:function(){var f=parseInt(this.model.get("percentage"));this.$el.find(".progress-bar").css({width:f+"%"});if(f!=100){this.$el.find("#percentage").html(f+"%")}else{this.$el.find("#percentage").html("Adding to history...")}},_refreshStatus:function(){var g=this.$el;var f=this.model.get("status");var i=this.status_classes[f];var h=this.$el.find("#symbol");h.removeClass();h.addClass(i);if(f=="init"){this.select_genome.enable();this.select_extension.enable();g.find("#text-content").attr("disabled",false);g.find("#space_to_tabs").attr("disabled",false)}else{this.select_genome.disable();this.select_extension.disable();g.find("#text-content").attr("disabled",true);g.find("#space_to_tabs").attr("disabled",true)}if(f=="success"){g.addClass("success");g.find("#percentage").html("100%")}if(f=="error"){g.addClass("danger");g.find(".progress").remove()}},_refreshFileSize:function(){var f=this.model.get("file_size");this.$el.find("#size").html(d.bytesToString(f))},_removeRow:function(){var f=this.model.get("status");if(f=="init"||f=="success"||f=="error"){this.app.collection.remove(this.model)}},_showSettings:function(){if(!this.settings.visible){this.settings.empty();this.settings.append((new a(this)).$el);this.settings.show()}else{this.settings.hide()}},_template:function(f){return'<tr id="upload-item-'+f.id+'" class="upload-item"><td><div class="name-column"><div id="mode"></div><div id="title" class="title"></div><div id="text" class="text"><div class="text-info">You can tell Galaxy to download data from web by entering URL in this box (one per line). You can also directly paste the contents of a file.</div><textarea id="text-content" class="text-content form-control"></textarea></div></div></td><td><div id="size" class="size"></div></td><td><div id="extension" class="extension" style="float: left;"/>  <div id="extension-info" class="upload-icon-button fa fa-search"/></td><td><div id="genome" class="genome" /></td><td><div id="settings" class="upload-icon-button fa fa-gear"></div><td><div id="info" class="info"><div class="progress"><div class="progress-bar progress-bar-success"></div><div id="percentage" class="percentage">0%</div></div></div></td><td><div id="symbol" class="'+this.status_classes.init+'"></div></td></tr>'}})});
\ No newline at end of file
+define(["utils/utils","mvc/upload/upload-model","mvc/upload/upload-settings","mvc/ui/ui-popover","mvc/ui/ui-select"],function(d,b,a,c,e){return Backbone.View.extend({options:{padding:8},status_classes:{init:"upload-icon-button fa fa-trash-o",queued:"upload-icon fa fa-spinner fa-spin",running:"upload-icon fa fa-spinner fa-spin",success:"upload-icon-button fa fa-check",error:"upload-icon-button fa fa-exclamation-triangle"},settings:null,select_genome:null,select_extension:null,initialize:function(k,h){this.app=k;var f=this;this.model=new b.Model(h);this.setElement(this._template(h));var j=this.$el;this.settings=new c.View({title:"Upload configuration",container:j.find("#settings"),placement:"bottom"});var i=this.app.select_genome.value();this.select_genome=new e.View({css:"genome",onchange:function(l){f.model.set("genome",l);f.app.updateGenome(l)},data:f.app.list_genomes,container:j.find("#genome"),value:i});this.model.set("genome",i);var g=this.app.select_extension.value();this.select_extension=new e.View({css:"extension",onchange:function(l){f.model.set("extension",l);f.app.updateExtension(l)},data:f.app.list_extensions,container:j.find("#extension"),value:g});this.model.set("extension",g);j.find("#symbol").on("click",function(){f._removeRow()});j.find("#extension-info").on("click",function(l){f.app.showExtensionInfo({$el:$(l.target),title:f.select_extension.text(),extension:f.select_extension.value()})}).on("mousedown",function(l){l.preventDefault()});j.find("#settings").on("click",function(l){f._showSettings()}).on("mousedown",function(l){l.preventDefault()});j.find("#text-content").on("keyup",function(l){f.model.set("url_paste",$(l.target).val());f.model.set("file_size",$(l.target).val().length)});j.find("#space_to_tabs").on("change",function(l){f.model.set("space_to_tabs",$(l.target).prop("checked"))});this.model.on("change:percentage",function(){f._refreshPercentage()});this.model.on("change:status",function(){f._refreshStatus()});this.model.on("change:info",function(){f._refreshInfo()});this.model.on("change:genome",function(){f._refreshGenome()});this.model.on("change:extension",function(){f._refreshExtension()});this.model.on("change:file_size",function(){f._refreshFileSize()});this.model.on("remove",function(){f.remove()});this.app.collection.on("reset",function(){f.remove()})},render:function(){var m=this.model.get("file_name");var g=this.model.get("file_size");var j=this.model.get("file_mode");var i=this.$el;i.find("#title").html(m);i.find("#size").html(d.bytesToString(g));i.find("#mode").removeClass().addClass("mode");if(j=="new"){var l=i.find("#text");var k=this.options.padding;var h=i.width()-2*k;var f=i.height()-k;l.css("width",h+"px");l.css("top",f+"px");i.height(f+l.height()+2*k);l.show();i.find("#mode").addClass("fa fa-pencil")}if(j=="local"){i.find("#mode").addClass("fa fa-laptop")}if(j=="ftp"){i.find("#mode").addClass("fa fa-code-fork")}},remove:function(){this.select_genome.remove();this.select_extension.remove();Backbone.View.prototype.remove.apply(this)},_refreshExtension:function(){this.select_extension.value(this.model.get("extension"))},_refreshGenome:function(){this.select_genome.value(this.model.get("genome"))},_refreshInfo:function(){var f=this.model.get("info");if(f){this.$el.find("#info").html("<strong>Failed: </strong>"+f).show()}else{this.$el.find("#info").hide()}},_refreshPercentage:function(){var f=parseInt(this.model.get("percentage"));this.$el.find(".progress-bar").css({width:f+"%"});if(f!=100){this.$el.find("#percentage").html(f+"%")}else{this.$el.find("#percentage").html("Adding to history...")}},_refreshStatus:function(){var g=this.$el;var f=this.model.get("status");var i=this.status_classes[f];var h=this.$el.find("#symbol");h.removeClass();h.addClass(i);if(f=="init"){this.select_genome.enable();this.select_extension.enable();g.find("#text-content").attr("disabled",false);g.find("#space_to_tabs").attr("disabled",false)}else{this.select_genome.disable();this.select_extension.disable();g.find("#text-content").attr("disabled",true);g.find("#space_to_tabs").attr("disabled",true)}if(f=="success"){g.addClass("success");g.find("#percentage").html("100%")}if(f=="error"){g.addClass("danger");g.find(".progress").remove()}},_refreshFileSize:function(){var f=this.model.get("file_size");this.$el.find("#size").html(d.bytesToString(f))},_removeRow:function(){var f=this.model.get("status");if(f=="init"||f=="success"||f=="error"){this.app.collection.remove(this.model)}},_showSettings:function(){if(!this.settings.visible){this.settings.empty();this.settings.append((new a(this)).$el);this.settings.show()}else{this.settings.hide()}},_template:function(f){return'<tr id="upload-item-'+f.id+'" class="upload-item"><td><div class="name-column"><div id="mode"></div><div id="title" class="title"></div><div id="text" class="text"><div class="text-info">You can tell Galaxy to download data from web by entering URL in this box (one per line). You can also directly paste the contents of a file.</div><textarea id="text-content" class="text-content form-control"></textarea></div></div></td><td><div id="size" class="size"></div></td><td><div id="extension" class="extension" style="float: left;"/>  <div id="extension-info" class="upload-icon-button fa fa-search"/></td><td><div id="genome" class="genome" /></td><td><div id="settings" class="upload-icon-button fa fa-gear"></div><td><div id="info" class="info"><div class="progress"><div class="progress-bar progress-bar-success"></div><div id="percentage" class="percentage">0%</div></div></div></td><td><div id="symbol" class="'+this.status_classes.init+'"></div></td></tr>'}})});
\ No newline at end of file
diff -r e38653b24ade2d72db2ad6196f8b85780311671c -r b546c920a9785ed1edc4ec6126b8d58258ea0f5d static/scripts/packed/mvc/upload/upload-view.js
--- a/static/scripts/packed/mvc/upload/upload-view.js
+++ b/static/scripts/packed/mvc/upload/upload-view.js
@@ -1,1 +1,1 @@
-define(["utils/utils","mvc/upload/upload-button","mvc/upload/upload-model","mvc/upload/upload-row","mvc/upload/upload-ftp","mvc/ui/ui-popover","mvc/ui/ui-modal","mvc/ui/ui-select","utils/uploadbox"],function(f,e,c,b,g,d,a,h){return Backbone.View.extend({options:{nginx_upload_path:""},modal:null,ui_button:null,uploadbox:null,current_history:null,select_extension:null,select_genome:null,upload_size:0,list_extensions:[],list_genomes:[],auto:{id:"auto",text:"Auto-detect",description:"This system will try to detect the file type automatically. If your file is not detected properly as one of the known formats, it most likely means that it has some format problems (e.g., different number of columns on different rows). You can still coerce the system to set your data to the format you think it should be. You can also upload compressed files, which will automatically be decompressed."},collection:new c.Collection(),ftp:null,counter:{announce:0,success:0,error:0,running:0,reset:function(){this.announce=this.success=this.error=this.running=0}},initialize:function(j){var i=this;if(j){this.options=_.defaults(j,this.options)}this.ui_button=new e.Model({icon:"fa-upload",tooltip:"Download from URL or upload files from disk",label:"Load Data",onclick:function(k){if(k){k.preventDefault();i.show()}},onunload:function(){if(i.counter.running>0){return"Several uploads are still processing."}}});$(".with-upload-button").append((new e.View(this.ui_button)).$el);var i=this;f.get({url:galaxy_config.root+"api/datatypes?extension_only=False",success:function(k){for(key in k){i.list_extensions.push({id:k[key].extension,text:k[key].extension,description:k[key].description,description_url:k[key].description_url})}i.list_extensions.sort(function(m,l){return m.id>l.id?1:m.id<l.id?-1:0});if(!i.options.datatypes_disable_auto){i.list_extensions.unshift(i.auto)}i.default_extension=i.list_extensions[0]&&i.list_extensions[0].id}});f.get({url:galaxy_config.root+"api/genomes",success:function(k){for(key in k){i.list_genomes.push({id:k[key][1],text:k[key][0]})}i.list_genomes.sort(function(m,l){return m.id>l.id?1:m.id<l.id?-1:0});i.default_genome=i.list_genomes[0]&&i.list_genomes[0].id}});this.collection.on("remove",function(k){i._eventRemove(k)})},show:function(){var i=this;if(!Galaxy.currHistoryPanel||!Galaxy.currHistoryPanel.model){window.setTimeout(function(){i.show()},500);return}if(!this.modal){var i=this;this.modal=new a.View({title:"Download data directly from web or upload files from your disk",body:this._template("upload-box","upload-info"),buttons:{"Choose local file":function(){i.uploadbox.select()},"Choose FTP file":function(){i._eventFtp()},"Paste/Fetch data":function(){i._eventCreate()},Start:function(){i._eventStart()},Pause:function(){i._eventStop()},Reset:function(){i._eventReset()},Close:function(){i.modal.hide()},},height:"400",width:"900",closing_events:true});this.setElement("#upload-box");var i=this;this.uploadbox=this.$el.uploadbox({announce:function(k,l,m){i._eventAnnounce(k,l,m)},initialize:function(k,l,m){return i._eventInitialize(k,l,m)},progress:function(k,l,m){i._eventProgress(k,l,m)},success:function(k,l,m){i._eventSuccess(k,l,m)},error:function(k,l,m){i._eventError(k,l,m)},complete:function(){i._eventComplete()}});var j=this.modal.getButton("Choose FTP file");this.ftp=new d.View({title:"FTP files",container:j});this.select_extension=new h.View({css:"header-selection",data:this.list_extensions,container:this.$el.parent().find("#header-extension"),value:this.default_extension,onchange:function(k){i.collection.each(function(l){if(l.get("status")=="init"&&l.get("extension")==i.default_extension){l.set("extension",k)}})}});i.$el.parent().find("#header-extension-info").on("click",function(k){i.showExtensionInfo({$el:$(k.target),title:i.select_extension.text(),extension:i.select_extension.value(),placement:"top"})}).on("mousedown",function(k){k.preventDefault()});this.select_genome=new h.View({css:"header-selection",data:this.list_genomes,container:this.$el.parent().find("#header-genome"),value:this.default_genome,onchange:function(k){i.collection.each(function(l){if(l.get("status")=="init"&&l.get("genome")==i.default_genome){l.set("genome",k)}})}})}this.modal.show();this._updateUser();this._updateScreen()},showExtensionInfo:function(j){var i=this;var k=j.$el;var n=j.extension;var m=j.title;var l=_.findWhere(i.list_extensions,{id:n});this.extension_popup&&this.extension_popup.remove();this.extension_popup=new d.View({placement:j.placement||"bottom",container:k,destroy:true});this.extension_popup.title(m);this.extension_popup.empty();this.extension_popup.append(this._templateDescription(l));this.extension_popup.show()},_eventRemove:function(j){var i=j.get("status");if(i=="success"){this.counter.success--}else{if(i=="error"){this.counter.error--}else{this.counter.announce--}}this._updateScreen();this.uploadbox.remove(j.id)},_eventAnnounce:function(i,j,l){this.counter.announce++;this._updateScreen();var k=new b(this,{id:i,file_name:j.name,file_size:j.size,file_mode:j.mode,file_path:j.path});this.collection.add(k.model);$(this.el).find("tbody:first").append(k.$el);k.render()},_eventInitialize:function(n,k,t){var l=this.collection.get(n);l.set("status","running");var p=l.get("file_name");var o=l.get("file_path");var i=l.get("file_mode");var q=l.get("extension");var s=l.get("genome");var r=l.get("url_paste");var m=l.get("space_to_tabs");var j=l.get("to_posix_lines");if(!r&&!(k.size>0)){return null}this.uploadbox.configure({url:this.options.nginx_upload_path});if(i=="local"){this.uploadbox.configure({paramname:"files_0|file_data"})}else{this.uploadbox.configure({paramname:null})}tool_input={};if(i=="new"){tool_input["files_0|url_paste"]=r}if(i=="ftp"){tool_input["files_0|ftp_files"]=o}tool_input.dbkey=s;tool_input.file_type=q;tool_input["files_0|type"]="upload_dataset";tool_input["files_0|space_to_tab"]=m&&"Yes"||null;tool_input["files_0|to_posix_lines"]=j&&"Yes"||null;data={};data.history_id=this.current_history;data.tool_id="upload1";data.inputs=JSON.stringify(tool_input);return data},_eventProgress:function(j,k,i){var l=this.collection.get(j);l.set("percentage",i);this.ui_button.set("percentage",this._uploadPercentage(i,k.size))},_eventSuccess:function(j,k,m){var l=this.collection.get(j);l.set("percentage",100);l.set("status","success");var i=l.get("file_size");this.ui_button.set("percentage",this._uploadPercentage(100,i));this.upload_completed+=i*100;this.counter.announce--;this.counter.success++;this._updateScreen();Galaxy.currHistoryPanel.refreshContents()},_eventError:function(i,j,l){var k=this.collection.get(i);k.set("percentage",100);k.set("status","error");k.set("info",l);this.ui_button.set("percentage",this._uploadPercentage(100,j.size));this.ui_button.set("status","danger");this.upload_completed+=j.size*100;this.counter.announce--;this.counter.error++;this._updateScreen()},_eventComplete:function(){this.collection.each(function(i){if(i.get("status")=="queued"){i.set("status","init")}});this.counter.running=0;this._updateScreen()},_eventFtp:function(){if(!this.ftp.visible){this.ftp.empty();this.ftp.append((new g(this)).$el);this.ftp.show()}else{this.ftp.hide()}},_eventCreate:function(){this.uploadbox.add([{name:"New File",size:0,mode:"new"}])},_eventStart:function(){if(this.counter.announce==0||this.counter.running>0){return}var i=this;this.upload_size=0;this.upload_completed=0;this.collection.each(function(j){if(j.get("status")=="init"){j.set("status","queued");i.upload_size+=j.get("file_size")}});this.ui_button.set("percentage",0);this.ui_button.set("status","success");this.counter.running=this.counter.announce;this._updateScreen();this.uploadbox.start()},_eventStop:function(){if(this.counter.running==0){return}this.ui_button.set("status","info");this.uploadbox.stop();$("#upload-info").html("Queue will pause after completing the current file...")},_eventReset:function(){if(this.counter.running==0){this.collection.reset();this.counter.reset();this._updateScreen();this.uploadbox.reset();this.select_extension.value(this.default_extension);this.select_genome.value(this.default_genome);this.ui_button.set("percentage",0)}},_updateUser:function(){this.current_user=Galaxy.currUser.get("id");this.current_history=null;if(this.current_user){this.current_history=Galaxy.currHistoryPanel.model.get("id")}},_updateScreen:function(){if(this.counter.announce==0){if(this.uploadbox.compatible()){message="You can Drag & Drop files into this box."}else{message="Unfortunately, your browser does not support multiple file uploads or drag&drop.<br>Some supported browsers are: Firefox 4+, Chrome 7+, IE 10+, Opera 12+ or Safari 6+."}}else{if(this.counter.running==0){message="You added "+this.counter.announce+" file(s) to the queue. Add more files or click 'Start' to proceed."}else{message="Please wait..."+this.counter.announce+" out of "+this.counter.running+" remaining."}}$("#upload-info").html(message);if(this.counter.running==0&&this.counter.announce+this.counter.success+this.counter.error>0){this.modal.enableButton("Reset")}else{this.modal.disableButton("Reset")}if(this.counter.running==0&&this.counter.announce>0){this.modal.enableButton("Start")}else{this.modal.disableButton("Start")}if(this.counter.running>0){this.modal.enableButton("Pause")}else{this.modal.disableButton("Pause")}if(this.counter.running==0){this.modal.enableButton("Choose local file");this.modal.enableButton("Choose FTP file");this.modal.enableButton("Paste/Fetch data")}else{this.modal.disableButton("Choose local file");this.modal.disableButton("Choose FTP file");this.modal.disableButton("Paste/Fetch data")}if(this.current_user&&this.options.ftp_upload_dir&&this.options.ftp_upload_site){this.modal.showButton("Choose FTP file")}else{this.modal.hideButton("Choose FTP file")}if(this.counter.announce+this.counter.success+this.counter.error>0){$(this.el).find("#upload-table").show()}else{$(this.el).find("#upload-table").hide()}},_uploadPercentage:function(i,j){return(this.upload_completed+(i*j))/this.upload_size},_templateDescription:function(j){if(j.description){var i=j.description;if(j.description_url){i+=' (<a href="'+j.description_url+'" target="_blank">read more</a>)'}return i}else{return"There is no description available for this file extension."}},_template:function(j,i){return'<div class="upload-top"><h6 id="'+i+'" class="upload-info"></h6></div><div id="'+j+'" class="upload-box"><table id="upload-table" class="table table-striped" style="display: none;"><thead><tr><th>Name</th><th>Size</th><th>Type</th><th>Genome</th><th>Settings</th><th>Status</th><th></th></tr></thead><tbody></tbody></table></div><div id="upload-header" class="upload-header"><span class="header-title">Type (default):</span><span id="header-extension"/><span id="header-extension-info" class="upload-icon-button fa fa-search"/><span class="header-title">Genome (default):</span><span id="header-genome"/></div>'}})});
\ No newline at end of file
+define(["utils/utils","mvc/upload/upload-button","mvc/upload/upload-model","mvc/upload/upload-row","mvc/upload/upload-ftp","mvc/ui/ui-popover","mvc/ui/ui-modal","mvc/ui/ui-select","utils/uploadbox"],function(f,e,c,b,g,d,a,h){return Backbone.View.extend({options:{nginx_upload_path:""},modal:null,ui_button:null,uploadbox:null,current_history:null,select_extension:null,select_genome:null,upload_size:0,list_extensions:[],list_genomes:[],auto:{id:"auto",text:"Auto-detect",description:"This system will try to detect the file type automatically. If your file is not detected properly as one of the known formats, it most likely means that it has some format problems (e.g., different number of columns on different rows). You can still coerce the system to set your data to the format you think it should be. You can also upload compressed files, which will automatically be decompressed."},collection:new c.Collection(),ftp:null,counter:{announce:0,success:0,error:0,running:0,reset:function(){this.announce=this.success=this.error=this.running=0}},initialize:function(j){var i=this;if(j){this.options=_.defaults(j,this.options)}this.ui_button=new e.Model({icon:"fa-upload",tooltip:"Download from URL or upload files from disk",label:"Load Data",onclick:function(k){if(k){k.preventDefault();i.show()}},onunload:function(){if(i.counter.running>0){return"Several uploads are still processing."}}});$(".with-upload-button").append((new e.View(this.ui_button)).$el);var i=this;f.get({url:galaxy_config.root+"api/datatypes?extension_only=False",success:function(k){for(key in k){i.list_extensions.push({id:k[key].extension,text:k[key].extension,description:k[key].description,description_url:k[key].description_url})}i.list_extensions.sort(function(m,l){return m.id>l.id?1:m.id<l.id?-1:0});if(!i.options.datatypes_disable_auto){i.list_extensions.unshift(i.auto)}i.default_extension=i.list_extensions[0]&&i.list_extensions[0].id}});f.get({url:galaxy_config.root+"api/genomes",success:function(k){for(key in k){i.list_genomes.push({id:k[key][1],text:k[key][0]})}i.list_genomes.sort(function(m,l){return m.id>l.id?1:m.id<l.id?-1:0});i.default_genome=i.list_genomes[0]&&i.list_genomes[0].id}});this.collection.on("remove",function(k){i._eventRemove(k)})},show:function(){var i=this;if(!Galaxy.currHistoryPanel||!Galaxy.currHistoryPanel.model){window.setTimeout(function(){i.show()},500);return}if(!this.modal){var i=this;this.modal=new a.View({title:"Download data directly from web or upload files from your disk",body:this._template("upload-box","upload-info"),buttons:{"Choose local file":function(){i.uploadbox.select()},"Choose FTP file":function(){i._eventFtp()},"Paste/Fetch data":function(){i._eventCreate()},Start:function(){i._eventStart()},Pause:function(){i._eventStop()},Reset:function(){i._eventReset()},Close:function(){i.modal.hide()},},height:"400",width:"900",closing_events:true});this.setElement("#upload-box");var i=this;this.uploadbox=this.$el.uploadbox({announce:function(k,l,m){i._eventAnnounce(k,l,m)},initialize:function(k,l,m){return i._eventInitialize(k,l,m)},progress:function(k,l,m){i._eventProgress(k,l,m)},success:function(k,l,m){i._eventSuccess(k,l,m)},error:function(k,l,m){i._eventError(k,l,m)},complete:function(){i._eventComplete()}});var j=this.modal.getButton("Choose FTP file");this.ftp=new d.View({title:"FTP files",container:j});this.select_extension=new h.View({css:"header-selection",data:this.list_extensions,container:this.$el.parent().find("#header-extension"),value:this.default_extension,onchange:function(k){i.updateExtension(k)}});i.$el.parent().find("#header-extension-info").on("click",function(k){i.showExtensionInfo({$el:$(k.target),title:i.select_extension.text(),extension:i.select_extension.value(),placement:"top"})}).on("mousedown",function(k){k.preventDefault()});this.select_genome=new h.View({css:"header-selection",data:this.list_genomes,container:this.$el.parent().find("#header-genome"),value:this.default_genome,onchange:function(k){i.updateGenome(k)}})}this.modal.show();this._updateUser();this._updateScreen()},showExtensionInfo:function(j){var i=this;var k=j.$el;var n=j.extension;var m=j.title;var l=_.findWhere(i.list_extensions,{id:n});this.extension_popup&&this.extension_popup.remove();this.extension_popup=new d.View({placement:j.placement||"bottom",container:k,destroy:true});this.extension_popup.title(m);this.extension_popup.empty();this.extension_popup.append(this._templateDescription(l));this.extension_popup.show()},_eventRemove:function(j){var i=j.get("status");if(i=="success"){this.counter.success--}else{if(i=="error"){this.counter.error--}else{this.counter.announce--}}this._updateScreen();this.uploadbox.remove(j.id)},_eventAnnounce:function(i,j,l){this.counter.announce++;this._updateScreen();var k=new b(this,{id:i,file_name:j.name,file_size:j.size,file_mode:j.mode,file_path:j.path});this.collection.add(k.model);$(this.el).find("tbody:first").append(k.$el);k.render()},_eventInitialize:function(n,k,t){var l=this.collection.get(n);l.set("status","running");var p=l.get("file_name");var o=l.get("file_path");var i=l.get("file_mode");var q=l.get("extension");var s=l.get("genome");var r=l.get("url_paste");var m=l.get("space_to_tabs");var j=l.get("to_posix_lines");if(!r&&!(k.size>0)){return null}this.uploadbox.configure({url:this.options.nginx_upload_path});if(i=="local"){this.uploadbox.configure({paramname:"files_0|file_data"})}else{this.uploadbox.configure({paramname:null})}tool_input={};if(i=="new"){tool_input["files_0|url_paste"]=r}if(i=="ftp"){tool_input["files_0|ftp_files"]=o}tool_input.dbkey=s;tool_input.file_type=q;tool_input["files_0|type"]="upload_dataset";tool_input["files_0|space_to_tab"]=m&&"Yes"||null;tool_input["files_0|to_posix_lines"]=j&&"Yes"||null;data={};data.history_id=this.current_history;data.tool_id="upload1";data.inputs=JSON.stringify(tool_input);return data},_eventProgress:function(j,k,i){var l=this.collection.get(j);l.set("percentage",i);this.ui_button.set("percentage",this._uploadPercentage(i,k.size))},_eventSuccess:function(j,k,m){var l=this.collection.get(j);l.set("percentage",100);l.set("status","success");var i=l.get("file_size");this.ui_button.set("percentage",this._uploadPercentage(100,i));this.upload_completed+=i*100;this.counter.announce--;this.counter.success++;this._updateScreen();Galaxy.currHistoryPanel.refreshContents()},_eventError:function(i,j,l){var k=this.collection.get(i);k.set("percentage",100);k.set("status","error");k.set("info",l);this.ui_button.set("percentage",this._uploadPercentage(100,j.size));this.ui_button.set("status","danger");this.upload_completed+=j.size*100;this.counter.announce--;this.counter.error++;this._updateScreen()},_eventComplete:function(){this.collection.each(function(i){if(i.get("status")=="queued"){i.set("status","init")}});this.counter.running=0;this._updateScreen()},_eventFtp:function(){if(!this.ftp.visible){this.ftp.empty();this.ftp.append((new g(this)).$el);this.ftp.show()}else{this.ftp.hide()}},_eventCreate:function(){this.uploadbox.add([{name:"New File",size:0,mode:"new"}])},_eventStart:function(){if(this.counter.announce==0||this.counter.running>0){return}var i=this;this.upload_size=0;this.upload_completed=0;this.collection.each(function(j){if(j.get("status")=="init"){j.set("status","queued");i.upload_size+=j.get("file_size")}});this.ui_button.set("percentage",0);this.ui_button.set("status","success");this.counter.running=this.counter.announce;this._updateScreen();this.uploadbox.start()},_eventStop:function(){if(this.counter.running==0){return}this.ui_button.set("status","info");this.uploadbox.stop();$("#upload-info").html("Queue will pause after completing the current file...")},_eventReset:function(){if(this.counter.running==0){this.collection.reset();this.counter.reset();this._updateScreen();this.uploadbox.reset();this.select_extension.value(this.default_extension);this.select_genome.value(this.default_genome);this.ui_button.set("percentage",0)}},updateExtension:function(j){var i=this;this.collection.each(function(k){if(k.get("status")=="init"&&k.get("extension")==i.default_extension){k.set("extension",j)}})},updateGenome:function(i){var j=this;this.collection.each(function(k){if(k.get("status")=="init"&&k.get("genome")==j.default_genome){k.set("genome",i)}})},_updateUser:function(){this.current_user=Galaxy.currUser.get("id");this.current_history=null;if(this.current_user){this.current_history=Galaxy.currHistoryPanel.model.get("id")}},_updateScreen:function(){if(this.counter.announce==0){if(this.uploadbox.compatible()){message="You can Drag & Drop files into this box."}else{message="Unfortunately, your browser does not support multiple file uploads or drag&drop.<br>Some supported browsers are: Firefox 4+, Chrome 7+, IE 10+, Opera 12+ or Safari 6+."}}else{if(this.counter.running==0){message="You added "+this.counter.announce+" file(s) to the queue. Add more files or click 'Start' to proceed."}else{message="Please wait..."+this.counter.announce+" out of "+this.counter.running+" remaining."}}$("#upload-info").html(message);if(this.counter.running==0&&this.counter.announce+this.counter.success+this.counter.error>0){this.modal.enableButton("Reset")}else{this.modal.disableButton("Reset")}if(this.counter.running==0&&this.counter.announce>0){this.modal.enableButton("Start")}else{this.modal.disableButton("Start")}if(this.counter.running>0){this.modal.enableButton("Pause")}else{this.modal.disableButton("Pause")}if(this.counter.running==0){this.modal.enableButton("Choose local file");this.modal.enableButton("Choose FTP file");this.modal.enableButton("Paste/Fetch data")}else{this.modal.disableButton("Choose local file");this.modal.disableButton("Choose FTP file");this.modal.disableButton("Paste/Fetch data")}if(this.current_user&&this.options.ftp_upload_dir&&this.options.ftp_upload_site){this.modal.showButton("Choose FTP file")}else{this.modal.hideButton("Choose FTP file")}if(this.counter.announce+this.counter.success+this.counter.error>0){$(this.el).find("#upload-table").show()}else{$(this.el).find("#upload-table").hide()}},_uploadPercentage:function(i,j){return(this.upload_completed+(i*j))/this.upload_size},_templateDescription:function(j){if(j.description){var i=j.description;if(j.description_url){i+=' (<a href="'+j.description_url+'" target="_blank">read more</a>)'}return i}else{return"There is no description available for this file extension."}},_template:function(j,i){return'<div class="upload-top"><h6 id="'+i+'" class="upload-info"></h6></div><div id="'+j+'" class="upload-box"><table id="upload-table" class="table table-striped" style="display: none;"><thead><tr><th>Name</th><th>Size</th><th>Type</th><th>Genome</th><th>Settings</th><th>Status</th><th></th></tr></thead><tbody></tbody></table></div><div id="upload-header" class="upload-header"><span class="header-title">Type (default):</span><span id="header-extension"/><span id="header-extension-info" class="upload-icon-button fa fa-search"/><span class="header-title">Genome (default):</span><span id="header-genome"/></div>'}})});
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: martenson: start of paging; require len(search_term)>2;
by commits-noreply@bitbucket.org 29 Jan '15
by commits-noreply@bitbucket.org 29 Jan '15
29 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/e38653b24ade/
Changeset: e38653b24ade
User: martenson
Date: 2015-01-29 17:27:45+00:00
Summary: start of paging; require len(search_term)>2;
Affected #: 2 files
diff -r 18aa57e52605ca18e6f0e4d1fcfcdff53b0664fa -r e38653b24ade2d72db2ad6196f8b85780311671c lib/galaxy/webapps/tool_shed/api/search.py
--- a/lib/galaxy/webapps/tool_shed/api/search.py
+++ b/lib/galaxy/webapps/tool_shed/api/search.py
@@ -27,9 +27,14 @@
raise exceptions.ConfigDoesNotAllowException( 'Searching the TS through the API is turned off for this instance.' )
if not self.app.config.toolshed_whoosh_index_dir:
raise exceptions.ConfigDoesNotAllowException( 'There is no directory for the search index specified. Please ontact the administrator.' )
+ if len( search_term ) < 3:
+ raise exceptions.RequestParameterInvalidException( 'The search term has to be at least 3 characters long.' )
+
+ page = kwd.get( 'page', 1 )
+ callback = kwd.get( 'callback', 'callback' )
repo_search = RepoSearch()
- results = repo_search.search( trans, search_term )
+ results = repo_search.search( trans, search_term, page )
results[ 'hostname' ] = url_for( '/', qualified = True )
- response = '%s(%s);' % ( kwd.get( 'callback' ), json.dumps( results ) )
+ response = '%s(%s);' % ( callback, json.dumps( results ) )
return response
diff -r 18aa57e52605ca18e6f0e4d1fcfcdff53b0664fa -r e38653b24ade2d72db2ad6196f8b85780311671c lib/galaxy/webapps/tool_shed/search/repo_search.py
--- a/lib/galaxy/webapps/tool_shed/search/repo_search.py
+++ b/lib/galaxy/webapps/tool_shed/search/repo_search.py
@@ -73,7 +73,7 @@
class RepoSearch( object ):
- def search( self, trans, search_term, **kwd ):
+ def search( self, trans, search_term, page, **kwd ):
"""
Perform the search on the given search_term
@@ -98,7 +98,6 @@
'remote_repository_url_B' : 0.2,
'repo_owner_username' : 0.3 } )
- # log.debug(repo_weighting.__dict__)
searcher = index.searcher( weighting = repo_weighting )
parser = MultifieldParser( [
@@ -112,9 +111,8 @@
# user_query = parser.parse( search_term )
user_query = parser.parse( '*' + search_term + '*' )
- hits = searcher.search( user_query, terms = True )
- # hits = searcher.search( user_query )
- # hits = searcher.search_page( user_query, 1, pagelen = 1, terms = True )
+ # hits = searcher.search( user_query, terms = True )
+ hits = searcher.search_page( user_query, page, pagelen = 10, terms = True )
log.debug( 'searching for: #' + str( search_term ) )
log.debug( 'total hits: ' + str( len( hits ) ) )
log.debug( 'scored hits: ' + str( hits.scored_length() ) )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: guerler: Api: Redirect deprecated ftp files api
by commits-noreply@bitbucket.org 29 Jan '15
by commits-noreply@bitbucket.org 29 Jan '15
29 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/18aa57e52605/
Changeset: 18aa57e52605
User: guerler
Date: 2015-01-29 17:18:03+00:00
Summary: Api: Redirect deprecated ftp files api
Affected #: 1 file
diff -r 4fcd087ac38c5ff89e715b969de0210fd3c395e0 -r 18aa57e52605ca18e6f0e4d1fcfcdff53b0664fa lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -179,6 +179,7 @@
webapp.mapper.resource( 'form', 'forms', path_prefix='/api' )
webapp.mapper.resource( 'request_type', 'request_types', path_prefix='/api' )
webapp.mapper.resource( 'role', 'roles', path_prefix='/api' )
+ webapp.mapper.connect( '/api/ftp_files', controller='remote_files' )
webapp.mapper.resource( 'remote_file', 'remote_files', path_prefix='/api' )
webapp.mapper.resource( 'group', 'groups', path_prefix='/api' )
webapp.mapper.resource_with_deleted( 'quota', 'quotas', path_prefix='/api' )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: guerler: Api: Rename ftp_files to remote_files
by commits-noreply@bitbucket.org 29 Jan '15
by commits-noreply@bitbucket.org 29 Jan '15
29 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/4fcd087ac38c/
Changeset: 4fcd087ac38c
User: guerler
Date: 2015-01-29 16:56:56+00:00
Summary: Api: Rename ftp_files to remote_files
Affected #: 9 files
diff -r be28a5fda9ddbc05df0e545a3a85434630212433 -r 4fcd087ac38c5ff89e715b969de0210fd3c395e0 client/galaxy/scripts/mvc/library/library-model.js
--- a/client/galaxy/scripts/mvc/library/library-model.js
+++ b/client/galaxy/scripts/mvc/library/library-model.js
@@ -199,7 +199,7 @@
*/
var Jstree = Backbone.Model.extend({
- urlRoot: '/api/ftp_files'
+ urlRoot: '/api/remote_files'
});
return {
diff -r be28a5fda9ddbc05df0e545a3a85434630212433 -r 4fcd087ac38c5ff89e715b969de0210fd3c395e0 client/galaxy/scripts/mvc/upload/upload-ftp.js
--- a/client/galaxy/scripts/mvc/upload/upload-ftp.js
+++ b/client/galaxy/scripts/mvc/upload/upload-ftp.js
@@ -26,7 +26,7 @@
// load extension
Utils.get({
- url : galaxy_config.root + 'api/ftp_files',
+ url : galaxy_config.root + 'api/remote_files',
success : function(ftp_files) { self._fill(ftp_files); },
error : function() { self._fill(); }
});
diff -r be28a5fda9ddbc05df0e545a3a85434630212433 -r 4fcd087ac38c5ff89e715b969de0210fd3c395e0 lib/galaxy/webapps/galaxy/api/ftp_files.py
--- a/lib/galaxy/webapps/galaxy/api/ftp_files.py
+++ /dev/null
@@ -1,147 +0,0 @@
-"""
-API operations on remote files.
-"""
-import os
-import time
-import hashlib
-from galaxy import web
-from galaxy import exceptions
-from galaxy.web import _future_expose_api as expose_api
-from galaxy.util import jstree
-from galaxy.web.base.controller import BaseAPIController, url_for
-from operator import itemgetter
-
-import logging
-log = logging.getLogger( __name__ )
-
-class FTPFilesAPIController( BaseAPIController ):
-
- @expose_api
- def index( self, trans, **kwd ):
- """
- GET /api/ftp_files/
-
- Displays remote files.
-
- :param target: target to load available datasets from, defaults to ftp
- possible values: ftp, userdir
- :type target: str
-
- :param format: requested format of data, defaults to flat
- possible values: flat, jstree, ajax
-
- :returns: list of available files
- :rtype: list
- """
- target = kwd.get( 'target', None )
- format = kwd.get( 'format', None )
-
- if target == 'userdir':
- user_login = trans.user.email
- user_base_dir = trans.app.config.user_library_import_dir
- if user_base_dir is None:
- raise exceptions.ConfigDoesNotAllowException( 'The configuration of this Galaxy instance does not allow upload from user directories.' )
- full_import_dir = os.path.join( user_base_dir, user_login )
- if full_import_dir is not None:
- if format == 'jstree':
- disable = kwd.get( 'disable', 'folders')
- try:
- userdir_jstree = self.__create_jstree( full_import_dir, disable )
- response = userdir_jstree.jsonData()
- except Exception, exception:
- log.debug( str( exception ) )
- raise exceptions.InternalServerError( 'Could not create tree representation of the given folder: ' + str( full_import_dir ) )
- elif format == 'ajax':
- raise exceptions.NotImplemented( 'Not implemented yet. Sorry.' )
- else:
- try:
- response = self.__load_all_filenames( full_import_dir )
- except Exception, exception:
- log.error( 'Could not get user import files: %s', str( exception ), exc_info=True )
- raise exceptions.InternalServerError( 'Could not get the files from your user directory folder.' )
- else:
- raise exceptions.InternalServerError( 'Could not get the files from your user directory folder.' )
- elif target == 'importdir':
- base_dir = trans.app.config.library_import_dir
- if base_dir is None:
- raise exceptions.ConfigDoesNotAllowException( 'The configuration of this Galaxy instance does not allow usage of import directory.' )
- if format == 'jstree':
- disable = kwd.get( 'disable', 'folders')
- try:
- importdir_jstree = self.__create_jstree( base_dir, disable )
- response = importdir_jstree.jsonData()
- except Exception, exception:
- log.debug( str( exception ) )
- raise exceptions.InternalServerError( 'Could not create tree representation of the given folder: ' + str( base_dir ) )
- elif format == 'ajax':
- raise exceptions.NotImplemented( 'Not implemented yet. Sorry.' )
- else:
- try:
- response = self.__load_all_filenames( base_dir )
- except Exception, exception:
- log.error( 'Could not get user import files: %s', str( exception ), exc_info=True )
- raise exceptions.InternalServerError( 'Could not get the files from your import directory folder.' )
- else:
- user_ftp_base_dir = trans.app.config.ftp_upload_dir
- if user_ftp_base_dir is None:
- raise exceptions.ConfigDoesNotAllowException( 'The configuration of this Galaxy instance does not allow upload from FTP directories.' )
- try:
- user_ftp_dir = None
- identifier = trans.app.config.ftp_upload_dir_identifier
- user_ftp_dir = os.path.join( user_ftp_base_dir, getattr(trans.user, identifier) )
- if user_ftp_dir is not None:
- response = self.__load_all_filenames( user_ftp_dir )
- else:
- raise exceptions.ConfigDoesNotAllowException( 'You do not have an FTP directory named as your login at this Galaxy instance.' )
- except Exception, exception:
- log.error( 'Could not get ftp files: %s', str( exception ), exc_info=True )
- raise exceptions.InternalServerError( 'Could not get the files from your FTP folder.' )
- return response
-
- def __load_all_filenames( self, directory ):
- """
- Loads recursively all files within the given folder and its
- subfolders and returns a flat list.
- """
- response = []
- if os.path.exists( directory ):
- for ( dirpath, dirnames, filenames ) in os.walk( directory ):
- for filename in filenames:
- path = os.path.relpath( os.path.join( dirpath, filename ), directory )
- statinfo = os.lstat( os.path.join( dirpath, filename ) )
- response.append( dict( path = path,
- size = statinfo.st_size,
- ctime = time.strftime( "%m/%d/%Y %I:%M:%S %p", time.localtime( statinfo.st_ctime ) ) ) )
- else:
- raise exceptions.ConfigDoesNotAllowException( 'The given directory does not exist.' )
- # sort by path
- response = sorted(response, key=itemgetter("path"))
- return response
-
- def __create_jstree( self, directory, disable='folders' ):
- """
- Loads recursively all files and folders within the given folder
- and its subfolders and returns jstree representation
- of its structure.
- """
- userdir_jstree = None
- jstree_paths = []
- if os.path.exists( directory ):
- for ( dirpath, dirnames, filenames ) in os.walk( directory ):
-
- for dirname in dirnames:
- dir_path = os.path.relpath( os.path.join( dirpath, dirname ), directory )
- dir_path_hash = hashlib.sha1( dir_path ).hexdigest()
- disabled = True if disable == 'folders' else False
- jstree_paths.append( jstree.Path( dir_path, dir_path_hash, { 'type': 'folder', 'state': { 'disabled': disabled }, 'li_attr': { 'full_path': dir_path } } ) )
-
- for filename in filenames:
- file_path = os.path.relpath( os.path.join( dirpath, filename ), directory )
- file_path_hash = hashlib.sha1( file_path ).hexdigest()
- disabled = True if disable == 'files' else False
- jstree_paths.append( jstree.Path( file_path, file_path_hash, { 'type': 'file', 'state': { 'disabled': disabled }, 'li_attr': { 'full_path': file_path } } ) )
- else:
- raise exceptions.ConfigDoesNotAllowException( 'The given directory does not exist.' )
-
- userdir_jstree = jstree.JSTree( jstree_paths )
- return userdir_jstree
diff -r be28a5fda9ddbc05df0e545a3a85434630212433 -r 4fcd087ac38c5ff89e715b969de0210fd3c395e0 lib/galaxy/webapps/galaxy/api/remote_files.py
--- /dev/null
+++ b/lib/galaxy/webapps/galaxy/api/remote_files.py
@@ -0,0 +1,147 @@
+"""
+API operations on remote files.
+"""
+import os
+import time
+import hashlib
+from galaxy import web
+from galaxy import exceptions
+from galaxy.web import _future_expose_api as expose_api
+from galaxy.util import jstree
+from galaxy.web.base.controller import BaseAPIController, url_for
+from operator import itemgetter
+
+import logging
+log = logging.getLogger( __name__ )
+
+class RemoteFilesAPIController( BaseAPIController ):
+
+ @expose_api
+ def index( self, trans, **kwd ):
+ """
+ GET /api/remote_files/
+
+ Displays remote files.
+
+ :param target: target to load available datasets from, defaults to ftp
+ possible values: ftp, userdir
+ :type target: str
+
+ :param format: requested format of data, defaults to flat
+ possible values: flat, jstree, ajax
+
+ :returns: list of available files
+ :rtype: list
+ """
+ target = kwd.get( 'target', None )
+ format = kwd.get( 'format', None )
+
+ if target == 'userdir':
+ user_login = trans.user.email
+ user_base_dir = trans.app.config.user_library_import_dir
+ if user_base_dir is None:
+ raise exceptions.ConfigDoesNotAllowException( 'The configuration of this Galaxy instance does not allow upload from user directories.' )
+ full_import_dir = os.path.join( user_base_dir, user_login )
+ if full_import_dir is not None:
+ if format == 'jstree':
+ disable = kwd.get( 'disable', 'folders')
+ try:
+ userdir_jstree = self.__create_jstree( full_import_dir, disable )
+ response = userdir_jstree.jsonData()
+ except Exception, exception:
+ log.debug( str( exception ) )
+ raise exceptions.InternalServerError( 'Could not create tree representation of the given folder: ' + str( full_import_dir ) )
+ elif format == 'ajax':
+ raise exceptions.NotImplemented( 'Not implemented yet. Sorry.' )
+ else:
+ try:
+ response = self.__load_all_filenames( full_import_dir )
+ except Exception, exception:
+ log.error( 'Could not get user import files: %s', str( exception ), exc_info=True )
+ raise exceptions.InternalServerError( 'Could not get the files from your user directory folder.' )
+ else:
+ raise exceptions.InternalServerError( 'Could not get the files from your user directory folder.' )
+ elif target == 'importdir':
+ base_dir = trans.app.config.library_import_dir
+ if base_dir is None:
+ raise exceptions.ConfigDoesNotAllowException( 'The configuration of this Galaxy instance does not allow usage of import directory.' )
+ if format == 'jstree':
+ disable = kwd.get( 'disable', 'folders')
+ try:
+ importdir_jstree = self.__create_jstree( base_dir, disable )
+ response = importdir_jstree.jsonData()
+ except Exception, exception:
+ log.debug( str( exception ) )
+ raise exceptions.InternalServerError( 'Could not create tree representation of the given folder: ' + str( base_dir ) )
+ elif format == 'ajax':
+ raise exceptions.NotImplemented( 'Not implemented yet. Sorry.' )
+ else:
+ try:
+ response = self.__load_all_filenames( base_dir )
+ except Exception, exception:
+ log.error( 'Could not get user import files: %s', str( exception ), exc_info=True )
+ raise exceptions.InternalServerError( 'Could not get the files from your import directory folder.' )
+ else:
+ user_ftp_base_dir = trans.app.config.ftp_upload_dir
+ if user_ftp_base_dir is None:
+ raise exceptions.ConfigDoesNotAllowException( 'The configuration of this Galaxy instance does not allow upload from FTP directories.' )
+ try:
+ user_ftp_dir = None
+ identifier = trans.app.config.ftp_upload_dir_identifier
+ user_ftp_dir = os.path.join( user_ftp_base_dir, getattr(trans.user, identifier) )
+ if user_ftp_dir is not None:
+ response = self.__load_all_filenames( user_ftp_dir )
+ else:
+ raise exceptions.ConfigDoesNotAllowException( 'You do not have an FTP directory named as your login at this Galaxy instance.' )
+ except Exception, exception:
+ log.error( 'Could not get ftp files: %s', str( exception ), exc_info=True )
+ raise exceptions.InternalServerError( 'Could not get the files from your FTP folder.' )
+ return response
+
+ def __load_all_filenames( self, directory ):
+ """
+ Loads recursively all files within the given folder and its
+ subfolders and returns a flat list.
+ """
+ response = []
+ if os.path.exists( directory ):
+ for ( dirpath, dirnames, filenames ) in os.walk( directory ):
+ for filename in filenames:
+ path = os.path.relpath( os.path.join( dirpath, filename ), directory )
+ statinfo = os.lstat( os.path.join( dirpath, filename ) )
+ response.append( dict( path = path,
+ size = statinfo.st_size,
+ ctime = time.strftime( "%m/%d/%Y %I:%M:%S %p", time.localtime( statinfo.st_ctime ) ) ) )
+ else:
+ raise exceptions.ConfigDoesNotAllowException( 'The given directory does not exist.' )
+ # sort by path
+ response = sorted(response, key=itemgetter("path"))
+ return response
+
+ def __create_jstree( self, directory, disable='folders' ):
+ """
+ Loads recursively all files and folders within the given folder
+ and its subfolders and returns jstree representation
+ of its structure.
+ """
+ userdir_jstree = None
+ jstree_paths = []
+ if os.path.exists( directory ):
+ for ( dirpath, dirnames, filenames ) in os.walk( directory ):
+
+ for dirname in dirnames:
+ dir_path = os.path.relpath( os.path.join( dirpath, dirname ), directory )
+ dir_path_hash = hashlib.sha1( dir_path ).hexdigest()
+ disabled = True if disable == 'folders' else False
+ jstree_paths.append( jstree.Path( dir_path, dir_path_hash, { 'type': 'folder', 'state': { 'disabled': disabled }, 'li_attr': { 'full_path': dir_path } } ) )
+
+ for filename in filenames:
+ file_path = os.path.relpath( os.path.join( dirpath, filename ), directory )
+ file_path_hash = hashlib.sha1( file_path ).hexdigest()
+ disabled = True if disable == 'files' else False
+ jstree_paths.append( jstree.Path( file_path, file_path_hash, { 'type': 'file', 'state': { 'disabled': disabled }, 'li_attr': { 'full_path': file_path } } ) )
+ else:
+ raise exceptions.ConfigDoesNotAllowException( 'The given directory does not exist.' )
+
+ userdir_jstree = jstree.JSTree( jstree_paths )
+ return userdir_jstree
diff -r be28a5fda9ddbc05df0e545a3a85434630212433 -r 4fcd087ac38c5ff89e715b969de0210fd3c395e0 lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -179,7 +179,7 @@
webapp.mapper.resource( 'form', 'forms', path_prefix='/api' )
webapp.mapper.resource( 'request_type', 'request_types', path_prefix='/api' )
webapp.mapper.resource( 'role', 'roles', path_prefix='/api' )
- webapp.mapper.resource( 'ftp_file', 'ftp_files', path_prefix='/api' )
+ webapp.mapper.resource( 'remote_file', 'remote_files', path_prefix='/api' )
webapp.mapper.resource( 'group', 'groups', path_prefix='/api' )
webapp.mapper.resource_with_deleted( 'quota', 'quotas', path_prefix='/api' )
webapp.mapper.connect( '/api/tools/{id:.+?}/build', action='build', controller="tools" )
diff -r be28a5fda9ddbc05df0e545a3a85434630212433 -r 4fcd087ac38c5ff89e715b969de0210fd3c395e0 static/scripts/mvc/library/library-model.js
--- a/static/scripts/mvc/library/library-model.js
+++ b/static/scripts/mvc/library/library-model.js
@@ -199,7 +199,7 @@
*/
var Jstree = Backbone.Model.extend({
- urlRoot: '/api/ftp_files'
+ urlRoot: '/api/remote_files'
});
return {
diff -r be28a5fda9ddbc05df0e545a3a85434630212433 -r 4fcd087ac38c5ff89e715b969de0210fd3c395e0 static/scripts/mvc/upload/upload-ftp.js
--- a/static/scripts/mvc/upload/upload-ftp.js
+++ b/static/scripts/mvc/upload/upload-ftp.js
@@ -26,7 +26,7 @@
// load extension
Utils.get({
- url : galaxy_config.root + 'api/ftp_files',
+ url : galaxy_config.root + 'api/remote_files',
success : function(ftp_files) { self._fill(ftp_files); },
error : function() { self._fill(); }
});
diff -r be28a5fda9ddbc05df0e545a3a85434630212433 -r 4fcd087ac38c5ff89e715b969de0210fd3c395e0 static/scripts/packed/mvc/library/library-model.js
--- a/static/scripts/packed/mvc/library/library-model.js
+++ b/static/scripts/packed/mvc/library/library-model.js
@@ -1,1 +1,1 @@
-define([],function(){var f=Backbone.Model.extend({urlRoot:"/api/libraries/",isVisible:function(n){var m=true;if((!n)&&(this.get("deleted"))){m=false}return m}});var i=Backbone.Collection.extend({url:"/api/libraries",model:f,sort_key:"name",sort_order:null,initialize:function(m){m=m||{}},getVisible:function(n,o){o=o||[];var m=new i(this.filter(function(p){return p.isVisible(n)}));return m},sortByNameAsc:function(){this.comparator=function(n,m){if(n.get("name").toLowerCase()>m.get("name").toLowerCase()){return 1}if(m.get("name").toLowerCase()>n.get("name").toLowerCase()){return -1}return 0};this.sort();return this},sortByNameDesc:function(){this.comparator=function(n,m){if(n.get("name").toLowerCase()>m.get("name").toLowerCase()){return -1}if(m.get("name").toLowerCase()>n.get("name").toLowerCase()){return 1}return 0};this.sort();return this}});var g=Backbone.Model.extend({urlRoot:"/api/libraries/datasets/"});var l=Backbone.Model.extend({urlRoot:"/api/libraries/datasets/"});var a=Backbone.Model.extend({urlRoot:"/api/folders"});var c=Backbone.Collection.extend({model:g,sortByNameAsc:function(){this.comparator=function(n,m){if(n.get("type")===m.get("type")){if(n.get("name").toLowerCase()>m.get("name").toLowerCase()){return 1}if(m.get("name").toLowerCase()>n.get("name").toLowerCase()){return -1}return 0}else{if(n.get("type")==="folder"){return -1}else{return 1}}};this.sort();return this},sortByNameDesc:function(){this.comparator=function(n,m){if(n.get("type")===m.get("type")){if(n.get("name").toLowerCase()>m.get("name").toLowerCase()){return -1}if(m.get("name").toLowerCase()>n.get("name").toLowerCase()){return 1}return 0}else{if(n.get("type")==="folder"){return -1}else{return 1}}};this.sort();return this}});var e=Backbone.Model.extend({defaults:{folder:new c(),urlRoot:"/api/folders/",id:"unknown"},parse:function(m){this.get("folder").reset(m.folder_contents);return m}});var b=Backbone.Model.extend({urlRoot:"/api/histories/"});var d=Backbone.Collection.extend({urlRoot:"/api/histories/",initialize:function(m){this.id=m.id},url:function(){return this.urlRoot+this.id+"/contents"},model:b});var h=Backbone.Model.extend({urlRoot:"/api/histories/"});var k=Backbone.Collection.extend({url:"/api/histories",model:h});var j=Backbone.Model.extend({urlRoot:"/api/ftp_files"});return{Library:f,FolderAsModel:a,Libraries:i,Item:g,Ldda:l,Folder:c,FolderContainer:e,HistoryItem:b,HistoryContents:d,GalaxyHistory:h,GalaxyHistories:k,Jstree:j}});
\ No newline at end of file
+define([],function(){var f=Backbone.Model.extend({urlRoot:"/api/libraries/",isVisible:function(n){var m=true;if((!n)&&(this.get("deleted"))){m=false}return m}});var i=Backbone.Collection.extend({url:"/api/libraries",model:f,sort_key:"name",sort_order:null,initialize:function(m){m=m||{}},getVisible:function(n,o){o=o||[];var m=new i(this.filter(function(p){return p.isVisible(n)}));return m},sortByNameAsc:function(){this.comparator=function(n,m){if(n.get("name").toLowerCase()>m.get("name").toLowerCase()){return 1}if(m.get("name").toLowerCase()>n.get("name").toLowerCase()){return -1}return 0};this.sort();return this},sortByNameDesc:function(){this.comparator=function(n,m){if(n.get("name").toLowerCase()>m.get("name").toLowerCase()){return -1}if(m.get("name").toLowerCase()>n.get("name").toLowerCase()){return 1}return 0};this.sort();return this}});var g=Backbone.Model.extend({urlRoot:"/api/libraries/datasets/"});var l=Backbone.Model.extend({urlRoot:"/api/libraries/datasets/"});var a=Backbone.Model.extend({urlRoot:"/api/folders"});var c=Backbone.Collection.extend({model:g,sortByNameAsc:function(){this.comparator=function(n,m){if(n.get("type")===m.get("type")){if(n.get("name").toLowerCase()>m.get("name").toLowerCase()){return 1}if(m.get("name").toLowerCase()>n.get("name").toLowerCase()){return -1}return 0}else{if(n.get("type")==="folder"){return -1}else{return 1}}};this.sort();return this},sortByNameDesc:function(){this.comparator=function(n,m){if(n.get("type")===m.get("type")){if(n.get("name").toLowerCase()>m.get("name").toLowerCase()){return -1}if(m.get("name").toLowerCase()>n.get("name").toLowerCase()){return 1}return 0}else{if(n.get("type")==="folder"){return -1}else{return 1}}};this.sort();return this}});var e=Backbone.Model.extend({defaults:{folder:new c(),urlRoot:"/api/folders/",id:"unknown"},parse:function(m){this.get("folder").reset(m.folder_contents);return m}});var b=Backbone.Model.extend({urlRoot:"/api/histories/"});var d=Backbone.Collection.extend({urlRoot:"/api/histories/",initialize:function(m){this.id=m.id},url:function(){return this.urlRoot+this.id+"/contents"},model:b});var h=Backbone.Model.extend({urlRoot:"/api/histories/"});var k=Backbone.Collection.extend({url:"/api/histories",model:h});var j=Backbone.Model.extend({urlRoot:"/api/remote_files"});return{Library:f,FolderAsModel:a,Libraries:i,Item:g,Ldda:l,Folder:c,FolderContainer:e,HistoryItem:b,HistoryContents:d,GalaxyHistory:h,GalaxyHistories:k,Jstree:j}});
\ No newline at end of file
diff -r be28a5fda9ddbc05df0e545a3a85434630212433 -r 4fcd087ac38c5ff89e715b969de0210fd3c395e0 static/scripts/packed/mvc/upload/upload-ftp.js
--- a/static/scripts/packed/mvc/upload/upload-ftp.js
+++ b/static/scripts/packed/mvc/upload/upload-ftp.js
@@ -1,1 +1,1 @@
-define(["utils/utils"],function(a){return Backbone.View.extend({options:{class_add:"upload-icon-button fa fa-square-o",class_remove:"upload-icon-button fa fa-check-square-o",class_partial:"upload-icon-button fa fa-minus-square-o"},initialize:function(c){this.app=c;var b=this;this.setElement(this._template());this.rows=[];a.get({url:galaxy_config.root+"api/ftp_files",success:function(d){b._fill(d)},error:function(){b._fill()}})},events:{mousedown:function(b){b.preventDefault()}},_fill:function(d){if(d&&d.length>0){this.$el.find("#upload-ftp-content").html($(this._templateTable()));var c=0;for(key in d){this.rows.push(this._add(d[key]));c+=d[key].size}this.$el.find("#upload-ftp-number").html(d.length+" files");this.$el.find("#upload-ftp-disk").html(a.bytesToString(c,true));this.$select_all=$("#upload-selectall");this.$select_all.addClass(this.options.class_add);var b=this;this.$select_all.on("click",function(){var g=b.$select_all.hasClass(b.options.class_add);for(key in d){var f=d[key];var e=b._find(f);if(!e&&g||e&&!g){b.rows[key].trigger("click")}}});b._refresh()}else{this.$el.find("#upload-ftp-content").html($(this._templateInfo()))}this.$el.find("#upload-ftp-wait").hide()},_add:function(f){var d=this;var e=$(this._templateRow(f));var b=e.find(".icon");$(this.el).find("tbody").append(e);var c="";if(this._find(f)){c=this.options.class_remove}else{c=this.options.class_add}b.addClass(c);e.on("click",function(){var g=d._find(f);b.removeClass();if(!g){d.app.uploadbox.add([{mode:"ftp",name:f.path,size:f.size,path:f.path}]);b.addClass(d.options.class_remove)}else{d.app.collection.remove(g);b.addClass(d.options.class_add)}d._refresh()});return e},_refresh:function(){var b=this.app.collection.where({file_mode:"ftp"});this.$select_all.removeClass();if(b.length==0){this.$select_all.addClass(this.options.class_add)}else{if(b.length==this.rows.length){this.$select_all.addClass(this.options.class_remove)}else{this.$select_all.addClass(this.options.class_partial)}}},_find:function(c){var b=this.app.collection.findWhere({file_path:c.path,status:"init",file_mode:"ftp"});if(b){return b.get("id")}return null},_templateRow:function(b){return'<tr class="upload-ftp-row"><td><div class="icon"/></td><td class="label"><p>'+b.path+'</p></td><td class="nonlabel">'+a.bytesToString(b.size)+'</td><td class="nonlabel">'+b.ctime+"</td></tr>"},_templateTable:function(){return'<span style="whitespace: nowrap; float: left;">Available files: </span><span style="whitespace: nowrap; float: right;"><span class="upload-icon fa fa-file-text-o"/><span id="upload-ftp-number"/> <span class="upload-icon fa fa-hdd-o"/><span id="upload-ftp-disk"/></span><table class="grid" style="float: left;"><thead><tr><th><div id="upload-selectall"></th><th>Name</th><th>Size</th><th>Created</th></tr></thead><tbody></tbody></table>'},_templateInfo:function(){return'<div class="upload-ftp-warning warningmessage">Your FTP directory does not contain any files.</div>'},_template:function(){return'<div class="upload-ftp"><div id="upload-ftp-wait" class="upload-ftp-wait fa fa-spinner fa-spin"/><div class="upload-ftp-help">This Galaxy server allows you to upload files via FTP. To upload some files, log in to the FTP server at <strong>'+this.app.options.ftp_upload_site+'</strong> using your Galaxy credentials (email address and password).</div><div id="upload-ftp-content"></div><div>'}})});
\ No newline at end of file
+define(["utils/utils"],function(a){return Backbone.View.extend({options:{class_add:"upload-icon-button fa fa-square-o",class_remove:"upload-icon-button fa fa-check-square-o",class_partial:"upload-icon-button fa fa-minus-square-o"},initialize:function(c){this.app=c;var b=this;this.setElement(this._template());this.rows=[];a.get({url:galaxy_config.root+"api/remote_files",success:function(d){b._fill(d)},error:function(){b._fill()}})},events:{mousedown:function(b){b.preventDefault()}},_fill:function(d){if(d&&d.length>0){this.$el.find("#upload-ftp-content").html($(this._templateTable()));var c=0;for(key in d){this.rows.push(this._add(d[key]));c+=d[key].size}this.$el.find("#upload-ftp-number").html(d.length+" files");this.$el.find("#upload-ftp-disk").html(a.bytesToString(c,true));this.$select_all=$("#upload-selectall");this.$select_all.addClass(this.options.class_add);var b=this;this.$select_all.on("click",function(){var g=b.$select_all.hasClass(b.options.class_add);for(key in d){var f=d[key];var e=b._find(f);if(!e&&g||e&&!g){b.rows[key].trigger("click")}}});b._refresh()}else{this.$el.find("#upload-ftp-content").html($(this._templateInfo()))}this.$el.find("#upload-ftp-wait").hide()},_add:function(f){var d=this;var e=$(this._templateRow(f));var b=e.find(".icon");$(this.el).find("tbody").append(e);var c="";if(this._find(f)){c=this.options.class_remove}else{c=this.options.class_add}b.addClass(c);e.on("click",function(){var g=d._find(f);b.removeClass();if(!g){d.app.uploadbox.add([{mode:"ftp",name:f.path,size:f.size,path:f.path}]);b.addClass(d.options.class_remove)}else{d.app.collection.remove(g);b.addClass(d.options.class_add)}d._refresh()});return e},_refresh:function(){var b=this.app.collection.where({file_mode:"ftp"});this.$select_all.removeClass();if(b.length==0){this.$select_all.addClass(this.options.class_add)}else{if(b.length==this.rows.length){this.$select_all.addClass(this.options.class_remove)}else{this.$select_all.addClass(this.options.class_partial)}}},_find:function(c){var b=this.app.collection.findWhere({file_path:c.path,status:"init",file_mode:"ftp"});if(b){return b.get("id")}return null},_templateRow:function(b){return'<tr class="upload-ftp-row"><td><div class="icon"/></td><td class="label"><p>'+b.path+'</p></td><td class="nonlabel">'+a.bytesToString(b.size)+'</td><td class="nonlabel">'+b.ctime+"</td></tr>"},_templateTable:function(){return'<span style="whitespace: nowrap; float: left;">Available files: </span><span style="whitespace: nowrap; float: right;"><span class="upload-icon fa fa-file-text-o"/><span id="upload-ftp-number"/> <span class="upload-icon fa fa-hdd-o"/><span id="upload-ftp-disk"/></span><table class="grid" style="float: left;"><thead><tr><th><div id="upload-selectall"></th><th>Name</th><th>Size</th><th>Created</th></tr></thead><tbody></tbody></table>'},_templateInfo:function(){return'<div class="upload-ftp-warning warningmessage">Your FTP directory does not contain any files.</div>'},_template:function(){return'<div class="upload-ftp"><div id="upload-ftp-wait" class="upload-ftp-wait fa fa-spinner fa-spin"/><div class="upload-ftp-help">This Galaxy server allows you to upload files via FTP. To upload some files, log in to the FTP server at <strong>'+this.app.options.ftp_upload_site+'</strong> using your Galaxy credentials (email address and password).</div><div id="upload-ftp-content"></div><div>'}})});
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: martenson: found a known Whoosh bug, trying to avoid it
by commits-noreply@bitbucket.org 29 Jan '15
by commits-noreply@bitbucket.org 29 Jan '15
29 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/be28a5fda9dd/
Changeset: be28a5fda9dd
User: martenson
Date: 2015-01-29 16:43:29+00:00
Summary: found a known Whoosh bug, trying to avoid it
https://bitbucket.org/mchaput/whoosh/issue/386/keyerror-1l
Affected #: 2 files
diff -r e3196615d5faf9c0b713933664150e9cc1ef1e21 -r be28a5fda9ddbc05df0e545a3a85434630212433 lib/galaxy/webapps/tool_shed/search/repo_search.py
--- a/lib/galaxy/webapps/tool_shed/search/repo_search.py
+++ b/lib/galaxy/webapps/tool_shed/search/repo_search.py
@@ -49,7 +49,12 @@
# Arbitrary for now
reasonable_hits = 100.0
- times_downloaded = int( searcher.stored_fields( docnum )[ "times_downloaded" ] )
+
+ stored_times_downloaded = searcher.stored_fields( docnum )[ "times_downloaded" ]
+ if not isinstance( stored_times_downloaded, ( int, long ) ):
+ times_downloaded = int( stored_times_downloaded )
+ else:
+ times_downloaded = stored_times_downloaded
# Add 1 to prevent 0 being divided
if times_downloaded == 0:
times_downloaded = 1
diff -r e3196615d5faf9c0b713933664150e9cc1ef1e21 -r be28a5fda9ddbc05df0e545a3a85434630212433 scripts/tool_shed/build_ts_whoosh_index.py
--- a/scripts/tool_shed/build_ts_whoosh_index.py
+++ b/scripts/tool_shed/build_ts_whoosh_index.py
@@ -93,7 +93,10 @@
long_description = repo.long_description
homepage_url = repo.homepage_url
remote_repository_url = repo.remote_repository_url
+
times_downloaded = repo.times_downloaded
+ if not isinstance( times_downloaded, ( int, long ) ):
+ times_downloaded = 0
repo_owner_username = ''
if repo.user_id is not None:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: Fix to 68f0ed3: remove old import
by commits-noreply@bitbucket.org 29 Jan '15
by commits-noreply@bitbucket.org 29 Jan '15
29 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/e3196615d5fa/
Changeset: e3196615d5fa
User: carlfeberhard
Date: 2015-01-29 16:35:39+00:00
Summary: Fix to 68f0ed3: remove old import
Affected #: 1 file
diff -r 89ea937034b80e7cad24005ffb018f2b1c4f5f65 -r e3196615d5faf9c0b713933664150e9cc1ef1e21 lib/galaxy/managers/base.py
--- a/lib/galaxy/managers/base.py
+++ b/lib/galaxy/managers/base.py
@@ -32,7 +32,6 @@
from galaxy import exceptions
from galaxy import model
from galaxy.model import tool_shed_install
-from galaxy.managers import filters as filter_parser
import logging
log = logging.getLogger( __name__ )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: davebgx: Set time to epoch instead of throwing server error if repository_metadata.time_last_tested is unset.
by commits-noreply@bitbucket.org 29 Jan '15
by commits-noreply@bitbucket.org 29 Jan '15
29 Jan '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/89ea937034b8/
Changeset: 89ea937034b8
User: davebgx
Date: 2015-01-29 16:23:35+00:00
Summary: Set time to epoch instead of throwing server error if repository_metadata.time_last_tested is unset.
Affected #: 1 file
diff -r c805913c4646238890e727a5f1c203058c6413b6 -r 89ea937034b80e7cad24005ffb018f2b1c4f5f65 lib/galaxy/webapps/tool_shed/controllers/repository.py
--- a/lib/galaxy/webapps/tool_shed/controllers/repository.py
+++ b/lib/galaxy/webapps/tool_shed/controllers/repository.py
@@ -1696,7 +1696,10 @@
description_lines = []
# Per the RSS 2.0 specification, all dates in RSS feeds must be formatted as specified in RFC 822
# section 5.1, e.g. Sat, 07 Sep 2002 00:00:01 UT
- time_tested = repository_metadata.time_last_tested.strftime( '%a, %d %b %Y %H:%M:%S UT' )
+ if repository_metadata.time_last_tested is None:
+ time_tested = 'Thu, 01 Jan 1970 00:00:00 UT'
+ else:
+ time_tested = repository_metadata.time_last_tested.strftime( '%a, %d %b %Y %H:%M:%S UT' )
# Generate a citable URL for this repository with owner and changeset revision.
repository_citable_url = common_util.url_join( tool_shed_url,
'view',
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0