galaxy-dev
Threads by month
- ----- 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
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- 10007 discussions
29 Jul '09
details: http://www.bx.psu.edu/hg/galaxy/rev/0f18a77ca03e
changeset: 2507:0f18a77ca03e
user: Dan Blankenberg <dan(a)bx.psu.edu>
date: Mon Jul 27 15:55:32 2009 -0400
description:
A new flag, force_history_refresh, has been added to Tool Configurations.
When set to "True", this flag will cause the entire history to reload when one of its outputs has finished running. Default is False.
This is useful, i.e., when a tool creates an indeterminate number of output datasets by dumping them into new_file_path.
Example:
<tool id="someTool" name="Some tool name" version="1.0.1" force_history_refresh="True">
...
</tool>
3 file(s) affected in this change:
lib/galaxy/tools/__init__.py
lib/galaxy/web/controllers/root.py
templates/root/history.mako
diffs (68 lines):
diff -r ae750790079a -r 0f18a77ca03e lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py Mon Jul 27 11:33:12 2009 -0400
+++ b/lib/galaxy/tools/__init__.py Mon Jul 27 15:55:32 2009 -0400
@@ -295,6 +295,8 @@
self.is_multi_byte = util.string_as_bool( root.get( "is_multi_byte", False ) )
# Type of tool
self.tool_type = root.get( "tool_type", None )
+ #Force history to fully refresh after job execution for this tool. Useful i.e. when an indeterminate number of outputs are created by a tool.
+ self.force_history_refresh = util.string_as_bool( root.get( 'force_history_refresh', 'False' ) )
# data_source tool
if self.tool_type == "data_source":
self.URL_method = root.get( "URL_method", "get" ) # get is the default
diff -r ae750790079a -r 0f18a77ca03e lib/galaxy/web/controllers/root.py
--- a/lib/galaxy/web/controllers/root.py Mon Jul 27 11:33:12 2009 -0400
+++ b/lib/galaxy/web/controllers/root.py Mon Jul 27 15:55:32 2009 -0400
@@ -114,9 +114,16 @@
for id, state in zip( ids, states ):
data = self.app.model.HistoryDatasetAssociation.get( id )
if data.state != state:
+ job_hda = data
+ while job_hda.copied_from_history_dataset_association:
+ job_hda = job_hda.copied_from_history_dataset_association
+ force_history_refresh = False
+ if job_hda.creating_job_associations:
+ force_history_refresh = trans.app.toolbox.tools_by_id[ job_hda.creating_job_associations[ 0 ].job.tool_id ].force_history_refresh
rval[id] = {
"state": data.state,
- "html": unicode( trans.fill_template( "root/history_item.mako", data=data, hid=data.hid ), 'utf-8' )
+ "html": unicode( trans.fill_template( "root/history_item.mako", data=data, hid=data.hid ), 'utf-8' ),
+ "force_history_refresh": force_history_refresh
}
return rval
diff -r ae750790079a -r 0f18a77ca03e templates/root/history.mako
--- a/templates/root/history.mako Mon Jul 27 11:33:12 2009 -0400
+++ b/templates/root/history.mako Mon Jul 27 15:55:32 2009 -0400
@@ -186,6 +186,7 @@
// Build request data
var ids = []
var states = []
+ var force_history_refresh = false
$.each( tracked_datasets, function ( id, state ) {
ids.push( id );
states.push( state );
@@ -205,13 +206,21 @@
initShowHide();
// If new state was terminal, stop tracking
if (( val.state == "ok") || ( val.state == "error") || ( val.state == "empty") || ( val.state == "deleted" ) || ( val.state == "discarded" )) {
+ if ( val.force_history_refresh ){
+ force_history_refresh = true;
+ }
delete tracked_datasets[ parseInt(id) ];
} else {
tracked_datasets[ parseInt(id) ] = val.state;
}
});
- // Keep going (if there are still any items to track)
- updater( tracked_datasets );
+ if ( force_history_refresh ) {
+ parent.frames.galaxy_history.location.reload();
+ }
+ else {
+ // Keep going (if there are still any items to track)
+ updater( tracked_datasets );
+ }
},
error: function() {
// Just retry, like the old method, should try to be smarter
1
0
29 Jul '09
details: http://www.bx.psu.edu/hg/galaxy/rev/e01bfc281e09
changeset: 2508:e01bfc281e09
user: Nate Coraor <nate(a)bx.psu.edu>
date: Tue Jul 28 14:16:19 2009 -0400
description:
More secure 'display at' functionality - allows "private" datasets to be displayed at external sites without making them public. Here's how:
1. Replace the 'display at UCSC <site>' direct link with one back to Galaxy at /dataset/<id>/display_at/ucsc_<site>
2. When the client requests the above path, if the dataset is "private", add a record to the new history_dataset_association_display_at_authorization table.
note: DATASET_MANAGE_PERMISSIONS is required for this step. If the user doesn't have appropriate permissions, an error is displayed.
note 2: "public" datasets don't get a record since they are already readable by external sites.
3. Send the client a redirect to the appropriate external URL.
4. When the external resource requests the dataset (via /root/display_as), allow access if:
a. an associated (by hda id) record exists in the above table AND
b. the remote host matches one of the known valid servers for that <site> AND
c. it's been no longer than 60 seconds since the record was updated (e.g. the lame host authorization expires after 60 seconds)
During the 60 second window, anyone could potentially view the authorized
dataset via UCSC, but they'd have to know the ID *and* know that it was just
authorized. In the future, it'd be more secure to exchange keys with external
sites or similar strategies, but this would require modifications to these
external applications.
This new method is implemented for UCSC, other display apps will need to be
handled as well, but this should be as simple as adding those sites/servers to
the list in lib/galaxy/security/__init__.py and modifying the link generation
in the display app.
9 file(s) affected in this change:
lib/galaxy/app.py
lib/galaxy/datatypes/genetics.py
lib/galaxy/datatypes/interval.py
lib/galaxy/model/__init__.py
lib/galaxy/model/mapping.py
lib/galaxy/model/migrate/versions/0010_hda_display_at_authz_table.py
lib/galaxy/security/__init__.py
lib/galaxy/web/controllers/dataset.py
lib/galaxy/web/controllers/root.py
diffs (295 lines):
diff -r 0f18a77ca03e -r e01bfc281e09 lib/galaxy/app.py
--- a/lib/galaxy/app.py Mon Jul 27 15:55:32 2009 -0400
+++ b/lib/galaxy/app.py Tue Jul 28 14:16:19 2009 -0400
@@ -41,6 +41,7 @@
self.datatypes_registry.load_datatype_indexers( self.toolbox )
#Load security policy
self.security_agent = self.model.security_agent
+ self.host_security_agent = galaxy.security.HostAgent( model=self.security_agent.model, permitted_actions=self.security_agent.permitted_actions )
# Heartbeat and memdump for thread / heap profiling
self.heartbeat = None
self.memdump = None
diff -r 0f18a77ca03e -r e01bfc281e09 lib/galaxy/datatypes/genetics.py
--- a/lib/galaxy/datatypes/genetics.py Mon Jul 27 15:55:32 2009 -0400
+++ b/lib/galaxy/datatypes/genetics.py Tue Jul 28 14:16:19 2009 -0400
@@ -86,9 +86,10 @@
sl.append("&hgGenome_dataSetName=%s&hgGenome_dataSetDescription=%s" % (dataset.name, 'GalaxyGG_data'))
sl.append("&hgGenome_formatType=best%20guess&hgGenome_markerType=best%20guess")
sl.append("&hgGenome_columnLabels=first%20row&hgGenome_maxVal=&hgGenome_labelVals=")
- sl.append("&hgGenome_maxGapToFill=25000000&hgGenome_uploadFile=")
- s = ''.join(sl)
- link = "%s%s%s" % (s, display_url, ggtail )
+ sl.append("&hgGenome_maxGapToFill=25000000&hgGenome_uploadFile=%%s")
+ sl.append(ggtail)
+ s = urllib.quote_plus( ''.join(sl) )
+ link = '%s?redirect_url=%s&display_url=%s' % ( internal_url, s, display_url )
ret_val.append( (site_name, link) )
return ret_val
diff -r 0f18a77ca03e -r e01bfc281e09 lib/galaxy/datatypes/interval.py
--- a/lib/galaxy/datatypes/interval.py Mon Jul 27 15:55:32 2009 -0400
+++ b/lib/galaxy/datatypes/interval.py Tue Jul 28 14:16:19 2009 -0400
@@ -233,10 +233,12 @@
# if our URL scheme is https. Making this work
# requires additional hackery in your upstream proxy.
# If UCSC ever supports https, remove this hack.
+ internal_url = "%s" % url_for( controller='dataset', dataset_id=dataset.id, action='display_at', filename='ucsc_' + site_name )
if base_url.startswith( 'https://' ):
base_url = base_url.replace( 'https', 'http', 1 )
- display_url = urllib.quote_plus( "%s%s/display_as?id=%i&display_app=%s" % (base_url, url_for( controller='root' ), dataset.id, type) )
- link = "%sdb=%s&position=%s:%s-%s&hgt.customText=%s" % (site_url, dataset.dbkey, chrom, start, stop, display_url )
+ display_url = urllib.quote_plus( "%s%s/display_as?id=%i&display_app=%s&authz_method=display_at" % (base_url, url_for( controller='root' ), dataset.id, type) )
+ redirect_url = urllib.quote_plus( "%sdb=%s&position=%s:%s-%s&hgt.customText=%%s" % (site_url, dataset.dbkey, chrom, start, stop ) )
+ link = '%s?redirect_url=%s&display_url=%s' % ( internal_url, redirect_url, display_url )
ret_val.append( (site_name, link) )
return ret_val
@@ -892,8 +894,12 @@
stop = viewport_tuple[2]
for site_name, site_url in util.get_ucsc_by_build(dataset.dbkey):
if site_name in app.config.ucsc_display_sites:
- display_url = urllib.quote_plus( "%s%s/display_as?id=%i&display_app=%s" % (base_url, url_for( controller='root' ), dataset.id, type) )
- link = "%sdb=%s&position=%s:%s-%s&hgt.customText=%s" % (site_url, dataset.dbkey, chrom, start, stop, display_url )
+ internal_url = "%s" % url_for( controller='dataset', dataset_id=dataset.id, action='display_at', filename='ucsc_' + site_name )
+ if base_url.startswith( 'https://' ):
+ base_url = base_url.replace( 'https', 'http', 1 )
+ display_url = urllib.quote_plus( "%s%s/display_as?id=%i&display_app=%s&authz_method=display_at" % (base_url, url_for( controller='root' ), dataset.id, type) )
+ redirect_url = urllib.quote_plus( "%sdb=%s&position=%s:%s-%s&hgt.customText=%%s" % (site_url, dataset.dbkey, chrom, start, stop ) )
+ link = '%s?redirect_url=%s&display_url=%s' % ( internal_url, redirect_url, display_url )
ret_val.append( (site_name, link) )
return ret_val
def sniff( self, filename ):
diff -r 0f18a77ca03e -r e01bfc281e09 lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py Mon Jul 27 15:55:32 2009 -0400
+++ b/lib/galaxy/model/__init__.py Tue Jul 28 14:16:19 2009 -0400
@@ -689,6 +689,12 @@
if not metadata_safe or not assoc.metadata_safe:
assoc.clear( purge = purge )
+class HistoryDatasetAssociationDisplayAtAuthorization( object ):
+ def __init__( self, hda=None, user=None, site=None ):
+ self.history_dataset_association = hda
+ self.user = user
+ self.site = site
+
class Library( object ):
permitted_actions = get_permitted_actions( filter='LIBRARY' )
def __init__( self, name = None, description = None, root_folder = None ):
diff -r 0f18a77ca03e -r e01bfc281e09 lib/galaxy/model/mapping.py
--- a/lib/galaxy/model/mapping.py Mon Jul 27 15:55:32 2009 -0400
+++ b/lib/galaxy/model/mapping.py Tue Jul 28 14:16:19 2009 -0400
@@ -96,6 +96,14 @@
Column( "external_filename" , TEXT ),
Column( "_extra_files_path", TEXT ),
Column( 'file_size', Numeric( 15, 0 ) ) )
+
+HistoryDatasetAssociationDisplayAtAuthorization.table = Table( "history_dataset_association_display_at_authorization", metadata,
+ Column( "id", Integer, primary_key=True ),
+ Column( "create_time", DateTime, default=now ),
+ Column( "update_time", DateTime, index=True, default=now, onupdate=now ),
+ Column( "history_dataset_association_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True ),
+ Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
+ Column( "site", TrimmedString( 255 ) ) )
ImplicitlyConvertedDatasetAssociation.table = Table( "implicitly_converted_dataset_association", metadata,
Column( "id", Integer, primary_key=True ),
@@ -710,6 +718,10 @@
primaryjoin=( ( Dataset.table.c.id == LibraryDatasetDatasetAssociation.table.c.dataset_id ) & ( LibraryDatasetDatasetAssociation.table.c.deleted == False ) ) )
) )
+assign_mapper( context, HistoryDatasetAssociationDisplayAtAuthorization, HistoryDatasetAssociationDisplayAtAuthorization.table,
+ properties=dict( history_dataset_association = relation( HistoryDatasetAssociation ),
+ user = relation( User ) ) )
+
assign_mapper( context, ImplicitlyConvertedDatasetAssociation, ImplicitlyConvertedDatasetAssociation.table,
properties=dict( parent=relation(
HistoryDatasetAssociation,
diff -r 0f18a77ca03e -r e01bfc281e09 lib/galaxy/model/migrate/versions/0010_hda_display_at_authz_table.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/galaxy/model/migrate/versions/0010_hda_display_at_authz_table.py Tue Jul 28 14:16:19 2009 -0400
@@ -0,0 +1,47 @@
+from sqlalchemy import *
+from sqlalchemy.orm import *
+from sqlalchemy.exceptions import *
+from migrate import *
+from migrate.changeset import *
+
+import datetime
+now = datetime.datetime.utcnow
+
+import sys, logging
+log = logging.getLogger( __name__ )
+log.setLevel(logging.DEBUG)
+handler = logging.StreamHandler( sys.stdout )
+format = "%(name)s %(levelname)s %(asctime)s %(message)s"
+formatter = logging.Formatter( format )
+handler.setFormatter( formatter )
+log.addHandler( handler )
+
+# Need our custom types, but don't import anything else from model
+from galaxy.model.custom_types import *
+
+metadata = MetaData( migrate_engine )
+db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, transactional=False ) )
+
+HistoryDatasetAssociationDisplayAtAuthorization_table = Table( "history_dataset_association_display_at_authorization", metadata,
+ Column( "id", Integer, primary_key=True ),
+ Column( "create_time", DateTime, default=now ),
+ Column( "update_time", DateTime, index=True, default=now, onupdate=now ),
+ Column( "history_dataset_association_id", Integer, ForeignKey( "history_dataset_association.id" ), index=True ),
+ Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
+ Column( "site", TrimmedString( 255 ) ) )
+
+def upgrade():
+ # Load existing tables
+ metadata.reflect()
+ try:
+ HistoryDatasetAssociationDisplayAtAuthorization_table.create()
+ except Exception, e:
+ log.debug( "Creating history_dataset_association_display_at_authorization table failed: %s" % str( e ) )
+
+def downgrade():
+ # Load existing tables
+ metadata.reflect()
+ try:
+ HistoryDatasetAssociationDisplayAtAuthorization_table.drop()
+ except Exception, e:
+ log.debug( "Dropping history_dataset_association_display_at_authorization table failed: %s" % str( e ) )
diff -r 0f18a77ca03e -r e01bfc281e09 lib/galaxy/security/__init__.py
--- a/lib/galaxy/security/__init__.py Mon Jul 27 15:55:32 2009 -0400
+++ b/lib/galaxy/security/__init__.py Tue Jul 28 14:16:19 2009 -0400
@@ -2,7 +2,8 @@
Galaxy Security
"""
-import logging
+import logging, socket
+from datetime import datetime, timedelta
from galaxy.util.bunch import Bunch
from galaxy.model.orm import *
@@ -484,6 +485,65 @@
else:
raise 'Passed an illegal object to check_folder_contents: %s' % type( entry )
+class HostAgent( RBACAgent ):
+ """
+ A simple security agent which allows access to datasets based on host.
+ This exists so that externals sites such as UCSC can gain access to
+ datasets which have permissions which would normally prevent such access.
+ """
+ # TODO: Make sites user configurable
+ sites = Bunch(
+ ucsc_main = ( 'hgw1.cse.ucsc.edu', 'hgw2.cse.ucsc.edu', 'hgw3.cse.ucsc.edu', 'hgw4.cse.ucsc.edu',
+ 'hgw5.cse.ucsc.edu', 'hgw6.cse.ucsc.edu', 'hgw7.cse.ucsc.edu', 'hgw8.cse.ucsc.edu' ),
+ ucsc_test = ( 'hgwdev.cse.ucsc.edu', ),
+ ucsc_archaea = ( 'lowepub.cse.ucsc.edu', )
+ )
+ def __init__( self, model, permitted_actions=None ):
+ self.model = model
+ if permitted_actions:
+ self.permitted_actions = permitted_actions
+ def allow_action( self, addr, action, **kwd ):
+ if 'dataset' in kwd and action == self.permitted_actions.DATASET_ACCESS:
+ hda = kwd['dataset']
+ if action == self.permitted_actions.DATASET_ACCESS and action.action not in [ dp.action for dp in hda.dataset.actions ]:
+ log.debug( 'Allowing access to public dataset with hda: %i.' % hda.id )
+ return True # dataset has no roles associated with the access permission, thus is already public
+ hdadaa = self.model.HistoryDatasetAssociationDisplayAtAuthorization.filter_by( history_dataset_association_id = hda.id ).first()
+ if not hdadaa:
+ log.debug( 'Denying access to private dataset with hda: %i. No hdadaa record for this dataset.' % hda.id )
+ return False # no auth
+ # We could just look up the reverse of addr, but then we'd also
+ # have to verify it with the forward address and special case any
+ # IPs (instead of hosts) in the server list.
+ #
+ # This would be improved by caching, but that's what the OS's name
+ # service cache daemon is for (you ARE running nscd, right?).
+ for server in HostAgent.sites.get( hdadaa.site, [] ):
+ # We're going to search in order, but if the remote site is load
+ # balancing their connections (as UCSC does), this is okay.
+ try:
+ if socket.gethostbyname( server ) == addr:
+ break # remote host is in the server list
+ except ( socket.error, socket.gaierror ):
+ pass # can't resolve, try next
+ else:
+ log.debug( 'Denying access to private dataset with hda: %i. Remote addr is not a valid server for site: %s.' % ( hda.id, hdadaa.site ) )
+ return False # remote addr is not in the server list
+ if ( datetime.utcnow() - hdadaa.update_time ) > timedelta( seconds=60 ):
+ log.debug( 'Denying access to private dataset with hda: %i. Authorization was granted, but has expired.' % hda.id )
+ return False # not authz'd in the last 60 seconds
+ log.debug( 'Allowing access to private dataset with hda: %i. Remote server is: %s.' % ( hda.id, server ) )
+ return True
+ else:
+ raise 'The dataset access permission is the only valid permission in the host security agent.'
+ def set_dataset_permissions( self, hda, user, site ):
+ hdadaa = self.model.HistoryDatasetAssociationDisplayAtAuthorization.filter_by( history_dataset_association_id = hda.id ).first()
+ if hdadaa:
+ hdadaa.update_time = datetime.utcnow()
+ else:
+ hdadaa = self.model.HistoryDatasetAssociationDisplayAtAuthorization( hda=hda, user=user, site=site )
+ hdadaa.flush()
+
def get_permitted_actions( filter=None ):
'''Utility method to return a subset of RBACAgent's permitted actions'''
if filter is None:
diff -r 0f18a77ca03e -r e01bfc281e09 lib/galaxy/web/controllers/dataset.py
--- a/lib/galaxy/web/controllers/dataset.py Mon Jul 27 15:55:32 2009 -0400
+++ b/lib/galaxy/web/controllers/dataset.py Tue Jul 28 14:16:19 2009 -0400
@@ -1,4 +1,4 @@
-import logging, os, sets, string, shutil, re, socket, mimetypes, smtplib
+import logging, os, sets, string, shutil, re, socket, mimetypes, smtplib, urllib
from galaxy.web.base.controller import *
from galaxy import util, datatypes, jobs, web, model
@@ -132,6 +132,24 @@
else:
return trans.show_error_message( "You are not allowed to access this dataset" )
+ @web.expose
+ def display_at( self, trans, dataset_id, filename=None, **kwd ):
+ """Sets up a dataset permissions so it is viewable at an external site"""
+ site = filename
+ data = trans.app.model.HistoryDatasetAssociation.get( dataset_id )
+ if not data:
+ raise paste.httpexceptions.HTTPRequestRangeNotSatisfiable( "Invalid reference dataset id: %s." % str( dataset_id ) )
+ if 'display_url' not in kwd or 'redirect_url' not in kwd:
+ return trans.show_error_message( 'Invalid parameters specified for "display at" link, please contact a Galaxy administrator' )
+ redirect_url = kwd['redirect_url'] % urllib.quote_plus( kwd['display_url'] )
+ if trans.app.security_agent.allow_action( None, data.permitted_actions.DATASET_ACCESS, dataset = data ):
+ return trans.response.send_redirect( redirect_url ) # anon access already permitted by rbac
+ if trans.app.security_agent.allow_action( trans.user, data.permitted_actions.DATASET_MANAGE_PERMISSIONS, dataset = data ):
+ trans.app.host_security_agent.set_dataset_permissions( data, trans.user, site )
+ return trans.response.send_redirect( redirect_url )
+ else:
+ return trans.show_error_message( "You are not allowed to view this dataset at external sites. Please contact your Galaxy administrator to acquire management permissions for this dataset." )
+
def _undelete( self, trans, id ):
try:
id = int( id )
diff -r 0f18a77ca03e -r e01bfc281e09 lib/galaxy/web/controllers/root.py
--- a/lib/galaxy/web/controllers/root.py Mon Jul 27 15:55:32 2009 -0400
+++ b/lib/galaxy/web/controllers/root.py Tue Jul 28 14:16:19 2009 -0400
@@ -197,13 +197,19 @@
def display_as( self, trans, id=None, display_app=None, **kwd ):
"""Returns a file in a format that can successfully be displayed in display_app"""
data = self.app.model.HistoryDatasetAssociation.get( id )
+ authz_method = 'rbac'
+ if 'authz_method' in kwd:
+ authz_method = kwd['authz_method']
if data:
- if trans.app.security_agent.allow_action( trans.user, data.permitted_actions.DATASET_ACCESS, dataset = data ):
+ if authz_method == 'rbac' and trans.app.security_agent.allow_action( trans.user, data.permitted_actions.DATASET_ACCESS, dataset = data ):
trans.response.set_content_type( data.get_mime() )
trans.log_event( "Formatted dataset id %s for display at %s" % ( str( id ), display_app ) )
return data.as_display_type( display_app, **kwd )
+ elif authz_method == 'display_at' and trans.app.host_security_agent.allow_action( trans.request.remote_addr, data.permitted_actions.DATASET_ACCESS, dataset = data ):
+ trans.response.set_content_type( data.get_mime() )
+ return data.as_display_type( display_app, **kwd )
else:
- return "You are not privileged to access this dataset."
+ return "You are not allowed to access this dataset."
else:
return "No data with id=%d" % id
1
0
29 Jul '09
details: http://www.bx.psu.edu/hg/galaxy/rev/5a92b5877cf7
changeset: 2505:5a92b5877cf7
user: Dan Blankenberg <dan(a)bx.psu.edu>
date: Mon Jul 27 10:46:25 2009 -0400
description:
Allow for multiple optional outputs to be specified in a tool's xml file by specifying 'filter' tags. The text contents of the filter tag are evaled. If the result is False, the output will not be created. A NoneDataset object is provided in the param_dict for ease of constructing command lines.
This allows a variable number of output files to be created before the tool is run in cases when the number of outputs is static and can be determined from tool parameters.
Example of an output with filter:
<data format="txt" name="optional_output">
<filter>some_parameter_name == 'some_parameter_value'</filter>
</data>
The output dataset, optional_output, will only be created when the tool parameter 'some_parameter_name' is 'some_parameter_value'.
2 file(s) affected in this change:
lib/galaxy/tools/__init__.py
lib/galaxy/tools/actions/__init__.py
diffs (192 lines):
diff -r 857d3a8ebd3d -r 5a92b5877cf7 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py Sun Jul 26 12:08:44 2009 -0400
+++ b/lib/galaxy/tools/__init__.py Mon Jul 27 10:46:25 2009 -0400
@@ -235,12 +235,13 @@
(format, metadata_source, parent)
"""
def __init__( self, name, format=None, metadata_source=None,
- parent=None, label=None ):
+ parent=None, label=None, filters = None ):
self.name = name
self.format = format
self.metadata_source = metadata_source
self.parent = parent
self.label = label
+ self.filters = filters or []
# Tuple emulation
@@ -413,6 +414,7 @@
output.metadata_source = data_elem.get("metadata_source", "")
output.parent = data_elem.get("parent", None)
output.label = util.xml_text( data_elem, "label" )
+ output.filters = data_elem.findall( 'filter' )
self.outputs[ output.name ] = output
# Any extra generated config files for the tool
self.config_files = []
@@ -1294,6 +1296,10 @@
param_dict[name].files_path = os.path.abspath(os.path.join( job_working_directory, "dataset_%s_files" % (hda.dataset.id) ))
for child in hda.children:
param_dict[ "_CHILD___%s___%s" % ( name, child.designation ) ] = DatasetFilenameWrapper( child )
+ for out_name, output in self.outputs.iteritems():
+ if out_name not in param_dict and output.filters:
+ #assume the reason we lack this output is because a filter failed to pass; for tool writing convienence, provide a NoneDataset
+ param_dict[ out_name ] = NoneDataset( datatypes_registry = self.app.datatypes_registry, ext = output.format )
# We add access to app here, this allows access to app.config, etc
param_dict['__app__'] = RawObjectWrapper( self.app )
# More convienent access to app.config.new_file_path; we don't need to wrap a string
diff -r 857d3a8ebd3d -r 5a92b5877cf7 lib/galaxy/tools/actions/__init__.py
--- a/lib/galaxy/tools/actions/__init__.py Sun Jul 26 12:08:44 2009 -0400
+++ b/lib/galaxy/tools/actions/__init__.py Mon Jul 27 10:46:25 2009 -0400
@@ -156,76 +156,83 @@
parent_to_child_pairs = []
child_dataset_names = set()
for name, output in tool.outputs.items():
- if output.parent:
- parent_to_child_pairs.append( ( output.parent, name ) )
- child_dataset_names.add( name )
- ## What is the following hack for? Need to document under what
- ## conditions can the following occur? (james(a)bx.psu.edu)
- # HACK: the output data has already been created
- # this happens i.e. as a result of the async controller
- if name in incoming:
- dataid = incoming[name]
- data = trans.app.model.HistoryDatasetAssociation.get( dataid )
- assert data != None
- out_data[name] = data
- else:
- # the type should match the input
- ext = output.format
- if ext == "input":
- ext = input_ext
- #process change_format tags
- if output.change_format:
- for change_elem in output.change_format:
- for when_elem in change_elem.findall( 'when' ):
- check = incoming.get( when_elem.get( 'input' ), None )
- if check is not None:
- if check == when_elem.get( 'value', None ):
- ext = when_elem.get( 'format', ext )
- else:
- check = when_elem.get( 'input_dataset', None )
+ for filter in output.filters:
+ try:
+ if not eval( filter.text, globals(), incoming ):
+ break #do not create this dataset
+ except Exception, e:
+ log.debug( 'Dataset output filter failed: %s' % e )
+ else: #all filters passed
+ if output.parent:
+ parent_to_child_pairs.append( ( output.parent, name ) )
+ child_dataset_names.add( name )
+ ## What is the following hack for? Need to document under what
+ ## conditions can the following occur? (james(a)bx.psu.edu)
+ # HACK: the output data has already been created
+ # this happens i.e. as a result of the async controller
+ if name in incoming:
+ dataid = incoming[name]
+ data = trans.app.model.HistoryDatasetAssociation.get( dataid )
+ assert data != None
+ out_data[name] = data
+ else:
+ # the type should match the input
+ ext = output.format
+ if ext == "input":
+ ext = input_ext
+ #process change_format tags
+ if output.change_format:
+ for change_elem in output.change_format:
+ for when_elem in change_elem.findall( 'when' ):
+ check = incoming.get( when_elem.get( 'input' ), None )
if check is not None:
- check = inp_data.get( check, None )
+ if check == when_elem.get( 'value', None ):
+ ext = when_elem.get( 'format', ext )
+ else:
+ check = when_elem.get( 'input_dataset', None )
if check is not None:
- if str( getattr( check, when_elem.get( 'attribute' ) ) ) == when_elem.get( 'value', None ):
- ext = when_elem.get( 'format', ext )
- data = trans.app.model.HistoryDatasetAssociation( extension=ext, create_dataset=True )
- # Commit the dataset immediately so it gets database assigned unique id
- data.flush()
- trans.app.security_agent.set_all_dataset_permissions( data.dataset, output_permissions )
- # Create an empty file immediately
- open( data.file_name, "w" ).close()
- # This may not be neccesary with the new parent/child associations
- data.designation = name
- # Copy metadata from one of the inputs if requested.
- if output.metadata_source:
- data.init_meta( copy_from=inp_data[output.metadata_source] )
- else:
- data.init_meta()
- # Take dbkey from LAST input
- data.dbkey = str(input_dbkey)
- # Set state
- # FIXME: shouldn't this be NEW until the job runner changes it?
- data.state = data.states.QUEUED
- data.blurb = "queued"
- # Set output label
- if output.label:
- params = make_dict_copy( incoming )
- # wrapping the params allows the tool config to contain things like
- # <outputs>
- # <data format="input" name="output" label="Blat on ${<input_param>.name}" />
- # </outputs>
- wrap_values( tool.inputs, params )
- params['tool'] = tool
- params['on_string'] = on_text
- data.name = fill_template( output.label, context=params )
- else:
- data.name = tool.name
- if on_text:
- data.name += ( " on " + on_text )
- # Store output
- out_data[ name ] = data
- # Store all changes to database
- trans.app.model.flush()
+ check = inp_data.get( check, None )
+ if check is not None:
+ if str( getattr( check, when_elem.get( 'attribute' ) ) ) == when_elem.get( 'value', None ):
+ ext = when_elem.get( 'format', ext )
+ data = trans.app.model.HistoryDatasetAssociation( extension=ext, create_dataset=True )
+ # Commit the dataset immediately so it gets database assigned unique id
+ data.flush()
+ trans.app.security_agent.set_all_dataset_permissions( data.dataset, output_permissions )
+ # Create an empty file immediately
+ open( data.file_name, "w" ).close()
+ # This may not be neccesary with the new parent/child associations
+ data.designation = name
+ # Copy metadata from one of the inputs if requested.
+ if output.metadata_source:
+ data.init_meta( copy_from=inp_data[output.metadata_source] )
+ else:
+ data.init_meta()
+ # Take dbkey from LAST input
+ data.dbkey = str(input_dbkey)
+ # Set state
+ # FIXME: shouldn't this be NEW until the job runner changes it?
+ data.state = data.states.QUEUED
+ data.blurb = "queued"
+ # Set output label
+ if output.label:
+ params = make_dict_copy( incoming )
+ # wrapping the params allows the tool config to contain things like
+ # <outputs>
+ # <data format="input" name="output" label="Blat on ${<input_param>.name}" />
+ # </outputs>
+ wrap_values( tool.inputs, params )
+ params['tool'] = tool
+ params['on_string'] = on_text
+ data.name = fill_template( output.label, context=params )
+ else:
+ data.name = tool.name
+ if on_text:
+ data.name += ( " on " + on_text )
+ # Store output
+ out_data[ name ] = data
+ # Store all changes to database
+ trans.app.model.flush()
# Add all the top-level (non-child) datasets to the history
for name in out_data.keys():
if name not in child_dataset_names and name not in incoming: #don't add children; or already existing datasets, i.e. async created
1
0
29 Jul '09
details: http://www.bx.psu.edu/hg/galaxy/rev/cbdd394a265c
changeset: 2503:cbdd394a265c
user: Kelly Vincent <kpvincent(a)bx.psu.edu>
date: Fri Jul 24 17:06:12 2009 -0400
description:
Removed option to select indexing algorithm from BWA wrapper and have it automatically determine the algorithm by file size.
2 file(s) affected in this change:
tools/sr_mapping/bwa_wrapper.py
tools/sr_mapping/bwa_wrapper.xml
diffs (76 lines):
diff -r 472bc69143be -r cbdd394a265c tools/sr_mapping/bwa_wrapper.py
--- a/tools/sr_mapping/bwa_wrapper.py Fri Jul 24 16:39:48 2009 -0400
+++ b/tools/sr_mapping/bwa_wrapper.py Fri Jul 24 17:06:12 2009 -0400
@@ -17,7 +17,6 @@
#Parse Command Line
parser = optparse.OptionParser()
parser.add_option('', '--ref', dest='ref', help='The reference genome to use or index')
- parser.add_option('', '--indexingAlg', dest='indexingAlg', help='The algorithm to use while indexing')
parser.add_option('', '--fastq', dest='fastq', help='The (forward) fastq file to use for the mapping')
parser.add_option('', '--rfastq', dest='rfastq', help='The reverse fastq file to use for mapping if paired-end data')
parser.add_option('', '--output', dest='output', help='The file to save the output (SAM format)')
@@ -53,10 +52,18 @@
os.system('cp %s %s' % (options.ref, tmp_dir))
except Exception, erf:
stop_err('Error creating temp directory for indexing purposes\n' + str(erf))
+ try:
+ size = os.stat(options.ref).st_size
+ if size <= 2**30:
+ indexingAlg = 'is'
+ else:
+ indexingAlg = 'bwtsw'
+ except:
+ indexingAlg = 'is'
if options.fileType == 'solid':
- indexing_cmds = '-c -a %s' % options.indexingAlg
+ indexing_cmds = '-c -a %s' % indexingAlg
else:
- indexing_cmds = '-a %s' % options.indexingAlg
+ indexing_cmds = '-a %s' % indexingAlg
options.ref = os.path.join(tmp_dir,os.path.split(options.ref)[1])
cmd1 = 'bwa index %s %s 2> /dev/null' % (indexing_cmds, options.ref)
try:
diff -r 472bc69143be -r cbdd394a265c tools/sr_mapping/bwa_wrapper.xml
--- a/tools/sr_mapping/bwa_wrapper.xml Fri Jul 24 16:39:48 2009 -0400
+++ b/tools/sr_mapping/bwa_wrapper.xml Fri Jul 24 17:06:12 2009 -0400
@@ -4,10 +4,8 @@
bwa_wrapper.py
#if $solidOrSolexa.solidRefGenomeSource.refGenomeSource == "history":
--ref=$solidOrSolexa.solidRefGenomeSource.ownFile
- --indexingAlg=$solidOrSolexa.solidRefGenomeSource.algorithm
#else:
--ref=$solidOrSolexa.solidRefGenomeSource.indices.value
- --indexingAlg="None"
#end if
--fastq=$paired.input1
#if $paired.sPaired == "paired":
@@ -74,10 +72,6 @@
</param>
<when value="history">
<param name="ownFile" type="data" label="Select a reference genome" />
- <param name="algorithm" type="select" label="Select an indexing algorithm" help="IS works on databses 2GB or less, and is linear-time. BWT-SW works on database 10MB and larger, and trades speed for memory.">
- <option value="is">IS</option>
- <option value="bwtsw">BWT-SW</option>
- </param>
</when>
<when value="indexed">
<param name="indices" type="select" label="Select a reference genome">
@@ -98,10 +92,6 @@
</param>
<when value="history">
<param name="ownFile" type="data" label="Select a reference genome" />
- <param name="algorithm" type="select" label="Select an indexing algorithm" help="IS works on databses 2GB or less, and is linear-time. BWT-SW works on database 10MB and larger, and trades speed for memory.">
- <option value="is">IS</option>
- <option value="bwtsw">BWT-SW</option>
- </param>
</when>
<when value="indexed">
<param name="indices" type="select" label="Select a reference genome">
@@ -177,7 +167,6 @@
<param name="solidSolexa" value="solid" />
<param name="refGenomeSource" value="history" />
<param name="ownFile" value="phiX.fa" />
- <param name="algorithm" value="is" />
<param name="sPaired" value="single" />
<param name="input1" value="bwa_phiX_sanger.fastq" />
<param name="source_select" value="pre_set" />
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/472bc69143be
changeset: 2502:472bc69143be
user: James Taylor <james(a)jamestaylor.org>
date: Fri Jul 24 16:39:48 2009 -0400
description:
Force browsers to recache the CSS
3 file(s) affected in this change:
lib/galaxy/web/framework/helpers/__init__.py
templates/base.mako
templates/base_panels.mako
diffs (66 lines):
diff -r 0d7a8525da9e -r 472bc69143be lib/galaxy/web/framework/helpers/__init__.py
--- a/lib/galaxy/web/framework/helpers/__init__.py Fri Jul 24 16:26:32 2009 -0400
+++ b/lib/galaxy/web/framework/helpers/__init__.py Fri Jul 24 16:39:48 2009 -0400
@@ -19,9 +19,12 @@
def css( *args ):
"""
Take a list of stylesheet names (no extension) and return appropriate string
- of link tags.
+ of link tags.
+
+ TODO: This has a hardcoded "?v=1" to defeat caching. This should be done
+ in a better way.
"""
- return "\n".join( [ stylesheet_link_tag( "/static/style/" + name + ".css" ) for name in args ] )
+ return "\n".join( [ stylesheet_link_tag( "/static/style/" + name + ".css?v=1" ) for name in args ] )
def js( *args ):
"""
diff -r 0d7a8525da9e -r 472bc69143be templates/base.mako
--- a/templates/base.mako Fri Jul 24 16:26:32 2009 -0400
+++ b/templates/base.mako Fri Jul 24 16:39:48 2009 -0400
@@ -19,7 +19,7 @@
## Default stylesheets
<%def name="stylesheets()">
- <link href="${h.url_for('/static/style/base.css')}" rel="stylesheet" type="text/css" />
+ ${h.css('base')}
</%def>
## Default javascripts
diff -r 0d7a8525da9e -r 472bc69143be templates/base_panels.mako
--- a/templates/base_panels.mako Fri Jul 24 16:26:32 2009 -0400
+++ b/templates/base_panels.mako Fri Jul 24 16:39:48 2009 -0400
@@ -20,8 +20,7 @@
## Default stylesheets
<%def name="stylesheets()">
- ## <link rel="stylesheet" type="text/css" href="${h.url_for('/static/style/reset.css')}" />
- <link rel="stylesheet" type="text/css" href="${h.url_for('/static/style/panel_layout.css')}" />
+ ${h.css('panel_layout')}
<style type="text/css">
#center {
%if not self.has_left_panel:
@@ -43,8 +42,7 @@
## Default javascripts
<%def name="javascripts()">
<!--[if lt IE 7]>
- <script type='text/javascript' src="/static/scripts/IE7.js"> </script>
- <script type='text/javascript' src="/static/scripts/ie7-recalc.js"> </script>
+ ${h.js( 'IE7', 'ie7-recalc' )}
<![endif]-->
</%def>
@@ -52,11 +50,7 @@
<%def name="late_javascripts()">
## Scripts can be loaded later since they progressively add features to
## the panels, but do not change layout
- <script type="text/javascript" src="${h.url_for('/static/scripts/jquery.js')}"></script>
- <script type="text/javascript" src="${h.url_for('/static/scripts/jquery.event.drag.js')}"></script>
- <script type="text/javascript" src="${h.url_for('/static/scripts/jquery.event.hover.js')}"></script>
- <script type="text/javascript" src="${h.url_for('/static/scripts/jquery.form.js')}"></script>
- <script type="text/javascript" src="${h.url_for('/static/scripts/galaxy.panels.js')}"></script>
+ ${h.js( 'jquery', 'jquery.event.drag', 'jquery.event.hover', 'jquery.form', 'galaxy.panels' )}
<script type="text/javascript">
ensure_dd_helper();
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/857d3a8ebd3d
changeset: 2504:857d3a8ebd3d
user: James Taylor <james(a)jamestaylor.org>
date: Sun Jul 26 12:08:44 2009 -0400
description:
Fix problem with history icons repeating
3 file(s) affected in this change:
static/june_2007_style/blue/history.css
static/june_2007_style/history.css.tmpl
templates/root/history_common.mako
diffs (132 lines):
diff -r cbdd394a265c -r 857d3a8ebd3d static/june_2007_style/blue/history.css
--- a/static/june_2007_style/blue/history.css Fri Jul 24 17:06:12 2009 -0400
+++ b/static/june_2007_style/blue/history.css Sun Jul 26 12:08:44 2009 -0400
@@ -2,22 +2,23 @@
a{color:#303030;}
div.historyLinks{padding:5px;margin:5px 0 5px 0;}
div.historyItem{margin:5px -5px 5px 0px;padding:5px 11px 5px 5px;border:solid #888888 1px;border-left:solid #888888 5px;border-right:none;background:#EEEEEE;}
-div.historyItem div.historyItemTitleBar{padding-left:20px;background-position:0 1px;background-repeat:no-repeat;}
+div.historyItem .state-icon{display:inline-block;vertical-align:middle;width:16px;height:16px;background-position:0 1px;background-repeat:no-repeat;}
+div.historyItem .historyItemTitle{line-height:16px;}
div.historyItem div.historyItem{margin-right:-11px;}
div.historyItem-ok{border-color:#66AA66;background:#CCFFCC;}
-div.historyItem-ok div.historyItemTitleBar{padding-left:0;}
+div.historyItem-ok .state-icon{display:none;}
div.historyItem-error{border-color:#AA6666;background:#FFCCCC;}
-div.historyItem-error div.historyItemTitleBar{background:url(history-states.png) no-repeat 0px -0px;}
+div.historyItem-error .state-icon{background:url(history-states.png) no-repeat 0px -0px;}
div.historyItem-empty{border-color:#AA6666;background:#FFCCCC;}
-div.historyItem-empty div.historyItemTitleBar{background:url(history-states.png) no-repeat 0px -25px;}
+div.historyItem-empty .state-icon{background:url(history-states.png) no-repeat 0px -25px;}
div.historyItem-running{border-color:#AAAA66;background:#FFFFCC;}
-div.historyItem-running div.historyItemTitleBar{background-image:url(data_running.gif);}
+div.historyItem-running .state-icon{background-image:url(data_running.gif);}
div.historyItem-upload{border-color:#6666AA;background:#CCCCFF;}
-div.historyItem-upload div.historyItemTitleBar{background-image:url(data_upload.gif);}
+div.historyItem-upload .state-icon{background-image:url(data_upload.gif);}
div.historyItem-queued{background:#EEEEEE;}
-div.historyItem-queued div.historyItemTitleBar{background:url(history-states.png) no-repeat 0px -50px;}
+div.historyItem-queued .state-icon{background:url(history-states.png) no-repeat 0px -50px;}
div.historyItem-noPermission{filter:alpha(opacity=60);-moz-opacity:.60;opacity:.60;}
-div.historyItemTitleBar.spinner{background:url(data_running.gif) 0 1px no-repeat !important;padding-left:20px !important;}
+div.historyItemTitleBar.spinner .state-icon{background:url(data_running.gif) 0 1px no-repeat !important;}
div.historyItemButtons{float:right;}
.icon-button{width:16px;height:16px;display:block;float:left;margin-left:2px;text-indent:20px;}
.icon-button.display{background:url(history-buttons.png) no-repeat 0px -0px;}
diff -r cbdd394a265c -r 857d3a8ebd3d static/june_2007_style/history.css.tmpl
--- a/static/june_2007_style/history.css.tmpl Fri Jul 24 17:06:12 2009 -0400
+++ b/static/june_2007_style/history.css.tmpl Sun Jul 26 12:08:44 2009 -0400
@@ -27,10 +27,16 @@
border-left: solid $history_queued_border 5px;
border-right: none;
background: $history_queued_bg;
- div.historyItemTitleBar {
- padding-left: 20px;
+ .state-icon {
+ display: inline-block;
+ vertical-align: middle;
+ width: 16px;
+ height: 16px;
background-position: 0 1px;
background-repeat: no-repeat;
+ }
+ .historyItemTitle {
+ line-height: 16px;
}
}
@@ -43,14 +49,14 @@
div.historyItem-ok {
border-color: $history_ok_border;
background: $history_ok_bg;
- div.historyItemTitleBar {
- padding-left: 0;
+ .state-icon {
+ display: none;
}
}
div.historyItem-error {
border-color: $history_error_border;
background: $history_error_bg;
- div.historyItemTitleBar {
+ .state-icon {
-sprite-group: history-states;
-sprite-image: data_error.png;
}
@@ -59,7 +65,7 @@
div.historyItem-empty {
border-color: $history_error_border;
background: $history_error_bg;
- div.historyItemTitleBar {
+ .state-icon {
-sprite-group: history-states;
-sprite-image: data_empty.png;
}
@@ -68,7 +74,7 @@
div.historyItem-running {
border-color: $history_running_border;
background: $history_running_bg;
- div.historyItemTitleBar {
+ .state-icon {
background-image: url(data_running.gif);
}
}
@@ -76,14 +82,14 @@
div.historyItem-upload {
border-color: $history_upload_border;
background: $history_upload_bg;
- div.historyItemTitleBar {
+ .state-icon {
background-image: url(data_upload.gif);
}
}
div.historyItem-queued {
background: $history_queued_bg;
- div.historyItemTitleBar {
+ .state-icon {
-sprite-group: history-states;
-sprite-image: data_queued.png;
}
@@ -96,9 +102,8 @@
}
## Special case for showing the spinner but not changing the background
-div.historyItemTitleBar.spinner {
+div.historyItemTitleBar.spinner .state-icon {
background: url(data_running.gif) 0 1px no-repeat !important;
- padding-left: 20px !important;
}
## Buttons
diff -r cbdd394a265c -r 857d3a8ebd3d templates/root/history_common.mako
--- a/templates/root/history_common.mako Fri Jul 24 17:06:12 2009 -0400
+++ b/templates/root/history_common.mako Sun Jul 26 12:08:44 2009 -0400
@@ -34,6 +34,7 @@
%endif
<a class="icon-button delete" title="delete" href="${h.url_for( action='delete', id=data.id, show_deleted_on_refresh=show_deleted_on_refresh )}" id="historyItemDeleter-${data.id}"></a>
</div>
+ <span class="state-icon"></span>
<span class="historyItemTitle"><b>${hid}: ${data.display_name()}</b></span>
</div>
1
0
29 Jul '09
details: http://www.bx.psu.edu/hg/galaxy/rev/3d4d44d7a275
changeset: 2500:3d4d44d7a275
user: James Taylor <james(a)jamestaylor.org>
date: Fri Jul 24 16:14:46 2009 -0400
description:
New (custom) CSS processor, supports nested rules, background sprites, selector mixins, et cetera. Some styles have been updated to use this. History images now use sprites. All images have been optomized with advpng and optipng.
53 file(s) affected in this change:
lib/galaxy/web/framework/__init__.py
lib/galaxy/web/framework/helpers/__init__.py
static/june_2007_style/base.css.tmpl
static/june_2007_style/blue/base.css
static/june_2007_style/blue/base_bg.png
static/june_2007_style/blue/button_bar_bg_light.png
static/june_2007_style/blue/data_empty.png
static/june_2007_style/blue/data_error.png
static/june_2007_style/blue/data_ok.png
static/june_2007_style/blue/data_queued.png
static/june_2007_style/blue/done_message_icon.png
static/june_2007_style/blue/error_large.png
static/june_2007_style/blue/error_message_icon.png
static/june_2007_style/blue/error_small.png
static/june_2007_style/blue/footer_title_bg.png
static/june_2007_style/blue/form_body_bg.png
static/june_2007_style/blue/gray_bg.png
static/june_2007_style/blue/hgrad.png
static/june_2007_style/blue/hgrad_over.png
static/june_2007_style/blue/history.css
static/june_2007_style/blue/info_large.png
static/june_2007_style/blue/info_message_icon.png
static/june_2007_style/blue/info_small.png
static/june_2007_style/blue/iphone.css
static/june_2007_style/blue/layout_callout_top.png
static/june_2007_style/blue/library.css
static/june_2007_style/blue/masthead.css
static/june_2007_style/blue/masthead_bg.png
static/june_2007_style/blue/ok_large.png
static/june_2007_style/blue/ok_small.png
static/june_2007_style/blue/panel_header_bg.png
static/june_2007_style/blue/panel_layout.css
static/june_2007_style/blue/popupmenu_callout_top.png
static/june_2007_style/blue/reset.css
static/june_2007_style/blue/tiny_arror_right.png
static/june_2007_style/blue/tiny_arrow_left.png
static/june_2007_style/blue/tiny_arrow_right.png
static/june_2007_style/blue/tool_menu.css
static/june_2007_style/blue/wait_large.png
static/june_2007_style/blue/wait_small.png
static/june_2007_style/blue/warn_large.png
static/june_2007_style/blue/warn_message_icon.png
static/june_2007_style/blue/warn_small.png
static/june_2007_style/blue/workflow_circle_drag.png
static/june_2007_style/blue/workflow_circle_green.png
static/june_2007_style/blue/workflow_circle_open.png
static/june_2007_style/history.css.tmpl
static/june_2007_style/make_style.py
static/june_2007_style/panel_layout.css.tmpl
static/june_2007_style/process_css.py
templates/base_panels.mako
templates/root/history.mako
templates/root/history_common.mako
diffs (1437 lines):
diff -r 0564441c5043 -r 3d4d44d7a275 lib/galaxy/web/framework/__init__.py
--- a/lib/galaxy/web/framework/__init__.py Fri Jul 24 15:13:11 2009 -0400
+++ b/lib/galaxy/web/framework/__init__.py Fri Jul 24 16:14:46 2009 -0400
@@ -14,8 +14,7 @@
pkg_resources.require( "simplejson" )
import simplejson
-pkg_resources.require( "WebHelpers" )
-import webhelpers
+import helpers
pkg_resources.require( "PasteDeploy" )
from paste.deploy.converters import asbool
@@ -567,19 +566,19 @@
return self.fill_template_mako( filename, **kwargs )
else:
template = Template( file=os.path.join(self.app.config.template_path, filename),
- searchList=[kwargs, self.template_context, dict(caller=self, t=self, h=webhelpers, util=util, request=self.request, response=self.response, app=self.app)] )
+ searchList=[kwargs, self.template_context, dict(caller=self, t=self, h=helpers, util=util, request=self.request, response=self.response, app=self.app)] )
return str( template )
def fill_template_mako( self, filename, **kwargs ):
template = self.webapp.mako_template_lookup.get_template( filename )
template.output_encoding = 'utf-8'
- data = dict( caller=self, t=self, trans=self, h=webhelpers, util=util, request=self.request, response=self.response, app=self.app )
+ data = dict( caller=self, t=self, trans=self, h=helpers, util=util, request=self.request, response=self.response, app=self.app )
data.update( self.template_context )
data.update( kwargs )
return template.render( **data )
def stream_template_mako( self, filename, **kwargs ):
template = self.webapp.mako_template_lookup.get_template( filename )
template.output_encoding = 'utf-8'
- data = dict( caller=self, t=self, trans=self, h=webhelpers, util=util, request=self.request, response=self.response, app=self.app )
+ data = dict( caller=self, t=self, trans=self, h=helpers, util=util, request=self.request, response=self.response, app=self.app )
data.update( self.template_context )
data.update( kwargs )
## return template.render( **data )
diff -r 0564441c5043 -r 3d4d44d7a275 lib/galaxy/web/framework/helpers/__init__.py
--- a/lib/galaxy/web/framework/helpers/__init__.py Fri Jul 24 15:13:11 2009 -0400
+++ b/lib/galaxy/web/framework/helpers/__init__.py Fri Jul 24 16:14:46 2009 -0400
@@ -1,3 +1,6 @@
+import pkg_resources
+
+pkg_resources.require( "WebHelpers" )
from webhelpers import *
from datetime import datetime
@@ -9,4 +12,20 @@
if a:
return b
else:
- return c
\ No newline at end of file
+ return c
+
+# Quick helpers for static content
+
+def css( *args ):
+ """
+ Take a list of stylesheet names (no extension) and return appropriate string
+ of link tags.
+ """
+ return "\n".join( [ stylesheet_link_tag( "/static/style/" + name + ".css" ) for name in args ] )
+
+def js( *args ):
+ """
+ Take a list of javascript names (no extension) and return appropriate
+ string of script tags.
+ """
+ return "\n".join( [ javascript_include_tag( "/static/scripts/" + name + ".js" ) for name in args ] )
\ No newline at end of file
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/base.css.tmpl
--- a/static/june_2007_style/base.css.tmpl Fri Jul 24 15:13:11 2009 -0400
+++ b/static/june_2007_style/base.css.tmpl Fri Jul 24 16:14:46 2009 -0400
@@ -1,8 +1,9 @@
-@import url( "reset.css" );
+## Font settings from YUI + verdana
+body{font:13px/1.231 verdana,arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}select,input,button,textarea,button{font:99% verdana,arial,helvetica,clean,sans-serif;}table{font-size:inherit;font:100%;}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;}
+body{font-size:75%;}
body
{
- font: 75% verdana, "Bitstream Vera Sans", geneva, arial, helvetica, helve, sans-serif;
background: $base_bg_bottom;
color: $base_text;
background-image: url(base_bg.png);
@@ -590,7 +591,7 @@
font-size: 80%;
cursor: pointer;
text-decoration: none;
- color: #555
+ color: #555;
}
.popup-arrow:hover {
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/base.css
--- a/static/june_2007_style/blue/base.css Fri Jul 24 15:13:11 2009 -0400
+++ b/static/june_2007_style/blue/base.css Fri Jul 24 16:14:46 2009 -0400
@@ -1,1 +1,101 @@
-@import url("reset.css");body{font:75% verdana,"Bitstream Vera Sans",geneva,arial,helvetica,helve,sans-serif;background:#FFF;color:#303030;background-image:url(base_bg.png);background-repeat:repeat-x;background-position:top;margin:10px;}img{border:0;}a:link,a:visited,a:active{color:#303030;}h1,h2,h3,h4{color:#023858;}hr{border:none;height:0;border-bottom:dotted #303030 1px;}div.toolForm{border:solid #d8b365 1px;}div.toolFormTitle{font-weight:bold;padding:5px;padding-left:10px;padding-right:10px;background:#d2c099;background-image:url(form_title_bg.png);background-repeat:repeat-x;background-position:top;border-bottom:solid #d8b365 1px;}div.toolParamHelp{color:#666;}div.toolParamHelp a{color:#666;}div.toolFormBody{background:#FFF;background-image:url(form_body_bg.png);background-repeat:repeat-x;background-position:top;padding:5px 0;}div.toolFormBody div.toolFormTitle{background:transparent;border:none;font-weight:bold;border-bottom:solid #d8b365 1px;margin-bottom:5px;}div.tool
FormDisabled div.toolFormTitle{background:#eee;border-color:#999;}div.toolFormDisabled{border-color:#999;}div.toolHelpBody{width:100%;overflow:auto;}div.titleRow{font-weight:bold;border-bottom:dotted gray 1px;margin-bottom:.5em;padding-bottom:.25em;}div.form{border:solid #d8b365 1px;}div.form-title{font-weight:bold;padding:5px 10px;background:#d2c099;background-image:url(form_title_bg.png);background-repeat:repeat-x;background-position:top;border-bottom:solid #d8b365 1px;}div.form-body{padding:5px 0;}div.form-row{padding:5px 10px;}div.form-title-row{padding:5px 10px;}div.repeat-group-item{border-left:solid #d8b365 5px;margin-left:10px;margin-bottom:10px;}div.form-row-error{background:#FCC;}div.form-row label{font-weight:bold;display:block;margin-bottom:.2em;}div.form-row-input{float:left;width:300px;}div.form-row-input>input{max-width:300px;}div.form-row-error-message{width:300px;float:left;color:red;font-weight:bold;padding:3px 0 0 1em;}select,input,textarea{font:inherit;fo
nt-size:115%;}select,textarea,input[type="text"],input[type="file"],input[type="password"]{-webkit-box-sizing:border-box;max-width:300px;}.errormessage,.warningmessage,.donemessage,.infomessage,.welcomeBlue,.welcomeRed,.screencastBox,.yellowbox,.redbox,.bluebox,.greenbox{padding:10px;padding-left:52px;min-height:32px;border:1px solid #A66;background-color:#FCC;background-image:url(error_message_icon.png);background-repeat:no-repeat;background-position:10px 10px;}.warningmessage{background-image:url(warn_message_icon.png);border-color:#AA6;background-color:#FFC;}.donemessage{background-image:url(done_message_icon.png);border-color:#6A6;background-color:#CFC;}.infomessage{background-image:url(info_message_icon.png);border-color:#66A;background-color:#CCF;}.welcomeBlue{padding-left:10px;border-color:#66A;background-color:#CCF;background-image:none;}.welcomeRed{padding-left:10px;border-color:#A66;background-color:#FCC;background-image:none;}.screencastBox{padding-left:10px;borde
r-color:#AA6;background-color:#FFC;background-image:none;}.redbox{border:none;padding:10px;border-color:#000;background-color:#F66;background-image:none;border-right-width:1px;border-right-style:dotted;border-bottom-width:1px;border-bottom-style:dotted;margin-top:5px;min-height:32px;}.yellowbox{border:none;padding:10px;border-color:#000;background-color:#FC0;background-image:none;border-right-width:1px;border-right-style:dotted;border-bottom-width:1px;border-bottom-style:dotted;margin-top:5px;min-height:32px;}.bluebox{border:none;padding:10px;border-color:#000;background-color:#66F;background-image:none;border-right-width:1px;border-right-style:dotted;border-bottom-width:1px;border-bottom-style:dotted;margin-top:5px;color:#FFF;min-height:32px;}.greenbox{border:none;padding:10px;border-color:#000;background-color:#0C0;background-image:none;border-right-width:1px;border-right-style:dotted;border-bottom-width:1px;border-bottom-style:dotted;margin-top:5px;min-height:32px;}.redbo
x li,.yellowbox li,.bluebox li,.greenbox li{list-style:disc;text-transform:none;list-style-position:inside;list-style-image:none;margin:3px;}.errormessagesmall,.warningmessagesmall,.donemessagesmall,.infomessagesmall{padding:5px;padding-left:25px;min-height:25px;border:1px solid #A66;background-color:#FCC;background-image:url(error_small.png);background-repeat:no-repeat;background-position:5px 5px;}.warningmessagesmall{background-image:url(warn_small.png);border-color:#AA6;background-color:#FFC;}.donemessagesmall{background-image:url(ok_small.png);border-color:#6A6;background-color:#CFC;}.infomessagesmall{background-image:url(info_small.png);border-color:#66A;background-color:#CCF;}.errormark,.warningmark,.donemark,.infomark,.ok_bgr,.err_bgr{padding-left:20px;min-height:15px;background:url(error_small.png) no-repeat;}.warningmark{background-image:url(warn_small.png);}.donemark{background-image:url(ok_small.png);}.infomark,.ok_bgr{background-image:url(info_small.png);}table.c
olored{border-top:solid #d8b365 1px;border-bottom:solid #d8b365 1px;}table.colored td,table.colored th{text-align:left;padding:5px;}table.colored tr.header{background:#ebd9b2;background-image:url(form_title_bg.png);background-repeat:repeat-x;background-position:top;border-bottom:solid #d8b365 1px;font-weight:bold;}table.colored tr{background:white;}table.colored tr.odd_row{background:#DADFEF;}div.debug{margin:10px;padding:5px;background:#FF9;border:solid #FF3 1px;color:black;}div.odd_row{background:#DADFEF;}#footer{display:none;}td.panel-body{background:white;color:#303030;background:#C1C9E5 url(menu_bg.png) top repeat-x;}div.toolSectionPad{margin:0;padding:0;height:5px;font-size:0;}div.toolSectionDetailsInner{margin-left:5px;margin-right:5px;}div.toolSectionTitle{padding-bottom:0;font-weight:bold;}div.toolTitle{padding-top:5px;padding-bottom:5px;margin-left:16px;margin-right:10px;display:list-item;list-style:square outside;}span.toolParameterExpandableCollapsable{font-weigh
t:bold;cursor:pointer;}ul.toolParameterExpandableCollapsable{list-style:none;}ul.manage-table-actions{float:right;margin-top:-2.5em;}ul.manage-table-actions li{display:block;float:left;margin-left:.5em;}.state-color-queued{border-color:#888;background:#EEE;}.state-color-ok{border-color:#6A6;background:#CFC;}.state-color-error{border-color:#A66;background:#FCC;}.state-color-running{border-color:#AA6;background:#FFC;}.state-fg-queued{color:#888;}.state-fg-ok{color:#6A6;}.state-fg-running{color:#AA6;}.state-fg-error{color:#A66;}.action-button{background:#eee;color:#333;text-decoration:none;font-size:95%;font-weight:bold;display:inline-block;cursor:pointer;padding:2px;border:solid #aaa 1px;padding-right:.5em;padding-left:.5em;-moz-border-radius:.5em;-webkit-border-radius:.5em;border-radius:.5em;user-select:none;-moz-user-select:none;-webkit-user-select:none;}.action-button>*{vertical-align:middle;}.action-button:hover{color:black;background:#ddd;}.action-button:active{color:whit
e;background:#aaa;}div.popupmenu{display:none;background:#eee;color:#333;font-size:110%;font-weight:bold;font-style:normal;white-space:nowrap;position:absolute;z-index:20000;border:solid #aaa 1px;padding:3px 0;-moz-border-radius:.5em;-webkit-border-radius:.5em;border-radius:.5em;user-select:none;-moz-user-select:none;-webkit-user-select:none;}div.popupmenu-item{padding:3px 1em;cursor:pointer;}div.popupmenu-item:hover{background:#aaa;}.popup-arrow{font-size:80%;cursor:pointer;text-decoration:none;color:#555;}.popup-arrow:hover{color:black;}div.permissionContainer{padding-left:20px;}.grid-header{padding-bottom:1em;}.grid-header h2{margin:0;margin-bottom:.5em;}.grid-header .title{font-weight:bold;}.grid{padding-top:1em;border-collapse:collapse;width:100%;}.grid tbody td{border-top:solid #DDD 1px;border-bottom:solid #DDD 1px;padding:.5em 1em;}.grid tbody td:empty{padding:0;}.grid thead th{background:#ebd9b2;background-image:url(form_title_bg.png);background-repeat:repeat-x;backg
round-position:top;border-top:solid #d8b365 1px;border-bottom:solid #d8b365 1px;padding:.5em 1em;text-align:left;}.grid tfoot td{background-color:#F8F8F8;border-top:solid #DDD 1px;border-bottom:solid #DDD 1px;padding:.5em 1em;}.grid .current{background-color:#EEF;}
\ No newline at end of file
+body{font:13px/1.231 verdana,arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}
+select,input,button,textarea,button{font:99% verdana,arial,helvetica,clean,sans-serif;}
+table{font-size:inherit;font:100%;}
+pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;}
+body{font-size:75%;}
+body{background:#FFFFFF;color:#303030;background-image:url(base_bg.png);background-repeat:repeat-x;background-position:top;margin:10px;}
+img{border:0;}
+a:link,a:visited,a:active{color:#303030;}
+h1,h2,h3,h4{color:#023858;}
+hr{border:none;height:0px;border-bottom:dotted #303030 1px;}
+div.toolForm{border:solid #d8b365 1px;}
+div.toolFormTitle{font-weight:bold;padding:5px;padding-left:10px;padding-right:10px;background:#d2c099;background-image:url(form_title_bg.png);background-repeat:repeat-x;background-position:top;border-bottom:solid #d8b365 1px;}
+div.toolParamHelp{color:#666;}
+div.toolParamHelp a{color:#666;}
+div.toolFormBody{background:#FFFFFF;background-image:url(form_body_bg.png);background-repeat:repeat-x;background-position:top;padding:5px 0;}
+div.toolFormBody div.toolFormTitle{background:transparent;border:none;font-weight:bold;border-bottom:solid #d8b365 1px;margin-bottom:5px;}
+div.toolFormDisabled div.toolFormTitle{background:#eee;border-color:#999;}
+div.toolFormDisabled{border-color:#999;}
+div.toolHelp{}
+div.toolHelpBody{width:100%;overflow:auto;}
+div.titleRow{font-weight:bold;border-bottom:dotted gray 1px;margin-bottom:0.5em;padding-bottom:0.25em;}
+div.form{border:solid #d8b365 1px;}
+div.form-title{font-weight:bold;padding:5px 10px;background:#d2c099;background-image:url(form_title_bg.png);background-repeat:repeat-x;background-position:top;border-bottom:solid #d8b365 1px;}
+div.form-body{padding:5px 0;}
+div.form-row{padding:5px 10px;}
+div.form-title-row{padding:5px 10px;}
+div.repeat-group-item{border-left:solid #d8b365 5px;margin-left:10px;margin-bottom:10px;}
+div.form-row-error{background:#FFCCCC;}
+div.form-row label{font-weight:bold;display:block;margin-bottom:.2em;}
+div.form-row-input{float:left;width:300px;}
+div.form-row-input > input{max-width:300px;}
+div.form-row-error-message{width:300px;float:left;color:red;font-weight:bold;padding:3px 0 0 1em;}
+select,input,textarea{font:inherit;font-size:115%;}
+select,textarea,input[type="text"],input[type="file"],input[type="password"]{-webkit-box-sizing:border-box;max-width:300px;}
+.errormessage,.warningmessage,.donemessage,.infomessage,.welcomeBlue,.welcomeRed,.screencastBox,.yellowbox,.redbox,.bluebox,.greenbox{padding:10px;padding-left:52px;min-height:32px;border:1px solid #AA6666;background-color:#FFCCCC;background-image:url(error_message_icon.png);background-repeat:no-repeat;background-position:10px 10px;}
+.warningmessage{background-image:url(warn_message_icon.png);border-color:#AAAA66;background-color:#FFFFCC;}
+.donemessage{background-image:url(done_message_icon.png);border-color:#66AA66;background-color:#CCFFCC;}
+.infomessage{background-image:url(info_message_icon.png);border-color:#6666AA;background-color:#CCCCFF;}
+.welcomeBlue{padding-left:10px;border-color:#6666AA;background-color:#CCCCFF;background-image:none;}
+.welcomeRed{padding-left:10px;border-color:#AA6666;background-color:#FFCCCC;background-image:none;}
+.screencastBox{padding-left:10px;border-color:#AAAA66;background-color:#FFFFCC;background-image:none;}
+.redbox{border:none;padding:10px;border-color:#000000;background-color:#FF6666;background-image:none;border-right-width:1px;border-right-style:dotted;border-bottom-width:1px;border-bottom-style:dotted;margin-top:5px;min-height:32px;}
+.yellowbox{border:none;padding:10px;border-color:#000000;background-color:#FFCC00;background-image:none;border-right-width:1px;border-right-style:dotted;border-bottom-width:1px;border-bottom-style:dotted;margin-top:5px;min-height:32px;}
+.bluebox{border:none;padding:10px;border-color:#000000;background-color:#6666FF;background-image:none;border-right-width:1px;border-right-style:dotted;border-bottom-width:1px;border-bottom-style:dotted;margin-top:5px;color:#FFFFFF;min-height:32px;}
+.greenbox{border:none;padding:10px;border-color:#000000;background-color:#00CC00;background-image:none;border-right-width:1px;border-right-style:dotted;border-bottom-width:1px;border-bottom-style:dotted;margin-top:5px;min-height:32px;}
+.redbox li,.yellowbox li,.bluebox li,.greenbox li{list-style:disc;text-transform:none;list-style-position:inside;list-style-image:none;margin:3px;}
+.errormessagesmall,.warningmessagesmall,.donemessagesmall,.infomessagesmall{padding:5px;padding-left:25px;min-height:25px;border:1px solid #AA6666;background-color:#FFCCCC;background-image:url(error_small.png);background-repeat:no-repeat;background-position:5px 5px;}
+.warningmessagesmall{background-image:url(warn_small.png);border-color:#AAAA66;background-color:#FFFFCC;}
+.donemessagesmall{background-image:url(ok_small.png);border-color:#66AA66;background-color:#CCFFCC;}
+.infomessagesmall{background-image:url(info_small.png);border-color:#6666AA;background-color:#CCCCFF;}
+.errormark,.warningmark,.donemark,.infomark,.ok_bgr,.err_bgr{padding-left:20px;min-height:15px;background:url(error_small.png) no-repeat;}
+.warningmark{background-image:url(warn_small.png);}
+.donemark{background-image:url(ok_small.png);}
+.infomark,.ok_bgr{background-image:url(info_small.png);}
+table.colored{border-top:solid #d8b365 1px;border-bottom:solid #d8b365 1px;}
+table.colored td,table.colored th{text-align:left;padding:5px;}
+table.colored tr.header{background:#ebd9b2;background-image:url(form_title_bg.png);background-repeat:repeat-x;background-position:top;border-bottom:solid #d8b365 1px;font-weight:bold;}
+table.colored tr{background:white;}
+table.colored tr.odd_row{background:#DADFEF;}
+div.debug{margin:10px;padding:5px;background:#FFFF99;border:solid #FFFF33 1px;color:black;}
+div.odd_row{background:#DADFEF;}
+#footer{display:none;}
+td.panel-body{background:white;color:#303030;background:#C1C9E5 url(menu_bg.png) top repeat-x;}
+div.toolSectionPad{margin:0;padding:0;height:5px;font-size:0px;}
+div.toolSectionDetailsInner{margin-left:5px;margin-right:5px;}
+div.toolSectionTitle{padding-bottom:0px;font-weight:bold;}
+div.toolTitle{padding-top:5px;padding-bottom:5px;margin-left:16px;margin-right:10px;display:list-item;list-style:square outside;}
+span.toolParameterExpandableCollapsable{font-weight:bold;cursor:pointer;}
+ul.toolParameterExpandableCollapsable{list-style:none;}
+ul.manage-table-actions{float:right;margin-top:-2.5em;}
+ul.manage-table-actions li{display:block;float:left;margin-left:0.5em;}
+.state-color-queued{border-color:#888888;background:#EEEEEE;}
+.state-color-ok{border-color:#66AA66;background:#CCFFCC;}
+.state-color-error{border-color:#AA6666;background:#FFCCCC;}
+.state-color-running{border-color:#AAAA66;background:#FFFFCC;}
+.state-fg-queued{color:#888888;}
+.state-fg-ok{color:#66AA66;}
+.state-fg-running{color:#AAAA66;}
+.state-fg-error{color:#AA6666;}
+.action-button{background:#eeeeee;color:#333;text-decoration:none;font-size:95%;font-weight:bold;display:inline-block;cursor:pointer;padding:2px;border:solid #aaaaaa 1px;padding-right:0.5em;padding-left:0.5em;-moz-border-radius:0.5em;-webkit-border-radius:0.5em;border-radius:0.5em;user-select:none;-moz-user-select:none;-webkit-user-select:none;}
+.action-button > *{vertical-align:middle;}
+.action-button:hover{color:black;background:#dddddd;}
+.action-button:active{color:white;background:#aaaaaa;}
+div.popupmenu{display:none;background:#eeeeee;color:#333;font-size:110%;font-weight:bold;font-style:normal;white-space:nowrap;position:absolute;z-index:20000;border:solid #aaaaaa 1px;padding:3px 0;-moz-border-radius:0.5em;-webkit-border-radius:0.5em;border-radius:0.5em;user-select:none;-moz-user-select:none;-webkit-user-select:none;}
+div.popupmenu-item{padding:3px 1em;cursor:pointer;}
+div.popupmenu-item:hover{background:#aaaaaa;}
+.popup-arrow{font-size:80%;cursor:pointer;text-decoration:none;color:#555
+}
+
+.popup-arrow:hover {
+ color: black;}
+div.permissionContainer{padding-left:20px;}
+.grid-header{padding-bottom:1em;}
+.grid-header h2{margin:0;margin-bottom:0.5em;}
+.grid-header .title{font-weight:bold;}
+.grid{padding-top:1em;border-collapse:collapse;width:100%;}
+.grid tbody td{border-top:solid #DDDDDD 1px;border-bottom:solid #DDDDDD 1px;padding:0.5em 1em;}
+.grid tbody td:empty{padding:0;}
+.grid thead th{background:#ebd9b2;background-image:url(form_title_bg.png);background-repeat:repeat-x;background-position:top;border-top:solid #d8b365 1px;border-bottom:solid #d8b365 1px;padding:0.5em 1em;text-align:left;}
+.grid tfoot td{background-color:#F8F8F8;border-top:solid #DDDDDD 1px;border-bottom:solid #DDDDDD 1px;padding:0.5em 1em;}
+.grid .current{background-color:#EEEEFF;}
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/base_bg.png
Binary file static/june_2007_style/blue/base_bg.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/button_bar_bg_light.png
Binary file static/june_2007_style/blue/button_bar_bg_light.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/data_empty.png
Binary file static/june_2007_style/blue/data_empty.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/data_error.png
Binary file static/june_2007_style/blue/data_error.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/data_ok.png
Binary file static/june_2007_style/blue/data_ok.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/data_queued.png
Binary file static/june_2007_style/blue/data_queued.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/done_message_icon.png
Binary file static/june_2007_style/blue/done_message_icon.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/error_large.png
Binary file static/june_2007_style/blue/error_large.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/error_message_icon.png
Binary file static/june_2007_style/blue/error_message_icon.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/error_small.png
Binary file static/june_2007_style/blue/error_small.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/footer_title_bg.png
Binary file static/june_2007_style/blue/footer_title_bg.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/form_body_bg.png
Binary file static/june_2007_style/blue/form_body_bg.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/gray_bg.png
Binary file static/june_2007_style/blue/gray_bg.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/hgrad.png
Binary file static/june_2007_style/blue/hgrad.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/hgrad_over.png
Binary file static/june_2007_style/blue/hgrad_over.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/history.css
--- a/static/june_2007_style/blue/history.css Fri Jul 24 15:13:11 2009 -0400
+++ b/static/june_2007_style/blue/history.css Fri Jul 24 16:14:46 2009 -0400
@@ -1,1 +1,31 @@
-body{background:#C1C9E5;color:#303030;background-image:url(menu_bg.png);background-repeat:repeat-x;background-position:top;margin:5px;border:0;padding:0;}a{color:#base_text;}div.historyLinks{padding:5px;margin-top:5px;margin-bottom:5px;padding-right:5px;padding-left:5px;margin-bottom:5px;}div.historyItem{margin-right:-5px;margin-top:5px;margin-bottom:5px;padding:5px;padding-right:11px;border:solid #888 1px;border-left:solid #888 5px;border-right:none;background:#EEE;background-image:url(gray_bg.png);background-repeat:repeat-x;background-position:top;}div.historyItem div.historyItem{margin-right:-11px;}div.historyItem-ok{border-color:#6A6;background:#CFC;}div.historyItem-error,div.historyItem-empty{border-color:#A66;background:#FCC;}div.historyItem-running{border-color:#AA6;background:#FFC;}div.historyItem-upload{border-color:#66A;background:#CCF;}div.historyItem-noPermission{filter:alpha(opacity=60);-moz-opacity:.60;opacity:.60;}div.historyItemBody div{padding-top:2px;}pre.p
eek{background:white;color:black;width:100%;overflow:auto;}pre.peek th{color:white;background:#023858;}
\ No newline at end of file
+body{background:#C1C9E5;color:#303030;background-image:url(menu_bg.png);background-repeat:repeat-x;background-position:top;margin:5px;border:0;padding:0;}
+a{color:#base_text;}
+div.historyLinks{padding:5px;margin:5px 0 5px 0;}
+div.historyItem{margin:5px -5px 5px 0px;padding:5px 11px 5px 5px;border:solid #888888 1px;border-left:solid #888888 5px;border-right:none;background:#EEEEEE;}
+div.historyItem div.historyItemTitleBar{padding-left:20px;background-position:0 1px;background-repeat:no-repeat;}
+div.historyItem div.historyItem{margin-right:-11px;}
+div.historyItem-ok{border-color:#66AA66;background:#CCFFCC;}
+div.historyItem-ok div.historyItemTitleBar{padding-left:0;}
+div.historyItem-error{border-color:#AA6666;background:#FFCCCC;}
+div.historyItem-error div.historyItemTitleBar{background:url(history-states.png) no-repeat 0px -0px;}
+div.historyItem-empty{border-color:#AA6666;background:#FFCCCC;}
+div.historyItem-empty div.historyItemTitleBar{background:url(history-states.png) no-repeat 0px -25px;}
+div.historyItem-running{border-color:#AAAA66;background:#FFFFCC;}
+div.historyItem-running div.historyItemTitleBar{background-image:url(data_running.gif);}
+div.historyItem-upload{border-color:#6666AA;background:#CCCCFF;}
+div.historyItem-upload div.historyItemTitleBar{background-image:url(data_upload.gif);}
+div.historyItem-queued{background:#EEEEEE;}
+div.historyItem-queued div.historyItemTitleBar{background:url(history-states.png) no-repeat 0px -50px;}
+div.historyItem-noPermission{filter:alpha(opacity=60);-moz-opacity:.60;opacity:.60;}
+div.historyItemTitleBar.spinner{background:url(data_running.gif) 0 1px no-repeat !important;padding-left:20px !important;}
+div.historyItemButtons{float:right;}
+.icon-button{width:16px;height:16px;display:block;float:left;margin-left:2px;text-indent:20px;}
+.icon-button.display{background:url(history-buttons.png) no-repeat 0px -0px;}
+.icon-button.display:hover{background:url(history-buttons.png) no-repeat 0px -26px;}
+.icon-button.edit{background:url(history-buttons.png) no-repeat 0px -52px;}
+.icon-button.edit:hover{background:url(history-buttons.png) no-repeat 0px -78px;}
+.icon-button.delete{background:url(history-buttons.png) no-repeat 0px -104px;}
+.icon-button.delete:hover{background:url(history-buttons.png) no-repeat 0px -130px;}
+div.historyItemBody div{padding-top:2px;}
+pre.peek{background:white;color:black;width:100%;overflow:auto;}
+pre.peek th{color:white;background:#023858;}
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/info_large.png
Binary file static/june_2007_style/blue/info_large.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/info_message_icon.png
Binary file static/june_2007_style/blue/info_message_icon.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/info_small.png
Binary file static/june_2007_style/blue/info_small.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/iphone.css
--- a/static/june_2007_style/blue/iphone.css Fri Jul 24 15:13:11 2009 -0400
+++ b/static/june_2007_style/blue/iphone.css Fri Jul 24 16:14:46 2009 -0400
@@ -1,1 +1,54 @@
-body{margin:0;font-family:Helvetica;background:#FFF;color:#000;overflow-x:hidden;-webkit-user-select:none;-webkit-text-size-adjust:none;}body>*:not(.toolbar){display:none;position:absolute;margin:0;padding:0;left:0;width:100%;min-height:372px;}body[orient="landscape"]>*:not(.toolbar){min-height:268px;}body>*[selected="true"]{display:block;}a[selected],a:active{background-color:#194fdb!important;background-image:url(../iui/listArrowSel.png),url(../iui/selection.png)!important;background-repeat:no-repeat,repeat-x;background-position:right center,left top;color:#FFF!important;}a[selected="progress"]{background-image:url(../iui/loading.gif),url(../iui/selection.png)!important;}body>.toolbar{position:relative;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border-bottom:1px solid #2d3642;padding:10px;height:45px;background:url(../iui/toolbar.png) #6d84a2 repeat-x;}.toolbar>h1{position:absolute;overflow:hidden;left:50%;margin:1px 0 0 -75px;height:45p
x;font-size:20px;width:150px;font-weight:bold;text-shadow:rgba(0,0,0,0.4) 0 -1px 0;text-align:center;text-overflow:ellipsis;white-space:nowrap;color:#FFF;}body[orient="landscape"]>.toolbar>h1{margin-left:-125px;width:250px;}body>.toolbar.masthead{background:#2C3143 repeat-x;}body>.toolbar.masthead>h1{left:0;margin-left:0;width:100%;}.button{position:absolute;overflow:hidden;top:8px;right:6px;margin:0;border-width:0 5px;padding:0 3px;width:auto;height:30px;line-height:30px;font-family:inherit;font-size:12px;font-weight:bold;color:#FFF;text-shadow:rgba(0,0,0,0.6) 0 -1px 0;text-overflow:ellipsis;text-decoration:none;white-space:nowrap;background:none;-webkit-border-image:url(../iui/toolButton.png) 0 5 0 5;}.blueButton{-webkit-border-image:url(../iui/blueButton.png) 0 5 0 5;border-width:0 5px;}.leftButton{left:6px;right:auto;}#backButton{display:none;left:6px;right:auto;padding:0;max-width:55px;border-width:0 8px 0 14px;-webkit-border-image:url(../iui/backButton.png) 0 8 0 14;}.
whiteButton,.grayButton{display:block;border-width:0 12px;padding:10px;text-align:center;font-size:20px;font-weight:bold;text-decoration:inherit;color:inherit;}.whiteButton{-webkit-border-image:url(../iui/whiteButton.png) 0 12 0 12;text-shadow:rgba(255,255,255,0.7) 0 1px 0;}.grayButton{-webkit-border-image:url(../iui/grayButton.png) 0 12 0 12;color:#FFF;}body>ul>li{position:relative;margin:0;border-bottom:1px solid #E0E0E0;padding:8px 0 8px 10px;font-size:20px;font-weight:bold;list-style:none;}body>ul>li.group{position:relative;top:-1px;margin-bottom:-2px;border-top:1px solid #7d7d7d;border-bottom:1px solid #999;padding:1px 10px;background:url(../iui/listGroup.png) repeat-x;font-size:17px;font-weight:bold;text-shadow:rgba(0,0,0,0.4) 0 1px 0;color:#FFF;}body>ul>li.group:first-child{top:0;border-top:none;}body>ul>li>a{display:block;margin:-8px 0 -8px -10px;padding:8px 32px 8px 10px;text-decoration:none;color:inherit;background:url(../iui/listArrow.png) no-repeat right center;}
a[target="_replace"]{box-sizing:border-box;-webkit-box-sizing:border-box;padding-top:25px;padding-bottom:25px;font-size:18px;color:cornflowerblue;background-color:#FFF;background-image:none;}body>.dialog{top:0;width:100%;min-height:417px;z-index:2;background:rgba(0,0,0,0.8);padding:0;text-align:right;}.dialog>fieldset{box-sizing:border-box;-webkit-box-sizing:border-box;width:100%;margin:0;border:none;border-top:1px solid #6d84a2;padding:10px 6px;background:url(../iui/toolbar.png) #7388a5 repeat-x;}.dialog>fieldset>h1{margin:0 10px 0 10px;padding:0;font-size:20px;font-weight:bold;color:#FFF;text-shadow:rgba(0,0,0,0.4) 0 -1px 0;text-align:center;}.dialog>fieldset>label{position:absolute;margin:16px 0 0 6px;font-size:14px;color:#999;}input:not(input[type|=radio]):not(input[type|=checkbox]){box-sizing:border-box;-webkit-box-sizing:border-box;width:100%;margin:8px 0 0 0;padding:6px 6px 6px 44px;font-size:16px;font-weight:normal;}body>.panel{box-sizing:border-box;-moz-box-sizing:b
order-box;-webkit-box-sizing:border-box;padding:10px;background:#c8c8c8 url(../iui/pinstripes.png);}.panel>fieldset{position:relative;margin:0 0 20px 0;padding:0;background:#FFF;-webkit-border-radius:10px;-moz-border-radius:10px;border:1px solid #999;text-align:right;font-size:16px;}.row{position:relative;min-height:42px;border-bottom:1px solid #999;-webkit-border-radius:0;text-align:right;overflow:hidden;text-overflow:ellipsis;}fieldset>.row:last-child{border-bottom:none!important;}.row>input:not(input[type|=radio]):not(input[type|=checkbox]){box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;margin:0;border:none;padding:12px 10px 0 110px;height:42px;background:none;}.row>input[type|=radio],.row>input[type|=checkbox]{margin:7px 7px 0 0;height:25px;width:25px;}.row>label{position:absolute;margin:0 0 0 14px;line-height:42px;font-weight:bold;}.row>a{font-weight:bold;text-align:left;display:block;padding:8px 32px 8px 14px;text-decoration:none;color:i
nherit;background:url(../iui/listArrow.png) no-repeat right center;}.row>.error{height:25px;text-align:left;font-size:14px;padding:0 0 0 110px;color:red;}.row>span{position:absolute;padding:12px 10px 0 110px;margin:0;}.row>.toggle{position:absolute;top:6px;right:6px;width:100px;height:28px;}.toggle{border:1px solid #888;-webkit-border-radius:6px;background:#FFF url(../iui/toggle.png) repeat-x;font-size:19px;font-weight:bold;line-height:30px;}.toggle[toggled="true"]{border:1px solid #143fae;background:#194fdb url(../iui/toggleOn.png) repeat-x;}.toggleOn{display:none;position:absolute;width:60px;text-align:center;left:0;top:0;color:#FFF;text-shadow:rgba(0,0,0,0.4) 0 -1px 0;}.toggleOff{position:absolute;width:60px;text-align:center;right:0;top:0;color:#666;}.toggle[toggled="true"]>.toggleOn{display:block;}.toggle[toggled="true"]>.toggleOff{display:none;}.thumb{position:absolute;top:-1px;left:-1px;width:40px;height:28px;border:1px solid #888;-webkit-border-radius:6px;background:
#fff url(../iui/thumb.png) repeat-x;}.toggle[toggled="true"]>.thumb{left:auto;right:-1px;}.panel>h2{margin:0 0 8px 14px;font-size:inherit;font-weight:bold;color:#4d4d70;text-shadow:rgba(255,255,255,0.75) 2px 2px 0;}#preloader{display:none;background-image:url(loading.gif),url(selection.png),url(blueButton.png),url(listArrowSel.png),url(listGroup.png);}.state-color-queued{background:#EEE;}.state-color-ok{background:#CFC;}.state-color-error{background:#FCC;}.state-color-running{background:#FFC;}
\ No newline at end of file
+body{margin:0;font-family:Helvetica;background:#FFFFFF;color:#000000;overflow-x:hidden;-webkit-user-select:none;-webkit-text-size-adjust:none;}
+body > *:not(.toolbar){display:none;position:absolute;margin:0;padding:0;left:0;width:100%;min-height:372px;}
+body[orient="landscape"] > *:not(.toolbar){min-height:268px;}
+body > *[selected="true"]{display:block;}
+a[selected],a:active{background-color:#194fdb !important;background-image:url(../iui/listArrowSel.png), url(../iui/selection.png) !important;background-repeat:no-repeat, repeat-x;background-position:right center, left top;color:#FFFFFF !important;}
+a[selected="progress"]{background-image:url(../iui/loading.gif), url(../iui/selection.png) !important;}
+body > .toolbar{position:relative;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;border-bottom:1px solid #2d3642;padding:10px;height:45px;background:url(../iui/toolbar.png) #6d84a2 repeat-x;}
+.toolbar > h1{position:absolute;overflow:hidden;left:50%;margin:1px 0 0 -75px;height:45px;font-size:20px;width:150px;font-weight:bold;text-shadow:rgba(0, 0, 0, 0.4) 0px -1px 0;text-align:center;text-overflow:ellipsis;white-space:nowrap;color:#FFFFFF;}
+body[orient="landscape"] > .toolbar > h1{margin-left:-125px;width:250px;}
+body > .toolbar.masthead{background:#2C3143 repeat-x;}
+body > .toolbar.masthead > h1{left:0;margin-left:0;width:100%;}
+.button{position:absolute;overflow:hidden;top:8px;right:6px;margin:0;border-width:0 5px;padding:0 3px;width:auto;height:30px;line-height:30px;font-family:inherit;font-size:12px;font-weight:bold;color:#FFFFFF;text-shadow:rgba(0, 0, 0, 0.6) 0px -1px 0;text-overflow:ellipsis;text-decoration:none;white-space:nowrap;background:none;-webkit-border-image:url(../iui/toolButton.png) 0 5 0 5;}
+.blueButton{-webkit-border-image:url(../iui/blueButton.png) 0 5 0 5;border-width:0 5px;}
+.leftButton{left:6px;right:auto;}
+#backButton{display:none;left:6px;right:auto;padding:0;max-width:55px;border-width:0 8px 0 14px;-webkit-border-image:url(../iui/backButton.png) 0 8 0 14;}
+.whiteButton,.grayButton{display:block;border-width:0 12px;padding:10px;text-align:center;font-size:20px;font-weight:bold;text-decoration:inherit;color:inherit;}
+.whiteButton{-webkit-border-image:url(../iui/whiteButton.png) 0 12 0 12;text-shadow:rgba(255, 255, 255, 0.7) 0 1px 0;}
+.grayButton{-webkit-border-image:url(../iui/grayButton.png) 0 12 0 12;color:#FFFFFF;}
+body > ul > li{position:relative;margin:0;border-bottom:1px solid #E0E0E0;padding:8px 0 8px 10px;font-size:20px;font-weight:bold;list-style:none;}
+body > ul > li.group{position:relative;top:-1px;margin-bottom:-2px;border-top:1px solid #7d7d7d;border-bottom:1px solid #999999;padding:1px 10px;background:url(../iui/listGroup.png) repeat-x;font-size:17px;font-weight:bold;text-shadow:rgba(0, 0, 0, 0.4) 0 1px 0;color:#FFFFFF;}
+body > ul > li.group:first-child{top:0;border-top:none;}
+body > ul > li > a{display:block;margin:-8px 0 -8px -10px;padding:8px 32px 8px 10px;text-decoration:none;color:inherit;background:url(../iui/listArrow.png) no-repeat right center;}
+a[target="_replace"]{box-sizing:border-box;-webkit-box-sizing:border-box;padding-top:25px;padding-bottom:25px;font-size:18px;color:cornflowerblue;background-color:#FFFFFF;background-image:none;}
+body > .dialog{top:0;width:100%;min-height:417px;z-index:2;background:rgba(0, 0, 0, 0.8);padding:0;text-align:right;}
+.dialog > fieldset{box-sizing:border-box;-webkit-box-sizing:border-box;width:100%;margin:0;border:none;border-top:1px solid #6d84a2;padding:10px 6px;background:url(../iui/toolbar.png) #7388a5 repeat-x;}
+.dialog > fieldset > h1{margin:0 10px 0 10px;padding:0;font-size:20px;font-weight:bold;color:#FFFFFF;text-shadow:rgba(0, 0, 0, 0.4) 0px -1px 0;text-align:center;}
+.dialog > fieldset > label{position:absolute;margin:16px 0 0 6px;font-size:14px;color:#999999;}
+input:not(input[type|=radio]):not(input[type|=checkbox]){box-sizing:border-box;-webkit-box-sizing:border-box;width:100%;margin:8px 0 0 0;padding:6px 6px 6px 44px;font-size:16px;font-weight:normal;}
+body > .panel{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:10px;background:#c8c8c8 url(../iui/pinstripes.png);}
+.panel > fieldset{position:relative;margin:0 0 20px 0;padding:0;background:#FFFFFF;-webkit-border-radius:10px;-moz-border-radius:10px;border:1px solid #999999;text-align:right;font-size:16px;}
+.row{position:relative;min-height:42px;border-bottom:1px solid #999999;-webkit-border-radius:0;text-align:right;overflow:hidden;text-overflow:ellipsis;}
+fieldset > .row:last-child{border-bottom:none !important;}
+.row > input:not(input[type|=radio]):not(input[type|=checkbox]){box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;margin:0;border:none;padding:12px 10px 0 110px;height:42px;background:none;}
+.row > input[type|=radio],.row > input[type|=checkbox]{margin:7px 7px 0 0;height:25px;width:25px;}
+.row > label{position:absolute;margin:0 0 0 14px;line-height:42px;font-weight:bold;}
+.row > a{font-weight:bold;text-align:left;display:block;padding:8px 32px 8px 14px;text-decoration:none;color:inherit;background:url(../iui/listArrow.png) no-repeat right center;}
+.row > .error{height:25px;text-align:left;font-size:14px;padding:0 0 0 110px;color:red;}
+.row > span{position:absolute;padding:12px 10px 0 110px;margin:0;}
+.row > .toggle{position:absolute;top:6px;right:6px;width:100px;height:28px;}
+.toggle{border:1px solid #888888;-webkit-border-radius:6px;background:#FFFFFF url(../iui/toggle.png) repeat-x;font-size:19px;font-weight:bold;line-height:30px;}
+.toggle[toggled="true"]{border:1px solid #143fae;background:#194fdb url(../iui/toggleOn.png) repeat-x;}
+.toggleOn{display:none;position:absolute;width:60px;text-align:center;left:0;top:0;color:#FFFFFF;text-shadow:rgba(0, 0, 0, 0.4) 0px -1px 0;}
+.toggleOff{position:absolute;width:60px;text-align:center;right:0;top:0;color:#666666;}
+.toggle[toggled="true"] > .toggleOn{display:block;}
+.toggle[toggled="true"] > .toggleOff{display:none;}
+.thumb{position:absolute;top:-1px;left:-1px;width:40px;height:28px;border:1px solid #888888;-webkit-border-radius:6px;background:#ffffff url(../iui/thumb.png) repeat-x;}
+.toggle[toggled="true"] > .thumb{left:auto;right:-1px;}
+.panel > h2{margin:0 0 8px 14px;font-size:inherit;font-weight:bold;color:#4d4d70;text-shadow:rgba(255, 255, 255, 0.75) 2px 2px 0;}
+#preloader{display:none;background-image:url(loading.gif), url(selection.png),
+ url(blueButton.png), url(listArrowSel.png), url(listGroup.png);}
+.state-color-queued{background:#EEEEEE;}
+.state-color-ok{background:#CCFFCC;}
+.state-color-error{background:#FFCCCC;}
+.state-color-running{background:#FFFFCC;}
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/layout_callout_top.png
Binary file static/june_2007_style/blue/layout_callout_top.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/library.css
--- a/static/june_2007_style/blue/library.css Fri Jul 24 15:13:11 2009 -0400
+++ b/static/june_2007_style/blue/library.css Fri Jul 24 16:14:46 2009 -0400
@@ -1,1 +1,15 @@
-.libraryRow{background-color:#d2c099;}.datasetHighlighted{background-color:#C1C9E5;}.libraryItemDeleted-True{font-style:italic;}div.historyItemBody{padding:4px 4px 2px 4px;}li.folderRow,li.datasetRow{border-top:solid 1px #ddd;}li.folderRow:hover,li.datasetRow:hover{background-color:#C1C9E5;}img.expanderIcon{padding-right:4px;}input.datasetCheckbox,li,ul{padding:0;margin:0;}.rowTitle{padding:2px;}ul{list-style:none;}.libraryTitle th{text-align:left;}pre.peek{background:white;color:black;width:100%;overflow:auto;}pre.peek th{color:white;background:#023858;}a.expandLink{text-decoration:none;}span.expandLink{width:100%;height:100%;display:block;}
\ No newline at end of file
+.libraryRow{background-color:#d2c099;}
+.datasetHighlighted{background-color:#C1C9E5;}
+.libraryItemDeleted-True{font-style:italic;}
+div.historyItemBody{padding:4px 4px 2px 4px;}
+li.folderRow,li.datasetRow{border-top:solid 1px #ddd;}
+li.folderRow:hover,li.datasetRow:hover{background-color:#C1C9E5;}
+img.expanderIcon{padding-right:4px;}
+input.datasetCheckbox,li,ul{padding:0;margin:0;}
+.rowTitle{padding:2px;}
+ul{list-style:none;}
+.libraryTitle th{text-align:left;}
+pre.peek{background:white;color:black;width:100%;overflow:auto;}
+pre.peek th{color:white;background:#023858;}
+a.expandLink{text-decoration:none;}
+span.expandLink{width:100%;height:100%;display:block;}
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/masthead.css
--- a/static/june_2007_style/blue/masthead.css Fri Jul 24 15:13:11 2009 -0400
+++ b/static/june_2007_style/blue/masthead.css Fri Jul 24 16:14:46 2009 -0400
@@ -1,1 +1,8 @@
-body{background:#2C3143 url(masthead_bg.png) bottom;color:#eee;padding:0;border:0;margin:3px;margin-right:5px;margin-left:5px;overflow:hidden;}div.pageTitle{font-size:175%;font-weight:bold;}div.pageTitle a:link,div.pageTitle a:visited,div.pageTitle a:active,div.pageTitle a:hover{text-decoration:none;}a:link,a:visited,a:active{color:#eee;}#tab-bar-bottom{z-index:-1;position:absolute;top:27px;left:0;width:100%;height:100%;background:#222532;}span.link-group{margin:0;padding:0;display:inline;padding-bottom:10px;margin-bottom:-10px;}span.link-group span{margin:0;padding:0;display:inline;}span.link-group span.active-link{background:#222532;padding-left:3px;padding-right:3px;margin-left:-3px;margin-right:-3px;padding-bottom:10px;margin-bottom:-10px;}
\ No newline at end of file
+body{background:#2C3143 url(masthead_bg.png) bottom;color:#eeeeee;padding:0;border:0;margin:3px;margin-right:5px;margin-left:5px;overflow:hidden;}
+div.pageTitle{font-size:175%;font-weight:bold;}
+div.pageTitle a:link,div.pageTitle a:visited,div.pageTitle a:active,div.pageTitle a:hover{text-decoration:none;}
+a:link,a:visited,a:active{color:#eeeeee;}
+#tab-bar-bottom{z-index:-1;position:absolute;top:27px;left:0;width:100%;height:100%;background:#222532;}
+span.link-group{margin:0;padding:0;display:inline;padding-bottom:10px;margin-bottom:-10px;}
+span.link-group span{margin:0;padding:0;display:inline;}
+span.link-group span.active-link{background:#222532;padding-left:3px;padding-right:3px;margin-left:-3px;margin-right:-3px;padding-bottom:10px;margin-bottom:-10px;}
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/masthead_bg.png
Binary file static/june_2007_style/blue/masthead_bg.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/ok_large.png
Binary file static/june_2007_style/blue/ok_large.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/ok_small.png
Binary file static/june_2007_style/blue/ok_small.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/panel_header_bg.png
Binary file static/june_2007_style/blue/panel_header_bg.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/panel_layout.css
--- a/static/june_2007_style/blue/panel_layout.css Fri Jul 24 15:13:11 2009 -0400
+++ b/static/june_2007_style/blue/panel_layout.css Fri Jul 24 16:14:46 2009 -0400
@@ -1,1 +1,50 @@
-body,html{overflow:hidden;margin:0;padding:0;width:100%;height:100%;}body{font:75% verdana,"Bitstream Vera Sans",geneva,arial,helvetica,helve,sans-serif;background:#eee;}#background{position:absolute;background:#eee;z-index:-1;top:0;left:0;margin:0;padding:0;width:100%;height:100%;}#messagebox{position:absolute;top:33px;left:0;width:100%;height:24px!important;overflow:hidden;border-bottom:solid #999 1px;font-size:90%;}#left,#left-border,#center,#right-border,#right{position:absolute;top:39px;bottom:0;overflow:hidden;background:#fff;}#left,#center,#right{border-top:solid #999 1px;}#left-border,#right-border{background:#eee;border-left:solid #999 1px;border-right:solid #999 1px;padding-right:1px;padding-left:1px;width:5px;z-index:10000;}#left-border div,#right-border div{width:100%;height:100%;background-repeat:no-repeat;background-position:center center;position:absolute;width:5px;height:100%;}#left-border div,#right-border.hidden div{background-image:url(tiny_arrow_left.png)
;cursor:w-resize;}#left-border.hidden div,#right-border div{background-image:url(tiny_arrow_right.png);cursor:e-resize;}#left-border.hover div,#right-border.hover div{background-color:#AAE;}#left{left:0;width:250px;z-index:200;}#left-border{left:250px;}#center{left:259px;right:259px;overflow:hidden;z-index:1;}#right-border{right:250px;}#right{width:250px;right:0;z-index:200;}.unified-panel-header{height:2em;z-index:1000;background:#ccc;background-image:url(panel_header_bg.png);background-position:top center;background-repeat:repeat-x;border-bottom:solid #999 1px;margin:0;padding:0;padding-right:10px;padding-left:10px;color:#333;font-weight:bold;}.unified-panel-header-inner{padding-top:.45em;}.menu-bg{background:#C1C9E5 url(menu_bg.png) top repeat-x;}div.unified-panel-body{position:absolute;top:2em;bottom:0;width:100%;margin-top:1px;}.panel-header-button{color:#333;text-decoration:none;display:inline-block;cursor:pointer;margin:-1px;padding:1px;border:0;padding-right:.5em;pad
ding-left:.5em;-moz-border-radius:.5em;-webkit-border-radius:.5em;border-radius:.5em;background:transparent;}.panel-header-button:hover{color:black;background:#aaa;}.panel-header-button:active{color:white;background:#aaa;}#overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:20000;}.dialog-box-container{position:relative;margin-top:80px;margin-right:auto;margin-left:auto;}.dialog-box-wrapper{position:relative;padding:1em;background-color:rgba(0,0,0,0.5);-moz-border-radius:1em;-webkit-border-radius:1em;}.dialog-box{border:solid #999 1px;background:white;min-width:230px;z-index:80000;}.dialog-box .body,.dialog-box .buttons{padding:5px;}.panel-error-message,.panel-warning-message,.panel-done-message,.panel-info-message{height:24px;line-height:24px;color:#303030;padding:0;padding-left:26px;background-color:#FCC;background-image:url(error_small.png);background-repeat:no-repeat;background-position:6px 50%;}.panel-warning-message{background-image:url(warn_small.png);b
ackground-color:#FFC;}.panel-done-message{background-image:url(done_small.png);background-color:#CFC;}.panel-info-message{background-image:url(info_small.png);background-color:#CCF;}#masthead{position:absolute;top:0;left:0;width:100%;height:32px;background:#2C3143;color:#fff;border-bottom:solid #444 1px;z-index:15000;padding:0;}#masthead a{color:#eee;}#masthead .title{padding:3px 10px;font-size:175%;font-weight:bold;}#masthead a{text-decoration:none;}#masthead a:hover{text-decoration:underline;}.tab-group{margin:0;padding:0 10px;height:100%;white-space:nowrap;cursor:default;user-select:none;-moz-user-select:none;-webkit-user-select:none;}.tab-group .tab{background:#2C3143;position:relative;float:left;margin:0;padding:0 1em;height:32px;line-height:32px;text-align:left;}.tab-group .tab:hover>a{color:gold!important;}.tab-group .active{background:#010101;}.tab-group .tab .submenu{display:none;position:absolute;z-index:16000;left:0;top:32px;padding:1em;margin:-1em;padding-top:0;m
argin-top:0;background-color:rgba(0,0,0,0.5);-moz-border-radius:0 0 1em 1em;-webkit-border-bottom-right-radius:1em;-webkit-border-bottom-left-radius:1em;}.tab-group .tab .submenu ul{display:block;margin:0;padding:0;list-style-type:none;background:#2C3143;}.tab-group .tab .submenu ul li{display:block;padding:0 1em;white-space:nowrap;}
\ No newline at end of file
+body{font:13px/1.231 verdana,arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}
+select,input,button,textarea,button{font:99% verdana,arial,helvetica,clean,sans-serif;}
+table{font-size:inherit;font:100%;}
+pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;}
+body{font-size:75%;}
+body,html{overflow:hidden;margin:0;padding:0;width:100%;height:100%;}
+body{font:75% verdana, "Bitstream Vera Sans", geneva, arial, helvetica, helve, sans-serif;background:#eee;}
+.unselectable{user-select:none;-moz-user-select:none;-webkit-user-select:none;}
+#background{position:absolute;background:#eee;z-index:-1;top:0;left:0;margin:0;padding:0;width:100%;height:100%;}
+#messagebox{position:absolute;top:33px;left:0;width:100%;height:24px !important;overflow:hidden;border-bottom:solid #999 1px;font-size:90%;}
+#left,#left-border,#center,#right-border,#right{position:absolute;top:39px;bottom:0px;overflow:hidden;background:#fff;}
+#left,#center,#right{border-top:solid #999 1px;}
+#left-border,#right-border{background:#eeeeee;border-left:solid #999 1px;border-right:solid #999 1px;padding-right:1px;padding-left:1px;width:5px;z-index:10000;}
+#left-border div,#right-border div{width:100%;height:100%;background-repeat:no-repeat;background-position:center center;position:absolute;width:5px;height:100%;}
+#left-border div,#right-border.hidden div{background-image:url(tiny_arrow_left.png);cursor:w-resize;}
+#left-border.hidden div,#right-border div{background-image:url(tiny_arrow_right.png);cursor:e-resize;}
+#left-border.hover div,#right-border.hover div{background-color:#AAAAEE;}
+#left{left:0px;width:250px;z-index:200;}
+#left-border{left:250px;}
+#center{left:259px;right:259px;overflow:hidden;z-index:1;}
+#right-border{right:250px;}
+#right{width:250px;right:0px;z-index:200;}
+.unified-panel-header{height:2em;z-index:1000;background:#cccccc;background-image:url(panel_header_bg.png);background-position:top center;background-repeat:repeat-x;border-bottom:solid #999 1px;margin:0;padding:0;padding-right:10px;padding-left:10px;color:#333;font-weight:bold;}
+.unified-panel-header-inner{padding-top:0.45em;}
+.menu-bg{background:#C1C9E5 url(menu_bg.png) top repeat-x;}
+div.unified-panel-body{position:absolute;top:2em;bottom:0;width:100%;margin-top:1px;}
+.panel-header-button{color:#333;text-decoration:none;display:inline-block;cursor:pointer;margin:-1px;padding:1px;border:0px;padding-right:0.5em;padding-left:0.5em;-moz-border-radius:0.5em;-webkit-border-radius:0.5em;border-radius:0.5em;background:transparent;}
+.panel-header-button:hover{color:black;background:#aaaaaa;}
+.panel-header-button:active{color:white;background:#aaaaaa;}
+#overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:20000;}
+.dialog-box-container{position:relative;margin-top:80px;margin-right:auto;margin-left:auto;}
+.dialog-box-wrapper{position:relative;padding:1em;background-color:rgba(0,0,0,0.5);-moz-border-radius:1em;-webkit-border-radius:1em;}
+.dialog-box{border:solid #999 1px;background:white;min-width:230px;z-index:80000;}
+.dialog-box .body,.dialog-box .buttons{padding:5px;}
+.panel-error-message,.panel-warning-message,.panel-done-message,.panel-info-message{height:24px;line-height:24px;color:#303030;padding:0px;padding-left:26px;background-color:#FFCCCC;background-image:url(error_small.png);background-repeat:no-repeat;background-position:6px 50%;}
+.panel-warning-message{background-image:url(warn_small.png);background-color:#FFFFCC;}
+.panel-done-message{background-image:url(done_small.png);background-color:#CCFFCC;}
+.panel-info-message{background-image:url(info_small.png);background-color:#CCCCFF;}
+#masthead{position:absolute;top:0;left:0;width:100%;height:32px;background:#2C3143;color:#fff;border-bottom:solid #444 1px;z-index:15000;padding:0;}
+#masthead a{color:#eeeeee;}
+#masthead .title{padding:3px 10px;font-size:175%;font-weight:bold;}
+#masthead a{text-decoration:none;}
+#masthead a:hover{text-decoration:underline;}
+.tab-group{margin:0;padding:0 10px;height:100%;white-space:nowrap;cursor:default;background:transparent;}
+.tab-group .tab{background:#2C3143;position:relative;float:left;margin:0;padding:0 1em;height:32px;line-height:32px;text-align:left;}
+.tab-group .tab .submenu{display:none;position:absolute;z-index:16000;left:0;top:32px;padding:1em;margin:-1em;padding-top:0;margin-top:0;background-color:rgba(0,0,0,0.5);-moz-border-radius:0 0 1em 1em;-webkit-border-bottom-right-radius:1em;-webkit-border-bottom-left-radius:1em;}
+.tab-group .tab .submenu ul{display:block;margin:0;padding:0;list-style-type:none;background:#2C3143;}
+.tab-group .tab .submenu ul li{display:block;padding:0 1em;white-space:nowrap;}
+.tab-group .tab:hover > a{color:gold !important;}
+.tab-group .active{background:rgb(1,1,1);}
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/popupmenu_callout_top.png
Binary file static/june_2007_style/blue/popupmenu_callout_top.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/reset.css
--- a/static/june_2007_style/blue/reset.css Fri Jul 24 15:13:11 2009 -0400
+++ b/static/june_2007_style/blue/reset.css Fri Jul 24 16:14:46 2009 -0400
@@ -1,1 +1,4 @@
-body{font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}select,input,button,textarea{font:99% arial,helvetica,clean,sans-serif;}table{font-size:inherit;font:100%;}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;}
\ No newline at end of file
+body{font:13px/1.231 arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}
+select,input,button,textarea{font:99% arial,helvetica,clean,sans-serif;}
+table{font-size:inherit;font:100%;}
+pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;}
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/tiny_arror_right.png
Binary file static/june_2007_style/blue/tiny_arror_right.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/tiny_arrow_left.png
Binary file static/june_2007_style/blue/tiny_arrow_left.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/tiny_arrow_right.png
Binary file static/june_2007_style/blue/tiny_arrow_right.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/tool_menu.css
--- a/static/june_2007_style/blue/tool_menu.css Fri Jul 24 15:13:11 2009 -0400
+++ b/static/june_2007_style/blue/tool_menu.css Fri Jul 24 16:14:46 2009 -0400
@@ -1,1 +1,9 @@
-body{background:white;color:#303030;background:#C1C9E5 url(menu_bg.png) top repeat-x;margin:5px;margin-right:10px;margin-left:10px;}hr{border:none;height:0;margin-top:0;}div.toolSectionPad{margin:0;padding:0;height:5px;font-size:0;}div.toolSectionDetailsInner{margin-left:5px;margin-right:5px;}div.toolSectionTitle{font-weight:bold;}div.toolPanelLabel{padding-top:10px;padding-bottom:5px;font-weight:bold;color:gray;text-transform:uppercase;}div.toolTitle{padding-top:5px;padding-bottom:5px;margin-left:16px;margin-right:10px;display:list-item;list-style:square outside;}div.toolSectionBody div.toolPanelLabel{padding-top:5px;padding-bottom:5px;margin-left:16px;margin-right:10px;display:list-item;list-style:none outside;}div.toolTitleNoSection{padding-bottom:0;}
\ No newline at end of file
+body{background:white;color:#303030;background:#C1C9E5 url(menu_bg.png) top repeat-x;margin:5px;margin-right:10px;margin-left:10px;}
+hr{border:none;height:0px;margin-top:0px;}
+div.toolSectionPad{margin:0;padding:0;height:5px;font-size:0px;}
+div.toolSectionDetailsInner{margin-left:5px;margin-right:5px;}
+div.toolSectionTitle{font-weight:bold;}
+div.toolPanelLabel{padding-top:10px;padding-bottom:5px;font-weight:bold;color:gray;text-transform:uppercase;}
+div.toolTitle{padding-top:5px;padding-bottom:5px;margin-left:16px;margin-right:10px;display:list-item;list-style:square outside;}
+div.toolSectionBody div.toolPanelLabel{padding-top:5px;padding-bottom:5px;margin-left:16px;margin-right:10px;display:list-item;list-style:none outside;}
+div.toolTitleNoSection{padding-bottom:0px;}
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/wait_large.png
Binary file static/june_2007_style/blue/wait_large.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/wait_small.png
Binary file static/june_2007_style/blue/wait_small.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/warn_large.png
Binary file static/june_2007_style/blue/warn_large.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/warn_message_icon.png
Binary file static/june_2007_style/blue/warn_message_icon.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/warn_small.png
Binary file static/june_2007_style/blue/warn_small.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/workflow_circle_drag.png
Binary file static/june_2007_style/blue/workflow_circle_drag.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/workflow_circle_green.png
Binary file static/june_2007_style/blue/workflow_circle_green.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/blue/workflow_circle_open.png
Binary file static/june_2007_style/blue/workflow_circle_open.png has changed
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/history.css.tmpl
--- a/static/june_2007_style/history.css.tmpl Fri Jul 24 15:13:11 2009 -0400
+++ b/static/june_2007_style/history.css.tmpl Fri Jul 24 16:14:46 2009 -0400
@@ -1,5 +1,4 @@
-body
-{
+body {
background: $menu_bg_over;
color: $base_text;
background-image: url(menu_bg.png);
@@ -10,108 +9,154 @@
padding: 0;
}
-a
-{
- color: #base_text;
+a {
+ color: $base_text;
}
-div.historyLinks
-{
+## Control links at top of history
+div.historyLinks {
padding: 5px;
- margin-top: 5px;
- margin-bottom: 5px;
- padding-right: 5px;
- padding-left: 5px;
- margin-bottom: 5px;
+ margin: 5px 0 5px 0;
}
-div.historyItem
-{
- margin-right: -5px;
- margin-top: 5px;
- margin-bottom: 5px;
- padding: 5px;
- padding-right: 11px;
-
+## Default history item appearend
+div.historyItem {
+ margin: 5px -5px 5px 0px;
+ padding: 5px 11px 5px 5px;
border: solid $history_queued_border 1px;
border-left: solid $history_queued_border 5px;
border-right: none;
background: $history_queued_bg;
- background-image: url(gray_bg.png);
- background-repeat: repeat-x;
- background-position: top;
+ div.historyItemTitleBar {
+ padding-left: 20px;
+ background-position: 0 1px;
+ background-repeat: no-repeat;
+ }
}
-div.historyItem div.historyItem
-{
+## Nested history items
+div.historyItem div.historyItem {
margin-right: -11px;
}
-div.historyItem-ok
-{
+## Change background/border color depending on state
+div.historyItem-ok {
border-color: $history_ok_border;
background: $history_ok_bg;
- /*
- background-image: url(ok_bg.png);
- background-repeat: repeat-x;
- background-position: top;
- */
+ div.historyItemTitleBar {
+ padding-left: 0;
+ }
+}
+div.historyItem-error {
+ border-color: $history_error_border;
+ background: $history_error_bg;
+ div.historyItemTitleBar {
+ -sprite-group: history-states;
+ -sprite-image: data_error.png;
+ }
}
-div.historyItem-error, div.historyItem-empty
-{
+div.historyItem-empty {
border-color: $history_error_border;
background: $history_error_bg;
- /*
- background-image: url(error_bg.png);
- background-repeat: repeat-x;
- background-position: top;
- */
+ div.historyItemTitleBar {
+ -sprite-group: history-states;
+ -sprite-image: data_empty.png;
+ }
}
-div.historyItem-running
-{
+div.historyItem-running {
border-color: $history_running_border;
background: $history_running_bg;
- /*
- background-image: url(warn_bg.png);
- background-repeat: repeat-x;
- background-position: top;
- */
+ div.historyItemTitleBar {
+ background-image: url(data_running.gif);
+ }
}
-div.historyItem-upload
-{
+div.historyItem-upload {
border-color: $history_upload_border;
background: $history_upload_bg;
+ div.historyItemTitleBar {
+ background-image: url(data_upload.gif);
+ }
}
-div.historyItem-noPermission
-{
+div.historyItem-queued {
+ background: $history_queued_bg;
+ div.historyItemTitleBar {
+ -sprite-group: history-states;
+ -sprite-image: data_queued.png;
+ }
+}
+
+div.historyItem-noPermission {
filter: alpha(opacity=60);
-moz-opacity: .60;
opacity: .60;
}
-div.historyItem-queued
-{
+## Special case for showing the spinner but not changing the background
+div.historyItemTitleBar.spinner {
+ background: url(data_running.gif) 0 1px no-repeat !important;
+ padding-left: 20px !important;
}
-div.historyItemBody div
-{
+## Buttons
+div.historyItemButtons {
+ float: right;
+}
+
+.icon-button {
+ width: 16px;
+ height: 16px;
+ display: block;
+ float: left;
+ margin-left: 2px;
+ ## Allow alt text for screen readers
+ text-indent: 20px;
+}
+
+.icon-button.display {
+ -sprite-group: history-buttons;
+ -sprite-image: eye_icon.png;
+}
+
+.icon-button.display:hover {
+ -sprite-group: history-buttons;
+ -sprite-image: eye_icon_dark.png;
+}
+
+.icon-button.edit {
+ -sprite-group: history-buttons;
+ -sprite-image: pencil_icon.png;
+}
+
+.icon-button.edit:hover {
+ -sprite-group: history-buttons;
+ -sprite-image: pencil_icon_dark.png;
+}
+
+.icon-button.delete {
+ -sprite-group: history-buttons;
+ -sprite-image: delete_icon.png;
+}
+
+.icon-button.delete:hover {
+ -sprite-group: history-buttons;
+ -sprite-image: delete_icon_dark.png;
+}
+
+div.historyItemBody div {
padding-top: 2px;
}
-pre.peek
-{
+pre.peek {
background: white;
color: black;
width: 100%;
overflow: auto;
+ th {
+ color: white;
+ background: $peek_table_header;
+ }
}
-
-pre.peek th
-{
- color: white;
- background: $peek_table_header;
-}
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/make_style.py
--- a/static/june_2007_style/make_style.py Fri Jul 24 15:13:11 2009 -0400
+++ b/static/june_2007_style/make_style.py Fri Jul 24 16:14:46 2009 -0400
@@ -57,33 +57,15 @@
# History icons
( "ok_small.png", "history_ok_bg", "data_ok.png" ),
( "error_small.png", "history_error_bg", "data_error.png" ),
- ( "wait_small.png", "history_queued_bg", "data_queued.png" ) ]
+ ( "wait_small.png", "history_queued_bg", "data_queued.png" ),
+]
vars, out_dir = sys.argv[1:]
-context = dict()
-for line in open( vars ):
- if line.startswith( '#' ):
- continue
- key, value = line.rstrip("\r\n").split( '=' )
- if value.startswith( '"' ) and value.endswith( '"' ):
- value = value[1:-1]
- context[key] = value
-
for input, output in templates:
print input ,"->", output
- out_fname = os.path.join( out_dir, output )
- temp_file = tempfile.NamedTemporaryFile()
- # Write processed template to temporary file
- print "Processing template..."
- temp_file.write( str( Template( file=input, searchList=[context] ) ) )
- temp_file.flush()
- # Compress CSS with YUI
- print "Compressing..."
- subprocess.call(
- "java -jar ../../scripts/yuicompressor.jar --type css %s -o %s" % ( temp_file.name, out_fname ),
- shell = True )
+ subprocess.call( "./process_css.py %s %s < %s > %s" % ( vars, out_dir, input, os.path.join( out_dir, output ) ), shell=True )
"""
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/panel_layout.css.tmpl
--- a/static/june_2007_style/panel_layout.css.tmpl Fri Jul 24 15:13:11 2009 -0400
+++ b/static/june_2007_style/panel_layout.css.tmpl Fri Jul 24 16:14:46 2009 -0400
@@ -1,26 +1,28 @@
-#set $unselectable = """
- user-select: none;
- -moz-user-select: none;
- -webkit-user-select: none;
-"""
+## Font settings from YUI + verdana
+body{font:13px/1.231 verdana,arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}select,input,button,textarea,button{font:99% verdana,arial,helvetica,clean,sans-serif;}table{font-size:inherit;font:100%;}pre,code,kbd,samp,tt{font-family:monospace;*font-size:108%;line-height:100%;}
+body{font-size:75%;}
-## Rules
-body, html
-{
+body, html {
overflow: hidden;
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
-body
-{
+
+body {
font: 75% verdana, "Bitstream Vera Sans", geneva, arial, helvetica, helve, sans-serif;
background: ${layout_bg};
}
-#background
-{
+
+.unselectable {
+ user-select: none;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+}
+
+#background {
position: absolute;
background: ${layout_bg};
z-index: -1;
@@ -32,8 +34,7 @@
height: 100%;
}
-#messagebox
-{
+#messagebox {
position:absolute;
top:33px;
left:0;
@@ -44,30 +45,25 @@
font-size: 90%;
}
-#left, #left-border, #center, #right-border, #right
-{
+#left, #left-border, #center, #right-border, #right {
position: absolute;
top: 39px;
bottom: 0px;
overflow: hidden;
background: #fff;
}
-#left, #center, #right
-{
+#left, #center, #right {
border-top: solid ${layout_border} 1px;
}
-#left-border, #right-border
-{
+#left-border, #right-border {
background: #eeeeee;
border-left: solid ${layout_border} 1px;
border-right: solid ${layout_border} 1px;
padding-right: 1px;
padding-left: 1px;
width: 5px;
- z-index: 10000;
-}
-#left-border div, #right-border div
-{
+ z-index: 10000; }
+#left-border div, #right-border div {
width: 100%;
height: 100%;
background-repeat: no-repeat;
@@ -76,43 +72,35 @@
width: 5px;
height: 100%;
}
-#left-border div, #right-border.hidden div
-{
+#left-border div, #right-border.hidden div {
background-image: url(tiny_arrow_left.png);
cursor: w-resize;
}
-#left-border.hidden div, #right-border div
-{
+#left-border.hidden div, #right-border div {
background-image: url(tiny_arrow_right.png);
cursor: e-resize;
}
-#left-border.hover div, #right-border.hover div
-{
+#left-border.hover div, #right-border.hover div {
background-color: ${layout_hover};
}
-#left
-{
+#left {
left: 0px;
width: 250px;
z-index: 200;
}
-#left-border
-{
+#left-border {
left: 250px;
}
-#center
-{
+#center {
left:259px;
right: 259px;
overflow: hidden;
z-index: 1;
}
-#right-border
-{
+#right-border {
right: 250px;
}
-#right
-{
+#right {
width: 250px;
right: 0px;
z-index: 200;
@@ -240,7 +228,7 @@
background-color: $info_message_bg;
}
-## ---- Masthead styles ----
+## Masthead
#masthead
{
@@ -280,66 +268,65 @@
## Tabs
-.tab-group
-{
+.tab-group {
+
margin: 0;
padding: 0 10px;
height: 100%;
white-space: nowrap;
cursor: default;
- ${unselectable}
+ background: transparent;
+
+ .tab {
+
+ background: ${masthead_bg};
+ position: relative;
+ float: left;
+ margin: 0;
+ padding: 0 1em;
+ height: 32px;
+ line-height: 32px;
+ text-align: left;
+
+ .submenu {
+
+ display: none;
+ position: absolute;
+ z-index: 16000;
+ left: 0;
+ top: 32px;
+ padding: 1em;
+ margin: -1em;
+ padding-top: 0;
+ margin-top: 0;
+ background-color: rgba(0,0,0,0.5);
+ -moz-border-radius: 0 0 1em 1em;
+ -webkit-border-bottom-right-radius: 1em;
+ -webkit-border-bottom-left-radius: 1em;
+
+ ul {
+
+ display: block;
+ margin: 0;
+ padding: 0;
+ list-style-type: none;
+ background: ${masthead_bg};
+
+ li {
+
+ display: block;
+ padding: 0 1em;
+ white-space: nowrap;
+ }
+ }
+ }
+ }
+
+ .tab:hover > a {
+ color: gold !important;
+ }
+
+ .active {
+ background: rgb(1,1,1);
+ }
}
-
-.tab-group .tab
-{
- background: ${masthead_bg};
- position: relative;
- float: left;
- margin: 0;
- padding: 0 1em;
- height: 32px;
- line-height: 32px;
- text-align: left;
-}
-
-.tab-group .tab:hover > a
-{
- color: gold !important;
-}
-
-.tab-group .active
-{
- background: rgb(1,1,1);
-}
-
-.tab-group .tab .submenu {
- display: none;
- position: absolute;
- z-index: 16000;
- left: 0;
- top: 32px;
- padding: 1em;
- margin: -1em;
- padding-top: 0;
- margin-top: 0;
- background-color: rgba(0,0,0,0.5);
- -moz-border-radius: 0 0 1em 1em;
- -webkit-border-bottom-right-radius: 1em;
- -webkit-border-bottom-left-radius: 1em;
-}
-
-.tab-group .tab .submenu ul
-{
- display: block;
- margin: 0;
- padding: 0;
- list-style-type: none;
- background: ${masthead_bg};
-}
-
-.tab-group .tab .submenu ul li
-{
- display: block;
- padding: 0 1em;
- white-space: nowrap;
-}
diff -r 0564441c5043 -r 3d4d44d7a275 static/june_2007_style/process_css.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/static/june_2007_style/process_css.py Fri Jul 24 16:14:46 2009 -0400
@@ -0,0 +1,236 @@
+#!/usr/bin/env python
+
+"""
+CSS processor for Galaxy style sheets. Supports the following features:
+
+- Nested rule definition
+- Mixins
+- Variable substitution in values
+
+"""
+
+import sys, string, os.path
+from pyparsing import *
+from galaxy.util.odict import odict
+import Image
+
+def cross_lists(*sets):
+ """
+ Return the cross product of the arguments
+ """
+ wheels = map(iter, sets)
+ digits = [it.next() for it in wheels]
+ while True:
+ yield digits[:]
+ for i in range(len(digits)-1, -1, -1):
+ try:
+ digits[i] = wheels[i].next()
+ break
+ except StopIteration:
+ wheels[i] = iter(sets[i])
+ digits[i] = wheels[i].next()
+ else:
+ break
+
+def build_stylesheet_parser():
+ """
+ Returns a PyParsing parser object for CSS
+ """
+
+ # Forward declerations for recursion
+ rule = Forward()
+
+ # Structural syntax, supressed from parser output
+ lbrace = Literal("{").suppress()
+ rbrace = Literal("}").suppress()
+ colon = Literal(":").suppress()
+ semi = Literal(";").suppress()
+
+ ident = Word( alphas + "_", alphanums + "_-" )
+
+ # Properties
+ prop_name = Word( alphas + "_-*", alphanums + "_-" )
+ prop_value = CharsNotIn( ";" ) # expand this as needed
+ property_def = Group( prop_name + colon + prop_value + semi ).setResultsName( "property_def" )
+
+ # Selectors
+ # Just match anything that looks like a selector, including element, class,
+ # id, attribute, and pseudoclass. Attributes are not handled properly (spaces,
+ # and even newlines in the quoted string are legal).
+ simple_selector = Word( alphanums + ".#*:()[]|=\"'_-" )
+ combinator = Literal( ">" ) | Literal( "+" )
+ selector = Group( simple_selector + ZeroOrMore( Optional( combinator ) + simple_selector ) )
+ selectors = Group( delimitedList( selector ) )
+
+ selector_mixin = Group( selector + semi ).setResultsName( "selector_mixin" )
+
+ # Rules
+ rule << Group( selectors +
+ lbrace +
+ Group( ZeroOrMore( property_def | rule | selector_mixin ) ) +
+ rbrace ).setResultsName( "rule" )
+
+ # A whole stylesheet
+ stylesheet = ZeroOrMore( rule )
+
+ # C-style comments should be ignored, as should "##" comments
+ stylesheet.ignore( cStyleComment )
+ stylesheet.ignore( "##" + restOfLine )
+
+ return stylesheet
+
+stylesheet_parser = build_stylesheet_parser()
+
+class CSSProcessor( object ):
+
+ def process( self, file, out, variables, image_dir ):
+ # Build parse tree
+ results = stylesheet_parser.parseFile( sys.stdin, parseAll=True )
+ # Expand rules (elimimate recursion and resolve mixins)
+ rules = self.expand_rules( results )
+ # Expand variables (inplace)
+ self.expand_variables( rules, variables )
+ # Do sprites
+ self.make_sprites( rules, image_dir )
+ # Print
+ self.print_rules( rules, out )
+
+ def expand_rules( self, parse_results ):
+ mixins = {}
+ rules = []
+ # Visitor for recursively expanding rules
+ def visitor( r, selector_prefixes ):
+ # Concatenate combinations and build list of expanded selectors
+ selectors = [ " ".join( s ) for s in r[0] ]
+ full_selector_list = selector_prefixes + [selectors]
+ full_selectors = []
+ for l in cross_lists( *full_selector_list ):
+ full_selectors.append( " ".join( l ) )
+ # Separate properties from recursively defined rules
+ properties = []
+ children = []
+ for dec in r[1]:
+ type = dec.getName()
+ if type == "property_def":
+ properties.append( dec )
+ elif type == "selector_mixin":
+ properties.extend( mixins[dec[0][0]] )
+ else:
+ children.append( dec )
+ rules.append( ( full_selectors, properties ) )
+ # Save by name for mixins (not smart enough to combine rules!)
+ for s in full_selectors:
+ mixins[ s ] = properties;
+ # Visit children
+ for child in children:
+ visitor( child, full_selector_list )
+ # Call at top level
+ for p in parse_results:
+ visitor( p, [] )
+ # Return the list of expanded rules
+ return rules
+
+ def expand_variables( self, rules, context ):
+ for selectors, properties in rules:
+ for p in properties:
+ p[1] = string.Template( p[1] ).substitute( context ).strip()
+
+ def make_sprites( self, rules, image_dir ):
+
+ pad = 10
+
+ class SpriteGroup():
+ def __init__( self, name ):
+ self.name = name
+ self.offset = 0
+ self.sprites = odict()
+ def add_or_get_sprite( self, fname ):
+ if fname in self.sprites:
+ return self.sprites[fname]
+ else:
+ sprite = self.sprites[fname] = Sprite( fname, self.offset )
+ self.offset += sprite.image.size[1] + pad
+ return sprite
+
+ class Sprite():
+ def __init__( self, fname, offset ):
+ self.fname = fname
+ self.image = Image.open( os.path.join( image_dir, fname ) )
+ self.offset = offset
+
+ sprite_groups = {}
+
+ for i in range( len( rules ) ):
+ properties = rules[i][1]
+ new_properties = []
+ # Find sprite properties (and remove them). Last takes precedence
+ sprite_group_name = None
+ sprite_filename = None
+ for name, value in properties:
+ if name == "-sprite-group":
+ sprite_group_name = value
+ elif name == "-sprite-image":
+ sprite_filename = value
+ else:
+ new_properties.append( ( name, value ) )
+ # If a sprite filename was found, deal with it...
+ if sprite_group_name and sprite_filename:
+ if sprite_group_name not in sprite_groups:
+ sprite_groups[sprite_group_name] = SpriteGroup( sprite_group_name )
+ sprite_group = sprite_groups[sprite_group_name]
+ sprite = sprite_group.add_or_get_sprite( sprite_filename )
+ new_properties.append( ( "background", "url(%s.png) no-repeat 0px -%dpx" % ( sprite_group.name, sprite.offset ) ) )
+ # Save changed properties
+ rules[i] = ( rules[i][0], new_properties )
+
+ # Generate new images
+ for group in sprite_groups.itervalues():
+ w = 0
+ h = 0
+ for sprite in group.sprites.itervalues():
+ sw, sh = sprite.image.size
+ w = max( w, sw )
+ h += sh + pad
+ master = Image.new( mode='RGBA', size=(w, h), color=(0,0,0,0) )
+ offset = 0
+ for sprite in group.sprites.itervalues():
+ master.paste( sprite.image, (0,offset) )
+ offset += sprite.image.size[1] + pad
+ master.save( os.path.join( image_dir, group.name + ".png" ) )
+
+ def print_rules( self, rules, file ):
+ for selectors, properties in rules:
+ file.write( ",".join( selectors ) )
+ file.write( "{" )
+ for name, value in properties:
+ file.write( "%s:%s;" % ( name, value ) )
+ file.write( "}\n" )
+
+def main():
+
+ # Read variable definitions from a (sorta) ini file
+ context = dict()
+ for line in open( sys.argv[1] ):
+ if line.startswith( '#' ):
+ continue
+ key, value = line.rstrip("\r\n").split( '=' )
+ if value.startswith( '"' ) and value.endswith( '"' ):
+ value = value[1:-1]
+ context[key] = value
+
+ image_dir = sys.argv[2]
+
+ try:
+
+ processor = CSSProcessor()
+ processor.process( sys.stdin, sys.stdout, context, image_dir )
+
+ except ParseException, e:
+
+ print >> sys.stderr, "Error:", e
+ print >> sys.stderr, e.markInputline()
+ sys.exit( 1 )
+
+
+if __name__ == "__main__":
+ main()
diff -r 0564441c5043 -r 3d4d44d7a275 templates/base_panels.mako
--- a/templates/base_panels.mako Fri Jul 24 15:13:11 2009 -0400
+++ b/templates/base_panels.mako Fri Jul 24 16:14:46 2009 -0400
@@ -20,7 +20,7 @@
## Default stylesheets
<%def name="stylesheets()">
- <link rel="stylesheet" type="text/css" href="${h.url_for('/static/style/reset.css')}" />
+ ## <link rel="stylesheet" type="text/css" href="${h.url_for('/static/style/reset.css')}" />
<link rel="stylesheet" type="text/css" href="${h.url_for('/static/style/panel_layout.css')}" />
<style type="text/css">
#center {
@@ -287,6 +287,7 @@
</head>
<body scroll="no" class="${self.body_class}">
+ <div id="everything" style="position: absolute; width: 100%; height: 100%; min-width: 960px; min-height: 400px;">
## Background displays first
<div id="background"></div>
## Layer iframes over backgrounds
@@ -316,6 +317,7 @@
${self.right_panel()}
</div>
%endif
+ </div>
## Allow other body level elements
</body>
## Scripts can be loaded later since they progressively add features to
diff -r 0564441c5043 -r 3d4d44d7a275 templates/root/history.mako
--- a/templates/root/history.mako Fri Jul 24 15:13:11 2009 -0400
+++ b/templates/root/history.mako Fri Jul 24 16:14:46 2009 -0400
@@ -13,17 +13,10 @@
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Pragma" content="no-cache">
-<link href="${h.url_for('/static/style/base.css')}" rel="stylesheet" type="text/css" />
-<link href="${h.url_for('/static/style/history.css')}" rel="stylesheet" type="text/css" />
-## <!--[if lt IE 7]>
-## <script defer type="text/javascript" src="/static/scripts/ie_pngfix.js"></script>
-## <![endif]-->
-
-<script type="text/javascript" src="${h.url_for('/static/scripts/jquery.js')}"></script>
-<script type="text/javascript" src="${h.url_for('/static/scripts/jquery.cookie.js')}"></script>
-<script type="text/javascript" src="${h.url_for('/static/scripts/cookie_set.js')}"></script>
-
+${h.css( "base", "history" )}
+${h.js( "jquery", "jquery.cookie", "cookie_set" )}
+
<script type="text/javascript">
$( document ).ready( function() {
initShowHide();
@@ -86,7 +79,7 @@
//' Functionized so AJAX'd datasets can call them
// Get shown/hidden state from cookie
function initShowHide() {
- $( "div.historyItemBody" ).hide();
+ // $( "div.historyItemBody" ).hide();
// Load saved state and show as neccesary
var state = new CookieSet( "galaxy.history.expand_state" );
for ( id in state.store ) {
@@ -128,10 +121,10 @@
return false;
});
// Delete link
- $(this).find( "a.historyItemDelete" ).each( function() {
+ $(this).find( "div.historyItemButtons > .delete" ).each( function() {
var data_id = this.id.split( "-" )[1];
$(this).click( function() {
- $( '#progress-' + data_id ).show();
+ $( '#historyItem-' + data_id + "> div.historyItemTitleBar" ).addClass( "spinner" );
$.ajax({
url: "${h.url_for( action='delete_async', id='XXX' )}".replace( 'XXX', data_id ),
error: function() { alert( "Delete failed" ) },
@@ -157,7 +150,7 @@
$(this).find( "a.historyItemUndelete" ).each( function() {
var data_id = this.id.split( "-" )[1];
$(this).click( function() {
- $( '#progress-' + data_id ).show();
+ $( '#historyItem-' + data_id + " > div.historyItemTitleBar" ).addClass( "spinner" );
$.ajax({
url: "${h.url_for( controller='dataset', action='undelete_async', id='XXX' )}".replace( 'XXX', data_id ),
error: function() { alert( "Undelete failed" ) },
@@ -228,24 +221,19 @@
};
</script>
-<![if gte IE 7]>
-<script type="text/javascript">
- $( document ).ready( function() {
- // Add rollover effect to any image with a 'rollover' attribute
- preload_images = {}
- $( "img[rollover]" ).each( function() {
- var r = $(this).attr('rollover');
- var s = $(this).attr('src');
- preload_images[r] = true;
- $(this).hover(
- function() { $(this).attr( 'src', r ) },
- function() { $(this).attr( 'src', s ) }
- )
- })
- for ( r in preload_images ) { $( "<img>" ).attr( "src", r ) }
- })
-</script>
-<![endif]>
+<style>
+.historyItemBody {
+ display: none;
+}
+</style>
+
+<noscript>
+<style>
+.historyItemBody {
+ display: block;
+}
+</style>
+</noscript>
</head>
@@ -259,7 +247,7 @@
</div>
<div id="history-name-area" class="historyLinks" style="color: gray; font-weight: bold;">
- <div style="float: right"><a id="history-rename" target="galaxy_main" href="${h.url_for( controller='history', action='rename' )}"><img src="${h.url_for('/static/images/pencil_icon.png')}"></a></div>
+ <div style="float: right"><a id="history-rename" title="Rename" class="icon-button edit" target="galaxy_main" href="${h.url_for( controller='history', action='rename' )}"></a></div>
<div id="history-name">${history.name}</div>
</div>
diff -r 0564441c5043 -r 3d4d44d7a275 templates/root/history_common.mako
--- a/templates/root/history_common.mako Fri Jul 24 15:13:11 2009 -0400
+++ b/templates/root/history_common.mako Fri Jul 24 16:14:46 2009 -0400
@@ -18,29 +18,21 @@
<strong>This dataset has been deleted. Click <a href="${h.url_for( controller='dataset', action='undelete', id=data.id )}" class="historyItemUndelete" id="historyItemUndeleter-${data.id}" target="galaxy_history">here</a> to undelete.</strong>
</div>
%endif
+
## Header row for history items (name, state, action buttons)
- <div style="overflow: hidden;" class="historyItemTitleBar">
- <div style="float: left; padding-right: 3px;">
- <div style='display: none;' id="progress-${data.id}">
- <img src="${h.url_for('/static/style/data_running.gif')}" border="0" align="middle" >
- </div>
- %if data_state == 'running':
- <div><img src="${h.url_for('/static/style/data_running.gif')}" border="0" align="middle"></div>
- %elif data_state == 'upload':
- <div><img src="${h.url_for('/static/style/data_upload.gif')}" border="0" align="middle"></div>
- %elif data_state != 'ok':
- <div><img src="${h.url_for( "/static/style/data_%s.png" % data_state )}" border="0" align="middle"></div>
- %endif
- </div>
- <div style="float: right;">
+ <div style="overflow: hidden;" class="historyItemTitleBar">
+ <div class="historyItemButtons">
%if data_state == "upload":
- <img src="${h.url_for('/static/images/eye_icon_grey.png')}" width='16' height='16' alt='display data' title='display data' class='displayButton' border='0'>
- <img src="${h.url_for('/static/images/pencil_icon_grey.png')}" width='16' height='16' alt='edit attributes' title='edit attributes' class='editButton' border='0'>
+ ## TODO: Make these CSS, just adding a "disabled" class to the normal
+ ## links should be enough. However the number of datasets being uploaded
+ ## at a time is usually small so the impact of these images is also small.
+ <img src="${h.url_for('/static/images/eye_icon_grey.png')}" width='16' height='16' alt='display data' title='display data' class='button display' border='0'>
+ <img src="${h.url_for('/static/images/pencil_icon_grey.png')}" width='16' height='16' alt='edit attributes' title='edit attributes' class='button edit' border='0'>
%else:
- <a href="${h.url_for( controller='dataset', dataset_id=data.id, action='display', filename='index')}" target="galaxy_main"><img src="${h.url_for('/static/images/eye_icon.png')}" rollover="${h.url_for('/static/images/eye_icon_dark.png')}" width='16' height='16' alt='display data' title='display data' class='displayButton' border='0'></a>
- <a href="${h.url_for( controller='root', action='edit', id=data.id )}" target="galaxy_main"><img src="${h.url_for('/static/images/pencil_icon.png')}" rollover="${h.url_for('/static/images/pencil_icon_dark.png')}" width='16' height='16' alt='edit attributes' title='edit attributes' class='editButton' border='0'></a>
+ <a class="icon-button display" title="display data" href="${h.url_for( controller='dataset', dataset_id=data.id, action='display', filename='index')}" target="galaxy_main"></a>
+ <a class="icon-button edit" title="edit attributes" href="${h.url_for( controller='root', action='edit', id=data.id )}" target="galaxy_main"></a>
%endif
- <a href="${h.url_for( action='delete', id=data.id, show_deleted_on_refresh=show_deleted_on_refresh )}" class="historyItemDelete" id="historyItemDeleter-${data.id}"><img src="${h.url_for('/static/images/delete_icon.png')}" rollover="${h.url_for('/static/images/delete_icon_dark.png')}" width='16' height='16' alt='delete' class='deleteButton' border='0'></a>
+ <a class="icon-button delete" title="delete" href="${h.url_for( action='delete', id=data.id, show_deleted_on_refresh=show_deleted_on_refresh )}" id="historyItemDeleter-${data.id}"></a>
</div>
<span class="historyItemTitle"><b>${hid}: ${data.display_name()}</b></span>
</div>
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/0d7a8525da9e
changeset: 2501:0d7a8525da9e
user: James Taylor <james(a)jamestaylor.org>
date: Fri Jul 24 16:26:32 2009 -0400
description:
Fixes and missed files for CSS
5 file(s) affected in this change:
static/june_2007_style/blue/base.css
static/june_2007_style/blue/history-buttons.png
static/june_2007_style/blue/history-states.png
static/june_2007_style/blue/history.css
static/june_2007_style/process_css.py
diffs (43 lines):
diff -r 3d4d44d7a275 -r 0d7a8525da9e static/june_2007_style/blue/base.css
--- a/static/june_2007_style/blue/base.css Fri Jul 24 16:14:46 2009 -0400
+++ b/static/june_2007_style/blue/base.css Fri Jul 24 16:26:32 2009 -0400
@@ -84,11 +84,8 @@
div.popupmenu{display:none;background:#eeeeee;color:#333;font-size:110%;font-weight:bold;font-style:normal;white-space:nowrap;position:absolute;z-index:20000;border:solid #aaaaaa 1px;padding:3px 0;-moz-border-radius:0.5em;-webkit-border-radius:0.5em;border-radius:0.5em;user-select:none;-moz-user-select:none;-webkit-user-select:none;}
div.popupmenu-item{padding:3px 1em;cursor:pointer;}
div.popupmenu-item:hover{background:#aaaaaa;}
-.popup-arrow{font-size:80%;cursor:pointer;text-decoration:none;color:#555
-}
-
-.popup-arrow:hover {
- color: black;}
+.popup-arrow{font-size:80%;cursor:pointer;text-decoration:none;color:#555;}
+.popup-arrow:hover{color:black;}
div.permissionContainer{padding-left:20px;}
.grid-header{padding-bottom:1em;}
.grid-header h2{margin:0;margin-bottom:0.5em;}
diff -r 3d4d44d7a275 -r 0d7a8525da9e static/june_2007_style/blue/history-buttons.png
Binary file static/june_2007_style/blue/history-buttons.png has changed
diff -r 3d4d44d7a275 -r 0d7a8525da9e static/june_2007_style/blue/history-states.png
Binary file static/june_2007_style/blue/history-states.png has changed
diff -r 3d4d44d7a275 -r 0d7a8525da9e static/june_2007_style/blue/history.css
--- a/static/june_2007_style/blue/history.css Fri Jul 24 16:14:46 2009 -0400
+++ b/static/june_2007_style/blue/history.css Fri Jul 24 16:26:32 2009 -0400
@@ -1,5 +1,5 @@
body{background:#C1C9E5;color:#303030;background-image:url(menu_bg.png);background-repeat:repeat-x;background-position:top;margin:5px;border:0;padding:0;}
-a{color:#base_text;}
+a{color:#303030;}
div.historyLinks{padding:5px;margin:5px 0 5px 0;}
div.historyItem{margin:5px -5px 5px 0px;padding:5px 11px 5px 5px;border:solid #888888 1px;border-left:solid #888888 5px;border-right:none;background:#EEEEEE;}
div.historyItem div.historyItemTitleBar{padding-left:20px;background-position:0 1px;background-repeat:no-repeat;}
diff -r 3d4d44d7a275 -r 0d7a8525da9e static/june_2007_style/process_css.py
--- a/static/june_2007_style/process_css.py Fri Jul 24 16:14:46 2009 -0400
+++ b/static/june_2007_style/process_css.py Fri Jul 24 16:26:32 2009 -0400
@@ -11,7 +11,7 @@
import sys, string, os.path
from pyparsing import *
-from galaxy.util.odict import odict
+from odict import odict
import Image
def cross_lists(*sets):
1
0
29 Jul '09
details: http://www.bx.psu.edu/hg/galaxy/rev/0564441c5043
changeset: 2499:0564441c5043
user: Kelly Vincent <kpvincent(a)bx.psu.edu>
date: Fri Jul 24 15:13:11 2009 -0400
description:
Added BWA wrapper tool to Short Read Mapping Tools
5 file(s) affected in this change:
tool-data/sequence_index_base.loc.sample
tool-data/sequence_index_color.loc.sample
tool_conf.xml.sample
tools/sr_mapping/bwa_wrapper.py
tools/sr_mapping/bwa_wrapper.xml
diffs (614 lines):
diff -r 643e3cd86e0b -r 0564441c5043 tool-data/sequence_index_base.loc.sample
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool-data/sequence_index_base.loc.sample Fri Jul 24 15:13:11 2009 -0400
@@ -0,0 +1,28 @@
+#This is a sample file distributed with Galaxy that enables tools
+#to use a directory of BWA indexed sequences data files. You will need
+#to create these data files and then create a sequence_index_base.loc file
+#similar to this one (store it in this directory ) that points to
+#the directories in which those files are stored. The sequence_index_base.loc
+#file has this format (white space characters are TAB characters):
+#
+#<build> <file_base>
+#
+#So, for example, if you had phiX indexed stored in
+#/depot/data2/galaxy/phiX/base/,
+#then the sequence_index_base.loc entry would look like this:
+#
+#phiX /depot/data2/galaxy/phiX/base/phiX.fa
+#
+#and your /depot/data2/galaxy/phiX/base/ directory
+#would contain phiX.fa.* files:
+#
+#-rw-r--r-- 1 james universe 830134 2005-09-13 10:12 phiX.fa.amb
+#-rw-r--r-- 1 james universe 527388 2005-09-13 10:12 phiX.fa.ann
+#-rw-r--r-- 1 james universe 269808 2005-09-13 10:12 phiX.fa.bwt
+#...etc...
+#
+#Your sequence_index_base.loc file should include an entry per line for
+#each index set you have stored. The "file" in the path does not actually
+#exist, but it is the prefix for the actual index files. For example:
+#
+#phiX /depot/data2/galaxy/phiX/base/phiX.fa
diff -r 643e3cd86e0b -r 0564441c5043 tool-data/sequence_index_color.loc.sample
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool-data/sequence_index_color.loc.sample Fri Jul 24 15:13:11 2009 -0400
@@ -0,0 +1,28 @@
+#This is a sample file distributed with Galaxy that enables tools
+#to use a directory of BWA indexed sequences data files. You will need
+#to create these data files and then create a sequence_index_color.loc file
+#similar to this one (store it in this directory ) that points to
+#the directories in which those files are stored. The sequence_index_color.loc
+#file has this format (white space characters are TAB characters):
+#
+#<build> <file_base>
+#
+#So, for example, if you had phiX indexed stored in
+#/depot/data2/galaxy/phiX/color/,
+#then the sequence_index_color.loc entry would look like this:
+#
+#phiX /depot/data2/galaxy/phiX/color/phiX.fa
+#
+#and your /depot/data2/galaxy/phiX/color/ directory
+#would contain phiX.fa.* files:
+#
+#-rw-r--r-- 1 james universe 830134 2005-09-13 10:12 phiX.fa.amb
+#-rw-r--r-- 1 james universe 527388 2005-09-13 10:12 phiX.fa.ann
+#-rw-r--r-- 1 james universe 269808 2005-09-13 10:12 phiX.fa.bwt
+#...etc...
+#
+#Your sequence_index_color.loc file should include an entry per line for
+#each index set you have stored. The "file" in the path does not actually
+#exist, but it is the prefix for the actual index files. For example:
+#
+#phiX /depot/data2/galaxy/phiX/color/phiX.fa
diff -r 643e3cd86e0b -r 0564441c5043 tool_conf.xml.sample
--- a/tool_conf.xml.sample Fri Jul 24 12:16:32 2009 -0400
+++ b/tool_conf.xml.sample Fri Jul 24 15:13:11 2009 -0400
@@ -329,8 +329,9 @@
<tool file="metag_tools/megablast_xml_parser.xml" />
<tool file="metag_tools/blat_wrapper.xml" />
<tool file="metag_tools/mapping_to_ucsc.xml" />
+ <tool file="sr_mapping/bwa_wrapper.xml" />
</section>
<section name="Tracks" id="tracks">
<tool file="visualization/genetrack.xml" />
- </section>
+ </section>
</toolbox>
diff -r 643e3cd86e0b -r 0564441c5043 tools/sr_mapping/bwa_wrapper.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/sr_mapping/bwa_wrapper.py Fri Jul 24 15:13:11 2009 -0400
@@ -0,0 +1,119 @@
+#! /usr/bin/python
+
+"""
+Runs BWA on single-end or paired-end data.
+Produces a SAM file containing the mappings.
+
+usage: python bwa_wrapper.py reference_sequence indexing_algorithm(is_or_bwtsw) forward_fastq_file reverse_fastq_file(or_None) output alignment_type(single_or_paired) parameters(pre_set_or_full) file_type(solexa_or_solid) file_source(indexed_or_history) maxEditDist fracMissingAligns maxGapOpens maxGapExtens disallowLongDel disallowIndel seed maxEditDistSeed numThreads mismatchPenalty gapOpenPenalty gapExtensPenalty colorSpaceRev suboptAlign noIterSearch outputTopN maxInsertSize maxOccurPairing\nThe last eighteen need to all be specified, or all be None
+"""
+
+import optparse, os, sys, tempfile
+
+def stop_err( msg ):
+ sys.stderr.write( "%s\n" % msg )
+ sys.exit()
+
+def __main__():
+ #Parse Command Line
+ parser = optparse.OptionParser()
+ parser.add_option('', '--ref', dest='ref', help='The reference genome to use or index')
+ parser.add_option('', '--indexingAlg', dest='indexingAlg', help='The algorithm to use while indexing')
+ parser.add_option('', '--fastq', dest='fastq', help='The (forward) fastq file to use for the mapping')
+ parser.add_option('', '--rfastq', dest='rfastq', help='The reverse fastq file to use for mapping if paired-end data')
+ parser.add_option('', '--output', dest='output', help='The file to save the output (SAM format)')
+ parser.add_option('', '--genAlignType', dest='genAlignType', help='The type of pairing (single or paired)')
+ parser.add_option('', '--params', dest='params', help='Parameter setting to use (pre_set or full)')
+ parser.add_option('', '--fileType', dest='fileType', help='Type of reference sequence file (solid or solexa)')
+ parser.add_option('', '--fileSource', dest='fileSource', help='Whether to use a previously indexed reference sequence or one form history (indexed or history)')
+ parser.add_option('-n', '--maxEditDist', dest='maxEditDist', help='Maximum edit distance if integer')
+ parser.add_option('', '--fracMissingAligns', dest='fracMissingAligns', help='Fraction of missing alignments given 2% uniform base error rate if fraction')
+ parser.add_option('-o', '--maxGapOpens', dest='maxGapOpens', help='Maximum number of gap opens')
+ parser.add_option('-e', '--maxGapExtens', dest='maxGapExtens', help='Maximum number of gap extensions')
+ parser.add_option('-d', '--disallowLongDel', dest='disallowLongDel', help='Disallow a long deletion within specified bps')
+ parser.add_option('-i', '--disallowIndel', dest='disallowIndel', help='Disallow indel within specified bps')
+ parser.add_option('-l', '--seed', dest='seed', help='Take the first specified subsequences')
+ parser.add_option('-k', '--maxEditDistSeed', dest='maxEditDistSeed', help='Maximum edit distance to the seed')
+ parser.add_option('-t', '--numThreads', dest='numThreads', help='Number of threads')
+ parser.add_option('-M', '--mismatchPenalty', dest='mismatchPenalty', help='Mismatch penalty')
+ parser.add_option('-O', '--gapOpenPenalty', dest='gapOpenPenalty', help='Gap open penalty')
+ parser.add_option('-E', '--gapExtensPenalty', dest='gapExtensPenalty', help='Gap extension penalty')
+ parser.add_option('-c', '--colorSpaceRev', dest='colorSpaceRev', help="Reverse query but don't complement it")
+ parser.add_option('-R', '--suboptAlign', dest='suboptAlign', help='Proceed with suboptimal alignments even if the top hit is a repeat')
+ parser.add_option('-N', '--noIterSearch', dest='noIterSearch', help='Disable iterative search')
+ parser.add_option('', '--outputTopN', dest='outputTopN', help='Output top specified hits')
+ parser.add_option('', '--maxInsertSize', dest='maxInsertSize', help='Maximum insert size for a read pair to be considered mapped good')
+ parser.add_option('', '--maxOccurPairing', dest='maxOccurPairing', help='Maximum occurrences of a read for pairings')
+ (options, args) = parser.parse_args()
+
+ # index if necessary
+ if options.fileSource == 'history':
+ # make temp directory for placement of indices and copy reference file there
+ tmp_dir = tempfile.gettempdir()
+ try:
+ os.system('cp %s %s' % (options.ref, tmp_dir))
+ except Exception, erf:
+ stop_err('Error creating temp directory for indexing purposes\n' + str(erf))
+ if options.fileType == 'solid':
+ indexing_cmds = '-c -a %s' % options.indexingAlg
+ else:
+ indexing_cmds = '-a %s' % options.indexingAlg
+ options.ref = os.path.join(tmp_dir,os.path.split(options.ref)[1])
+ cmd1 = 'bwa index %s %s 2> /dev/null' % (indexing_cmds, options.ref)
+ try:
+ os.system(cmd1)
+ except Exception, erf:
+ stop_err('Error indexing reference sequence\n' + str(erf))
+
+ # set up aligning and generate aligning command options
+ if options.params == 'pre_set':
+ if options.fileType == 'solid':
+ aligning_cmds = '-c'
+ else:
+ aligning_cmds = ''
+ gen_alignment_cmds = ''
+ else:
+ aligning_cmds = '-n %s -o %s -e %s -d %s -i %s %s -k %s -t %s -M %s -O %s -E %s %s %s %s' % \
+ ((options.fracMissingAligns, options.maxEditDist)[options.maxEditDist != '0'],
+ options.maxGapOpens, options.maxGapExtens, options.disallowLongDel,
+ options.disallowIndel, ('',' -l %s'%options.seed)[options.seed!=-1],
+ options.maxEditDistSeed, options.numThreads, options.mismatchPenalty,
+ options.gapOpenPenalty, options.gapExtensPenalty, ('',' -c')[options.colorSpaceRev=='true'],
+ ('',' -R')[options.suboptAlign=='true'], ('',' -N')[options.noIterSearch=='true'])
+ if options.genAlignType == 'single':
+ gen_alignment_cmds = '-n %s' % options.outputTopN
+ elif options.genAlignType == 'paired':
+ gen_alignment_cmds = '-a %s -o %s' % (options.maxInsertSize, options.maxOccurPairing)
+
+ # set up output file
+ file(options.output,'w').write('QNAME\tFLAG\tRNAME\tPOS\tMAPQ\tCIGAR\tMRNM\tMPOS\tISIZE\tSEQ\tQUAL\tOPT\n')
+ tmp_align_out = tempfile.NamedTemporaryFile()
+
+ # prepare actual aligning and generate aligning commands
+ cmd2 = 'bwa aln %s %s %s > %s 2> /dev/null' % (aligning_cmds, options.ref, options.fastq, tmp_align_out.name)
+ cmd2b = ''
+ if options.genAlignType == 'paired':
+ tmp_align_out2 = tempfile.NamedTemporaryFile()
+ cmd2b = 'bwa aln %s %s %s > %s 2> /dev/null' % (aligning_cmds, options.ref, options.rfastq, tmp_align_out2.name)
+ cmd3 = 'bwa sampe %s %s %s %s %s %s >> %s 2> /dev/null' % (gen_alignment_cmds, options.ref, tmp_align_out.name, tmp_align_out2.name, options.fastq, options.rfastq, options.output)
+ else:
+ cmd3 = 'bwa samse %s %s %s %s >> %s 2> /dev/null' % (gen_alignment_cmds, options.ref, tmp_align_out.name, options.fastq, options.output)
+
+ # align
+ try:
+ os.system(cmd2)
+ except Exception, erf:
+ stop_err("Error aligning sequence\n" + str(erf))
+ # and again if paired data
+ try:
+ if cmd2b:
+ os.system(cmd2b)
+ except Exception, erf:
+ stop_err("Error aligning second sequence\n" + str(erf))
+
+ # generate align
+ try:
+ os.system(cmd3)
+ except Exception, erf:
+ stop_err("Error sequence aligning sequence\n" + str(erf))
+
+if __name__=="__main__": __main__()
diff -r 643e3cd86e0b -r 0564441c5043 tools/sr_mapping/bwa_wrapper.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/sr_mapping/bwa_wrapper.xml Fri Jul 24 15:13:11 2009 -0400
@@ -0,0 +1,409 @@
+<tool id="bwa_wrapper" name="BWA" version="1.0.0">
+ <description> fast mapping of reads against reference sequence</description>
+ <command interpreter="python">
+ bwa_wrapper.py
+ #if $solidOrSolexa.solidRefGenomeSource.refGenomeSource == "history":
+ --ref=$solidOrSolexa.solidRefGenomeSource.ownFile
+ --indexingAlg=$solidOrSolexa.solidRefGenomeSource.algorithm
+ #else:
+ --ref=$solidOrSolexa.solidRefGenomeSource.indices.value
+ --indexingAlg="None"
+ #end if
+ --fastq=$paired.input1
+ #if $paired.sPaired == "paired":
+ --rfastq=$paired.input2
+ #else:
+ --rfastq="None"
+ #end if
+ --output=$output
+ --genAlignType=$paired.sPaired
+ --params=$params.source_select
+ --fileType=$solidOrSolexa.solidSolexa
+ --fileSource=$solidOrSolexa.solidRefGenomeSource.refGenomeSource
+ #if $params.source_select == "pre_set":
+ --maxEditDist="None"
+ --fracMissingAligns="None"
+ --maxGapOpens="None"
+ --maxGapExtens="None"
+ --disallowLongDel="None"
+ --disallowIndel="None"
+ --seed="None"
+ --maxEditDistSeed="None"
+ --numThreads="None"
+ --mismatchPenalty="None"
+ --gapOpenPenalty="None"
+ --gapExtensPenalty="None"
+ --colorSpaceRev="None"
+ --suboptAlign="None"
+ --noIterSearch="None"
+ --outputTopN="None"
+ --maxInsertSize="None"
+ --maxOccurPairing="None"
+ #else:
+ --maxEditDist=$params.maxEditDist
+ --fracMissingAligns=$params.fracMissingAligns
+ --maxGapOpens=$params.maxGapOpens
+ --maxGapExtens=$params.maxGapExtens
+ --disallowLongDel=$params.disallowLongDel
+ --disallowIndel=$params.disallowIndel
+ --seed=$params.seed
+ --maxEditDistSeed=$params.maxEditDistSeed
+ --numThreads=$params.numThreads
+ --mismatchPenalty=$params.mismatchPenalty
+ --gapOpenPenalty=$params.gapOpenPenalty
+ --gapExtensPenalty=$params.gapExtensPenalty
+ --colorSpaceRev=$params.colorSpaceRev
+ --suboptAlign=$params.suboptAlign
+ --noIterSearch=$params.noIterSearch
+ --outputTopN=$params.outputTopN
+ --maxInsertSize=$params.maxInsertSize
+ --maxOccurPairing=$params.maxOccurPairing
+ #end if
+ </command>
+ <inputs>
+ <conditional name="solidOrSolexa">
+ <param name="solidSolexa" type="select" label="Select SOLiD or Solexa format for the original dataset">
+ <option value="solexa">Solexa</option>
+ <option value="solid">SOLiD</option>
+ </param>
+ <when value="solid">
+ <conditional name="solidRefGenomeSource">
+ <param name="refGenomeSource" type="select" label="Will you select a reference genome from your history or use a built-in index?">
+ <option value="indexed">Use a built-in index</option>
+ <option value="history">Use one from the history</option>
+ </param>
+ <when value="history">
+ <param name="ownFile" type="data" label="Select a reference genome" />
+ <param name="algorithm" type="select" label="Select an indexing algorithm" help="IS works on databses 2GB or less, and is linear-time. BWT-SW works on database 10MB and larger, and trades speed for memory.">
+ <option value="is">IS</option>
+ <option value="bwtsw">BWT-SW</option>
+ </param>
+ </when>
+ <when value="indexed">
+ <param name="indices" type="select" label="Select a reference genome">
+ <options from_file="sequence_index_color.loc">
+ <column name="value" index="1" />
+ <column name="name" index="0" />
+ <filter type="sort_by" column="0" />
+ </options>
+ </param>
+ </when>
+ </conditional>
+ </when>
+ <when value="solexa">
+ <conditional name="solidRefGenomeSource">
+ <param name="refGenomeSource" type="select" label="Will you select a reference genome from your history or use a built-in index?">
+ <option value="indexed">Use a built-in index</option>
+ <option value="history">Use one from the history</option>
+ </param>
+ <when value="history">
+ <param name="ownFile" type="data" label="Select a reference genome" />
+ <param name="algorithm" type="select" label="Select an indexing algorithm" help="IS works on databses 2GB or less, and is linear-time. BWT-SW works on database 10MB and larger, and trades speed for memory.">
+ <option value="is">IS</option>
+ <option value="bwtsw">BWT-SW</option>
+ </param>
+ </when>
+ <when value="indexed">
+ <param name="indices" type="select" label="Select a reference genome">
+ <options from_file="sequence_index_base.loc">
+ <column name="value" index="1" />
+ <column name="name" index="0" />
+ <filter type="sort_by" column="0" />
+ </options>
+ </param>
+ </when>
+ </conditional>
+ </when>
+ </conditional>
+ <conditional name="paired">
+ <param name="sPaired" type="select" label="Is this library mate-paired?">
+ <option value="single">Single-end</option>
+ <option value="paired">Paired-end</option>
+ </param>
+ <when value="single">
+ <param name="input1" type="data" label="FASTQ file" />
+ </when>
+ <when value="paired">
+ <param name="input1" type="data" label="Forward FASTQ file" />
+ <param name="input2" type="data" label="Reverse FASTQ file" />
+ </when>
+ </conditional>
+ <conditional name="params">
+ <param name="source_select" type="select" label="BWA settings to use" help="For most mapping needs use Commonly used settings. If you want full control use Full List">
+ <option value="pre_set">Commonly used</option>
+ <option value="full">Full Parameter List</option>
+ </param>
+ <when value="pre_set" />
+ <when value="full">
+ <param name="maxEditDist" type="integer" value="0" label="Maximum edit distance" help="Enter this value OR a fraction of missing alignments, not both" />
+ <param name="fracMissingAligns" type="float" value="0.04" label="Fraction of missing alignments given 2% uniform base error rate" help="Enter this value OR maximum edit distance, not both" />
+ <param name="maxGapOpens" type="integer" value="1" label="Maximum number of gap opens" />
+ <param name="maxGapExtens" type="integer" value="-1" label="Maximum number of gap extensions" help="-1 for k-difference mode (disallowing long gaps)" />
+ <param name="disallowLongDel" type="integer" value="16" label="Disallow long deletion within [value] towards the 3'-end" />
+ <param name="disallowIndel" type="integer" value="5" label="Disallow insertion/deletion within [value] bp towards the end" />
+ <param name="seed" type="integer" value="-1" label="Number of first subsequences to take as seed" help="Enter -1 for infinity" />
+ <param name="maxEditDistSeed" type="integer" value="2" label="Maximum edit distance in the seed" />
+ <param name="numThreads" type="integer" value="1" label="Number of threads, in multi-threading mode" />
+ <param name="mismatchPenalty" type="integer" value="3" label="Mismatch penalty" help="BWA will not search for suboptimal hits with a score lower than [value]" />
+ <param name="gapOpenPenalty" type="integer" value="1" label="Gap open penalty" />
+ <param name="gapExtensPenalty" type="integer" value="4" label="Gap extension penalty" />
+ <param name="colorSpaceRev" type="select" label="Reverse query but don't compement it" help="Reverse query for all alignment in color space">
+ <option value="false">Don't reverse query</option>
+ <option value="true">Reverse query</option>
+ </param>
+ <param name="suboptAlign" type="boolean" truevalue="true" falsevalue="false" checked="no" label="Proceed with suboptimal alignments even if the top hit is a repeat" help="By default, BWA only searches for suboptimal alignments if the top hit is unique. Using this option has no effect on accuracy for single-end reads. It is mainly designed for improving the alignment accuracy of paired-end reads. However, the pairing procedure will be slowed down, especially for very short reads (~32bp)" />
+ <param name="noIterSearch" type="boolean" truevalue="true" falsevalue="false" checked="no" label="Disable iterative search" help="All hits with no more than maxDiff differences will be found. This mode is much slower than the default." />
+ <param name="outputTopN" type="integer" value="-1" label="Output top [value] hits" help="For single-end reads only. Enter -1 to disable outputting multiple hits" />
+ <param name="maxInsertSize" type="integer" value="500" label="Maximum insert size for a read pair to be considered as being mapped properly" help="For paired-end reads only. Only used when there are not enough good alignment to infer the distribution of insert sizes" />
+ <param name="maxOccurPairing" type="integer" value="100000" label="Maximum occurrences of a read for pairing" help="For paired-end reads only. A read with more occurrences will be treated as a single-end read. Reducing this parameter helps faster pairing" />
+ </when>
+ </conditional>
+ </inputs>
+ <outputs>
+ <data format="tabular" name="output" />
+ </outputs>
+<!-- Tests all fail because of problem with nested conditionals in test framework
+ <tests>
+ <test>
+ <param name="solidSolexa" value="solexa" />
+ <param name="refGenomeSource" value="indexed" />
+ <param name="indices" value="phiX" />
+ <param name="sPaired" value="single" />
+ <param name="input1" value="bwa_phiX_sanger.fastq" />
+ <param name="source_select" value="pre_set" />
+ <output name="output" file="bwa_wrapper_out0.tabular" />
+ </test>
+ <test>
+ <param name="solidSolexa" value="solid" />
+ <param name="refGenomeSource" value="history" />
+ <param name="ownFile" value="phiX.fa" />
+ <param name="algorithm" value="is" />
+ <param name="sPaired" value="single" />
+ <param name="input1" value="bwa_phiX_sanger.fastq" />
+ <param name="source_select" value="pre_set" />
+ <output name="output" file="bwa_wrapper_out0b.tabular" />
+ </test>
+ <test>
+ <param name="solidSolexa" value="solid" />
+ <param name="refGenomeSource" value="indexed" />
+ <param name="indices" value="phiX" />
+ <param name="sPaired" value="single" />
+ <param name="input1" value="bwa_solid.fastq" />
+ <param name="source_select" value="full" />
+ <param name="maxEditDist" value="0" />
+ <param name="fracMissingAligns" value="0.04" />
+ <param name="maxGapOpens" value="1" />
+ <param name="maxGapExtens" value="-1" />
+ <param name="disallowLongDel" value="16" />
+ <param name="disallowIndel" value="5" />
+ <param name="seed" value="-1" />
+ <param name="maxEditDistSeed" value="2" />
+ <param name="numThreads" value="1" />
+ <param name="mismatchPenalty" value="3" />
+ <param name="gapOpenPenalty" value="1" />
+ <param name="gapExtensPenalty" value="4" />
+ <param name="colorSpaceRev" value="true" />
+ <param name="suboptAlign" value="true" />
+ <param name="noIterSearch" value="true" />
+ <param name="outputTopN" value="-1" />
+ <param name="maxInsertSize" value="500" />
+ <param name="maxOccurPairing" value="100000" />
+ <output name="output" file="bwa_wrapper_out1.tabular" />
+ </test>
+ <test>
+ <param name="solidSolexa" value="solid" />
+ <param name="refGenomeSource" value="indexed" />
+ <param name="indices" value="phiX" />
+ <param name="sPaired" value="paired" />
+ <param name="input1" value="bwa_solid_f.fastq" />
+ <param name="input2" value="bwa_solid_r.fastq" />
+ <param name="source_select" value="full" />
+ <param name="maxEditDist" value="0" />
+ <param name="fracMissingAligns" value="0.04" />
+ <param name="maxGapOpens" value="1" />
+ <param name="maxGapExtens" value="-1" />
+ <param name="disallowLongDel" value="16" />
+ <param name="disallowIndel" value="5" />
+ <param name="seed" value="-1" />
+ <param name="maxEditDistSeed" value="2" />
+ <param name="numThreads" value="1" />
+ <param name="mismatchPenalty" value="3" />
+ <param name="gapOpenPenalty" value="1" />
+ <param name="gapExtensPenalty" value="4" />
+ <param name="colorSpaceRev" value="true" />
+ <param name="suboptAlign" value="true" />
+ <param name="noIterSearch" value="true" />
+ <param name="outputTopN" value="-1" />
+ <param name="maxInsertSize" value="500" />
+ <param name="maxOccurPairing" value="100000" />
+ <output name="output" file="bwa_wrapper_out2.tabular" />
+ </test>
+ <test>
+ <param name="solidSolexa" value="solexa" />
+ <param name="refGenomeSource" value="indexed" />
+ <param name="indices" value="phiX" />
+ <param name="sPaired" value="single" />
+ <param name="input1" value="bwa_phiX_sanger.fastq" />
+ <param name="source_select" value="full" />
+ <param name="maxEditDist" value="0" />
+ <param name="fracMissingAligns" value="0.04" />
+ <param name="maxGapOpens" value="1" />
+ <param name="maxGapExtens" value="-1" />
+ <param name="disallowLongDel" value="16" />
+ <param name="disallowIndel" value="5" />
+ <param name="seed" value="-1" />
+ <param name="maxEditDistSeed" value="2" />
+ <param name="numThreads" value="1" />
+ <param name="mismatchPenalty" value="3" />
+ <param name="gapOpenPenalty" value="1" />
+ <param name="gapExtensPenalty" value="4" />
+ <param name="colorSpaceRev" value="false" />
+ <param name="suboptAlign" value="true" />
+ <param name="noIterSearch" value="true" />
+ <param name="outputTopN" value="-1" />
+ <param name="maxInsertSize" value="500" />
+ <param name="maxOccurPairing" value="100000" />
+ <output name="output" file="bwa_wrapper_out3.tabular" />
+ </test>
+ <test>
+ <param name="solidSolexa" value="solexa" />
+ <param name="refGenomeSource" value="indexed" />
+ <param name="indices" value="phiX" />
+ <param name="sPaired" value="paired" />
+ <param name="input1" value="bwa_phiX_sanger_f.fastq" />
+ <param name="input2" value="bwa_phiX_sanger_r.fastq" />
+ <param name="source_select" value="full" />
+ <param name="maxEditDist" value="0" />
+ <param name="fracMissingAligns" value="0.04" />
+ <param name="maxGapOpens" value="1" />
+ <param name="maxGapExtens" value="-1" />
+ <param name="disallowLongDel" value="16" />
+ <param name="disallowIndel" value="5" />
+ <param name="seed" value="-1" />
+ <param name="maxEditDistSeed" value="2" />
+ <param name="numThreads" value="1" />
+ <param name="mismatchPenalty" value="3" />
+ <param name="gapOpenPenalty" value="1" />
+ <param name="gapExtensPenalty" value="4" />
+ <param name="colorSpaceRev" value="false" />
+ <param name="suboptAlign" value="true" />
+ <param name="noIterSearch" value="true" />
+ <param name="outputTopN" value="-1" />
+ <param name="maxInsertSize" value="500" />
+ <param name="maxOccurPairing" value="100000" />
+ <output name="output" file="bwa_wrapper_out4.tabular" />
+ </test>
+ </tests>
+-->
+ <help>
+
+**What it does**
+
+**BWA** is a high performance sequence aligner that succeeds MAQ. It is based on BWT-SW but uses a completely different algorithm, and it is aimed toward short read alignments. It is fast--it can map the human genome in only 15-25 minutes. Heng Li of the Sanger Institute wrote the majority of the code, with contributions by Chi-Kwong Wong at the University of Hong Kong, Nong Ge at Sun Yat-Sen University, and Yuta Mori.
+
+------
+
+**Input formats**
+
+BWA accepts files in FASTQ format.
+
+------
+
+**Outputs**
+
+The output is in SAM format, and has the following columns::
+
+ 1 QNAME - Query (pair) NAME
+ 2 FLAG - bitwise FLAG
+ 3 RNAME - Reference sequence NAME
+ 4 POS - 1-based leftmost POSition/coordinate of clipped sequence
+ 5 MAPQ - MAPping Quality (Phred-scaled)
+ 6 CIGAR - extended CIGAR string
+ 7 MRNM - Mate Reference sequence NaMe ('=' if same as RNAME)
+ 8 MPOS - 1-based Mate POSition
+ 9 ISIZE - Inferred insert SIZE
+ 10 SEQ - query SEQuence on the same strand as the reference
+ 11 QUAL - query QUALity (ASCII-33 gives the Phred base quality)
+ 12 OPT - variable OPTional fields in the format TAG:VTYPE:VALU
+
+The flags are as follows::
+
+ Flag - Description
+ 0x0001 - the read is paired in sequencing
+ 0x0002 - the read is mapped in a proper pair
+ 0x0004 - the query sequence itself is unmapped
+ 0x0008 - the mate is unmapped
+ 0x0010 - strand of the query (1 for reverse)
+ 0x0020 - strand of the mate
+ 0x0040 - the read is the first read in a pair
+ 0x0080 - the read is the second read in a pair
+ 0x0100 - the alignment is not primary
+
+It looks like this (scroll sideways to see the entire example)::
+
+ QNAME FLAG RNAME POS MAPQ CIAGR MRNM MPOS ISIZE SEQ QUAL OPT
+ HWI-EAS91_1_30788AAXX:1:1:1761:343 4 * 0 0 * * 0 0 AAAAAAANNAAAAAAAAAAAAAAAAAAAAAAAAAAACNNANNGAGTNGNNNNNNNGCTTCCCACAGNNCTGG hhhhhhh;;hhhhhhhhhhh^hOhhhhghhhfhhhgh;;h;;hhhh;h;;;;;;;hhhhhhghhhh;;Phhh
+ HWI-EAS91_1_30788AAXX:1:1:1578:331 4 * 0 0 * * 0 0 GTATAGANNAATAAGAAAAAAAAAAATGAAGACTTTCNNANNTCTGNANNNNNNNTCTTTTTTCAGNNGTAG hhhhhhh;;hhhhhhhhhhhhhhhhhhhhhhhhhhhh;;h;;hhhh;h;;;;;;;hhhhhhhhhhh;;hhVh
+
+-------
+
+**BWA Settings**
+
+All of the options have a default value. You can change any of them. All of the options in BWA have been implemented here.
+
+------
+
+**BWA parameter list**
+
+This is an exhaustive list of BWA options:
+
+For **aln**::
+
+ -n NUM Maximum edit distance if the value is INT, or the fraction of missing
+ alignments given 2% uniform base error rate if FLOAT. In the latter
+ case, the maximum edit distance is automatically chosen for different
+ read lengths. [0.04]
+ -o INT Maximum number of gap opens [1]
+ -e INT Maximum number of gap extensions, -1 for k-difference mode
+ (disallowing long gaps) [-1]
+ -d INT Disallow a long deletion within INT bp towards the 3'-end [16]
+ -i INT Disallow an indel within INT bp towards the ends [5]
+ -l INT Take the first INT subsequence as seed. If INT is larger than the
+ query sequence, seeding will be disabled. For long reads, this option
+ is typically ranged from 25 to 35 for '-k 2'. [inf]
+ -k INT Maximum edit distance in the seed [2]
+ -t INT Number of threads (multi-threading mode) [1]
+ -M INT Mismatch penalty. BWA will not search for suboptimal hits with a score
+ lower than (bestScore-misMsc). [3]
+ -O INT Gap open penalty [11]
+ -E INT Gap extension penalty [4]
+ -c Reverse query but not complement it, which is required for alignment
+ in the color space.
+ -R Proceed with suboptimal alignments even if the top hit is a repeat. By
+ default, BWA only searches for suboptimal alignments if the top hit is
+ unique. Using this option has no effect on accuracy for single-end
+ reads. It is mainly designed for improving the alignment accuracy of
+ paired-end reads. However, the pairing procedure will be slowed down,
+ especially for very short reads (~32bp).
+ -N Disable iterative search. All hits with no more than maxDiff
+ differences will be found. This mode is much slower than the default.
+
+For **samse**::
+
+ -n INT Output up to INT top hits. Value -1 to disable outputting multiple
+ hits. [-1]
+
+For **sampe**::
+
+ -a INT Maximum insert size for a read pair to be considered as being mapped
+ properly. Since 0.4.5, this option is only used when there are not
+ enough good alignment to infer the distribution of insert sizes. [500]
+ -o INT Maximum occurrences of a read for pairing. A read with more
+ occurrences will be treated as a single-end read. Reducing this
+ parameter helps faster pairing. [100000]
+
+
+ </help>
+</tool>
+
+
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/643e3cd86e0b
changeset: 2498:643e3cd86e0b
user: rc
date: Fri Jul 24 12:16:32 2009 -0400
description:
LIMS Changes
- Unique sample names within a request is now enforced
- minor UI tweaks
- show/hide request details
11 file(s) affected in this change:
lib/galaxy/web/controllers/requests.py
lib/galaxy/web/controllers/requests_admin.py
templates/admin/index.mako
templates/admin/requests/grid.mako
templates/admin/requests/show_request.mako
templates/admin/samples/bar_codes.mako
templates/admin/samples/events.mako
templates/requests/new_request.mako
templates/requests/select_request_type.mako
templates/requests/show_request.mako
templates/sample/sample_events.mako
diffs (504 lines):
diff -r 4e0671e6eeaa -r 643e3cd86e0b lib/galaxy/web/controllers/requests.py
--- a/lib/galaxy/web/controllers/requests.py Fri Jul 24 11:22:31 2009 -0400
+++ b/lib/galaxy/web/controllers/requests.py Fri Jul 24 12:16:32 2009 -0400
@@ -97,17 +97,18 @@
for s in request.samples:
self.current_samples.append([s.name, s.values.content])
if add_sample:
- self.current_samples.append(['New Sample',['' for field in request.type.sample_form.fields]])
+ self.current_samples.append(['Sample_%i' % (len(self.current_samples)+1),['' for field in request.type.sample_form.fields]])
# selectfield of all samples
copy_list = SelectField('copy_sample')
copy_list.add_option('None', -1, selected=True)
for i, s in enumerate(self.current_samples):
- copy_list.add_option(i+1, i)
+ copy_list.add_option(i+1, i)
+ self.details_state = 'Show request details'
return trans.fill_template( '/requests/show_request.mako',
request=request,
request_details=self.request_details(trans, id),
current_samples = self.current_samples,
- sample_copy=copy_list)
+ sample_copy=copy_list, details_state=self.details_state)
def request_details(self, trans, id):
'''
Shows the request details
@@ -141,7 +142,20 @@
value=request.values.content[index],
helptext=field['helptext']+' ('+req+')'))
return request_details
-
+
+ def __update_samples(self, request, **kwd):
+ params = util.Params( kwd )
+ num_samples = len(self.current_samples)
+ self.current_samples = []
+ for s in request.samples:
+ self.current_samples.append([s.name, s.values.content])
+ for index in range(num_samples-len(request.samples)):
+ sample_index = index + len(request.samples)
+ sample_name = util.restore_text( params.get( 'sample_%i_name' % sample_index, '' ) )
+ sample_values = []
+ for field_index in range(len(request.type.sample_form.fields)):
+ sample_values.append(util.restore_text( params.get( 'sample_%i_field_%i' % (sample_index, field_index), '' ) ))
+ self.current_samples.append([sample_name, sample_values])
@web.expose
def show_request(self, trans, **kwd):
params = util.Params( kwd )
@@ -157,26 +171,17 @@
**kwd) )
if params.get('add_sample_button', False) == 'Add New':
# save the all (saved+unsaved) sample info in 'current_samples'
- num_samples = len(self.current_samples)
- self.current_samples = []
- for s in request.samples:
- self.current_samples.append([s.name, s.values.content])
- for index in range(num_samples-len(request.samples)):
- sample_index = index + len(request.samples)
- sample_name = util.restore_text( params.get( 'sample_%i_name' % sample_index, '' ) )
- sample_values = []
- for field_index in range(len(request.type.sample_form.fields)):
- sample_values.append(util.restore_text( params.get( 'sample_%i_field_%i' % (sample_index, field_index), '' ) ))
- self.current_samples.append([sample_name, sample_values])
+ self.__update_samples(request, **kwd)
# add an empty or filled sample
# if the user has selected a sample no. to copy then copy the contents
# of the src sample to the new sample else an empty sample
src_sample_index = int(params.get( 'copy_sample', -1 ))
if src_sample_index == -1:
# empty sample
- self.current_samples.append(['New Sample',['' for field in request.type.sample_form.fields]])
+ self.current_samples.append(['Sample_%i' % (len(self.current_samples)+1),['' for field in request.type.sample_form.fields]])
else:
- self.current_samples.append([self.current_samples[src_sample_index][0]+'_copy',[val for val in self.current_samples[src_sample_index][1]]])
+ self.current_samples.append([self.current_samples[src_sample_index][0]+'_%i' % (len(self.current_samples)+1),
+ [val for val in self.current_samples[src_sample_index][1]]])
# selectfield of all samples
copy_list = SelectField('copy_sample')
copy_list.add_option('None', -1, selected=True)
@@ -186,11 +191,38 @@
request=request,
request_details=self.request_details(trans, request.id),
current_samples = self.current_samples,
- sample_copy=copy_list)
+ sample_copy=copy_list, details_state=self.details_state)
if params.get('save_samples_button', False) == 'Save':
- num_samples = len(self.current_samples)
+ # update current_samples
+ self.__update_samples(request, **kwd)
+ # check for duplicate sample names
+ msg = ''
+ for index in range(len(self.current_samples)-len(request.samples)):
+ sample_index = index + len(request.samples)
+ sample_name = self.current_samples[sample_index][0]
+ if not sample_name.strip():
+ msg = 'Please enter the name of sample number %i' % sample_index
+ break
+ count = 0
+ for i in range(len(self.current_samples)):
+ if sample_name == self.current_samples[i][0]:
+ count = count + 1
+ if count > 1:
+ msg = "This request has <b>%i</b> samples with the name <b>%s</b>.\nSamples belonging to a request must have unique names." % (count, sample_name)
+ break
+ if msg:
+ copy_list = SelectField('copy_sample')
+ copy_list.add_option('None', -1, selected=True)
+ for i, s in enumerate(self.current_samples):
+ copy_list.add_option(i+1, i)
+ return trans.fill_template( '/requests/show_request.mako',
+ request=request,
+ request_details=self.request_details(trans, request.id),
+ current_samples = self.current_samples,
+ sample_copy=copy_list, details_state=self.details_state,
+ messagetype='error', msg=msg)
# save all the new/unsaved samples entered by the user
- for index in range(num_samples-len(request.samples)):
+ for index in range(len(self.current_samples)-len(request.samples)):
sample_index = index + len(request.samples)
sample_name = util.restore_text( params.get( 'sample_%i_name' % sample_index, '' ) )
sample_values = []
@@ -208,7 +240,6 @@
action='list',
operation='show_request',
id=trans.security.encode_id(request.id)) )
-
@web.expose
def delete_sample(self, trans, **kwd):
params = util.Params( kwd )
@@ -221,6 +252,7 @@
if s:
s.delete()
s.flush()
+ request.flush()
del self.current_samples[sample_index]
copy_list = SelectField('copy_sample')
copy_list.add_option('None', -1, selected=True)
@@ -230,7 +262,26 @@
request=request,
request_details=self.request_details(trans, request.id),
current_samples = self.current_samples,
- sample_copy=copy_list)
+ sample_copy=copy_list, details_state=self.details_state)
+ @web.expose
+ def toggle_request_details(self, trans, **kwd):
+ params = util.Params( kwd )
+ msg = util.restore_text( params.get( 'msg', '' ) )
+ messagetype = params.get( 'messagetype', 'done' )
+ request = trans.app.model.Request.get(int(params.get('request_id', 0)))
+ if self.details_state == 'Show request details':
+ self.details_state = 'Hide request details'
+ elif self.details_state == 'Hide request details':
+ self.details_state = 'Show request details'
+ copy_list = SelectField('copy_sample')
+ copy_list.add_option('None', -1, selected=True)
+ for i, s in enumerate(self.current_samples):
+ copy_list.add_option(i+1, i)
+ return trans.fill_template( '/requests/show_request.mako',
+ request=request,
+ request_details=self.request_details(trans, request.id),
+ current_samples = self.current_samples,
+ sample_copy=copy_list, details_state=self.details_state)
@web.expose
def new(self, trans, **kwd):
params = util.Params( kwd )
@@ -248,7 +299,7 @@
elif params.get('save', False) == 'True':
request_type = trans.app.model.RequestType.get(int(params.request_type_id))
msg = self.__validate(trans,
- [('name','Name'), ('library_id','Library')],
+ [('name','Name')],
request_type.request_form.fields,
**kwd)
if msg:
@@ -283,7 +334,7 @@
'''
params = util.Params( kwd )
for field, field_name in main_fields:
- if not util.restore_text(params.get(field, None)):
+ if not util.restore_text(params.get(field, '')):
return 'Please enter the <b>%s</b> of the request' % field_name
# check rest of the fields of the form
for index, field in enumerate(form_fields):
@@ -303,7 +354,15 @@
pass
name = util.restore_text(params.get('name', ''))
desc = util.restore_text(params.get('desc', ''))
- library_id = int(util.restore_text(params.get('library_id', 0)))
+ try:
+ library_id = int(util.restore_text(params.get('library_id', None)))
+ except:
+ msg = "Sequencing request could not be saved. Invalid library"
+ return trans.response.send_redirect( web.url_for( controller='requests',
+ action='list',
+ status='error',
+ message=msg,
+ **kwd) )
values = []
for index, field in enumerate(request_type.request_form.fields):
values.append(util.restore_text(params.get('field_%i' % index, '')))
diff -r 4e0671e6eeaa -r 643e3cd86e0b lib/galaxy/web/controllers/requests_admin.py
--- a/lib/galaxy/web/controllers/requests_admin.py Fri Jul 24 11:22:31 2009 -0400
+++ b/lib/galaxy/web/controllers/requests_admin.py Fri Jul 24 12:16:32 2009 -0400
@@ -92,10 +92,31 @@
self.current_samples = []
for s in request.samples:
self.current_samples.append([s.name, s.values.content])
+ self.details_state = 'Show request details'
return trans.fill_template( '/admin/requests/show_request.mako',
request=request,
request_details=self.request_details(trans, id),
- current_samples = self.current_samples)
+ current_samples = self.current_samples,
+ details_state=self.details_state)
+ @web.expose
+ def toggle_request_details(self, trans, **kwd):
+ params = util.Params( kwd )
+ msg = util.restore_text( params.get( 'msg', '' ) )
+ messagetype = params.get( 'messagetype', 'done' )
+ request = trans.app.model.Request.get(int(params.get('request_id', 0)))
+ if self.details_state == 'Show request details':
+ self.details_state = 'Hide request details'
+ elif self.details_state == 'Hide request details':
+ self.details_state = 'Show request details'
+ copy_list = SelectField('copy_sample')
+ copy_list.add_option('None', -1, selected=True)
+ for i, s in enumerate(self.current_samples):
+ copy_list.add_option(i+1, i)
+ return trans.fill_template( '/admin/requests/show_request.mako',
+ request=request,
+ request_details=self.request_details(trans, request.id),
+ current_samples = self.current_samples,
+ sample_copy=copy_list, details_state=self.details_state)
def request_details(self, trans, id):
'''
Shows the request details
diff -r 4e0671e6eeaa -r 643e3cd86e0b templates/admin/index.mako
--- a/templates/admin/index.mako Fri Jul 24 11:22:31 2009 -0400
+++ b/templates/admin/index.mako Fri Jul 24 12:16:32 2009 -0400
@@ -114,7 +114,7 @@
</div>
<div class="toolSectionPad"></div>
<div class="toolSectionTitle">
- <span>Requests</span>
+ <span>Sequencing Requests</span>
</div>
<div class="toolSectionBody">
<div class="toolSectionBg">
diff -r 4e0671e6eeaa -r 643e3cd86e0b templates/admin/requests/grid.mako
--- a/templates/admin/requests/grid.mako Fri Jul 24 11:22:31 2009 -0400
+++ b/templates/admin/requests/grid.mako Fri Jul 24 12:16:32 2009 -0400
@@ -76,9 +76,6 @@
<div class="grid-header">
<h2>${grid.title}</h2>
- %if len(query.all()):
- <h3>All Users</h3>
- %endif
## %if len(query.all()):
## <span class="title">Filter:</span>
## %for i, filter in enumerate( grid.standard_filters ):
diff -r 4e0671e6eeaa -r 643e3cd86e0b templates/admin/requests/show_request.mako
--- a/templates/admin/requests/show_request.mako Fri Jul 24 11:22:31 2009 -0400
+++ b/templates/admin/requests/show_request.mako Fri Jul 24 12:16:32 2009 -0400
@@ -8,7 +8,7 @@
<div class="grid-header">
- <h2>Request: ${request.name}</h2>
+ <h2>Sequencing Request "${request.name}"</h2>
</div>
<ul class="manage-table-actions">
@@ -38,21 +38,26 @@
<div class="toolForm">
##<div class="toolFormTitle">Request Details: '${request_details[0]['value']}'</div>
- %for index, rd in enumerate(request_details):
- <div class="form-row">
- <label>${rd['label']}</label>
- %if not rd['value']:
- <i>None</i>
- %else:
- %if rd['label'] == 'Library':
- <a href="${h.url_for( controller='admin', action='browse_library', id=request.library.id )}">${rd['value']}</a>
- %else:
- ${rd['value']}
+ <div class="form-row">
+ <a href="${h.url_for( controller='requests_admin', action='toggle_request_details', request_id=request.id )}">${details_state}</a>
+ </div>
+ %if details_state == "Hide request details":
+ %for index, rd in enumerate(request_details):
+ <div class="form-row">
+ <label>${rd['label']}</label>
+ %if not rd['value']:
+ <i>None</i>
+ %else:
+ %if rd['label'] == 'Library':
+ <a href="${h.url_for( controller='admin', action='browse_library', id=request.library.id )}">${rd['value']}</a>
+ %else:
+ ${rd['value']}
+ %endif
%endif
- %endif
- </div>
- <div style="clear: both"></div>
- %endfor
+ </div>
+ <div style="clear: both"></div>
+ %endfor
+ %endif
</div>
</div>
diff -r 4e0671e6eeaa -r 643e3cd86e0b templates/admin/samples/bar_codes.mako
--- a/templates/admin/samples/bar_codes.mako Fri Jul 24 11:22:31 2009 -0400
+++ b/templates/admin/samples/bar_codes.mako Fri Jul 24 12:16:32 2009 -0400
@@ -1,12 +1,19 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
-<h2>Bar codes for Samples of Request: ${request.name}</h2>
+<h2>Bar codes for Samples of Request "${request.name}"</h2>
<h3>User: ${user.email}</h3>
%if msg:
${render_msg( msg, messagetype )}
%endif
+
+<ul class="manage-table-actions">
+ <li>
+ <a class="action-button" href="${h.url_for( controller='requests_admin', action='list', operation='show_request', id=trans.security.encode_id(request.id) )}">
+ <span>Browse this request</span></a>
+ </li>
+</ul>
<div class="toolForm">
<form name="bar_codes" action="${h.url_for( controller='requests_admin', action='save_bar_codes', request_id=request.id)}" method="post" >
diff -r 4e0671e6eeaa -r 643e3cd86e0b templates/admin/samples/events.mako
--- a/templates/admin/samples/events.mako Fri Jul 24 11:22:31 2009 -0400
+++ b/templates/admin/samples/events.mako Fri Jul 24 12:16:32 2009 -0400
@@ -3,7 +3,13 @@
<%def name="title()">Events for Sample ${sample.name}</%def>
-<h2>Events for Sample "${sample.name}" of Request: <a href="${h.url_for( controller='requests_admin', action='list', operation='show_request', id=trans.security.encode_id(sample.request.id))}">${sample.request.name}</a></h2>
+<h2>Events for Sample "${sample.name}"</h2>
+<ul class="manage-table-actions">
+ <li>
+ <a class="action-button" href="${h.url_for( controller='requests_admin', action='list', operation='show_request', id=trans.security.encode_id(sample.request.id) )}">
+ <span>Browse this request</span></a>
+ </li>
+</ul>
<h3>User: ${sample.request.user.email}</h3>
%if msg:
diff -r 4e0671e6eeaa -r 643e3cd86e0b templates/requests/new_request.mako
--- a/templates/requests/new_request.mako Fri Jul 24 11:22:31 2009 -0400
+++ b/templates/requests/new_request.mako Fri Jul 24 12:16:32 2009 -0400
@@ -5,6 +5,14 @@
%if msg:
${render_msg( msg, messagetype )}
%endif
+<br/>
+<br/>
+<ul class="manage-table-actions">
+ <li>
+ <a class="action-button" href="${h.url_for( controller='requests', action='list')}">
+ <span>Browse requests</span></a>
+ </li>
+</ul>
<div class="toolForm">
<div class="toolFormTitle">${title}</div>
diff -r 4e0671e6eeaa -r 643e3cd86e0b templates/requests/select_request_type.mako
--- a/templates/requests/select_request_type.mako Fri Jul 24 11:22:31 2009 -0400
+++ b/templates/requests/select_request_type.mako Fri Jul 24 12:16:32 2009 -0400
@@ -5,7 +5,14 @@
%if msg:
${render_msg( msg, messagetype )}
%endif
-
+<br/>
+<br/>
+<ul class="manage-table-actions">
+ <li>
+ <a class="action-button" href="${h.url_for( controller='requests', action='list')}">
+ <span>Browse requests</span></a>
+ </li>
+</ul>
<div class="toolForm">
<div class="toolFormTitle">Add a new request</div>
diff -r 4e0671e6eeaa -r 643e3cd86e0b templates/requests/show_request.mako
--- a/templates/requests/show_request.mako Fri Jul 24 11:22:31 2009 -0400
+++ b/templates/requests/show_request.mako Fri Jul 24 12:16:32 2009 -0400
@@ -8,17 +8,23 @@
<div class="grid-header">
- <h2>Request: ${request.name}</h2>
+ <h2>Sequencing Request "${request.name}"</h2>
</div>
-%if not request.submitted and request.samples:
+
<ul class="manage-table-actions">
+ %if not request.submitted and request.samples:
+ <li>
+ <a class="action-button" confirm="More samples cannot be added to this request once it is submitted. Click OK to submit." href="${h.url_for( controller='requests', action='submit_request', id=request.id)}">
+ <span>Submit request</span></a>
+ </li>
+ %endif
<li>
- <a class="action-button" confirm="More samples cannot be added to this request once it is submitted. Click OK to submit." href="${h.url_for( controller='requests', action='submit_request', id=request.id)}">
- <span>Submit request</span></a>
+ <a class="action-button" href="${h.url_for( controller='requests', action='list')}">
+ <span>Browse requests</span></a>
</li>
</ul>
-%endif
+
<%def name="render_sample_form( index, sample_name, sample_values )">
@@ -60,21 +66,26 @@
<div class="toolForm">
##<div class="toolFormTitle">Request Details: '${request_details[0]['value']}'</div>
- %for index, rd in enumerate(request_details):
- <div class="form-row">
- <label>${rd['label']}</label>
- %if not rd['value']:
- <i>None</i>
- %else:
- %if rd['label'] == 'Library':
- <a href="${h.url_for( controller='library', action='browse_library', id=request.library.id )}">${rd['value']}</a>
- %else:
- ${rd['value']}
+ <div class="form-row">
+ <a href="${h.url_for( controller='requests', action='toggle_request_details', request_id=request.id )}">${details_state}</a>
+ </div>
+ %if details_state == "Hide request details":
+ %for index, rd in enumerate(request_details):
+ <div class="form-row">
+ <label>${rd['label']}</label>
+ %if not rd['value']:
+ <i>None</i>
+ %else:
+ %if rd['label'] == 'Library':
+ <a href="${h.url_for( controller='library', action='browse_library', id=request.library.id )}">${rd['value']}</a>
+ %else:
+ ${rd['value']}
+ %endif
%endif
- %endif
- </div>
- <div style="clear: both"></div>
- %endfor
+ </div>
+ <div style="clear: both"></div>
+ %endfor
+ %endif
</div>
</div>
@@ -101,10 +112,13 @@
</tr>
<thead>
<tbody>
+ <%
+ request.refresh()
+ %>
%for sample_index, sample in enumerate(current_samples):
<tr>
<td>${sample_index+1}</td>
- %if sample[0] in [s.name for s in request.samples]:
+ %if sample_index in range(len(request.samples)):
${render_sample( sample_index, request.samples[sample_index] )}
%else:
${render_sample_form( sample_index, sample[0], sample[1])}
diff -r 4e0671e6eeaa -r 643e3cd86e0b templates/sample/sample_events.mako
--- a/templates/sample/sample_events.mako Fri Jul 24 11:22:31 2009 -0400
+++ b/templates/sample/sample_events.mako Fri Jul 24 12:16:32 2009 -0400
@@ -3,7 +3,19 @@
<%def name="title()">Events for Sample ${sample_name}</%def>
-<h2>Events for Sample "${sample_name}" of Request: <a href="${h.url_for( controller='requests', action='list', operation='show_request', id=trans.security.encode_id(request.id))}">${request.name}</a></h2>
+
+<h2>Events for Sample "${sample_name}"</h2>
+
+<ul class="manage-table-actions">
+ <li>
+ <a class="action-button" href="${h.url_for( controller='requests', action='list', operation='show_request', id=trans.security.encode_id(request.id) )}">
+ <span>Browse this request</span></a>
+ </li>
+ <li>
+ <a class="action-button" href="${h.url_for( controller='requests', action='list')}">
+ <span>Browse requests</span></a>
+ </li>
+</ul>
%if msg:
${render_msg( msg, messagetype )}
1
0