galaxy-commits
Threads by month
- ----- 2026 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/e7f83c2921c8/
Changeset: e7f83c2921c8
User: jmchilton
Date: 2015-02-06 02:27:53+00:00
Summary: PEP-8 fixes for reports controllers and app.
Affected #: 5 files
diff -r 17ed2655b3052c047aba60013e0f9bb173ebee90 -r e7f83c2921c86bedea95425c213e4a467e64f0f3 lib/galaxy/webapps/reports/app.py
--- a/lib/galaxy/webapps/reports/app.py
+++ b/lib/galaxy/webapps/reports/app.py
@@ -1,7 +1,9 @@
-import sys, config
+import sys
+import config
import galaxy.model
from galaxy.web import security
+
class UniverseApplication( object ):
"""Encapsulates the state of a Universe application"""
def __init__( self, **kwargs ):
@@ -20,8 +22,9 @@
self.model = galaxy.model.mapping.init( self.config.file_path,
db_url,
self.config.database_engine_options,
- create_tables = True )
+ create_tables=True )
# Security helper
self.security = security.SecurityHelper( id_secret=self.config.id_secret )
+
def shutdown( self ):
pass
diff -r 17ed2655b3052c047aba60013e0f9bb173ebee90 -r e7f83c2921c86bedea95425c213e4a467e64f0f3 lib/galaxy/webapps/reports/controllers/jobs.py
--- a/lib/galaxy/webapps/reports/controllers/jobs.py
+++ b/lib/galaxy/webapps/reports/controllers/jobs.py
@@ -1,9 +1,8 @@
-import calendar, operator, os, socket
+import calendar
from datetime import datetime, date, timedelta
-from time import mktime, strftime, localtime
from galaxy.web.base.controller import BaseUIController, web
from galaxy import model, util
-from galaxy.web.framework.helpers import time_ago, iff, grids
+from galaxy.web.framework.helpers import grids
from galaxy.model.orm import and_, not_, or_
import pkg_resources
pkg_resources.require( "SQLAlchemy >= 0.4" )
@@ -11,37 +10,53 @@
import logging
log = logging.getLogger( __name__ )
+
class SpecifiedDateListGrid( grids.Grid ):
+
class JobIdColumn( grids.IntegerColumn ):
+
def get_value( self, trans, grid, job ):
return job.id
+
class StateColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, job ):
return '<div class="count-box state-color-%s">%s</div>' % ( job.state, job.state )
+
def filter( self, trans, user, query, column_filter ):
if column_filter == 'Unfinished':
return query.filter( not_( or_( model.Job.table.c.state == model.Job.states.OK,
model.Job.table.c.state == model.Job.states.ERROR,
model.Job.table.c.state == model.Job.states.DELETED ) ) )
return query
+
class ToolColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, job ):
return job.tool_id
+
class CreateTimeColumn( grids.DateTimeColumn ):
+
def get_value( self, trans, grid, job ):
return job.create_time.strftime("%b %d, %Y, %H:%M:%S")
+
class UserColumn( grids.GridColumn ):
+
def get_value( self, trans, grid, job ):
if job.user:
return job.user.email
return 'anonymous'
+
class EmailColumn( grids.GridColumn ):
+
def filter( self, trans, user, query, column_filter ):
if column_filter == 'All':
return query
return query.filter( and_( model.Job.table.c.user_id == model.User.table.c.id,
model.User.table.c.email == column_filter ) )
+
class SpecifiedDateColumn( grids.GridColumn ):
+
def filter( self, trans, user, query, column_filter ):
if column_filter == 'All':
return query
@@ -57,7 +72,7 @@
end_date = start_date + timedelta( days=calendar.monthrange( year, month )[1] )
return query.filter( and_( self.model_class.table.c.create_time >= start_date,
- self.model_class.table.c.create_time < end_date ) )
+ self.model_class.table.c.create_time < end_date ) )
# Grid definition
use_async = False
@@ -72,8 +87,8 @@
attach_popup=False,
filterable="advanced" ),
StateColumn( "State",
- key="state",
- attach_popup=False ),
+ key="state",
+ attach_popup=False ),
ToolColumn( "Tool Id",
key="tool_id",
link=( lambda item: dict( operation="tool_per_month", id=item.id, webapp="reports" ) ),
@@ -105,7 +120,7 @@
visible=False,
filterable="standard" ) )
standard_filters = []
- default_filter = { 'specified_date' : 'All' }
+ default_filter = { 'specified_date': 'All' }
num_rows_per_page = 50
preserve_state = False
use_paging = True
@@ -119,7 +134,9 @@
.filter( model.Job.table.c.user_id != monitor_user_id )\
.enable_eagerloads( False )
+
class Jobs( BaseUIController ):
+
"""
Class contains functions for querying data requested by user via the webapp. It exposes the functions and
responds to requests with the filled .mako templates.
@@ -198,15 +215,14 @@
month_label = start_date.strftime( "%B" )
year_label = start_date.strftime( "%Y" )
-
month_jobs = sa.select( ( sa.func.date( model.Job.table.c.create_time ).label( 'date' ),
- sa.func.count( model.Job.table.c.id ).label( 'total_jobs' ) ),
- whereclause=sa.and_( model.Job.table.c.user_id != monitor_user_id,
- model.Job.table.c.create_time >= start_date,
- model.Job.table.c.create_time < end_date ),
- from_obj=[ model.Job.table ],
- group_by=[ 'date' ],
- order_by=[ sa.desc( 'date' ) ] )
+ sa.func.count( model.Job.table.c.id ).label( 'total_jobs' ) ),
+ whereclause=sa.and_( model.Job.table.c.user_id != monitor_user_id,
+ model.Job.table.c.create_time >= start_date,
+ model.Job.table.c.create_time < end_date ),
+ from_obj=[ model.Job.table ],
+ group_by=[ 'date' ],
+ order_by=[ sa.desc( 'date' ) ] )
jobs = []
for row in month_jobs.execute():
@@ -214,7 +230,7 @@
row.date.strftime( "%d" ),
row.total_jobs,
row.date
- ) )
+ ) )
return trans.fill_template( '/webapps/reports/jobs_specified_month_all.mako',
month_label=month_label,
year_label=year_label,
@@ -222,6 +238,7 @@
jobs=jobs,
is_user_jobs_only=monitor_user_id,
message=message )
+
@web.expose
def specified_month_in_error( self, trans, **kwd ):
"""
@@ -244,14 +261,14 @@
year_label = start_date.strftime( "%Y" )
month_jobs_in_error = sa.select( ( sa.func.date( model.Job.table.c.create_time ).label( 'date' ),
- sa.func.count( model.Job.table.c.id ).label( 'total_jobs' ) ),
- whereclause=sa.and_( model.Job.table.c.user_id != monitor_user_id,
- model.Job.table.c.state == 'error',
- model.Job.table.c.create_time >= start_date,
- model.Job.table.c.create_time < end_date ),
- from_obj=[ model.Job.table ],
- group_by=[ 'date' ],
- order_by=[ sa.desc( 'date' ) ] )
+ sa.func.count( model.Job.table.c.id ).label( 'total_jobs' ) ),
+ whereclause=sa.and_( model.Job.table.c.user_id != monitor_user_id,
+ model.Job.table.c.state == 'error',
+ model.Job.table.c.create_time >= start_date,
+ model.Job.table.c.create_time < end_date ),
+ from_obj=[ model.Job.table ],
+ group_by=[ 'date' ],
+ order_by=[ sa.desc( 'date' ) ] )
jobs = []
for row in month_jobs_in_error.execute():
@@ -266,6 +283,7 @@
jobs=jobs,
message=message,
is_user_jobs_only=monitor_user_id )
+
@web.expose
def per_month_all( self, trans, **kwd ):
"""
@@ -280,25 +298,26 @@
monitor_user_id = get_monitor_id( trans, monitor_email )
jobs_by_month = sa.select( ( sa.func.date_trunc( 'month', model.Job.table.c.create_time ).label( 'date' ),
- sa.func.count( model.Job.table.c.id ).label( 'total_jobs' ) ),
- whereclause=model.Job.table.c.user_id != monitor_user_id,
- from_obj=[ model.Job.table ],
- group_by=[ 'date' ],
- order_by=[ sa.desc( 'date' ) ] )
+ sa.func.count( model.Job.table.c.id ).label( 'total_jobs' ) ),
+ whereclause=model.Job.table.c.user_id != monitor_user_id,
+ from_obj=[ model.Job.table ],
+ group_by=[ 'date' ],
+ order_by=[ sa.desc( 'date' ) ] )
jobs = []
for row in jobs_by_month.execute():
- jobs.append( (
- row.date.strftime( "%Y-%m" ),
- row.total_jobs,
- row.date.strftime( "%B" ),
- row.date.strftime( "%y" )
- ) )
+ jobs.append( (
+ row.date.strftime( "%Y-%m" ),
+ row.total_jobs,
+ row.date.strftime( "%B" ),
+ row.date.strftime( "%y" )
+ ) )
return trans.fill_template( '/webapps/reports/jobs_per_month_all.mako',
jobs=jobs,
is_user_jobs_only=monitor_user_id,
message=message )
+
@web.expose
def per_month_in_error( self, trans, **kwd ):
"""
@@ -314,11 +333,11 @@
jobs_in_error_by_month = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time ) ).label( 'date' ),
sa.func.count( model.Job.table.c.id ).label( 'total_jobs' ) ),
- whereclause=sa.and_ ( model.Job.table.c.state == 'error',
- model.Job.table.c.user_id != monitor_user_id ),
- from_obj=[ model.Job.table ],
- group_by=[ sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time ) ) ],
- order_by=[ sa.desc( 'date' ) ] )
+ whereclause=sa.and_( model.Job.table.c.state == 'error',
+ model.Job.table.c.user_id != monitor_user_id ),
+ from_obj=[ model.Job.table ],
+ group_by=[ sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time ) ) ],
+ order_by=[ sa.desc( 'date' ) ] )
jobs = []
for row in jobs_in_error_by_month.execute():
@@ -339,19 +358,19 @@
jobs = []
jobs_per_user = sa.select( ( model.User.table.c.email.label( 'user_email' ),
- sa.func.count( model.Job.table.c.id ).label( 'total_jobs' ) ),
- from_obj=[ sa.outerjoin( model.Job.table, model.User.table ) ],
- group_by=[ 'user_email' ],
- order_by=[ sa.desc( 'total_jobs' ), 'user_email' ] )
+ sa.func.count( model.Job.table.c.id ).label( 'total_jobs' ) ),
+ from_obj=[ sa.outerjoin( model.Job.table, model.User.table ) ],
+ group_by=[ 'user_email' ],
+ order_by=[ sa.desc( 'total_jobs' ), 'user_email' ] )
for row in jobs_per_user.execute():
- if ( row.user_email == None ):
- jobs.append ( ( 'Anonymous',
- row.total_jobs ) )
+ if ( row.user_email is None ):
+ jobs.append( ( 'Anonymous',
+ row.total_jobs ) )
elif ( row.user_email == monitor_email ):
continue
else:
jobs.append( ( row.user_email,
- row.total_jobs ) )
+ row.total_jobs ) )
return trans.fill_template( '/webapps/reports/jobs_per_user.mako',
jobs=jobs,
message=message )
@@ -364,8 +383,8 @@
q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time ) ).label( 'date' ),
sa.func.count( model.Job.table.c.id ).label( 'total_jobs' ) ),
whereclause=sa.and_( model.Job.table.c.session_id == model.GalaxySession.table.c.id,
- model.GalaxySession.table.c.user_id == model.User.table.c.id,
- model.User.table.c.email == email
+ model.GalaxySession.table.c.user_id == model.User.table.c.id,
+ model.User.table.c.email == email
),
from_obj=[ sa.join( model.Job.table, model.User.table ) ],
group_by=[ sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time ) ) ],
@@ -420,7 +439,7 @@
q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time ) ).label( 'date' ),
sa.func.count( model.Job.table.c.id ).label( 'total_jobs' ) ),
whereclause=sa.and_( model.Job.table.c.tool_id == tool_id,
- model.Job.table.c.user_id != monitor_user_id ),
+ model.Job.table.c.user_id != monitor_user_id ),
from_obj=[ model.Job.table ],
group_by=[ sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time ) ) ],
order_by=[ sa.desc( 'date' ) ] )
@@ -439,7 +458,6 @@
@web.expose
def job_info( self, trans, **kwd ):
- params = util.Params( kwd )
message = ''
job = trans.sa_session.query( model.Job ) \
.get( trans.security.decode_id( kwd.get( 'id', '' ) ) )
@@ -447,19 +465,21 @@
job=job,
message=message )
-## ---- Utility methods -------------------------------------------------------
+# ---- Utility methods -------------------------------------------------------
+
def get_job( trans, id ):
return trans.sa_session.query( trans.model.Job ).get( trans.security.decode_id( id ) )
+
def get_monitor_id( trans, monitor_email ):
"""
A convenience method to obtain the monitor job id.
"""
monitor_user_id = None
monitor_row = trans.sa_session.query( trans.model.User.table.c.id ) \
- .filter( trans.model.User.table.c.email == monitor_email ) \
- .first()
+ .filter( trans.model.User.table.c.email == monitor_email ) \
+ .first()
if monitor_row is not None:
monitor_user_id = monitor_row[0]
return monitor_user_id
diff -r 17ed2655b3052c047aba60013e0f9bb173ebee90 -r e7f83c2921c86bedea95425c213e4a467e64f0f3 lib/galaxy/webapps/reports/controllers/sample_tracking.py
--- a/lib/galaxy/webapps/reports/controllers/sample_tracking.py
+++ b/lib/galaxy/webapps/reports/controllers/sample_tracking.py
@@ -1,35 +1,45 @@
-import calendar, operator, os, socket
-from datetime import datetime, date, timedelta
-from time import mktime, strftime, localtime
+import calendar
+from datetime import date, timedelta
from galaxy.web.base.controller import BaseUIController, web
from galaxy import model, util
-from galaxy.web.framework.helpers import time_ago, iff, grids
-from galaxy.model.orm import and_, not_, or_
+from galaxy.web.framework.helpers import grids
+from galaxy.model.orm import and_
import pkg_resources
pkg_resources.require( "SQLAlchemy >= 0.4" )
import sqlalchemy as sa
import logging
log = logging.getLogger( __name__ )
+
class SpecifiedDateListGrid( grids.Grid ):
+
class RequestNameColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, request ):
return request.name
+
class CreateTimeColumn( grids.DateTimeColumn ):
+
def get_value( self, trans, grid, request ):
return request.create_time
+
class UserColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, request ):
if request.user:
return request.user.email
return 'unknown'
+
class EmailColumn( grids.GridColumn ):
+
def filter( self, trans, user, query, column_filter ):
if column_filter == 'All':
return query
return query.filter( and_( model.Request.table.c.user_id == model.User.table.c.id,
model.User.table.c.email == column_filter ) )
+
class SpecifiedDateColumn( grids.GridColumn ):
+
def filter( self, trans, user, query, column_filter ):
if column_filter == 'All':
return query
@@ -54,14 +64,13 @@
use_async = False
model_class = model.Request
title = "Sequencing Requests"
- template='/webapps/reports/grid.mako'
+ template = '/webapps/reports/grid.mako'
default_sort_key = "name"
columns = [
RequestNameColumn( "Name",
- key="name",
- #link=( lambda item: dict( operation="workflow_info", id=item.id, webapp="reports" ) ),
- attach_popup=False,
- filterable="advanced" ),
+ key="name",
+ attach_popup=False,
+ filterable="advanced" ),
CreateTimeColumn( "Creation Time",
key="create_time",
attach_popup=False ),
@@ -85,15 +94,17 @@
visible=False,
filterable="standard" ) )
standard_filters = []
- default_filter = { 'specified_date' : 'All' }
+ default_filter = { 'specified_date': 'All' }
num_rows_per_page = 50
preserve_state = False
use_paging = True
+
def build_initial_query( self, trans, **kwd ):
return trans.sa_session.query( self.model_class ) \
.join( model.User ) \
.enable_eagerloads( False )
+
class SampleTracking( BaseUIController ):
specified_date_list_grid = SpecifiedDateListGrid()
@@ -124,19 +135,19 @@
if request.user:
kwd[ 'email' ] = request.user.email
else:
- kwd[ 'email' ] = None # For anonymous users ( shouldn't happen with requests )
+ kwd[ 'email' ] = None # For anonymous users ( shouldn't happen with requests )
return trans.response.send_redirect( web.url_for( controller='sample_tracking',
action='user_per_month',
**kwd ) )
return self.specified_date_list_grid( trans, **kwd )
+
@web.expose
def per_month_all( self, trans, **kwd ):
- params = util.Params( kwd )
message = ''
- q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.Request.table.c.create_time ) ).label( 'date' ),sa.func.count( model.Request.table.c.id ).label( 'total' ) ),
- from_obj = [ sa.outerjoin( model.Request.table, model.User.table ) ],
- group_by = [ sa.func.date_trunc( 'month', sa.func.date( model.Request.table.c.create_time ) ) ],
- order_by = [ sa.desc( 'date' ) ] )
+ q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.Request.table.c.create_time ) ).label( 'date' ), sa.func.count( model.Request.table.c.id ).label( 'total' ) ),
+ from_obj=[ sa.outerjoin( model.Request.table, model.User.table ) ],
+ group_by=[ sa.func.date_trunc( 'month', sa.func.date( model.Request.table.c.create_time ) ) ],
+ order_by=[ sa.desc( 'date' ) ] )
requests = []
for row in q.execute():
requests.append( ( row.date.strftime( "%Y-%m" ),
@@ -146,20 +157,21 @@
return trans.fill_template( '/webapps/reports/requests_per_month_all.mako',
requests=requests,
message=message )
+
@web.expose
def per_user( self, trans, **kwd ):
- params = util.Params( kwd )
message = ''
requests = []
q = sa.select( ( model.User.table.c.email.label( 'user_email' ),
sa.func.count( model.Request.table.c.id ).label( 'total' ) ),
- from_obj = [ sa.outerjoin( model.Request.table, model.User.table ) ],
- group_by = [ 'user_email' ],
- order_by = [ sa.desc( 'total' ), 'user_email' ] )
+ from_obj=[ sa.outerjoin( model.Request.table, model.User.table ) ],
+ group_by=[ 'user_email' ],
+ order_by=[ sa.desc( 'total' ), 'user_email' ] )
for row in q.execute():
requests.append( ( row.user_email,
row.total ) )
return trans.fill_template( '/webapps/reports/requests_per_user.mako', requests=requests, message=message )
+
@web.expose
def user_per_month( self, trans, **kwd ):
params = util.Params( kwd )
@@ -168,10 +180,10 @@
user_id = trans.security.decode_id( params.get( 'id', '' ) )
q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.Request.table.c.create_time ) ).label( 'date' ),
sa.func.count( model.Request.table.c.id ).label( 'total' ) ),
- whereclause = model.Request.table.c.user_id == user_id,
- from_obj = [ model.Request.table ],
- group_by = [ sa.func.date_trunc( 'month', sa.func.date( model.Request.table.c.create_time ) ) ],
- order_by = [ sa.desc( 'date' ) ] )
+ whereclause=model.Request.table.c.user_id == user_id,
+ from_obj=[ model.Request.table ],
+ group_by=[ sa.func.date_trunc( 'month', sa.func.date( model.Request.table.c.create_time ) ) ],
+ order_by=[ sa.desc( 'date' ) ] )
requests = []
for row in q.execute():
requests.append( ( row.date.strftime( "%Y-%m" ),
@@ -183,7 +195,8 @@
requests=requests,
message=message )
-## ---- Utility methods -------------------------------------------------------
+# ---- Utility methods -------------------------------------------------------
+
def get_request( trans, id ):
return trans.sa_session.query( trans.model.Workflow ).get( trans.security.decode_id( id ) )
diff -r 17ed2655b3052c047aba60013e0f9bb173ebee90 -r e7f83c2921c86bedea95425c213e4a467e64f0f3 lib/galaxy/webapps/reports/controllers/users.py
--- a/lib/galaxy/webapps/reports/controllers/users.py
+++ b/lib/galaxy/webapps/reports/controllers/users.py
@@ -1,10 +1,9 @@
from datetime import datetime, date, timedelta
-from time import strftime
-import calendar, operator
+import calendar
+import operator
from galaxy.web.base.controller import BaseUIController, web
import galaxy.model
from galaxy import util
-from galaxy.model.orm import and_, not_, or_
import pkg_resources
pkg_resources.require( "SQLAlchemy >= 0.4" )
import sqlalchemy as sa
@@ -13,20 +12,23 @@
log = logging.getLogger( __name__ )
+
class Users( BaseUIController ):
+
@web.expose
def registered_users( self, trans, **kwd ):
message = escape( util.restore_text( kwd.get( 'message', '' ) ) )
num_users = trans.sa_session.query( galaxy.model.User ).count()
return trans.fill_template( '/webapps/reports/registered_users.mako', num_users=num_users, message=message )
+
@web.expose
def registered_users_per_month( self, trans, **kwd ):
message = escape( util.restore_text( kwd.get( 'message', '' ) ) )
q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( galaxy.model.User.table.c.create_time ) ).label( 'date' ),
sa.func.count( galaxy.model.User.table.c.id ).label( 'num_users' ) ),
- from_obj = [ galaxy.model.User.table ],
- group_by = [ sa.func.date_trunc( 'month', sa.func.date( galaxy.model.User.table.c.create_time ) ) ],
- order_by = [ sa.desc( 'date' ) ] )
+ from_obj=[ galaxy.model.User.table ],
+ group_by=[ sa.func.date_trunc( 'month', sa.func.date( galaxy.model.User.table.c.create_time ) ) ],
+ order_by=[ sa.desc( 'date' ) ] )
users = []
for row in q.execute():
users.append( ( row.date.strftime( "%Y-%m" ),
@@ -36,6 +38,7 @@
return trans.fill_template( '/webapps/reports/registered_users_per_month.mako',
users=users,
message=message )
+
@web.expose
def specified_month( self, trans, **kwd ):
message = escape( util.restore_text( kwd.get( 'message', '' ) ) )
@@ -49,11 +52,11 @@
year_label = start_date.strftime( "%Y" )
q = sa.select( ( sa.func.date_trunc( 'day', sa.func.date( galaxy.model.User.table.c.create_time ) ).label( 'date' ),
sa.func.count( galaxy.model.User.table.c.id ).label( 'num_users' ) ),
- whereclause = sa.and_( galaxy.model.User.table.c.create_time >= start_date,
- galaxy.model.User.table.c.create_time < end_date ),
- from_obj = [ galaxy.model.User.table ],
- group_by = [ sa.func.date_trunc( 'day', sa.func.date( galaxy.model.User.table.c.create_time ) ) ],
- order_by = [ sa.desc( 'date' ) ] )
+ whereclause=sa.and_( galaxy.model.User.table.c.create_time >= start_date,
+ galaxy.model.User.table.c.create_time < end_date ),
+ from_obj=[ galaxy.model.User.table ],
+ group_by=[ sa.func.date_trunc( 'day', sa.func.date( galaxy.model.User.table.c.create_time ) ) ],
+ order_by=[ sa.desc( 'date' ) ] )
users = []
for row in q.execute():
users.append( ( row.date.strftime( "%Y-%m-%d" ),
@@ -66,6 +69,7 @@
month=month,
users=users,
message=message )
+
@web.expose
def specified_date( self, trans, **kwd ):
message = escape( util.restore_text( kwd.get( 'message', '' ) ) )
@@ -80,10 +84,10 @@
year_label = start_date.strftime( "%Y" )
q = sa.select( ( sa.func.date_trunc( 'day', sa.func.date( galaxy.model.User.table.c.create_time ) ).label( 'date' ),
galaxy.model.User.table.c.email ),
- whereclause = sa.and_( galaxy.model.User.table.c.create_time >= start_date,
- galaxy.model.User.table.c.create_time < end_date ),
- from_obj = [ galaxy.model.User.table ],
- order_by = [ galaxy.model.User.table.c.email ] )
+ whereclause=sa.and_( galaxy.model.User.table.c.create_time >= start_date,
+ galaxy.model.User.table.c.create_time < end_date ),
+ from_obj=[ galaxy.model.User.table ],
+ order_by=[ galaxy.model.User.table.c.email ] )
users = []
for row in q.execute():
users.append( ( row.email ) )
@@ -95,6 +99,7 @@
day_of_month=day_of_month,
users=users,
message=message )
+
@web.expose
def last_access_date( self, trans, **kwd ):
message = escape( util.restore_text( kwd.get( 'message', '' ) ) )
@@ -102,10 +107,9 @@
if not not_logged_in_for_days:
not_logged_in_for_days = 0
cutoff_time = datetime.utcnow() - timedelta( days=int( not_logged_in_for_days ) )
- now = strftime( "%Y-%m-%d %H:%M:%S" )
users = []
for user in trans.sa_session.query( galaxy.model.User ) \
- .filter( galaxy.model.User.table.c.deleted==False ) \
+ .filter( galaxy.model.User.table.c.deleted == False ) \
.order_by( galaxy.model.User.table.c.email ):
if user.galaxy_sessions:
last_galaxy_session = user.galaxy_sessions[ 0 ]
diff -r 17ed2655b3052c047aba60013e0f9bb173ebee90 -r e7f83c2921c86bedea95425c213e4a467e64f0f3 lib/galaxy/webapps/reports/controllers/workflows.py
--- a/lib/galaxy/webapps/reports/controllers/workflows.py
+++ b/lib/galaxy/webapps/reports/controllers/workflows.py
@@ -15,20 +15,24 @@
class SpecifiedDateListGrid( grids.Grid ):
class WorkflowNameColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, stored_workflow ):
return stored_workflow.name
class CreateTimeColumn( grids.DateTimeColumn ):
+
def get_value( self, trans, grid, stored_workflow ):
return stored_workflow.create_time
class UserColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, stored_workflow ):
if stored_workflow.user:
return stored_workflow.user.email
return 'unknown'
class EmailColumn( grids.GridColumn ):
+
def filter( self, trans, user, query, column_filter ):
if column_filter == 'All':
return query
@@ -36,6 +40,7 @@
model.User.table.c.email == column_filter ) )
class SpecifiedDateColumn( grids.GridColumn ):
+
def filter( self, trans, user, query, column_filter ):
if column_filter == 'All':
return query
@@ -60,12 +65,11 @@
use_async = False
model_class = model.StoredWorkflow
title = "Workflows"
- template='/webapps/reports/grid.mako'
+ template = '/webapps/reports/grid.mako'
default_sort_key = "name"
columns = [
WorkflowNameColumn( "Name",
key="name",
- #link=( lambda item: dict( operation="workflow_info", id=item.id, webapp="reports" ) ),
attach_popup=False,
filterable="advanced" ),
CreateTimeColumn( "Creation Time",
@@ -91,10 +95,11 @@
visible=False,
filterable="standard" ) )
standard_filters = []
- default_filter = { 'specified_date' : 'All' }
+ default_filter = { 'specified_date': 'All' }
num_rows_per_page = 50
preserve_state = False
use_paging = True
+
def build_initial_query( self, trans, **kwd ):
return trans.sa_session.query( self.model_class ) \
.join( model.User ) \
@@ -131,7 +136,7 @@
if workflow.user:
kwd[ 'email' ] = workflow.user.email
else:
- kwd[ 'email' ] = None # For anonymous users ( shouldn't happen with workflows )
+ kwd[ 'email' ] = None # For anonymous users ( shouldn't happen with workflows )
return trans.response.send_redirect( web.url_for( controller='workflows',
action='user_per_month',
**kwd ) )
@@ -140,10 +145,10 @@
@web.expose
def per_month_all( self, trans, **kwd ):
message = ''
- q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.StoredWorkflow.table.c.create_time ) ).label( 'date' ),sa.func.count( model.StoredWorkflow.table.c.id ).label( 'total_workflows' ) ),
- from_obj = [ sa.outerjoin( model.StoredWorkflow.table, model.User.table ) ],
- group_by = [ sa.func.date_trunc( 'month', sa.func.date( model.StoredWorkflow.table.c.create_time ) ) ],
- order_by = [ sa.desc( 'date' ) ] )
+ q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.StoredWorkflow.table.c.create_time ) ).label( 'date' ), sa.func.count( model.StoredWorkflow.table.c.id ).label( 'total_workflows' ) ),
+ from_obj=[ sa.outerjoin( model.StoredWorkflow.table, model.User.table ) ],
+ group_by=[ sa.func.date_trunc( 'month', sa.func.date( model.StoredWorkflow.table.c.create_time ) ) ],
+ order_by=[ sa.desc( 'date' ) ] )
workflows = []
for row in q.execute():
workflows.append( ( row.date.strftime( "%Y-%m" ),
@@ -160,9 +165,9 @@
workflows = []
q = sa.select( ( model.User.table.c.email.label( 'user_email' ),
sa.func.count( model.StoredWorkflow.table.c.id ).label( 'total_workflows' ) ),
- from_obj = [ sa.outerjoin( model.StoredWorkflow.table, model.User.table ) ],
- group_by = [ 'user_email' ],
- order_by = [ sa.desc( 'total_workflows' ), 'user_email' ] )
+ from_obj=[ sa.outerjoin( model.StoredWorkflow.table, model.User.table ) ],
+ group_by=[ 'user_email' ],
+ order_by=[ sa.desc( 'total_workflows' ), 'user_email' ] )
for row in q.execute():
workflows.append( ( row.user_email,
row.total_workflows ) )
@@ -176,10 +181,10 @@
user_id = trans.security.decode_id( params.get( 'id', '' ) )
q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.StoredWorkflow.table.c.create_time ) ).label( 'date' ),
sa.func.count( model.StoredWorkflow.table.c.id ).label( 'total_workflows' ) ),
- whereclause = model.StoredWorkflow.table.c.user_id == user_id,
- from_obj = [ model.StoredWorkflow.table ],
- group_by = [ sa.func.date_trunc( 'month', sa.func.date( model.StoredWorkflow.table.c.create_time ) ) ],
- order_by = [ sa.desc( 'date' ) ] )
+ whereclause=model.StoredWorkflow.table.c.user_id == user_id,
+ from_obj=[ model.StoredWorkflow.table ],
+ group_by=[ sa.func.date_trunc( 'month', sa.func.date( model.StoredWorkflow.table.c.create_time ) ) ],
+ order_by=[ sa.desc( 'date' ) ] )
workflows = []
for row in q.execute():
workflows.append( ( row.date.strftime( "%Y-%m" ),
@@ -191,7 +196,8 @@
workflows=workflows,
message=message )
-## ---- Utility methods -------------------------------------------------------
+# ---- Utility methods -------------------------------------------------------
+
def get_workflow( trans, id ):
return trans.sa_session.query( trans.model.Workflow ).get( trans.security.decode_id( id ) )
https://bitbucket.org/galaxy/galaxy-central/commits/ce2776f88e9d/
Changeset: ce2776f88e9d
User: jmchilton
Date: 2015-02-06 02:27:53+00:00
Summary: Fix reports webapp for MySQL.
Big thanks for Eric Enns and Fernandez Edgar for contributing patches to the galaxy-dev list.
Affected #: 6 files
diff -r e7f83c2921c86bedea95425c213e4a467e64f0f3 -r ce2776f88e9db53886b8879a948b19ce2a513835 lib/galaxy/webapps/reports/app.py
--- a/lib/galaxy/webapps/reports/app.py
+++ b/lib/galaxy/webapps/reports/app.py
@@ -23,6 +23,7 @@
db_url,
self.config.database_engine_options,
create_tables=True )
+ self.targets_mysql = 'mysql' in self.config.database_connection
# Security helper
self.security = security.SecurityHelper( id_secret=self.config.id_secret )
diff -r e7f83c2921c86bedea95425c213e4a467e64f0f3 -r ce2776f88e9db53886b8879a948b19ce2a513835 lib/galaxy/webapps/reports/controllers/jobs.py
--- a/lib/galaxy/webapps/reports/controllers/jobs.py
+++ b/lib/galaxy/webapps/reports/controllers/jobs.py
@@ -7,6 +7,8 @@
import pkg_resources
pkg_resources.require( "SQLAlchemy >= 0.4" )
import sqlalchemy as sa
+from galaxy.webapps.reports.controllers.query import ReportQueryBuilder
+
import logging
log = logging.getLogger( __name__ )
@@ -135,7 +137,7 @@
.enable_eagerloads( False )
-class Jobs( BaseUIController ):
+class Jobs( BaseUIController, ReportQueryBuilder ):
"""
Class contains functions for querying data requested by user via the webapp. It exposes the functions and
@@ -297,11 +299,11 @@
# In case we don't know which is the monitor user we will query for all jobs
monitor_user_id = get_monitor_id( trans, monitor_email )
- jobs_by_month = sa.select( ( sa.func.date_trunc( 'month', model.Job.table.c.create_time ).label( 'date' ),
+ jobs_by_month = sa.select( ( self.select_month( model.Job.table.c.create_time ).label( 'date' ),
sa.func.count( model.Job.table.c.id ).label( 'total_jobs' ) ),
whereclause=model.Job.table.c.user_id != monitor_user_id,
from_obj=[ model.Job.table ],
- group_by=[ 'date' ],
+ group_by=self.group_by_month( model.Job.table.c.create_time ),
order_by=[ sa.desc( 'date' ) ] )
jobs = []
@@ -331,12 +333,12 @@
# In case we don't know which is the monitor user we will query for all jobs
monitor_user_id = get_monitor_id( trans, monitor_email )
- jobs_in_error_by_month = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time ) ).label( 'date' ),
+ jobs_in_error_by_month = sa.select( ( self.select_month( model.Job.table.c.create_time ).label( 'date' ),
sa.func.count( model.Job.table.c.id ).label( 'total_jobs' ) ),
whereclause=sa.and_( model.Job.table.c.state == 'error',
model.Job.table.c.user_id != monitor_user_id ),
from_obj=[ model.Job.table ],
- group_by=[ sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time ) ) ],
+ group_by=self.group_by_month( model.Job.table.c.create_time ),
order_by=[ sa.desc( 'date' ) ] )
jobs = []
@@ -380,14 +382,14 @@
params = util.Params( kwd )
message = ''
email = util.restore_text( params.get( 'email', '' ) )
- q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time ) ).label( 'date' ),
+ q = sa.select( ( self.select_month( model.Job.table.c.create_time ).label( 'date' ),
sa.func.count( model.Job.table.c.id ).label( 'total_jobs' ) ),
whereclause=sa.and_( model.Job.table.c.session_id == model.GalaxySession.table.c.id,
model.GalaxySession.table.c.user_id == model.User.table.c.id,
model.User.table.c.email == email
),
from_obj=[ sa.join( model.Job.table, model.User.table ) ],
- group_by=[ sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time ) ) ],
+ group_by=self.group_by_month( model.Job.table.c.create_time ),
order_by=[ sa.desc( 'date' ) ] )
jobs = []
for row in q.execute():
@@ -436,12 +438,12 @@
tool_id = params.get( 'tool_id', 'Add a column1' )
specified_date = params.get( 'specified_date', datetime.utcnow().strftime( "%Y-%m-%d" ) )
- q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time ) ).label( 'date' ),
+ q = sa.select( ( self.select_month( model.Job.table.c.create_time ).label( 'date' ),
sa.func.count( model.Job.table.c.id ).label( 'total_jobs' ) ),
whereclause=sa.and_( model.Job.table.c.tool_id == tool_id,
model.Job.table.c.user_id != monitor_user_id ),
from_obj=[ model.Job.table ],
- group_by=[ sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time ) ) ],
+ group_by=self.group_by_month( model.Job.table.c.create_time ),
order_by=[ sa.desc( 'date' ) ] )
jobs = []
for row in q.execute():
diff -r e7f83c2921c86bedea95425c213e4a467e64f0f3 -r ce2776f88e9db53886b8879a948b19ce2a513835 lib/galaxy/webapps/reports/controllers/query.py
--- /dev/null
+++ b/lib/galaxy/webapps/reports/controllers/query.py
@@ -0,0 +1,32 @@
+""" Mixin to help build advanced queries for reports interface.
+"""
+import pkg_resources
+pkg_resources.require( "SQLAlchemy >= 0.4" )
+import sqlalchemy as sa
+
+
+class ReportQueryBuilder:
+
+ def group_by_month(self, column):
+ if self.app.targets_mysql:
+ return [ sa.func.year( column ), sa.func.month( sa.func.date( column ) ) ]
+ else:
+ return [ sa.func.date_trunc( 'month', sa.func.date( column ) ) ]
+
+ def select_month(self, column):
+ if self.app.targets_mysql:
+ return sa.func.date( column )
+ else:
+ return sa.func.date_trunc( 'month', sa.func.date( column ) )
+
+ def group_by_day(self, column):
+ if self.app.targets_mysql:
+ return [ sa.func.day( sa.func.date( column ) ) ]
+ else:
+ return [ sa.func.date_trunc( 'day', sa.func.date( column ) ) ]
+
+ def select_day(self, column):
+ if self.app.targets_mysql:
+ return sa.func.date( column )
+ else:
+ return sa.func.date_trunc( 'day', sa.func.date( column ) )
diff -r e7f83c2921c86bedea95425c213e4a467e64f0f3 -r ce2776f88e9db53886b8879a948b19ce2a513835 lib/galaxy/webapps/reports/controllers/sample_tracking.py
--- a/lib/galaxy/webapps/reports/controllers/sample_tracking.py
+++ b/lib/galaxy/webapps/reports/controllers/sample_tracking.py
@@ -7,6 +7,8 @@
import pkg_resources
pkg_resources.require( "SQLAlchemy >= 0.4" )
import sqlalchemy as sa
+from galaxy.webapps.reports.controllers.query import ReportQueryBuilder
+
import logging
log = logging.getLogger( __name__ )
@@ -105,7 +107,7 @@
.enable_eagerloads( False )
-class SampleTracking( BaseUIController ):
+class SampleTracking( BaseUIController, ReportQueryBuilder ):
specified_date_list_grid = SpecifiedDateListGrid()
@@ -144,9 +146,10 @@
@web.expose
def per_month_all( self, trans, **kwd ):
message = ''
- q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.Request.table.c.create_time ) ).label( 'date' ), sa.func.count( model.Request.table.c.id ).label( 'total' ) ),
+ q = sa.select( ( self.select_month( model.Request.table.c.create_time ).label( 'date' ),
+ sa.func.count( model.Request.table.c.id ).label( 'total' ) ),
from_obj=[ sa.outerjoin( model.Request.table, model.User.table ) ],
- group_by=[ sa.func.date_trunc( 'month', sa.func.date( model.Request.table.c.create_time ) ) ],
+ group_by=self.group_by_month( model.Request.table.c.create_time ),
order_by=[ sa.desc( 'date' ) ] )
requests = []
for row in q.execute():
@@ -178,11 +181,11 @@
message = ''
email = util.restore_text( params.get( 'email', '' ) )
user_id = trans.security.decode_id( params.get( 'id', '' ) )
- q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.Request.table.c.create_time ) ).label( 'date' ),
+ q = sa.select( ( self.select_month( model.Request.table.c.create_time ).label( 'date' ),
sa.func.count( model.Request.table.c.id ).label( 'total' ) ),
whereclause=model.Request.table.c.user_id == user_id,
from_obj=[ model.Request.table ],
- group_by=[ sa.func.date_trunc( 'month', sa.func.date( model.Request.table.c.create_time ) ) ],
+ group_by=self.group_by_month( model.Request.table.c.create_time ),
order_by=[ sa.desc( 'date' ) ] )
requests = []
for row in q.execute():
diff -r e7f83c2921c86bedea95425c213e4a467e64f0f3 -r ce2776f88e9db53886b8879a948b19ce2a513835 lib/galaxy/webapps/reports/controllers/users.py
--- a/lib/galaxy/webapps/reports/controllers/users.py
+++ b/lib/galaxy/webapps/reports/controllers/users.py
@@ -7,13 +7,14 @@
import pkg_resources
pkg_resources.require( "SQLAlchemy >= 0.4" )
import sqlalchemy as sa
+from galaxy.webapps.reports.controllers.query import ReportQueryBuilder
import logging
from markupsafe import escape
log = logging.getLogger( __name__ )
-class Users( BaseUIController ):
+class Users( BaseUIController, ReportQueryBuilder ):
@web.expose
def registered_users( self, trans, **kwd ):
@@ -24,10 +25,10 @@
@web.expose
def registered_users_per_month( self, trans, **kwd ):
message = escape( util.restore_text( kwd.get( 'message', '' ) ) )
- q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( galaxy.model.User.table.c.create_time ) ).label( 'date' ),
+ q = sa.select( ( self.select_month( galaxy.model.User.table.c.create_time ).label( 'date' ),
sa.func.count( galaxy.model.User.table.c.id ).label( 'num_users' ) ),
from_obj=[ galaxy.model.User.table ],
- group_by=[ sa.func.date_trunc( 'month', sa.func.date( galaxy.model.User.table.c.create_time ) ) ],
+ group_by=self.group_by_month( galaxy.model.User.table.c.create_time ),
order_by=[ sa.desc( 'date' ) ] )
users = []
for row in q.execute():
@@ -50,12 +51,12 @@
end_date = start_date + timedelta( days=calendar.monthrange( year, month )[1] )
month_label = start_date.strftime( "%B" )
year_label = start_date.strftime( "%Y" )
- q = sa.select( ( sa.func.date_trunc( 'day', sa.func.date( galaxy.model.User.table.c.create_time ) ).label( 'date' ),
+ q = sa.select( ( self.select_day( galaxy.model.User.table.c.create_time ).label( 'date' ),
sa.func.count( galaxy.model.User.table.c.id ).label( 'num_users' ) ),
whereclause=sa.and_( galaxy.model.User.table.c.create_time >= start_date,
galaxy.model.User.table.c.create_time < end_date ),
from_obj=[ galaxy.model.User.table ],
- group_by=[ sa.func.date_trunc( 'day', sa.func.date( galaxy.model.User.table.c.create_time ) ) ],
+ group_by=self.group_by_day( galaxy.model.User.table.c.create_time ),
order_by=[ sa.desc( 'date' ) ] )
users = []
for row in q.execute():
@@ -82,7 +83,7 @@
day_label = start_date.strftime( "%A" )
month_label = start_date.strftime( "%B" )
year_label = start_date.strftime( "%Y" )
- q = sa.select( ( sa.func.date_trunc( 'day', sa.func.date( galaxy.model.User.table.c.create_time ) ).label( 'date' ),
+ q = sa.select( ( self.select_day( galaxy.model.User.table.c.create_time ).label( 'date' ),
galaxy.model.User.table.c.email ),
whereclause=sa.and_( galaxy.model.User.table.c.create_time >= start_date,
galaxy.model.User.table.c.create_time < end_date ),
diff -r e7f83c2921c86bedea95425c213e4a467e64f0f3 -r ce2776f88e9db53886b8879a948b19ce2a513835 lib/galaxy/webapps/reports/controllers/workflows.py
--- a/lib/galaxy/webapps/reports/controllers/workflows.py
+++ b/lib/galaxy/webapps/reports/controllers/workflows.py
@@ -7,6 +7,7 @@
from galaxy.web.framework.helpers import grids
eggs.require( "SQLAlchemy >= 0.4" )
import sqlalchemy as sa
+from galaxy.webapps.reports.controllers.query import ReportQueryBuilder
import logging
log = logging.getLogger( __name__ )
@@ -106,7 +107,7 @@
.enable_eagerloads( False )
-class Workflows( BaseUIController ):
+class Workflows( BaseUIController, ReportQueryBuilder ):
specified_date_list_grid = SpecifiedDateListGrid()
@@ -145,9 +146,9 @@
@web.expose
def per_month_all( self, trans, **kwd ):
message = ''
- q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.StoredWorkflow.table.c.create_time ) ).label( 'date' ), sa.func.count( model.StoredWorkflow.table.c.id ).label( 'total_workflows' ) ),
+ q = sa.select( ( self.select_month( model.StoredWorkflow.table.c.create_time ).label( 'date' ), sa.func.count( model.StoredWorkflow.table.c.id ).label( 'total_workflows' ) ),
from_obj=[ sa.outerjoin( model.StoredWorkflow.table, model.User.table ) ],
- group_by=[ sa.func.date_trunc( 'month', sa.func.date( model.StoredWorkflow.table.c.create_time ) ) ],
+ group_by=self.group_by_month( model.StoredWorkflow.table.c.create_time ),
order_by=[ sa.desc( 'date' ) ] )
workflows = []
for row in q.execute():
@@ -179,11 +180,11 @@
message = ''
email = util.restore_text( params.get( 'email', '' ) )
user_id = trans.security.decode_id( params.get( 'id', '' ) )
- q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.StoredWorkflow.table.c.create_time ) ).label( 'date' ),
+ q = sa.select( ( self.select_month( model.StoredWorkflow.table.c.create_time ).label( 'date' ),
sa.func.count( model.StoredWorkflow.table.c.id ).label( 'total_workflows' ) ),
whereclause=model.StoredWorkflow.table.c.user_id == user_id,
from_obj=[ model.StoredWorkflow.table ],
- group_by=[ sa.func.date_trunc( 'month', sa.func.date( model.StoredWorkflow.table.c.create_time ) ) ],
+ group_by=self.group_by_month( model.StoredWorkflow.table.c.create_time ),
order_by=[ sa.desc( 'date' ) ] )
workflows = []
for row in q.execute():
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
3 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/5ff4dc352d74/
Changeset: 5ff4dc352d74
User: dannon
Date: 2015-02-06 00:13:59+00:00
Summary: Relocate is_uwsgi to app.config (determined at configuration time via import).
Affected #: 2 files
diff -r 8f1d5b7b30c62231bfa4fa8f39fc6338726020ee -r 5ff4dc352d748b18fa1b8e75c68877b27108deb6 lib/galaxy/config.py
--- a/lib/galaxy/config.py
+++ b/lib/galaxy/config.py
@@ -428,6 +428,18 @@
self.citation_cache_type = kwargs.get( "citation_cache_type", "file" )
self.citation_cache_data_dir = self.resolve_path( kwargs.get( "citation_cache_data_dir", "database/citations/data" ) )
self.citation_cache_lock_dir = self.resolve_path( kwargs.get( "citation_cache_lock_dir", "database/citations/locks" ) )
+ # TEST FOR UWSGI -- TODO save this somewhere so we only have to do it once.
+ self.is_uwsgi = False
+ try:
+ # The uwsgi module is automatically injected by the parent uwsgi
+ # process and only exists that way. If anything works, this is a
+ # uwsgi-managed process.
+ import uwsgi
+ if uwsgi.numproc:
+ self.is_uwsgi = True
+ except ImportError:
+ # This is not a uwsgi process, or something went horribly wrong.
+ pass
@property
def sentry_dsn_public( self ):
diff -r 8f1d5b7b30c62231bfa4fa8f39fc6338726020ee -r 5ff4dc352d748b18fa1b8e75c68877b27108deb6 lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -86,20 +86,8 @@
# Wrap the webapp in some useful middleware
if kwargs.get( 'middleware', True ):
webapp = wrap_in_middleware( webapp, global_conf, **kwargs )
- # TEST FOR UWSGI -- TODO save this somewhere so we only have to do it once.
- is_uwsgi = False
- try:
- # The uwsgi module is automatically injected by the parent uwsgi
- # process and only exists that way. If anything works, this is a
- # uwsgi-managed process.
- import uwsgi
- is_uwsgi = uwsgi.numproc
- is_uwsgi = True
- except ImportError:
- # This is not a uwsgi process, or something went horribly wrong.
- pass
if asbool( kwargs.get( 'static_enabled', True) ):
- if is_uwsgi:
+ if app.config.is_uwsgi:
log.error("Static middleware is enabled in your configuration but this is a uwsgi process. Refusing to wrap in static middleware.")
else:
webapp = wrap_in_static( webapp, global_conf, plugin_frameworks=[ app.visualizations_registry ], **kwargs )
https://bitbucket.org/galaxy/galaxy-central/commits/20bd598e1f53/
Changeset: 20bd598e1f53
User: dannon
Date: 2015-02-06 00:15:10+00:00
Summary: Remove TODO about moving uwsgi test since I did it.
Affected #: 1 file
diff -r 5ff4dc352d748b18fa1b8e75c68877b27108deb6 -r 20bd598e1f5363518c8bfe44697a8e6f0dacff4e lib/galaxy/config.py
--- a/lib/galaxy/config.py
+++ b/lib/galaxy/config.py
@@ -428,7 +428,7 @@
self.citation_cache_type = kwargs.get( "citation_cache_type", "file" )
self.citation_cache_data_dir = self.resolve_path( kwargs.get( "citation_cache_data_dir", "database/citations/data" ) )
self.citation_cache_lock_dir = self.resolve_path( kwargs.get( "citation_cache_lock_dir", "database/citations/locks" ) )
- # TEST FOR UWSGI -- TODO save this somewhere so we only have to do it once.
+ # TEST FOR UWSGI
self.is_uwsgi = False
try:
# The uwsgi module is automatically injected by the parent uwsgi
https://bitbucket.org/galaxy/galaxy-central/commits/17ed2655b305/
Changeset: 17ed2655b305
User: dannon
Date: 2015-02-06 00:16:19+00:00
Summary: Minor pep8'ing in lib/galaxy/config.py
Affected #: 1 file
diff -r 20bd598e1f5363518c8bfe44697a8e6f0dacff4e -r 17ed2655b3052c047aba60013e0f9bb173ebee90 lib/galaxy/config.py
--- a/lib/galaxy/config.py
+++ b/lib/galaxy/config.py
@@ -124,7 +124,7 @@
self.hours_between_check = 12
self.update_integrated_tool_panel = kwargs.get( "update_integrated_tool_panel", True )
self.enable_data_manager_user_view = string_as_bool( kwargs.get( "enable_data_manager_user_view", "False" ) )
- self.galaxy_data_manager_data_path = kwargs.get( 'galaxy_data_manager_data_path', self.tool_data_path )
+ self.galaxy_data_manager_data_path = kwargs.get( 'galaxy_data_manager_data_path', self.tool_data_path )
self.tool_secret = kwargs.get( "tool_secret", "" )
self.id_secret = kwargs.get( "id_secret", "USING THE DEFAULT IS NOT SECURE!" )
self.retry_metadata_internally = string_as_bool( kwargs.get( "retry_metadata_internally", "True" ) )
@@ -381,7 +381,7 @@
self.amqp_internal_connection = kwargs.get('amqp_internal_connection')
# TODO Get extra amqp args as necessary for ssl
elif 'database_connection' in kwargs:
- self.amqp_internal_connection = "sqlalchemy+"+self.database_connection
+ self.amqp_internal_connection = "sqlalchemy+" + self.database_connection
else:
self.amqp_internal_connection = "sqlalchemy+sqlite:///%s?isolation_level=IMMEDIATE" % resolve_path( "database/control.sqlite", self.root )
self.biostar_url = kwargs.get( 'biostar_url', None )
@@ -485,7 +485,10 @@
# [0], probably moved their shed_tool_conf.xml as well
# [2]: user has done nothing, use the old files
# [3]: fresh install
- tool_config_file=[ 'config/tool_conf.xml,shed_tool_conf.xml', 'config/tool_conf.xml,config/shed_tool_conf.xml', 'tool_conf.xml,shed_tool_conf.xml', 'config/tool_conf.xml.sample,config/shed_tool_conf.xml' ]
+ tool_config_file=[ 'config/tool_conf.xml,shed_tool_conf.xml',
+ 'config/tool_conf.xml,config/shed_tool_conf.xml',
+ 'tool_conf.xml,shed_tool_conf.xml',
+ 'config/tool_conf.xml.sample,config/shed_tool_conf.xml' ]
)
for var, defaults in defaults.items():
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
3 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/0b15f8124467/
Changeset: 0b15f8124467
User: dannon
Date: 2015-02-05 23:35:43+00:00
Summary: Add reference to the webapp to galaxy.app
Affected #: 2 files
diff -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 -r 0b15f8124467ff74da92f74f5f5977147ee6fc4c lib/galaxy/app.py
--- a/lib/galaxy/app.py
+++ b/lib/galaxy/app.py
@@ -23,7 +23,7 @@
import logging
log = logging.getLogger( __name__ )
-
+app = None
class UniverseApplication( object, config.ConfiguresGalaxyMixin ):
"""Encapsulates the state of a Universe application"""
diff -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 -r 0b15f8124467ff74da92f74f5f5977147ee6fc4c lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -10,6 +10,7 @@
from paste import httpexceptions
import pkg_resources
+import galaxy.app
import galaxy.model
import galaxy.model.mapping
import galaxy.datatypes.registry
@@ -39,8 +40,8 @@
app = kwargs.pop( 'app' )
else:
try:
- from galaxy.app import UniverseApplication
- app = UniverseApplication( global_conf=global_conf, **kwargs )
+ app = galaxy.app.UniverseApplication( global_conf=global_conf, **kwargs )
+ galaxy.app.app = app
except:
import traceback
traceback.print_exc()
https://bitbucket.org/galaxy/galaxy-central/commits/65870b9e3c18/
Changeset: 65870b9e3c18
User: dannon
Date: 2015-02-05 23:55:15+00:00
Summary: Fix lunr availability for tool form. Turns out javascript define needs a target. Oops.
Affected #: 3 files
diff -r 0b15f8124467ff74da92f74f5f5977147ee6fc4c -r 65870b9e3c1801e6e6ae9667f46baaec4ddba4b1 client/galaxy/scripts/mvc/tools.js
--- a/client/galaxy/scripts/mvc/tools.js
+++ b/client/galaxy/scripts/mvc/tools.js
@@ -3,7 +3,7 @@
*/
define( ["libs/underscore", "viz/trackster/util", "mvc/data", "libs/lunr" ],
- function(_, util, data) {
+ function(_, util, data, lunr) {
/**
* Mixin for tracking model visibility.
diff -r 0b15f8124467ff74da92f74f5f5977147ee6fc4c -r 65870b9e3c1801e6e6ae9667f46baaec4ddba4b1 static/scripts/mvc/tools.js
--- a/static/scripts/mvc/tools.js
+++ b/static/scripts/mvc/tools.js
@@ -3,7 +3,7 @@
*/
define( ["libs/underscore", "viz/trackster/util", "mvc/data", "libs/lunr" ],
- function(_, util, data) {
+ function(_, util, data, lunr) {
/**
* Mixin for tracking model visibility.
diff -r 0b15f8124467ff74da92f74f5f5977147ee6fc4c -r 65870b9e3c1801e6e6ae9667f46baaec4ddba4b1 static/scripts/packed/mvc/tools.js
--- a/static/scripts/packed/mvc/tools.js
+++ b/static/scripts/packed/mvc/tools.js
@@ -1,1 +1,1 @@
-define(["libs/underscore","viz/trackster/util","mvc/data","libs/lunr"],function(x,a,y){var g={hidden:false,show:function(){this.set("hidden",false)},hide:function(){this.set("hidden",true)},toggle:function(){this.set("hidden",!this.get("hidden"))},is_visible:function(){return !this.attributes.hidden}};var e=Backbone.Model.extend({defaults:{name:null,label:null,type:null,value:null,html:null,num_samples:5},initialize:function(z){this.attributes.html=unescape(this.attributes.html)},copy:function(){return new e(this.toJSON())},set_value:function(z){this.set("value",z||"")}});var i=Backbone.Collection.extend({model:e});var k=e.extend({});var d=e.extend({set_value:function(z){this.set("value",parseInt(z,10))},get_samples:function(){return d3.scale.linear().domain([this.get("min"),this.get("max")]).ticks(this.get("num_samples"))}});var f=d.extend({set_value:function(z){this.set("value",parseFloat(z))}});var t=e.extend({get_samples:function(){return x.map(this.get("options"),function(z){return z[0]})}});e.subModelTypes={integer:d,"float":f,data:k,select:t};var j=Backbone.Model.extend({defaults:{id:null,name:null,description:null,target:null,inputs:[],outputs:[]},urlRoot:galaxy_config.root+"api/tools",initialize:function(z){this.set("inputs",new i(x.map(z.inputs,function(A){var B=e.subModelTypes[A.type]||e;return new B(A)})))},toJSON:function(){var z=Backbone.Model.prototype.toJSON.call(this);z.inputs=this.get("inputs").map(function(A){return A.toJSON()});return z},remove_inputs:function(A){var z=this,B=z.get("inputs").filter(function(C){return(A.indexOf(C.get("type"))!==-1)});z.get("inputs").remove(B)},copy:function(A){var B=new j(this.toJSON());if(A){var z=new Backbone.Collection();B.get("inputs").each(function(C){if(C.get_samples()){z.push(C)}});B.set("inputs",z)}return B},apply_search_results:function(z){(x.indexOf(z,this.attributes.id)!==-1?this.show():this.hide());return this.is_visible()},set_input_value:function(z,A){this.get("inputs").find(function(B){return B.get("name")===z}).set("value",A)},set_input_values:function(A){var z=this;x.each(x.keys(A),function(B){z.set_input_value(B,A[B])})},run:function(){return this._run()},rerun:function(A,z){return this._run({action:"rerun",target_dataset_id:A.id,regions:z})},get_inputs_dict:function(){var z={};this.get("inputs").each(function(A){z[A.get("name")]=A.get("value")});return z},_run:function(B){var C=x.extend({tool_id:this.id,inputs:this.get_inputs_dict()},B);var A=$.Deferred(),z=new a.ServerStateDeferred({ajax_settings:{url:this.urlRoot,data:JSON.stringify(C),dataType:"json",contentType:"application/json",type:"POST"},interval:2000,success_fn:function(D){return D!=="pending"}});$.when(z.go()).then(function(D){A.resolve(new y.DatasetCollection().reset(D))});return A}});x.extend(j.prototype,g);var q=Backbone.View.extend({});var n=Backbone.Collection.extend({model:j});var v=Backbone.Model.extend(g);var l=Backbone.Model.extend({defaults:{elems:[],open:false},clear_search_results:function(){x.each(this.attributes.elems,function(z){z.show()});this.show();this.set("open",false)},apply_search_results:function(A){var B=true,z;x.each(this.attributes.elems,function(C){if(C instanceof v){z=C;z.hide()}else{if(C instanceof j){if(C.apply_search_results(A)){B=false;if(z){z.show()}}}}});if(B){this.hide()}else{this.show();this.set("open",true)}}});x.extend(l.prototype,g);var c=Backbone.Model.extend({defaults:{search_hint_string:"search tools",min_chars_for_search:3,spinner_url:"",clear_btn_url:"",search_url:"",visible:true,query:"",results:null,clear_key:27},initialize:function(){this.on("change:query",this.do_search)},do_search:function(){var B=this.attributes.query;if(B.length<this.attributes.min_chars_for_search){this.set("results",null);return}var A=B+"*";if(this.timer){clearTimeout(this.timer)}$("#search-clear-btn").hide();$("#search-spinner").show();var z=this;this.timer=setTimeout(function(){$.get(z.attributes.search_url,{query:A},function(C){z.set("results",C);$("#search-spinner").hide();$("#search-clear-btn").show()},"json")},200)},clear_search:function(){this.set("query","");this.set("results",null)}});x.extend(c.prototype,g);var o=Backbone.Model.extend({initialize:function(z){this.attributes.tool_search=z.tool_search;this.attributes.tool_search.on("change:results",this.apply_search_results,this);this.attributes.tools=z.tools;this.attributes.layout=new Backbone.Collection(this.parse(z.layout))},parse:function(A){var z=this,B=function(E){var D=E.model_class;if(D.indexOf("Tool")===D.length-4){return z.attributes.tools.get(E.id)}else{if(D==="ToolSection"){var C=x.map(E.elems,B);E.elems=C;return new l(E)}else{if(D==="ToolSectionLabel"){return new v(E)}}}};return x.map(A,B)},clear_search_results:function(){this.get("layout").each(function(z){if(z instanceof l){z.clear_search_results()}else{z.show()}})},apply_search_results:function(){var A=this.get("tool_search").get("results");if(A===null){this.clear_search_results();return}var z=null;this.get("layout").each(function(B){if(B instanceof v){z=B;z.hide()}else{if(B instanceof j){if(B.apply_search_results(A)){if(z){z.show()}}}else{z=null;B.apply_search_results(A)}}})}});var s=Backbone.View.extend({initialize:function(){this.model.on("change:hidden",this.update_visible,this);this.update_visible()},update_visible:function(){(this.model.attributes.hidden?this.$el.hide():this.$el.show())}});var m=s.extend({tagName:"div",render:function(){var z=$("<div/>");z.append(Handlebars.templates.tool_link(this.model.toJSON()));if(this.model.id==="upload1"){z.find("a").on("click",function(A){A.preventDefault();Galaxy.upload.show()})}this.$el.append(z);return this}});var b=s.extend({tagName:"div",className:"toolPanelLabel",render:function(){this.$el.append($("<span/>").text(this.model.attributes.text));return this}});var r=s.extend({tagName:"div",className:"toolSectionWrapper",initialize:function(){s.prototype.initialize.call(this);this.model.on("change:open",this.update_open,this)},render:function(){this.$el.append(Handlebars.templates.panel_section(this.model.toJSON()));var z=this.$el.find(".toolSectionBody");x.each(this.model.attributes.elems,function(A){if(A instanceof j){var B=new m({model:A,className:"toolTitle"});B.render();z.append(B.$el)}else{if(A instanceof v){var C=new b({model:A});C.render();z.append(C.$el)}else{}}});return this},events:{"click .toolSectionTitle > a":"toggle"},toggle:function(){this.model.set("open",!this.model.attributes.open)},update_open:function(){(this.model.attributes.open?this.$el.children(".toolSectionBody").slideDown("fast"):this.$el.children(".toolSectionBody").slideUp("fast"))}});var p=Backbone.View.extend({tagName:"div",id:"tool-search",className:"bar",events:{click:"focus_and_select","keyup :input":"query_changed","click #search-clear-btn":"clear"},render:function(){this.$el.append(Handlebars.templates.tool_search(this.model.toJSON()));if(!this.model.is_visible()){this.$el.hide()}this.$el.find("[title]").tooltip();return this},focus_and_select:function(){this.$el.find(":input").focus().select()},clear:function(){this.model.clear_search();this.$el.find(":input").val(this.model.attributes.search_hint_string);this.focus_and_select();return false},query_changed:function(z){if((this.model.attributes.clear_key)&&(this.model.attributes.clear_key===z.which)){this.clear();return false}this.model.set("query",this.$el.find(":input").val())}});var w=Backbone.View.extend({tagName:"div",className:"toolMenu",initialize:function(){this.model.get("tool_search").on("change:results",this.handle_search_results,this)},render:function(){var z=this;var A=new p({model:this.model.get("tool_search")});A.render();z.$el.append(A.$el);this.model.get("layout").each(function(C){if(C instanceof l){var B=new r({model:C});B.render();z.$el.append(B.$el)}else{if(C instanceof j){var D=new m({model:C,className:"toolTitleNoSection"});D.render();z.$el.append(D.$el)}else{if(C instanceof v){var E=new b({model:C});E.render();z.$el.append(E.$el)}}}});z.$el.find("a.tool-link").click(function(D){var C=$(this).attr("class").split(/\s+/)[0],B=z.model.get("tools").get(C);z.trigger("tool_link_click",D,B)});return this},handle_search_results:function(){var z=this.model.get("tool_search").get("results");if(z&&z.length===0){$("#search-no-results").show()}else{$("#search-no-results").hide()}}});var u=Backbone.View.extend({className:"toolForm",render:function(){this.$el.children().remove();this.$el.append(Handlebars.templates.tool_form(this.model.toJSON()))}});var h=Backbone.View.extend({className:"toolMenuAndView",initialize:function(){this.tool_panel_view=new w({collection:this.collection});this.tool_form_view=new u()},render:function(){this.tool_panel_view.render();this.tool_panel_view.$el.css("float","left");this.$el.append(this.tool_panel_view.$el);this.tool_form_view.$el.hide();this.$el.append(this.tool_form_view.$el);var z=this;this.tool_panel_view.on("tool_link_click",function(B,A){B.preventDefault();z.show_tool(A)})},show_tool:function(A){var z=this;A.fetch().done(function(){z.tool_form_view.model=A;z.tool_form_view.render();z.tool_form_view.$el.show();$("#left").width("650px")})}});return{ToolParameter:e,IntegerToolParameter:d,SelectToolParameter:t,Tool:j,ToolCollection:n,ToolSearch:c,ToolPanel:o,ToolPanelView:w,ToolFormView:u}});
\ No newline at end of file
+define(["libs/underscore","viz/trackster/util","mvc/data","libs/lunr"],function(y,a,z,s){var g={hidden:false,show:function(){this.set("hidden",false)},hide:function(){this.set("hidden",true)},toggle:function(){this.set("hidden",!this.get("hidden"))},is_visible:function(){return !this.attributes.hidden}};var e=Backbone.Model.extend({defaults:{name:null,label:null,type:null,value:null,html:null,num_samples:5},initialize:function(A){this.attributes.html=unescape(this.attributes.html)},copy:function(){return new e(this.toJSON())},set_value:function(A){this.set("value",A||"")}});var i=Backbone.Collection.extend({model:e});var k=e.extend({});var d=e.extend({set_value:function(A){this.set("value",parseInt(A,10))},get_samples:function(){return d3.scale.linear().domain([this.get("min"),this.get("max")]).ticks(this.get("num_samples"))}});var f=d.extend({set_value:function(A){this.set("value",parseFloat(A))}});var u=e.extend({get_samples:function(){return y.map(this.get("options"),function(A){return A[0]})}});e.subModelTypes={integer:d,"float":f,data:k,select:u};var j=Backbone.Model.extend({defaults:{id:null,name:null,description:null,target:null,inputs:[],outputs:[]},urlRoot:galaxy_config.root+"api/tools",initialize:function(A){this.set("inputs",new i(y.map(A.inputs,function(B){var C=e.subModelTypes[B.type]||e;return new C(B)})))},toJSON:function(){var A=Backbone.Model.prototype.toJSON.call(this);A.inputs=this.get("inputs").map(function(B){return B.toJSON()});return A},remove_inputs:function(B){var A=this,C=A.get("inputs").filter(function(D){return(B.indexOf(D.get("type"))!==-1)});A.get("inputs").remove(C)},copy:function(B){var C=new j(this.toJSON());if(B){var A=new Backbone.Collection();C.get("inputs").each(function(D){if(D.get_samples()){A.push(D)}});C.set("inputs",A)}return C},apply_search_results:function(A){(y.indexOf(A,this.attributes.id)!==-1?this.show():this.hide());return this.is_visible()},set_input_value:function(A,B){this.get("inputs").find(function(C){return C.get("name")===A}).set("value",B)},set_input_values:function(B){var A=this;y.each(y.keys(B),function(C){A.set_input_value(C,B[C])})},run:function(){return this._run()},rerun:function(B,A){return this._run({action:"rerun",target_dataset_id:B.id,regions:A})},get_inputs_dict:function(){var A={};this.get("inputs").each(function(B){A[B.get("name")]=B.get("value")});return A},_run:function(C){var D=y.extend({tool_id:this.id,inputs:this.get_inputs_dict()},C);var B=$.Deferred(),A=new a.ServerStateDeferred({ajax_settings:{url:this.urlRoot,data:JSON.stringify(D),dataType:"json",contentType:"application/json",type:"POST"},interval:2000,success_fn:function(E){return E!=="pending"}});$.when(A.go()).then(function(E){B.resolve(new z.DatasetCollection().reset(E))});return B}});y.extend(j.prototype,g);var q=Backbone.View.extend({});var n=Backbone.Collection.extend({model:j});var w=Backbone.Model.extend(g);var l=Backbone.Model.extend({defaults:{elems:[],open:false},clear_search_results:function(){y.each(this.attributes.elems,function(A){A.show()});this.show();this.set("open",false)},apply_search_results:function(B){var C=true,A;y.each(this.attributes.elems,function(D){if(D instanceof w){A=D;A.hide()}else{if(D instanceof j){if(D.apply_search_results(B)){C=false;if(A){A.show()}}}}});if(C){this.hide()}else{this.show();this.set("open",true)}}});y.extend(l.prototype,g);var c=Backbone.Model.extend({defaults:{search_hint_string:"search tools",min_chars_for_search:3,spinner_url:"",clear_btn_url:"",search_url:"",visible:true,query:"",results:null,clear_key:27},initialize:function(){this.on("change:query",this.do_search)},do_search:function(){var C=this.attributes.query;if(C.length<this.attributes.min_chars_for_search){this.set("results",null);return}var B=C+"*";if(this.timer){clearTimeout(this.timer)}$("#search-clear-btn").hide();$("#search-spinner").show();var A=this;this.timer=setTimeout(function(){$.get(A.attributes.search_url,{query:B},function(D){A.set("results",D);$("#search-spinner").hide();$("#search-clear-btn").show()},"json")},200)},clear_search:function(){this.set("query","");this.set("results",null)}});y.extend(c.prototype,g);var o=Backbone.Model.extend({initialize:function(A){this.attributes.tool_search=A.tool_search;this.attributes.tool_search.on("change:results",this.apply_search_results,this);this.attributes.tools=A.tools;this.attributes.layout=new Backbone.Collection(this.parse(A.layout))},parse:function(B){var A=this,C=function(F){var E=F.model_class;if(E.indexOf("Tool")===E.length-4){return A.attributes.tools.get(F.id)}else{if(E==="ToolSection"){var D=y.map(F.elems,C);F.elems=D;return new l(F)}else{if(E==="ToolSectionLabel"){return new w(F)}}}};return y.map(B,C)},clear_search_results:function(){this.get("layout").each(function(A){if(A instanceof l){A.clear_search_results()}else{A.show()}})},apply_search_results:function(){var B=this.get("tool_search").get("results");if(B===null){this.clear_search_results();return}var A=null;this.get("layout").each(function(C){if(C instanceof w){A=C;A.hide()}else{if(C instanceof j){if(C.apply_search_results(B)){if(A){A.show()}}}else{A=null;C.apply_search_results(B)}}})}});var t=Backbone.View.extend({initialize:function(){this.model.on("change:hidden",this.update_visible,this);this.update_visible()},update_visible:function(){(this.model.attributes.hidden?this.$el.hide():this.$el.show())}});var m=t.extend({tagName:"div",render:function(){var A=$("<div/>");A.append(Handlebars.templates.tool_link(this.model.toJSON()));if(this.model.id==="upload1"){A.find("a").on("click",function(B){B.preventDefault();Galaxy.upload.show()})}this.$el.append(A);return this}});var b=t.extend({tagName:"div",className:"toolPanelLabel",render:function(){this.$el.append($("<span/>").text(this.model.attributes.text));return this}});var r=t.extend({tagName:"div",className:"toolSectionWrapper",initialize:function(){t.prototype.initialize.call(this);this.model.on("change:open",this.update_open,this)},render:function(){this.$el.append(Handlebars.templates.panel_section(this.model.toJSON()));var A=this.$el.find(".toolSectionBody");y.each(this.model.attributes.elems,function(B){if(B instanceof j){var C=new m({model:B,className:"toolTitle"});C.render();A.append(C.$el)}else{if(B instanceof w){var D=new b({model:B});D.render();A.append(D.$el)}else{}}});return this},events:{"click .toolSectionTitle > a":"toggle"},toggle:function(){this.model.set("open",!this.model.attributes.open)},update_open:function(){(this.model.attributes.open?this.$el.children(".toolSectionBody").slideDown("fast"):this.$el.children(".toolSectionBody").slideUp("fast"))}});var p=Backbone.View.extend({tagName:"div",id:"tool-search",className:"bar",events:{click:"focus_and_select","keyup :input":"query_changed","click #search-clear-btn":"clear"},render:function(){this.$el.append(Handlebars.templates.tool_search(this.model.toJSON()));if(!this.model.is_visible()){this.$el.hide()}this.$el.find("[title]").tooltip();return this},focus_and_select:function(){this.$el.find(":input").focus().select()},clear:function(){this.model.clear_search();this.$el.find(":input").val(this.model.attributes.search_hint_string);this.focus_and_select();return false},query_changed:function(A){if((this.model.attributes.clear_key)&&(this.model.attributes.clear_key===A.which)){this.clear();return false}this.model.set("query",this.$el.find(":input").val())}});var x=Backbone.View.extend({tagName:"div",className:"toolMenu",initialize:function(){this.model.get("tool_search").on("change:results",this.handle_search_results,this)},render:function(){var A=this;var B=new p({model:this.model.get("tool_search")});B.render();A.$el.append(B.$el);this.model.get("layout").each(function(D){if(D instanceof l){var C=new r({model:D});C.render();A.$el.append(C.$el)}else{if(D instanceof j){var E=new m({model:D,className:"toolTitleNoSection"});E.render();A.$el.append(E.$el)}else{if(D instanceof w){var F=new b({model:D});F.render();A.$el.append(F.$el)}}}});A.$el.find("a.tool-link").click(function(E){var D=$(this).attr("class").split(/\s+/)[0],C=A.model.get("tools").get(D);A.trigger("tool_link_click",E,C)});return this},handle_search_results:function(){var A=this.model.get("tool_search").get("results");if(A&&A.length===0){$("#search-no-results").show()}else{$("#search-no-results").hide()}}});var v=Backbone.View.extend({className:"toolForm",render:function(){this.$el.children().remove();this.$el.append(Handlebars.templates.tool_form(this.model.toJSON()))}});var h=Backbone.View.extend({className:"toolMenuAndView",initialize:function(){this.tool_panel_view=new x({collection:this.collection});this.tool_form_view=new v()},render:function(){this.tool_panel_view.render();this.tool_panel_view.$el.css("float","left");this.$el.append(this.tool_panel_view.$el);this.tool_form_view.$el.hide();this.$el.append(this.tool_form_view.$el);var A=this;this.tool_panel_view.on("tool_link_click",function(C,B){C.preventDefault();A.show_tool(B)})},show_tool:function(B){var A=this;B.fetch().done(function(){A.tool_form_view.model=B;A.tool_form_view.render();A.tool_form_view.$el.show();$("#left").width("650px")})}});return{ToolParameter:e,IntegerToolParameter:d,SelectToolParameter:u,Tool:j,ToolCollection:n,ToolSearch:c,ToolPanel:o,ToolPanelView:x,ToolFormView:v}});
\ No newline at end of file
https://bitbucket.org/galaxy/galaxy-central/commits/8f1d5b7b30c6/
Changeset: 8f1d5b7b30c6
User: dannon
Date: 2015-02-05 23:55:20+00:00
Summary: Merge.
Affected #: 4 files
diff -r 65870b9e3c1801e6e6ae9667f46baaec4ddba4b1 -r 8f1d5b7b30c62231bfa4fa8f39fc6338726020ee lib/galaxy/managers/datasets.py
--- a/lib/galaxy/managers/datasets.py
+++ b/lib/galaxy/managers/datasets.py
@@ -274,3 +274,15 @@
def add_deserializers( self ):
super( DatasetAssociationDeserializer, self ).add_deserializers()
deletable.PurgableDeserializerMixin.add_deserializers( self )
+
+class DatasetAssociationFilters( base.ModelFilterParser, deletable.PurgableFiltersMixin ):
+
+ def _add_parsers( self ):
+ super( DatasetAssociationFilters, self )._add_parsers()
+ deletable.PurgableFiltersMixin._add_parsers( self )
+
+ self.orm_filter_parsers.update({
+ 'name' : { 'op': ( 'eq', 'contains', 'like' ) },
+ 'state' : { 'op': ( 'eq', 'in' ) },
+ })
+ #self.fn_filter_parsers.update({})
diff -r 65870b9e3c1801e6e6ae9667f46baaec4ddba4b1 -r 8f1d5b7b30c62231bfa4fa8f39fc6338726020ee lib/galaxy/managers/hdas.py
--- a/lib/galaxy/managers/hdas.py
+++ b/lib/galaxy/managers/hdas.py
@@ -592,3 +592,25 @@
})
self.deserializable_keyset.update( self.deserializers.keys() )
+
+
+class HDAFilters( datasets.DatasetAssociationFilters ):
+ model_class = model.HistoryDatasetAssociation
+
+ def _add_parsers( self ):
+ super( HDAFilters, self )._add_parsers()
+
+ self.fn_filter_parsers.update({
+ #TODO: filter_string_attr_contains, filter_string_attr_eq
+ #'dbkey' : { 'op': { 'has' : self.filter_annotation_contains, } },
+
+ #TODO: add this in annotatable mixin
+ 'annotation' : { 'op': { 'has' : self.filter_annotation_contains, } },
+ #TODO: add this in taggable mixin
+ 'tag' : {
+ 'op': {
+ 'eq' : self.filter_has_tag,
+ 'has': self.filter_has_partial_tag,
+ }
+ }
+ })
diff -r 65870b9e3c1801e6e6ae9667f46baaec4ddba4b1 -r 8f1d5b7b30c62231bfa4fa8f39fc6338726020ee lib/galaxy/managers/histories.py
--- a/lib/galaxy/managers/histories.py
+++ b/lib/galaxy/managers/histories.py
@@ -310,7 +310,7 @@
'contents' : self.serialize_contents
})
- def serialize_contents( self, trans, history, key ):
+ def serialize_contents( self, trans, history, *args ):
contents_dictionaries = []
for content in history.contents_iter( types=[ 'dataset', 'dataset_collection' ] ):
contents_dict = {}
diff -r 65870b9e3c1801e6e6ae9667f46baaec4ddba4b1 -r 8f1d5b7b30c62231bfa4fa8f39fc6338726020ee lib/galaxy/managers/users.py
--- a/lib/galaxy/managers/users.py
+++ b/lib/galaxy/managers/users.py
@@ -8,15 +8,17 @@
from galaxy import model
from galaxy import exceptions
+from galaxy import util
from galaxy.managers import base
+from galaxy.managers import deletable
from galaxy.managers import api_keys
import logging
log = logging.getLogger( __name__ )
-class UserManager( base.ModelManager ):
+class UserManager( base.ModelManager, deletable.PurgableManagerMixin ):
model_class = model.User
foreign_key_name = 'user'
@@ -107,7 +109,7 @@
"""
Return a list of admin email addresses from the config file.
"""
- return [ x.strip() for x in self.app.config.get( "admin_users", "" ).split( "," ) ]
+ return [ email.strip() for email in self.app.config.get( "admin_users", "" ).split( "," ) ]
def admins( self, trans, filters=None, **kwargs ):
"""
@@ -193,14 +195,19 @@
#TODO: not sure we need to go through sec agent... it's just the first role of type private
return self.app.security_agent.get_private_user_role( user )
+ def quota( self, trans, user ):
+ #TODO: use quota manager
+ return self.app.quota_agent.get_percent( user=user )
-class UserSerializer( base.ModelSerializer ):
- def __init__( self ):
+class UserSerializer( base.ModelSerializer, deletable.PurgableSerializerMixin ):
+
+ def __init__( self, app ):
"""
Convert a User and associated data to a dictionary representation.
"""
- super( UserSerializer, self ).__init__()
+ super( UserSerializer, self ).__init__( app )
+ self.user_manager = UserManager( app )
self.default_view = 'summary'
self.add_view( 'summary', [
@@ -209,23 +216,80 @@
self.add_view( 'detailed', [
'update_time',
'create_time',
+
+ 'deleted',
+ 'purged',
+ 'active',
+
'total_disk_usage',
'nice_total_disk_usage',
- 'deleted',
- 'purged',
- 'active'
- ], include_keys_from='summary' )
- #self.add_view( 'summary', [
+ 'quota_percent'
# 'preferences',
# # all tags
# 'tags',
# # all annotations
# 'annotations'
- #], include_keys_from='detailed' )
+ ], include_keys_from='summary' )
def add_serializers( self ):
+ super( UserSerializer, self ).add_serializers()
+ deletable.PurgableSerializerMixin.add_serializers( self )
+
self.serializers.update({
'id' : self.serialize_id,
'create_time' : self.serialize_date,
'update_time' : self.serialize_date,
+ 'is_admin' : lambda t, i, k: self.user_manager.is_admin( t, i ),
+ 'quota_percent' : lambda t, i, k: self.user_manager.quota( t, i )
})
+
+ def serialize_current_anonymous_user( self, trans, user, keys ):
+ # use the current history if any to get usage stats for trans' anonymous user
+ #TODO: might be better as sep. Serializer class
+ history = trans.history
+ if not history:
+ raise exceptions.AuthenticationRequired( 'No history for anonymous user usage stats' );
+
+ usage = trans.app.quota_agent.get_usage( trans, history=trans.history )
+ percent = trans.app.quota_agent.get_percent( trans=trans, usage=usage )
+
+ # a very small subset of keys available
+ values = {
+ 'id' : None,
+ 'total_disk_usage' : int( usage ),
+ 'nice_total_disk_usage' : util.nice_size( usage ),
+ 'quota_percent' : percent,
+ }
+ serialized = {}
+ for key in keys:
+ if key in values:
+ serialized[ key ] = values[ key ]
+ return serialized
+
+ def serialize( self, trans, user, keys ):
+ """
+ Override to return at least some usage info if user is anonymous.
+ """
+ if self.user_manager.is_anonymous( user ):
+ return self.serialize_current_anonymous_user( trans, user, keys )
+ return super( UserSerializer, self ).serialize( trans, user, keys )
+
+
+class AdminUserFilters( base.ModelFilterParser, deletable.PurgableFiltersMixin ):
+ model_class = model.User
+
+ def _add_parsers( self ):
+ super( AdminUserFilters, self )._add_parsers()
+ deletable.PurgableFiltersMixin._add_parsers( self )
+
+ #PRECONDITION: user making the query has been verified as an admin
+ self.orm_filter_parsers.update({
+ 'name' : { 'op': ( 'eq', 'contains', 'like' ) },
+ 'email' : { 'op': ( 'eq', 'contains', 'like' ) },
+ 'username' : { 'op': ( 'eq', 'contains', 'like' ) },
+ 'active' : { 'op': ( 'eq' ) },
+ 'disk_usage' : { 'op': ( 'le', 'ge' ) }
+ })
+
+ self.fn_filter_parsers.update({
+ })
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: Fix to 3abf1c3: pass app to super
by commits-noreply@bitbucket.org 06 Feb '15
by commits-noreply@bitbucket.org 06 Feb '15
06 Feb '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/e7e6758d12d7/
Changeset: e7e6758d12d7
User: carlfeberhard
Date: 2015-02-05 22:36:26+00:00
Summary: Fix to 3abf1c3: pass app to super
Affected #: 1 file
diff -r 3abf1c30e4730fb84c8a3ab764661e19071a8e45 -r e7e6758d12d7835c843bf978061cf410e1cc778f lib/galaxy/managers/users.py
--- a/lib/galaxy/managers/users.py
+++ b/lib/galaxy/managers/users.py
@@ -206,7 +206,7 @@
"""
Convert a User and associated data to a dictionary representation.
"""
- super( UserSerializer, self ).__init__()
+ super( UserSerializer, self ).__init__( app )
self.user_manager = UserManager( app )
self.default_view = 'summary'
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: Managers, users: add filters for later admin use, quota serializers, and a fallback anonymous user serialization; DatasetAssociations & HDAs: add filters
by commits-noreply@bitbucket.org 06 Feb '15
by commits-noreply@bitbucket.org 06 Feb '15
06 Feb '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/3abf1c30e473/
Changeset: 3abf1c30e473
User: carlfeberhard
Date: 2015-02-05 21:55:23+00:00
Summary: Managers, users: add filters for later admin use, quota serializers, and a fallback anonymous user serialization; DatasetAssociations & HDAs: add filters
Affected #: 4 files
diff -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 -r 3abf1c30e4730fb84c8a3ab764661e19071a8e45 lib/galaxy/managers/datasets.py
--- a/lib/galaxy/managers/datasets.py
+++ b/lib/galaxy/managers/datasets.py
@@ -274,3 +274,15 @@
def add_deserializers( self ):
super( DatasetAssociationDeserializer, self ).add_deserializers()
deletable.PurgableDeserializerMixin.add_deserializers( self )
+
+class DatasetAssociationFilters( base.ModelFilterParser, deletable.PurgableFiltersMixin ):
+
+ def _add_parsers( self ):
+ super( DatasetAssociationFilters, self )._add_parsers()
+ deletable.PurgableFiltersMixin._add_parsers( self )
+
+ self.orm_filter_parsers.update({
+ 'name' : { 'op': ( 'eq', 'contains', 'like' ) },
+ 'state' : { 'op': ( 'eq', 'in' ) },
+ })
+ #self.fn_filter_parsers.update({})
diff -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 -r 3abf1c30e4730fb84c8a3ab764661e19071a8e45 lib/galaxy/managers/hdas.py
--- a/lib/galaxy/managers/hdas.py
+++ b/lib/galaxy/managers/hdas.py
@@ -592,3 +592,25 @@
})
self.deserializable_keyset.update( self.deserializers.keys() )
+
+
+class HDAFilters( datasets.DatasetAssociationFilters ):
+ model_class = model.HistoryDatasetAssociation
+
+ def _add_parsers( self ):
+ super( HDAFilters, self )._add_parsers()
+
+ self.fn_filter_parsers.update({
+ #TODO: filter_string_attr_contains, filter_string_attr_eq
+ #'dbkey' : { 'op': { 'has' : self.filter_annotation_contains, } },
+
+ #TODO: add this in annotatable mixin
+ 'annotation' : { 'op': { 'has' : self.filter_annotation_contains, } },
+ #TODO: add this in taggable mixin
+ 'tag' : {
+ 'op': {
+ 'eq' : self.filter_has_tag,
+ 'has': self.filter_has_partial_tag,
+ }
+ }
+ })
diff -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 -r 3abf1c30e4730fb84c8a3ab764661e19071a8e45 lib/galaxy/managers/histories.py
--- a/lib/galaxy/managers/histories.py
+++ b/lib/galaxy/managers/histories.py
@@ -310,7 +310,7 @@
'contents' : self.serialize_contents
})
- def serialize_contents( self, trans, history, key ):
+ def serialize_contents( self, trans, history, *args ):
contents_dictionaries = []
for content in history.contents_iter( types=[ 'dataset', 'dataset_collection' ] ):
contents_dict = {}
diff -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 -r 3abf1c30e4730fb84c8a3ab764661e19071a8e45 lib/galaxy/managers/users.py
--- a/lib/galaxy/managers/users.py
+++ b/lib/galaxy/managers/users.py
@@ -8,15 +8,17 @@
from galaxy import model
from galaxy import exceptions
+from galaxy import util
from galaxy.managers import base
+from galaxy.managers import deletable
from galaxy.managers import api_keys
import logging
log = logging.getLogger( __name__ )
-class UserManager( base.ModelManager ):
+class UserManager( base.ModelManager, deletable.PurgableManagerMixin ):
model_class = model.User
foreign_key_name = 'user'
@@ -107,7 +109,7 @@
"""
Return a list of admin email addresses from the config file.
"""
- return [ x.strip() for x in self.app.config.get( "admin_users", "" ).split( "," ) ]
+ return [ email.strip() for email in self.app.config.get( "admin_users", "" ).split( "," ) ]
def admins( self, trans, filters=None, **kwargs ):
"""
@@ -193,14 +195,19 @@
#TODO: not sure we need to go through sec agent... it's just the first role of type private
return self.app.security_agent.get_private_user_role( user )
+ def quota( self, trans, user ):
+ #TODO: use quota manager
+ return self.app.quota_agent.get_percent( user=user )
-class UserSerializer( base.ModelSerializer ):
- def __init__( self ):
+class UserSerializer( base.ModelSerializer, deletable.PurgableSerializerMixin ):
+
+ def __init__( self, app ):
"""
Convert a User and associated data to a dictionary representation.
"""
super( UserSerializer, self ).__init__()
+ self.user_manager = UserManager( app )
self.default_view = 'summary'
self.add_view( 'summary', [
@@ -209,23 +216,80 @@
self.add_view( 'detailed', [
'update_time',
'create_time',
+
+ 'deleted',
+ 'purged',
+ 'active',
+
'total_disk_usage',
'nice_total_disk_usage',
- 'deleted',
- 'purged',
- 'active'
- ], include_keys_from='summary' )
- #self.add_view( 'summary', [
+ 'quota_percent'
# 'preferences',
# # all tags
# 'tags',
# # all annotations
# 'annotations'
- #], include_keys_from='detailed' )
+ ], include_keys_from='summary' )
def add_serializers( self ):
+ super( UserSerializer, self ).add_serializers()
+ deletable.PurgableSerializerMixin.add_serializers( self )
+
self.serializers.update({
'id' : self.serialize_id,
'create_time' : self.serialize_date,
'update_time' : self.serialize_date,
+ 'is_admin' : lambda t, i, k: self.user_manager.is_admin( t, i ),
+ 'quota_percent' : lambda t, i, k: self.user_manager.quota( t, i )
})
+
+ def serialize_current_anonymous_user( self, trans, user, keys ):
+ # use the current history if any to get usage stats for trans' anonymous user
+ #TODO: might be better as sep. Serializer class
+ history = trans.history
+ if not history:
+ raise exceptions.AuthenticationRequired( 'No history for anonymous user usage stats' );
+
+ usage = trans.app.quota_agent.get_usage( trans, history=trans.history )
+ percent = trans.app.quota_agent.get_percent( trans=trans, usage=usage )
+
+ # a very small subset of keys available
+ values = {
+ 'id' : None,
+ 'total_disk_usage' : int( usage ),
+ 'nice_total_disk_usage' : util.nice_size( usage ),
+ 'quota_percent' : percent,
+ }
+ serialized = {}
+ for key in keys:
+ if key in values:
+ serialized[ key ] = values[ key ]
+ return serialized
+
+ def serialize( self, trans, user, keys ):
+ """
+ Override to return at least some usage info if user is anonymous.
+ """
+ if self.user_manager.is_anonymous( user ):
+ return self.serialize_current_anonymous_user( trans, user, keys )
+ return super( UserSerializer, self ).serialize( trans, user, keys )
+
+
+class AdminUserFilters( base.ModelFilterParser, deletable.PurgableFiltersMixin ):
+ model_class = model.User
+
+ def _add_parsers( self ):
+ super( AdminUserFilters, self )._add_parsers()
+ deletable.PurgableFiltersMixin._add_parsers( self )
+
+ #PRECONDITION: user making the query has been verified as an admin
+ self.orm_filter_parsers.update({
+ 'name' : { 'op': ( 'eq', 'contains', 'like' ) },
+ 'email' : { 'op': ( 'eq', 'contains', 'like' ) },
+ 'username' : { 'op': ( 'eq', 'contains', 'like' ) },
+ 'active' : { 'op': ( 'eq' ) },
+ 'disk_usage' : { 'op': ( 'le', 'ge' ) }
+ })
+
+ self.fn_filter_parsers.update({
+ })
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
3 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/2248c4d82151/
Changeset: 2248c4d82151
Branch: stable
User: jmchilton
Date: 2015-02-05 17:14:01+00:00
Summary: Workflow scheduling delay fix.
There were problems if all three of these conditions were met - 1) workflow from GUI, 2) workflow evaluation delayed, and 3) a delayed step was connected to a input dataset. This fixes these workflows.
Affected #: 3 files
diff -r 097bbb3b7d3246faaa5188a1fc2a79b01630025c -r 2248c4d82151c928a7615f9335b55aa0c55c9446 lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -3202,6 +3202,27 @@
def update( self ):
self.update_time = galaxy.model.orm.now.now()
+ def add_input( self, content, step_id ):
+ if content.history_content_type == "dataset":
+ request_to_content = WorkflowRequestToInputDatasetAssociation()
+ request_to_content.dataset = content
+ request_to_content.workflow_step_id = step_id
+ self.input_datasets.append( request_to_content )
+ else:
+ request_to_content = WorkflowRequestToInputDatasetCollectionAssociation()
+ request_to_content.dataset_collection = content
+ request_to_content.workflow_step_id = step_id
+ self.input_dataset_collections.append( request_to_content )
+
+ def has_input_for_step( self, step_id ):
+ for content in self.input_datasets:
+ if content.workflow_step_id == step_id:
+ return True
+ for content in self.input_dataset_collections:
+ if content.workflow_step_id == step_id:
+ return True
+ return False
+
class WorkflowInvocationStep( object, Dictifiable ):
dict_collection_visible_keys = ( 'id', 'update_time', 'job_id', 'workflow_step_id', 'action' )
diff -r 097bbb3b7d3246faaa5188a1fc2a79b01630025c -r 2248c4d82151c928a7615f9335b55aa0c55c9446 lib/galaxy/workflow/modules.py
--- a/lib/galaxy/workflow/modules.py
+++ b/lib/galaxy/workflow/modules.py
@@ -320,6 +320,11 @@
step_outputs[ 'input_ds_copy' ] = new_hdca
else:
raise Exception("Unknown history content encountered")
+ # If coming from UI - we haven't registered invocation inputs yet,
+ # so do that now so dependent steps can be recalculated. In the future
+ # everything should come in from the API and this can be eliminated.
+ if not invocation.has_input_for_step( step.id ):
+ invocation.add_input( step_outputs.values()[ 0 ], step.id )
progress.set_outputs_for_input( step, step_outputs )
return job
diff -r 097bbb3b7d3246faaa5188a1fc2a79b01630025c -r 2248c4d82151c928a7615f9335b55aa0c55c9446 lib/galaxy/workflow/run_request.py
--- a/lib/galaxy/workflow/run_request.py
+++ b/lib/galaxy/workflow/run_request.py
@@ -284,18 +284,8 @@
value=value,
type=param_types.REPLACEMENT_PARAMETERS,
)
-
for step_id, content in run_config.inputs.iteritems():
- if content.history_content_type == "dataset":
- request_to_content = model.WorkflowRequestToInputDatasetAssociation()
- request_to_content.dataset = content
- request_to_content.workflow_step_id = step_id
- workflow_invocation.input_datasets.append( request_to_content )
- else:
- request_to_content = model.WorkflowRequestToInputDatasetCollectionAssociation()
- request_to_content.dataset_collection = content
- request_to_content.workflow_step_id = step_id
- workflow_invocation.input_dataset_collections.append( request_to_content )
+ workflow_invocation.add_input( content, step_id )
for step in workflow.steps:
state = step.state
https://bitbucket.org/galaxy/galaxy-central/commits/e07163fe8bdb/
Changeset: e07163fe8bdb
Branch: stable
User: jmchilton
Date: 2015-02-05 17:14:01+00:00
Summary: Fix scheduling_manager.py for unknown attribute reference.
Not sure if this was a poor rebasing or a copy and paste error.
Affected #: 1 file
diff -r 2248c4d82151c928a7615f9335b55aa0c55c9446 -r e07163fe8bdbc3e85f48b308ed293c46578b3294 lib/galaxy/workflow/scheduling_manager.py
--- a/lib/galaxy/workflow/scheduling_manager.py
+++ b/lib/galaxy/workflow/scheduling_manager.py
@@ -116,7 +116,6 @@
for plugin_element in plugins_element.getchildren():
plugin_type = plugin_element.tag
plugin_kwds = dict( plugin_element.items() )
- plugin_kwds.update( self.extra_kwargs )
workflow_scheduler_id = plugin_kwds.get( 'id', None )
self.__init_plugin( plugin_type, workflow_scheduler_id, **plugin_kwds )
https://bitbucket.org/galaxy/galaxy-central/commits/644deef1a578/
Changeset: 644deef1a578
Branch: stable
User: jmchilton
Date: 2015-02-05 18:33:59+00:00
Summary: Bugfix for bugfix d3b1f6b.
d3b1f6b fix the GUI (in an obsecure use) but broke fairly typical uses of the API.
Affected #: 1 file
diff -r e07163fe8bdbc3e85f48b308ed293c46578b3294 -r 644deef1a5789b788552a6db7f3d6fe07d81c79d lib/galaxy/workflow/modules.py
--- a/lib/galaxy/workflow/modules.py
+++ b/lib/galaxy/workflow/modules.py
@@ -324,7 +324,9 @@
# so do that now so dependent steps can be recalculated. In the future
# everything should come in from the API and this can be eliminated.
if not invocation.has_input_for_step( step.id ):
- invocation.add_input( step_outputs.values()[ 0 ], step.id )
+ content = step_outputs.values()[ 0 ]
+ if content:
+ invocation.add_input( content, step.id )
progress.set_outputs_for_input( step, step_outputs )
return job
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
[galaxyproject/usegalaxy-playbook] f0c67a: make toolform fancy again; update mutable configs
by GitHub 06 Feb '15
by GitHub 06 Feb '15
06 Feb '15
Branch: refs/heads/master
Home: https://github.com/galaxyproject/usegalaxy-playbook
Commit: f0c67a17684293e648e79eb1dae8c8116aed4e22
https://github.com/galaxyproject/usegalaxy-playbook/commit/f0c67a17684293e6…
Author: martenson <cech.marten(a)gmail.com>
Date: 2015-02-05 (Thu, 05 Feb 2015)
Changed paths:
M files/galaxy/test.galaxyproject.org/var/integrated_tool_panel.xml
M files/galaxy/test.galaxyproject.org/var/shed_tool_conf.xml
M stage/group_vars/galaxyservers.yml
Log Message:
-----------
make toolform fancy again; update mutable configs
1
0
commit/galaxy-central: guerler: ToolForm: Update version selection, use underscores for internal parameters
by commits-noreply@bitbucket.org 06 Feb '15
by commits-noreply@bitbucket.org 06 Feb '15
06 Feb '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/494418e72cf0/
Changeset: 494418e72cf0
User: guerler
Date: 2015-02-05 18:34:51+00:00
Summary: ToolForm: Update version selection, use underscores for internal parameters
Affected #: 12 files
diff -r ff2b00fcbd70e3d7ce10b0444412cc68d2ede46f -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 client/galaxy/scripts/mvc/tools/tools-form-base.js
--- a/client/galaxy/scripts/mvc/tools/tools-form-base.js
+++ b/client/galaxy/scripts/mvc/tools/tools-form-base.js
@@ -15,12 +15,10 @@
this.optionsDefault = {
// uses dynamic fields instead of text fields
is_dynamic : true,
- // shows form in compact view mode
- compact : false,
+ // shows form in narrow view mode
+ narrow : false,
// shows errors on start
- initial_errors : false,
- // use default value for disabled fields
- use_defaults : false
+ initial_errors : false
};
// configure options
@@ -58,9 +56,66 @@
$(this.container).append(this.$el);
// build this form
- this._buildForm();
+ this.build(this.options);
},
+ /** Main tool form build function. This function is called once a new model is available.
+ */
+ build: function(options) {
+ // link this
+ var self = this;
+
+ // reset events
+ this.off('refresh');
+ this.off('reset');
+
+ // reset field list, which contains the input field elements
+ this.field_list = {};
+
+ // reset sequential input definition list, which contains the input definitions as provided from the api
+ this.input_list = {};
+
+ // reset input element list, which contains the dom elements of each input element (includes also the input field)
+ this.element_list = {};
+
+ // creates a tree/json data structure from the input form
+ this.tree = new ToolTree(this);
+
+ // request history content and build form
+ this.content = new ToolContent(this);
+
+ // update model data
+ self.options.inputs = options && options.inputs;
+
+ // create ui elements
+ this._renderForm(options);
+
+ // rebuild the underlying data structure
+ this.tree.finalize();
+
+ // show errors on startup
+ if (options.initial_errors) {
+ this._errors(options);
+ }
+
+ // add refresh listener
+ this.on('refresh', function() {
+ // by using/resetting the deferred ajax queue the number of redundant calls is reduced
+ self.deferred.reset();
+ self.deferred.execute(function(){self._updateModel()});
+ });
+
+ // add reset listener
+ this.on('reset', function() {
+ for (var i in this.element_list) {
+ this.element_list[i].reset();
+ }
+ });
+
+ // refresh
+ this.trigger('refresh');
+ },
+
/** Shows the final message (usually upon successful job submission)
*/
reciept: function($el) {
@@ -105,63 +160,6 @@
}
}
},
-
- /** Main tool form build function. This function is called once a new model is available.
- */
- _buildForm: function() {
- // link this
- var self = this;
-
- // reset events
- this.off('refresh');
- this.off('reset');
-
- // reset field list, which contains the input field elements
- this.field_list = {};
-
- // reset sequential input definition list, which contains the input definitions as provided from the api
- this.input_list = {};
-
- // reset input element list, which contains the dom elements of each input element (includes also the input field)
- this.element_list = {};
-
- // creates a tree/json data structure from the input form
- this.tree = new ToolTree(this);
-
- // request history content and build form
- this.content = new ToolContent(this);
-
- // link model options
- var options = this.options;
-
- // create ui elements
- this._renderForm(options);
-
- // rebuild the underlying data structure
- this.tree.finalize();
-
- // show errors on startup
- if (options.initial_errors) {
- this._errors(options);
- }
-
- // add refresh listener
- this.on('refresh', function() {
- // by using/resetting the deferred ajax queue the number of redundant calls is reduced
- self.deferred.reset();
- self.deferred.execute(function(){self._updateModel()});
- });
-
- // add reset listener
- this.on('reset', function() {
- for (var i in this.element_list) {
- this.element_list[i].reset();
- }
- });
-
- // refresh
- this.trigger('refresh');
- },
/** Renders the UI elements required for the form
*/
@@ -175,7 +173,7 @@
// button for version selection
var requirements_button = new Ui.ButtonIcon({
icon : 'fa-info-circle',
- title : (!options.compact && 'Requirements') || null,
+ title : (!options.narrow && 'Requirements') || null,
tooltip : 'Display tool requirements',
onclick : function() {
if (!this.visible) {
@@ -200,7 +198,7 @@
// button for version selection
var versions_button = new Ui.ButtonMenu({
icon : 'fa-cubes',
- title : (!options.compact && 'Versions') || null,
+ title : (!options.narrow && 'Versions') || null,
tooltip : 'Select another tool version'
});
if (options.versions && options.versions.length > 1) {
@@ -213,8 +211,8 @@
icon : 'fa-cube',
onclick : function() {
// here we update the tool version (some tools encode the version also in the id)
- options.id = options.id.replace(options.version, this.version);
- options.version = this.version;
+ self.options.id = self.options.id.replace(self.options.version, this.version);
+ self.options.version = this.version;
// rebuild the model and form
self.deferred.reset();
@@ -230,7 +228,7 @@
// button menu
var menu_button = new Ui.ButtonMenu({
icon : 'fa-caret-down',
- title : (!options.compact && 'Options') || null,
+ title : (!options.narrow && 'Options') || null,
tooltip : 'View available options'
});
@@ -306,7 +304,7 @@
});
// remove padding
- if (options.compact) {
+ if (options.narrow) {
this.portlet.$content.css('padding', '0px');
}
diff -r ff2b00fcbd70e3d7ce10b0444412cc68d2ede46f -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 client/galaxy/scripts/mvc/tools/tools-form-workflow.js
--- a/client/galaxy/scripts/mvc/tools/tools-form-workflow.js
+++ b/client/galaxy/scripts/mvc/tools/tools-form-workflow.js
@@ -21,9 +21,13 @@
this.options = options;
// set labels
- this.options.text_enable = 'In Advance';
- this.options.text_disable = 'At Runtime';
- this.options.use_defaults = true;
+ this.options.text_enable = 'In Advance';
+ this.options.text_disable = 'At Runtime';
+
+ // configure workflow style
+ this.options.is_dynamic = false;
+ this.options.narrow = true;
+ this.options.initial_errors = true;
// declare fields as optional
Utils.deepeach(options.inputs, function(item) {
diff -r ff2b00fcbd70e3d7ce10b0444412cc68d2ede46f -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 client/galaxy/scripts/mvc/tools/tools-form.js
--- a/client/galaxy/scripts/mvc/tools/tools-form.js
+++ b/client/galaxy/scripts/mvc/tools/tools-form.js
@@ -24,7 +24,7 @@
}
ToolFormBase.prototype.initialize.call(this, options);
},
-
+
/** Builds a new model through api call and recreates the entire form
*/
_buildModel: function() {
@@ -47,31 +47,28 @@
}
}
}
-
+
// register process
var process_id = this.deferred.register();
-
+
// get initial model
Utils.request({
type : 'GET',
url : model_url,
success : function(response) {
- // link model data update options
- self.options = response;
-
- // build form
- self._buildForm();
-
+ // build new tool form
+ self.build(response);
+
// notification
self.message.update({
status : 'success',
message : 'Now you are using \'' + self.options.name + '\' version ' + self.options.version + '.',
persistent : false
});
-
+
// process completed
self.deferred.done(process_id);
-
+
// log success
console.debug('tools-form::initialize() - Initial tool model ready.');
console.debug(response);
@@ -79,11 +76,11 @@
error : function(response) {
// process completed
self.deferred.done(process_id);
-
+
// log error
console.debug('tools-form::initialize() - Initial tool model request failed.');
console.debug(response);
-
+
// show error
var error_message = response.error || 'Uncaught error.';
self.modal.show({
@@ -98,7 +95,7 @@
}
});
},
-
+
/** Request a new model for an already created tool form and updates the form inputs
*/
_updateModel: function() {
@@ -112,11 +109,11 @@
return null;
}
});
-
+
// log tool state
console.debug('tools-form::_refreshForm() - Refreshing states.');
console.debug(current_state);
-
+
// activates/disables spinner for dynamic fields to indicate that they are currently being updated
function wait(active) {
for (var i in self.input_list) {
@@ -131,10 +128,10 @@
}
}
}
-
+
// set wait mode
wait(true);
-
+
// register process
var process_id = this.deferred.register();
@@ -179,13 +176,13 @@
}
}
});
-
+
// unset wait mode
wait(false);
-
+
// process completed
self.deferred.done(process_id);
-
+
// log success
console.debug('tools-form::_refreshForm() - States refreshed.');
console.debug(new_model);
@@ -193,7 +190,7 @@
error : function(response) {
// process completed
self.deferred.done(process_id);
-
+
// log error
console.debug('tools-form::_refreshForm() - Refresh request failed.');
console.debug(response);
diff -r ff2b00fcbd70e3d7ce10b0444412cc68d2ede46f -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -2254,8 +2254,8 @@
"""
Recursively creates a tool dictionary containing repeats, dynamic options and updated states.
"""
- job_id = kwd.get('job_id', None)
- dataset_id = kwd.get('dataset_id', None)
+ job_id = kwd.get('__job_id__', None)
+ dataset_id = kwd.get('__dataset_id__', None)
is_dynamic = string_as_bool(kwd.get('__is_dynamic__', True))
# load job details if provided
diff -r ff2b00fcbd70e3d7ce10b0444412cc68d2ede46f -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 static/scripts/mvc/tools/tools-form-base.js
--- a/static/scripts/mvc/tools/tools-form-base.js
+++ b/static/scripts/mvc/tools/tools-form-base.js
@@ -15,12 +15,10 @@
this.optionsDefault = {
// uses dynamic fields instead of text fields
is_dynamic : true,
- // shows form in compact view mode
- compact : false,
+ // shows form in narrow view mode
+ narrow : false,
// shows errors on start
- initial_errors : false,
- // use default value for disabled fields
- use_defaults : false
+ initial_errors : false
};
// configure options
@@ -58,9 +56,66 @@
$(this.container).append(this.$el);
// build this form
- this._buildForm();
+ this.build(this.options);
},
+ /** Main tool form build function. This function is called once a new model is available.
+ */
+ build: function(options) {
+ // link this
+ var self = this;
+
+ // reset events
+ this.off('refresh');
+ this.off('reset');
+
+ // reset field list, which contains the input field elements
+ this.field_list = {};
+
+ // reset sequential input definition list, which contains the input definitions as provided from the api
+ this.input_list = {};
+
+ // reset input element list, which contains the dom elements of each input element (includes also the input field)
+ this.element_list = {};
+
+ // creates a tree/json data structure from the input form
+ this.tree = new ToolTree(this);
+
+ // request history content and build form
+ this.content = new ToolContent(this);
+
+ // update model data
+ self.options.inputs = options && options.inputs;
+
+ // create ui elements
+ this._renderForm(options);
+
+ // rebuild the underlying data structure
+ this.tree.finalize();
+
+ // show errors on startup
+ if (options.initial_errors) {
+ this._errors(options);
+ }
+
+ // add refresh listener
+ this.on('refresh', function() {
+ // by using/resetting the deferred ajax queue the number of redundant calls is reduced
+ self.deferred.reset();
+ self.deferred.execute(function(){self._updateModel()});
+ });
+
+ // add reset listener
+ this.on('reset', function() {
+ for (var i in this.element_list) {
+ this.element_list[i].reset();
+ }
+ });
+
+ // refresh
+ this.trigger('refresh');
+ },
+
/** Shows the final message (usually upon successful job submission)
*/
reciept: function($el) {
@@ -105,63 +160,6 @@
}
}
},
-
- /** Main tool form build function. This function is called once a new model is available.
- */
- _buildForm: function() {
- // link this
- var self = this;
-
- // reset events
- this.off('refresh');
- this.off('reset');
-
- // reset field list, which contains the input field elements
- this.field_list = {};
-
- // reset sequential input definition list, which contains the input definitions as provided from the api
- this.input_list = {};
-
- // reset input element list, which contains the dom elements of each input element (includes also the input field)
- this.element_list = {};
-
- // creates a tree/json data structure from the input form
- this.tree = new ToolTree(this);
-
- // request history content and build form
- this.content = new ToolContent(this);
-
- // link model options
- var options = this.options;
-
- // create ui elements
- this._renderForm(options);
-
- // rebuild the underlying data structure
- this.tree.finalize();
-
- // show errors on startup
- if (options.initial_errors) {
- this._errors(options);
- }
-
- // add refresh listener
- this.on('refresh', function() {
- // by using/resetting the deferred ajax queue the number of redundant calls is reduced
- self.deferred.reset();
- self.deferred.execute(function(){self._updateModel()});
- });
-
- // add reset listener
- this.on('reset', function() {
- for (var i in this.element_list) {
- this.element_list[i].reset();
- }
- });
-
- // refresh
- this.trigger('refresh');
- },
/** Renders the UI elements required for the form
*/
@@ -175,7 +173,7 @@
// button for version selection
var requirements_button = new Ui.ButtonIcon({
icon : 'fa-info-circle',
- title : (!options.compact && 'Requirements') || null,
+ title : (!options.narrow && 'Requirements') || null,
tooltip : 'Display tool requirements',
onclick : function() {
if (!this.visible) {
@@ -200,7 +198,7 @@
// button for version selection
var versions_button = new Ui.ButtonMenu({
icon : 'fa-cubes',
- title : (!options.compact && 'Versions') || null,
+ title : (!options.narrow && 'Versions') || null,
tooltip : 'Select another tool version'
});
if (options.versions && options.versions.length > 1) {
@@ -213,8 +211,8 @@
icon : 'fa-cube',
onclick : function() {
// here we update the tool version (some tools encode the version also in the id)
- options.id = options.id.replace(options.version, this.version);
- options.version = this.version;
+ self.options.id = self.options.id.replace(self.options.version, this.version);
+ self.options.version = this.version;
// rebuild the model and form
self.deferred.reset();
@@ -230,7 +228,7 @@
// button menu
var menu_button = new Ui.ButtonMenu({
icon : 'fa-caret-down',
- title : (!options.compact && 'Options') || null,
+ title : (!options.narrow && 'Options') || null,
tooltip : 'View available options'
});
@@ -306,7 +304,7 @@
});
// remove padding
- if (options.compact) {
+ if (options.narrow) {
this.portlet.$content.css('padding', '0px');
}
diff -r ff2b00fcbd70e3d7ce10b0444412cc68d2ede46f -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 static/scripts/mvc/tools/tools-form-workflow.js
--- a/static/scripts/mvc/tools/tools-form-workflow.js
+++ b/static/scripts/mvc/tools/tools-form-workflow.js
@@ -21,9 +21,13 @@
this.options = options;
// set labels
- this.options.text_enable = 'In Advance';
- this.options.text_disable = 'At Runtime';
- this.options.use_defaults = true;
+ this.options.text_enable = 'In Advance';
+ this.options.text_disable = 'At Runtime';
+
+ // configure workflow style
+ this.options.is_dynamic = false;
+ this.options.narrow = true;
+ this.options.initial_errors = true;
// declare fields as optional
Utils.deepeach(options.inputs, function(item) {
diff -r ff2b00fcbd70e3d7ce10b0444412cc68d2ede46f -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 static/scripts/mvc/tools/tools-form.js
--- a/static/scripts/mvc/tools/tools-form.js
+++ b/static/scripts/mvc/tools/tools-form.js
@@ -24,7 +24,7 @@
}
ToolFormBase.prototype.initialize.call(this, options);
},
-
+
/** Builds a new model through api call and recreates the entire form
*/
_buildModel: function() {
@@ -47,31 +47,28 @@
}
}
}
-
+
// register process
var process_id = this.deferred.register();
-
+
// get initial model
Utils.request({
type : 'GET',
url : model_url,
success : function(response) {
- // link model data update options
- self.options = response;
-
- // build form
- self._buildForm();
-
+ // build new tool form
+ self.build(response);
+
// notification
self.message.update({
status : 'success',
message : 'Now you are using \'' + self.options.name + '\' version ' + self.options.version + '.',
persistent : false
});
-
+
// process completed
self.deferred.done(process_id);
-
+
// log success
console.debug('tools-form::initialize() - Initial tool model ready.');
console.debug(response);
@@ -79,11 +76,11 @@
error : function(response) {
// process completed
self.deferred.done(process_id);
-
+
// log error
console.debug('tools-form::initialize() - Initial tool model request failed.');
console.debug(response);
-
+
// show error
var error_message = response.error || 'Uncaught error.';
self.modal.show({
@@ -98,7 +95,7 @@
}
});
},
-
+
/** Request a new model for an already created tool form and updates the form inputs
*/
_updateModel: function() {
@@ -112,11 +109,11 @@
return null;
}
});
-
+
// log tool state
console.debug('tools-form::_refreshForm() - Refreshing states.');
console.debug(current_state);
-
+
// activates/disables spinner for dynamic fields to indicate that they are currently being updated
function wait(active) {
for (var i in self.input_list) {
@@ -131,10 +128,10 @@
}
}
}
-
+
// set wait mode
wait(true);
-
+
// register process
var process_id = this.deferred.register();
@@ -179,13 +176,13 @@
}
}
});
-
+
// unset wait mode
wait(false);
-
+
// process completed
self.deferred.done(process_id);
-
+
// log success
console.debug('tools-form::_refreshForm() - States refreshed.');
console.debug(new_model);
@@ -193,7 +190,7 @@
error : function(response) {
// process completed
self.deferred.done(process_id);
-
+
// log error
console.debug('tools-form::_refreshForm() - Refresh request failed.');
console.debug(response);
diff -r ff2b00fcbd70e3d7ce10b0444412cc68d2ede46f -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 static/scripts/packed/mvc/tools/tools-form-base.js
--- a/static/scripts/packed/mvc/tools/tools-form-base.js
+++ b/static/scripts/packed/mvc/tools/tools-form-base.js
@@ -1,1 +1,1 @@
-define(["utils/utils","utils/deferred","mvc/ui/ui-portlet","mvc/ui/ui-misc","mvc/citation/citation-model","mvc/citation/citation-view","mvc/tools","mvc/tools/tools-template","mvc/tools/tools-content","mvc/tools/tools-section","mvc/tools/tools-tree"],function(g,h,f,k,i,a,d,c,e,j,b){return Backbone.View.extend({initialize:function(l){this.optionsDefault={is_dynamic:true,compact:false,initial_errors:false,use_defaults:false};this.options=g.merge(l,this.optionsDefault);console.debug(this.options);var m=parent.Galaxy;if(m&&m.modal){this.modal=m.modal}else{this.modal=new k.Modal.View()}if(m&&m.currUser){this.is_admin=m.currUser.get("is_admin")}else{this.is_admin=false}this.container=this.options.container||"body";this.deferred=new h();this.setElement("<div/>");$(this.container).append(this.$el);this._buildForm()},reciept:function(l){$(this.container).empty();$(this.container).append(l)},highlight:function(m,n,l){var o=this.element_list[m];if(o){o.error(n||"Please verify this parameter.");if(!l){$(this.container).animate({scrollTop:o.$el.offset().top-20},500)}}},_errors:function(n){this.trigger("reset");if(n&&n.errors){var o=this.tree.matchResponse(n.errors);for(var m in this.element_list){var l=this.element_list[m];if(o[m]){this.highlight(m,o[m],true)}}}},_buildForm:function(){var l=this;this.off("refresh");this.off("reset");this.field_list={};this.input_list={};this.element_list={};this.tree=new b(this);this.content=new e(this);var m=this.options;this._renderForm(m);this.tree.finalize();if(m.initial_errors){this._errors(m)}this.on("refresh",function(){l.deferred.reset();l.deferred.execute(function(){l._updateModel()})});this.on("reset",function(){for(var n in this.element_list){this.element_list[n].reset()}});this.trigger("refresh")},_renderForm:function(u){var t=this;this.message=new k.Message();var q=new k.ButtonIcon({icon:"fa-info-circle",title:(!u.compact&&"Requirements")||null,tooltip:"Display tool requirements",onclick:function(){if(!this.visible){this.visible=true;t.message.update({persistent:true,message:c.requirements(u),status:"info"})}else{this.visible=false;t.message.update({message:""})}}});if(!u.requirements||u.requirements.length==0){q.$el.hide()}var m=new k.ButtonMenu({icon:"fa-cubes",title:(!u.compact&&"Versions")||null,tooltip:"Select another tool version"});if(u.versions&&u.versions.length>1){for(var o in u.versions){var r=u.versions[o];if(r!=u.version){m.addMenu({title:"Switch to "+r,version:r,icon:"fa-cube",onclick:function(){u.id=u.id.replace(u.version,this.version);u.version=this.version;t.deferred.reset();t.deferred.execute(function(){t._buildModel()})}})}}}else{m.$el.hide()}var p=new k.ButtonMenu({icon:"fa-caret-down",title:(!u.compact&&"Options")||null,tooltip:"View available options"});if(u.biostar_url){p.addMenu({icon:"fa-question-circle",title:"Question?",tooltip:"Ask a question about this tool (Biostar)",onclick:function(){window.open(u.biostar_url+"/p/new/post/")}});p.addMenu({icon:"fa-search",title:"Search",tooltip:"Search help for this tool (Biostar)",onclick:function(){window.open(u.biostar_url+"/t/"+u.id+"/")}})}p.addMenu({icon:"fa-share",title:"Share",tooltip:"Share this tool",onclick:function(){prompt("Copy to clipboard: Ctrl+C, Enter",window.location.origin+galaxy_config.root+"root?tool_id="+u.id)}});if(this.is_admin){p.addMenu({icon:"fa-download",title:"Download",tooltip:"Download this tool",onclick:function(){window.location.href=galaxy_config.root+"api/tools/"+u.id+"/download"}})}this.section=new j.View(t,{inputs:u.inputs});if(this.incompatible){this.$el.hide();$("#tool-form-classic").show();return}this.portlet=new f.View({icon:"fa-wrench",title:"<b>"+u.name+"</b> "+u.description+" (Galaxy Tool Version "+u.version+")",cls:"ui-portlet-slim",operations:{requirements:q,menu:p,versions:m},buttons:this.buttons});if(u.compact){this.portlet.$content.css("padding","0px")}this.portlet.append(this.message.$el,true);this.portlet.append(this.section.$el);this.$el.empty();this.$el.append(this.portlet.$el);if(u.help!=""){this.$el.append(c.help(u.help))}if(u.citations){var s=$("<div/>");var l=new i.ToolCitationCollection();l.tool_id=u.id;var n=new a.CitationListView({el:s,collection:l});n.render();l.fetch();this.$el.append(s)}if(u.message){this.message.update({persistent:true,status:"warning",message:u.message})}}})});
\ No newline at end of file
+define(["utils/utils","utils/deferred","mvc/ui/ui-portlet","mvc/ui/ui-misc","mvc/citation/citation-model","mvc/citation/citation-view","mvc/tools","mvc/tools/tools-template","mvc/tools/tools-content","mvc/tools/tools-section","mvc/tools/tools-tree"],function(g,h,f,k,i,a,d,c,e,j,b){return Backbone.View.extend({initialize:function(l){this.optionsDefault={is_dynamic:true,narrow:false,initial_errors:false};this.options=g.merge(l,this.optionsDefault);console.debug(this.options);var m=parent.Galaxy;if(m&&m.modal){this.modal=m.modal}else{this.modal=new k.Modal.View()}if(m&&m.currUser){this.is_admin=m.currUser.get("is_admin")}else{this.is_admin=false}this.container=this.options.container||"body";this.deferred=new h();this.setElement("<div/>");$(this.container).append(this.$el);this.build(this.options)},build:function(m){var l=this;this.off("refresh");this.off("reset");this.field_list={};this.input_list={};this.element_list={};this.tree=new b(this);this.content=new e(this);l.options.inputs=m&&m.inputs;this._renderForm(m);this.tree.finalize();if(m.initial_errors){this._errors(m)}this.on("refresh",function(){l.deferred.reset();l.deferred.execute(function(){l._updateModel()})});this.on("reset",function(){for(var n in this.element_list){this.element_list[n].reset()}});this.trigger("refresh")},reciept:function(l){$(this.container).empty();$(this.container).append(l)},highlight:function(m,n,l){var o=this.element_list[m];if(o){o.error(n||"Please verify this parameter.");if(!l){$(this.container).animate({scrollTop:o.$el.offset().top-20},500)}}},_errors:function(n){this.trigger("reset");if(n&&n.errors){var o=this.tree.matchResponse(n.errors);for(var m in this.element_list){var l=this.element_list[m];if(o[m]){this.highlight(m,o[m],true)}}}},_renderForm:function(u){var t=this;this.message=new k.Message();var q=new k.ButtonIcon({icon:"fa-info-circle",title:(!u.narrow&&"Requirements")||null,tooltip:"Display tool requirements",onclick:function(){if(!this.visible){this.visible=true;t.message.update({persistent:true,message:c.requirements(u),status:"info"})}else{this.visible=false;t.message.update({message:""})}}});if(!u.requirements||u.requirements.length==0){q.$el.hide()}var m=new k.ButtonMenu({icon:"fa-cubes",title:(!u.narrow&&"Versions")||null,tooltip:"Select another tool version"});if(u.versions&&u.versions.length>1){for(var o in u.versions){var r=u.versions[o];if(r!=u.version){m.addMenu({title:"Switch to "+r,version:r,icon:"fa-cube",onclick:function(){t.options.id=t.options.id.replace(t.options.version,this.version);t.options.version=this.version;t.deferred.reset();t.deferred.execute(function(){t._buildModel()})}})}}}else{m.$el.hide()}var p=new k.ButtonMenu({icon:"fa-caret-down",title:(!u.narrow&&"Options")||null,tooltip:"View available options"});if(u.biostar_url){p.addMenu({icon:"fa-question-circle",title:"Question?",tooltip:"Ask a question about this tool (Biostar)",onclick:function(){window.open(u.biostar_url+"/p/new/post/")}});p.addMenu({icon:"fa-search",title:"Search",tooltip:"Search help for this tool (Biostar)",onclick:function(){window.open(u.biostar_url+"/t/"+u.id+"/")}})}p.addMenu({icon:"fa-share",title:"Share",tooltip:"Share this tool",onclick:function(){prompt("Copy to clipboard: Ctrl+C, Enter",window.location.origin+galaxy_config.root+"root?tool_id="+u.id)}});if(this.is_admin){p.addMenu({icon:"fa-download",title:"Download",tooltip:"Download this tool",onclick:function(){window.location.href=galaxy_config.root+"api/tools/"+u.id+"/download"}})}this.section=new j.View(t,{inputs:u.inputs});if(this.incompatible){this.$el.hide();$("#tool-form-classic").show();return}this.portlet=new f.View({icon:"fa-wrench",title:"<b>"+u.name+"</b> "+u.description+" (Galaxy Tool Version "+u.version+")",cls:"ui-portlet-slim",operations:{requirements:q,menu:p,versions:m},buttons:this.buttons});if(u.narrow){this.portlet.$content.css("padding","0px")}this.portlet.append(this.message.$el,true);this.portlet.append(this.section.$el);this.$el.empty();this.$el.append(this.portlet.$el);if(u.help!=""){this.$el.append(c.help(u.help))}if(u.citations){var s=$("<div/>");var l=new i.ToolCitationCollection();l.tool_id=u.id;var n=new a.CitationListView({el:s,collection:l});n.render();l.fetch();this.$el.append(s)}if(u.message){this.message.update({persistent:true,status:"warning",message:u.message})}}})});
\ No newline at end of file
diff -r ff2b00fcbd70e3d7ce10b0444412cc68d2ede46f -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 static/scripts/packed/mvc/tools/tools-form-workflow.js
--- a/static/scripts/packed/mvc/tools/tools-form-workflow.js
+++ b/static/scripts/packed/mvc/tools/tools-form-workflow.js
@@ -1,1 +1,1 @@
-define(["utils/utils","mvc/tools/tools-form-base"],function(b,a){var c=a.extend({initialize:function(e){this.node=workflow.active_node;if(!this.node){console.debug("FAILED - tools-form-workflow:initialize() - Node not found in workflow.");return}this.post_job_actions=this.node.post_job_actions||{};this.options=e;this.options.text_enable="In Advance";this.options.text_disable="At Runtime";this.options.use_defaults=true;b.deepeach(e.inputs,function(f){if(f.type){f.optional=(["data","data_hidden","hidden","drill_down","repeat","conditional"]).indexOf(f.type)==-1}});b.deepeach(e.inputs,function(f){if(f.type){if(f.type=="conditional"){f.test_param.optional=false}}});var d=this;b.get({url:galaxy_config.root+"api/datatypes",cache:true,success:function(f){d.datatypes=f;d._makeSections(e.inputs);a.prototype.initialize.call(d,e)}})},_makeSections:function(d){d[b.uuid()]={label:"Annotation / Notes",name:"annotation",type:"text",area:true,help:"Add an annotation or note for this step. It will be shown with the workflow.",value:this.node.annotation};var f=this.node.output_terminals&&Object.keys(this.node.output_terminals)[0];if(f){d[b.uuid()]={name:"pja__"+f+"__EmailAction",label:"Email notification",type:"boolean",value:String(Boolean(this.post_job_actions["EmailAction"+f])),ignore:"false",help:"An email notification will be send when the job has completed.",payload:{host:window.location.host}};d[b.uuid()]={name:"pja__"+f+"__DeleteIntermediatesAction",label:"Output cleanup",type:"boolean",value:String(Boolean(this.post_job_actions["DeleteIntermediatesAction"+f])),ignore:"false",help:"Delete intermediate outputs if they are not used as input for another job."};for(var e in this.node.output_terminals){d[b.uuid()]=this._makeSection(e)}}},_makeSection:function(h){var g=[];for(key in this.datatypes){g.push({0:this.datatypes[key],1:this.datatypes[key]})}g.sort(function(j,i){return j.label>i.label?1:j.label<i.label?-1:0});g.unshift({0:"Sequences",1:"Sequences"});g.unshift({0:"Roadmaps",1:"Roadmaps"});g.unshift({0:"Leave unchanged",1:""});var f={label:"Add Actions: '"+h+"'",type:"section",inputs:[{action:"RenameDatasetAction",argument:"newname",label:"Rename dataset",type:"text",value:"",ignore:"",help:'This action will rename the result dataset. Click <a href="https://wiki.galaxyproject.org/Learn/AdvancedWorkflow/Variables">here</a> for more information.'},{action:"ChangeDatatypeAction",argument:"newtype",label:"Change datatype",type:"select",ignore:"",options:g,help:"This action will change the datatype of the output to the indicated value."},{action:"TagDatasetAction",argument:"tags",label:"Tags",type:"text",value:"",ignore:"",help:"This action will set tags for the dataset."},{label:"Assign columns",type:"section",inputs:[{action:"ColumnSetAction",argument:"chromCol",label:"Chrom column",type:"integer",value:"",ignore:""},{action:"ColumnSetAction",argument:"startCol",label:"Start column",type:"integer",value:"",ignore:""},{action:"ColumnSetAction",argument:"endCol",label:"End column",type:"integer",value:"",ignore:""},{action:"ColumnSetAction",argument:"strandCol",label:"Strand column",type:"integer",value:"",ignore:""},{action:"ColumnSetAction",argument:"nameCol",label:"Name column",type:"integer",value:"",ignore:""}],help:"This action will set column assignments in the output dataset. Blank fields are ignored."}]};var d=this;function e(n,o){o=o||[];o.push(n);for(var m in n.inputs){var k=n.inputs[m];if(k.action){k.name="pja__"+h+"__"+k.action;if(k.argument){k.name+="__"+k.argument}if(k.payload){for(var s in k.payload){var q=k.payload[s];k.payload[k.name+"__"+s]=q;delete q}}var r=d.post_job_actions[k.action+h];if(r){for(var l in o){o[l].expand=true}if(k.argument){k.value=r.action_arguments&&r.action_arguments[k.argument]||k.value}else{k.value="true"}}}if(k.inputs){e(k,o.slice(0))}}}e(f);return f},_buildModel:function(){Galaxy.modal.show({title:"Coming soon...",body:"This feature has not been implemented yet.",buttons:{Close:function(){Galaxy.modal.hide()}}})},_updateModel:function(){var d=this;var e=this.tree.finalize();console.debug("tools-form-workflow::_refreshForm() - Refreshing states.");console.debug(e);var g=this.deferred.register();var f=galaxy_config.root+"workflow/editor_form_post?tool_id="+this.options.id+"&__is_dynamic__=False";b.request({type:"GET",url:f,data:e,success:function(h){d.node.update_field_data(h);d._errors(h&&h.tool_model);d.deferred.done(g);console.debug("tools-form::_refreshForm() - States refreshed.");console.debug(h)},error:function(h){d.deferred.done(g);console.debug("tools-form::_refreshForm() - Refresh request failed.");console.debug(h)}})}});return{View:c}});
\ No newline at end of file
+define(["utils/utils","mvc/tools/tools-form-base"],function(b,a){var c=a.extend({initialize:function(e){this.node=workflow.active_node;if(!this.node){console.debug("FAILED - tools-form-workflow:initialize() - Node not found in workflow.");return}this.post_job_actions=this.node.post_job_actions||{};this.options=e;this.options.text_enable="In Advance";this.options.text_disable="At Runtime";this.options.is_dynamic=false;this.options.narrow=true;this.options.initial_errors=true;b.deepeach(e.inputs,function(f){if(f.type){f.optional=(["data","data_hidden","hidden","drill_down","repeat","conditional"]).indexOf(f.type)==-1}});b.deepeach(e.inputs,function(f){if(f.type){if(f.type=="conditional"){f.test_param.optional=false}}});var d=this;b.get({url:galaxy_config.root+"api/datatypes",cache:true,success:function(f){d.datatypes=f;d._makeSections(e.inputs);a.prototype.initialize.call(d,e)}})},_makeSections:function(d){d[b.uuid()]={label:"Annotation / Notes",name:"annotation",type:"text",area:true,help:"Add an annotation or note for this step. It will be shown with the workflow.",value:this.node.annotation};var f=this.node.output_terminals&&Object.keys(this.node.output_terminals)[0];if(f){d[b.uuid()]={name:"pja__"+f+"__EmailAction",label:"Email notification",type:"boolean",value:String(Boolean(this.post_job_actions["EmailAction"+f])),ignore:"false",help:"An email notification will be send when the job has completed.",payload:{host:window.location.host}};d[b.uuid()]={name:"pja__"+f+"__DeleteIntermediatesAction",label:"Output cleanup",type:"boolean",value:String(Boolean(this.post_job_actions["DeleteIntermediatesAction"+f])),ignore:"false",help:"Delete intermediate outputs if they are not used as input for another job."};for(var e in this.node.output_terminals){d[b.uuid()]=this._makeSection(e)}}},_makeSection:function(h){var g=[];for(key in this.datatypes){g.push({0:this.datatypes[key],1:this.datatypes[key]})}g.sort(function(j,i){return j.label>i.label?1:j.label<i.label?-1:0});g.unshift({0:"Sequences",1:"Sequences"});g.unshift({0:"Roadmaps",1:"Roadmaps"});g.unshift({0:"Leave unchanged",1:""});var f={label:"Add Actions: '"+h+"'",type:"section",inputs:[{action:"RenameDatasetAction",argument:"newname",label:"Rename dataset",type:"text",value:"",ignore:"",help:'This action will rename the result dataset. Click <a href="https://wiki.galaxyproject.org/Learn/AdvancedWorkflow/Variables">here</a> for more information.'},{action:"ChangeDatatypeAction",argument:"newtype",label:"Change datatype",type:"select",ignore:"",options:g,help:"This action will change the datatype of the output to the indicated value."},{action:"TagDatasetAction",argument:"tags",label:"Tags",type:"text",value:"",ignore:"",help:"This action will set tags for the dataset."},{label:"Assign columns",type:"section",inputs:[{action:"ColumnSetAction",argument:"chromCol",label:"Chrom column",type:"integer",value:"",ignore:""},{action:"ColumnSetAction",argument:"startCol",label:"Start column",type:"integer",value:"",ignore:""},{action:"ColumnSetAction",argument:"endCol",label:"End column",type:"integer",value:"",ignore:""},{action:"ColumnSetAction",argument:"strandCol",label:"Strand column",type:"integer",value:"",ignore:""},{action:"ColumnSetAction",argument:"nameCol",label:"Name column",type:"integer",value:"",ignore:""}],help:"This action will set column assignments in the output dataset. Blank fields are ignored."}]};var d=this;function e(n,o){o=o||[];o.push(n);for(var m in n.inputs){var k=n.inputs[m];if(k.action){k.name="pja__"+h+"__"+k.action;if(k.argument){k.name+="__"+k.argument}if(k.payload){for(var s in k.payload){var q=k.payload[s];k.payload[k.name+"__"+s]=q;delete q}}var r=d.post_job_actions[k.action+h];if(r){for(var l in o){o[l].expand=true}if(k.argument){k.value=r.action_arguments&&r.action_arguments[k.argument]||k.value}else{k.value="true"}}}if(k.inputs){e(k,o.slice(0))}}}e(f);return f},_buildModel:function(){Galaxy.modal.show({title:"Coming soon...",body:"This feature has not been implemented yet.",buttons:{Close:function(){Galaxy.modal.hide()}}})},_updateModel:function(){var d=this;var e=this.tree.finalize();console.debug("tools-form-workflow::_refreshForm() - Refreshing states.");console.debug(e);var g=this.deferred.register();var f=galaxy_config.root+"workflow/editor_form_post?tool_id="+this.options.id+"&__is_dynamic__=False";b.request({type:"GET",url:f,data:e,success:function(h){d.node.update_field_data(h);d._errors(h&&h.tool_model);d.deferred.done(g);console.debug("tools-form::_refreshForm() - States refreshed.");console.debug(h)},error:function(h){d.deferred.done(g);console.debug("tools-form::_refreshForm() - Refresh request failed.");console.debug(h)}})}});return{View:c}});
\ No newline at end of file
diff -r ff2b00fcbd70e3d7ce10b0444412cc68d2ede46f -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 static/scripts/packed/mvc/tools/tools-form.js
--- a/static/scripts/packed/mvc/tools/tools-form.js
+++ b/static/scripts/packed/mvc/tools/tools-form.js
@@ -1,1 +1,1 @@
-define(["utils/utils","mvc/ui/ui-misc","mvc/tools/tools-form-base","mvc/tools/tools-jobs"],function(c,e,b,a){var d=b.extend({initialize:function(g){var f=this;this.job_handler=new a(this);this.buttons={execute:new e.Button({icon:"fa-check",tooltip:"Execute: "+g.name,title:"Execute",cls:"btn btn-primary",floating:"clear",onclick:function(){f.job_handler.submit()}})};b.prototype.initialize.call(this,g)},_buildModel:function(){var f=this;var g=galaxy_config.root+"api/tools/"+this.options.id+"/build?";if(this.options.job_id){g+="job_id="+this.options.job_id}else{if(this.options.dataset_id){g+="dataset_id="+this.options.dataset_id}else{g+="tool_version="+this.options.version+"&";var i=top.location.href;var j=i.indexOf("?");if(i.indexOf("tool_id=")!=-1&&j!==-1){g+=i.slice(j+1)}}}var h=this.deferred.register();c.request({type:"GET",url:g,success:function(k){f.options=k;f._buildForm();f.message.update({status:"success",message:"Now you are using '"+f.options.name+"' version "+f.options.version+".",persistent:false});f.deferred.done(h);console.debug("tools-form::initialize() - Initial tool model ready.");console.debug(k)},error:function(k){f.deferred.done(h);console.debug("tools-form::initialize() - Initial tool model request failed.");console.debug(k);var l=k.error||"Uncaught error.";f.modal.show({title:"Tool cannot be executed",body:l,buttons:{Close:function(){f.modal.hide()}}})}})},_updateModel:function(){var f=this;var g=this.tree.finalize({data:function(k){if(k.values.length>0&&k.values[0]&&k.values[0].src==="hda"){return f.content.get({id:k.values[0].id,src:"hda"}).id_uncoded}return null}});console.debug("tools-form::_refreshForm() - Refreshing states.");console.debug(g);function j(n){for(var l in f.input_list){var m=f.field_list[l];var k=f.input_list[l];if(k.is_dynamic&&m.wait&&m.unwait){if(n){m.wait()}else{m.unwait()}}}}j(true);var i=this.deferred.register();var h=galaxy_config.root+"api/tools/"+this.options.id+"/build?tool_version="+this.options.version;c.request({type:"GET",url:h,data:g,success:function(k){f.tree.matchModel(k,function(m,q){var l=f.input_list[m];if(l&&l.options){if(!_.isEqual(l.options,q.options)){l.options=q.options;var r=f.field_list[m];if(r.update){var p=[];if((["data","data_collection","drill_down"]).indexOf(l.type)!=-1){p=l.options}else{for(var o in q.options){var n=q.options[o];if(n.length>2){p.push({label:n[0],value:n[1]})}}}r.update(p);r.trigger("change");console.debug("Updating options for "+m)}}}});j(false);f.deferred.done(i);console.debug("tools-form::_refreshForm() - States refreshed.");console.debug(k)},error:function(k){f.deferred.done(i);console.debug("tools-form::_refreshForm() - Refresh request failed.");console.debug(k)}})}});return{View:d}});
\ No newline at end of file
+define(["utils/utils","mvc/ui/ui-misc","mvc/tools/tools-form-base","mvc/tools/tools-jobs"],function(c,e,b,a){var d=b.extend({initialize:function(g){var f=this;this.job_handler=new a(this);this.buttons={execute:new e.Button({icon:"fa-check",tooltip:"Execute: "+g.name,title:"Execute",cls:"btn btn-primary",floating:"clear",onclick:function(){f.job_handler.submit()}})};b.prototype.initialize.call(this,g)},_buildModel:function(){var f=this;var g=galaxy_config.root+"api/tools/"+this.options.id+"/build?";if(this.options.job_id){g+="job_id="+this.options.job_id}else{if(this.options.dataset_id){g+="dataset_id="+this.options.dataset_id}else{g+="tool_version="+this.options.version+"&";var i=top.location.href;var j=i.indexOf("?");if(i.indexOf("tool_id=")!=-1&&j!==-1){g+=i.slice(j+1)}}}var h=this.deferred.register();c.request({type:"GET",url:g,success:function(k){f.build(k);f.message.update({status:"success",message:"Now you are using '"+f.options.name+"' version "+f.options.version+".",persistent:false});f.deferred.done(h);console.debug("tools-form::initialize() - Initial tool model ready.");console.debug(k)},error:function(k){f.deferred.done(h);console.debug("tools-form::initialize() - Initial tool model request failed.");console.debug(k);var l=k.error||"Uncaught error.";f.modal.show({title:"Tool cannot be executed",body:l,buttons:{Close:function(){f.modal.hide()}}})}})},_updateModel:function(){var f=this;var g=this.tree.finalize({data:function(k){if(k.values.length>0&&k.values[0]&&k.values[0].src==="hda"){return f.content.get({id:k.values[0].id,src:"hda"}).id_uncoded}return null}});console.debug("tools-form::_refreshForm() - Refreshing states.");console.debug(g);function j(n){for(var l in f.input_list){var m=f.field_list[l];var k=f.input_list[l];if(k.is_dynamic&&m.wait&&m.unwait){if(n){m.wait()}else{m.unwait()}}}}j(true);var i=this.deferred.register();var h=galaxy_config.root+"api/tools/"+this.options.id+"/build?tool_version="+this.options.version;c.request({type:"GET",url:h,data:g,success:function(k){f.tree.matchModel(k,function(m,q){var l=f.input_list[m];if(l&&l.options){if(!_.isEqual(l.options,q.options)){l.options=q.options;var r=f.field_list[m];if(r.update){var p=[];if((["data","data_collection","drill_down"]).indexOf(l.type)!=-1){p=l.options}else{for(var o in q.options){var n=q.options[o];if(n.length>2){p.push({label:n[0],value:n[1]})}}}r.update(p);r.trigger("change");console.debug("Updating options for "+m)}}}});j(false);f.deferred.done(i);console.debug("tools-form::_refreshForm() - States refreshed.");console.debug(k)},error:function(k){f.deferred.done(i);console.debug("tools-form::_refreshForm() - Refresh request failed.");console.debug(k)}})}});return{View:d}});
\ No newline at end of file
diff -r ff2b00fcbd70e3d7ce10b0444412cc68d2ede46f -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 templates/webapps/galaxy/tool_form.mako
--- a/templates/webapps/galaxy/tool_form.mako
+++ b/templates/webapps/galaxy/tool_form.mako
@@ -9,8 +9,7 @@
## TEMPORARY: create tool dictionary in mako while both tool forms are in use.
## This avoids making two separate requests since the classic form requires the mako anyway.
params = dict(trans.request.params)
- if 'id' in params:
- params['dataset_id'] = params['id']
+ params['__dataset_id__'] = params.get('id', None)
self.form_config = tool.to_json(trans, **params)
self.form_config.update({
'id' : tool.id,
diff -r ff2b00fcbd70e3d7ce10b0444412cc68d2ede46f -r 494418e72cf0007e909c7f4b9134cd2b82df49e2 templates/webapps/galaxy/workflow/editor_tool_form.mako
--- a/templates/webapps/galaxy/workflow/editor_tool_form.mako
+++ b/templates/webapps/galaxy/workflow/editor_tool_form.mako
@@ -15,9 +15,6 @@
'id' : tool.id,
'job_id' : trans.security.encode_id( job.id ) if job else None,
'history_id' : trans.security.encode_id( trans.history.id ),
- 'is_dynamic' : False,
- 'compact' : True,
- 'initial_errors' : True,
'container' : '#right-content'
})
%>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jmchilton: Bugfix for bugfix d3b1f6b.
by commits-noreply@bitbucket.org 06 Feb '15
by commits-noreply@bitbucket.org 06 Feb '15
06 Feb '15
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/ff2b00fcbd70/
Changeset: ff2b00fcbd70
User: jmchilton
Date: 2015-02-05 18:32:56+00:00
Summary: Bugfix for bugfix d3b1f6b.
d3b1f6b fix the GUI (in an obsecure use) but broke fairly typical uses of the API.
Affected #: 1 file
diff -r b6349ba5cda26cdea678c4842136e50363c0629f -r ff2b00fcbd70e3d7ce10b0444412cc68d2ede46f lib/galaxy/workflow/modules.py
--- a/lib/galaxy/workflow/modules.py
+++ b/lib/galaxy/workflow/modules.py
@@ -330,7 +330,9 @@
# so do that now so dependent steps can be recalculated. In the future
# everything should come in from the API and this can be eliminated.
if not invocation.has_input_for_step( step.id ):
- invocation.add_input( step_outputs.values()[ 0 ], step.id )
+ content = step_outputs.values()[ 0 ]
+ if content:
+ invocation.add_input( content, step.id )
progress.set_outputs_for_input( step, step_outputs )
return job
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
4 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/73e9ca698df3/
Changeset: 73e9ca698df3
User: jmchilton
Date: 2015-02-05 17:27:46+00:00
Summary: Fix workflow schedulers to fallback onto sample like other config files.
Affected #: 1 file
diff -r 2f436edb5288bf750382ae1ccddd95ed611db6a1 -r 73e9ca698df3f0da3fe145878938cdf60978d17c lib/galaxy/config.py
--- a/lib/galaxy/config.py
+++ b/lib/galaxy/config.py
@@ -143,7 +143,6 @@
self.collect_outputs_from = [ x.strip() for x in kwargs.get( 'collect_outputs_from', 'new_file_path,job_working_directory' ).lower().split(',') ]
self.template_path = resolve_path( kwargs.get( "template_path", "templates" ), self.root )
self.template_cache = resolve_path( kwargs.get( "template_cache_path", "database/compiled_templates" ), self.root )
- self.workflow_schedulers_config_file = resolve_path( kwargs.get( 'workflow_schedulers_config_file', 'config/workflow_schedulers_conf.xml' ), self.root )
self.local_job_queue_workers = int( kwargs.get( "local_job_queue_workers", "5" ) )
self.cluster_job_queue_workers = int( kwargs.get( "cluster_job_queue_workers", "3" ) )
self.job_queue_cleanup_interval = int( kwargs.get("job_queue_cleanup_interval", "5") )
@@ -459,6 +458,7 @@
shed_data_manager_config_file=[ 'shed_data_manager_conf.xml', 'config/shed_data_manager_conf.xml' ],
shed_tool_data_table_config=[ 'shed_tool_data_table_conf.xml', 'config/shed_tool_data_table_conf.xml' ],
tool_sheds_config_file=[ 'config/tool_sheds_conf.xml', 'tool_sheds_conf.xml', 'config/tool_sheds_conf.xml.sample' ],
+ workflow_schedulers_config_file=['config/workflow_schedulers_conf.xml', 'config/workflow_schedulers_conf.xml.sample'],
)
listify_defaults = dict(
https://bitbucket.org/galaxy/galaxy-central/commits/d3b1f6b04d4b/
Changeset: d3b1f6b04d4b
User: jmchilton
Date: 2015-02-05 17:27:46+00:00
Summary: Workflow scheduling delay fix.
There were problems if all three of these conditions were met - 1) workflow from GUI, 2) workflow evaluation delayed, and 3) a delayed step was connected to a input dataset. This fixes these workflows.
Affected #: 3 files
diff -r 73e9ca698df3f0da3fe145878938cdf60978d17c -r d3b1f6b04d4b4fb9db667afdfb2beb78db5226a0 lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -3253,6 +3253,27 @@
def update( self ):
self.update_time = galaxy.model.orm.now.now()
+ def add_input( self, content, step_id ):
+ if content.history_content_type == "dataset":
+ request_to_content = WorkflowRequestToInputDatasetAssociation()
+ request_to_content.dataset = content
+ request_to_content.workflow_step_id = step_id
+ self.input_datasets.append( request_to_content )
+ else:
+ request_to_content = WorkflowRequestToInputDatasetCollectionAssociation()
+ request_to_content.dataset_collection = content
+ request_to_content.workflow_step_id = step_id
+ self.input_dataset_collections.append( request_to_content )
+
+ def has_input_for_step( self, step_id ):
+ for content in self.input_datasets:
+ if content.workflow_step_id == step_id:
+ return True
+ for content in self.input_dataset_collections:
+ if content.workflow_step_id == step_id:
+ return True
+ return False
+
class WorkflowInvocationStep( object, Dictifiable ):
dict_collection_visible_keys = ( 'id', 'update_time', 'job_id', 'workflow_step_id', 'action' )
diff -r 73e9ca698df3f0da3fe145878938cdf60978d17c -r d3b1f6b04d4b4fb9db667afdfb2beb78db5226a0 lib/galaxy/workflow/modules.py
--- a/lib/galaxy/workflow/modules.py
+++ b/lib/galaxy/workflow/modules.py
@@ -326,6 +326,11 @@
step_outputs[ 'input_ds_copy' ] = new_hdca
else:
raise Exception("Unknown history content encountered")
+ # If coming from UI - we haven't registered invocation inputs yet,
+ # so do that now so dependent steps can be recalculated. In the future
+ # everything should come in from the API and this can be eliminated.
+ if not invocation.has_input_for_step( step.id ):
+ invocation.add_input( step_outputs.values()[ 0 ], step.id )
progress.set_outputs_for_input( step, step_outputs )
return job
diff -r 73e9ca698df3f0da3fe145878938cdf60978d17c -r d3b1f6b04d4b4fb9db667afdfb2beb78db5226a0 lib/galaxy/workflow/run_request.py
--- a/lib/galaxy/workflow/run_request.py
+++ b/lib/galaxy/workflow/run_request.py
@@ -297,18 +297,8 @@
value=value,
type=param_types.REPLACEMENT_PARAMETERS,
)
-
for step_id, content in run_config.inputs.iteritems():
- if content.history_content_type == "dataset":
- request_to_content = model.WorkflowRequestToInputDatasetAssociation()
- request_to_content.dataset = content
- request_to_content.workflow_step_id = step_id
- workflow_invocation.input_datasets.append( request_to_content )
- else:
- request_to_content = model.WorkflowRequestToInputDatasetCollectionAssociation()
- request_to_content.dataset_collection = content
- request_to_content.workflow_step_id = step_id
- workflow_invocation.input_dataset_collections.append( request_to_content )
+ workflow_invocation.add_input( content, step_id )
for step in workflow.steps:
state = step.state
https://bitbucket.org/galaxy/galaxy-central/commits/ff56bdbf7b3e/
Changeset: ff56bdbf7b3e
User: jmchilton
Date: 2015-02-05 17:27:46+00:00
Summary: Fix scheduling_manager.py for unknown attribute reference.
Not sure if this was a poor rebasing or a copy and paste error.
Affected #: 1 file
diff -r d3b1f6b04d4b4fb9db667afdfb2beb78db5226a0 -r ff56bdbf7b3e1a7a19eaab24be8d2ac6b8aa970c lib/galaxy/workflow/scheduling_manager.py
--- a/lib/galaxy/workflow/scheduling_manager.py
+++ b/lib/galaxy/workflow/scheduling_manager.py
@@ -116,7 +116,6 @@
for plugin_element in plugins_element.getchildren():
plugin_type = plugin_element.tag
plugin_kwds = dict( plugin_element.items() )
- plugin_kwds.update( self.extra_kwargs )
workflow_scheduler_id = plugin_kwds.get( 'id', None )
self.__init_plugin( plugin_type, workflow_scheduler_id, **plugin_kwds )
https://bitbucket.org/galaxy/galaxy-central/commits/b6349ba5cda2/
Changeset: b6349ba5cda2
User: jmchilton
Date: 2015-02-05 17:27:46+00:00
Summary: Improved error message if things don't match up when recovering workflows.
Ideally this shouldn't really happen - but this should help if it does.
Affected #: 1 file
diff -r ff56bdbf7b3e1a7a19eaab24be8d2ac6b8aa970c -r b6349ba5cda26cdea678c4842136e50363c0629f lib/galaxy/workflow/run.py
--- a/lib/galaxy/workflow/run.py
+++ b/lib/galaxy/workflow/run.py
@@ -251,7 +251,13 @@
step_outputs = self.outputs[ connection.output_step.id ]
if step_outputs is STEP_OUTPUT_DELAYED:
raise modules.DelayedWorkflowEvaluation()
- replacement = step_outputs[ connection.output_name ]
+ output_name = connection.output_name
+ try:
+ replacement = step_outputs[ output_name ]
+ except KeyError:
+ template = "Workflow evaluation problem - failed to find output_name %s in step_outputs %s"
+ message = template % ( output_name, step_outputs )
+ raise Exception( message )
if isinstance( replacement, model.HistoryDatasetCollectionAssociation ):
if not replacement.collection.populated:
if not replacement.collection.waiting_for_elements:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0