galaxy-dev
Threads by month
- ----- 2025 -----
- 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
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- 10008 discussions
details: http://www.bx.psu.edu/hg/galaxy/rev/56bb85457bc1
changeset: 3045:56bb85457bc1
user: Nate Coraor <nate(a)bx.psu.edu>
date: Tue Nov 17 13:43:34 2009 -0500
description:
Updated GeneTrack egg
diffstat:
eggs.ini | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diffs (21 lines):
diff -r 3c96ab27aa31 -r 56bb85457bc1 eggs.ini
--- a/eggs.ini Tue Nov 17 13:31:56 2009 -0500
+++ b/eggs.ini Tue Nov 17 13:43:34 2009 -0500
@@ -60,7 +60,7 @@
MySQL_python = _5.0.67_static
python_lzo = _static
bx_python = _dev_r4bf1f32e6b76
-GeneTrack = _dev_raa786e9fc131d998e532a1aef39d108850c9e93d
+GeneTrack = _dev_e380f21c704218622155b9d230a44b3c9c452524
SQLAlchemy = _dev_r6498
; nose = .dev_r7156749efc58
@@ -82,7 +82,7 @@
decorator = http://pypi.python.org/packages/source/d/decorator/decorator-3.1.2.tar.gz
docutils = http://downloads.sourceforge.net/docutils/docutils-0.4.tar.gz
elementtree = http://effbot.org/downloads/elementtree-1.2.6-20050316.tar.gz
-GeneTrack = http://github.com/ialbert/genetrack-central/tarball/aa786e9fc131d998e532a1a…
+GeneTrack = http://github.com/ialbert/genetrack-central/tarball/e380f21c704218622155b9d…
lrucache = http://evan.prodromou.name/lrucache/lrucache-0.2.tar.gz
Mako = http://www.makotemplates.org/downloads/Mako-0.2.5.tar.gz
nose = http://pypi.python.org/packages/source/n/nose/nose-0.11.1.tar.gz
1
0

18 Nov '09
details: http://www.bx.psu.edu/hg/galaxy/rev/3c96ab27aa31
changeset: 3044:3c96ab27aa31
user: Greg Von Kuster <greg(a)bx.psu.edu>
date: Tue Nov 17 13:31:56 2009 -0500
description:
Fix a sqlalchemy session flush bug in the make_library_uploaded_dataset method.
diffstat:
lib/galaxy/web/controllers/library_common.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diffs (12 lines):
diff -r 4c3cddd02b09 -r 3c96ab27aa31 lib/galaxy/web/controllers/library_common.py
--- a/lib/galaxy/web/controllers/library_common.py Mon Nov 16 18:38:32 2009 -0500
+++ b/lib/galaxy/web/controllers/library_common.py Tue Nov 17 13:31:56 2009 -0500
@@ -117,7 +117,7 @@
uploaded_dataset.link_data_only = True
uploaded_dataset.data.file_name = os.path.abspath( path )
trans.sa_session.add( uploaded_dataset.data )
- trans.sa_session.data.flush()
+ trans.sa_session.flush()
return uploaded_dataset
def get_server_dir_uploaded_datasets( self, trans, params, full_dir, import_dir_desc, library_bunch, err_redirect, msg ):
files = []
1
0

18 Nov '09
details: http://www.bx.psu.edu/hg/galaxy/rev/ed8972386675
changeset: 3046:ed8972386675
user: rc
date: Tue Nov 17 14:28:34 2009 -0500
description:
Adding grids to forms, requests & request types pages. Resolves issue #231.
diffstat:
lib/galaxy/web/controllers/forms.py | 252 ++++++---
lib/galaxy/web/controllers/requests.py | 302 ++++++-----
lib/galaxy/web/controllers/requests_admin.py | 663 ++++++++++++++++---------
templates/admin/forms/edit_form.mako | 2 +-
templates/admin/forms/grid.mako | 1 +
templates/admin/forms/manage_forms.mako | 76 ---
templates/admin/forms/show_form_read_only.mako | 4 +-
templates/admin/requests/create_request_type.mako | 92 +-
templates/admin/requests/grid.mako | 218 +--------
templates/admin/requests/manage_request_types.mako | 69 +--
templates/admin/requests/show_request.mako | 2 +-
templates/admin/requests/view_request_type.mako | 70 +-
templates/requests/grid.mako | 218 +--------
templates/requests/show_request.mako | 2 +-
test/base/twilltestcase.py | 34 +-
test/functional/test_forms_and_requests.py | 44 +-
test/functional/test_user_info.py | 9 +-
17 files changed, 879 insertions(+), 1179 deletions(-)
diffs (2629 lines):
diff -r 56bb85457bc1 -r ed8972386675 lib/galaxy/web/controllers/forms.py
--- a/lib/galaxy/web/controllers/forms.py Tue Nov 17 13:43:34 2009 -0500
+++ b/lib/galaxy/web/controllers/forms.py Tue Nov 17 14:28:34 2009 -0500
@@ -8,9 +8,71 @@
from elementtree.ElementTree import XML, Element
from galaxy.util.odict import odict
import copy
+from galaxy.web.framework.helpers import time_ago, iff, grids
log = logging.getLogger( __name__ )
+class FormsGrid( grids.Grid ):
+ # Custom column types
+ class NameColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, form):
+ return form.latest_form.name
+ class DescriptionColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, form):
+ return form.latest_form.desc
+ class TypeColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, form):
+ return form.latest_form.type
+ class DeletedColumn( grids.GridColumn ):
+ def get_accepted_filters( self ):
+ """ Returns a list of accepted filters for this column. """
+ accepted_filter_labels_and_vals = { "active" : "False", "deleted" : "True", "all": "All" }
+ accepted_filters = []
+ for label, val in accepted_filter_labels_and_vals.items():
+ args = { self.key: val }
+ accepted_filters.append( grids.GridColumnFilter( label, args) )
+ return accepted_filters
+ # Grid definition
+ title = "Forms"
+ template = "admin/forms/grid.mako"
+ model_class = model.FormDefinitionCurrent
+ default_sort_key = "-create_time"
+ num_rows_per_page = 50
+ preserve_state = True
+ use_paging = True
+ default_filter = dict( deleted="False" )
+ columns = [
+ NameColumn( "Name",
+ key="name",
+ model_class=model.FormDefinition,
+ link=( lambda item: iff( item.deleted, None, dict( operation="view", id=item.id ) ) ),
+ attach_popup=True,
+ filterable="advanced" ),
+ DescriptionColumn( "Description",
+ key='desc',
+ model_class=model.FormDefinition,
+ filterable="advanced" ),
+ TypeColumn( "Type" ),
+ DeletedColumn( "Deleted",
+ key="deleted",
+ visible=False,
+ filterable="advanced" )
+ ]
+ columns.append( grids.MulticolFilterColumn( "Search",
+ cols_to_filter=[ columns[0], columns[1] ],
+ key="free-text-search",
+ visible=False,
+ filterable="standard" ) )
+ operations = [
+ grids.GridOperation( "Edit", allow_multiple=False, condition=( lambda item: not item.deleted ) ),
+ grids.GridOperation( "Delete", allow_multiple=True, condition=( lambda item: not item.deleted ) ),
+ grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ) ),
+ ]
+ global_actions = [
+ grids.GridAction( "Create new form", dict( controller='forms',
+ action='new' ) )
+ ]
+
class Forms( BaseController ):
# Empty form field
empty_field = { 'label': '',
@@ -20,38 +82,38 @@
'type': BaseField.form_field_types()[0],
'selectlist': [],
'layout': 'none' }
+ forms_grid = FormsGrid()
+
@web.expose
@web.require_admin
- def index( self, trans, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- return trans.fill_template( "/sample/index.mako",
- default_action=params.get( 'default_action', None ),
- msg=msg,
- messagetype=messagetype )
- @web.expose
- @web.require_admin
- def manage( self, trans, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- show_filter = params.get( 'show_filter', 'Active' )
- return self._show_forms_list(trans, msg, messagetype, show_filter)
- def _show_forms_list(self, trans, msg, messagetype, show_filter='Active'):
- all_forms = trans.sa_session.query( trans.app.model.FormDefinitionCurrent )
- if show_filter == 'All':
- forms_list = all_forms
- elif show_filter == 'Deleted':
- forms_list = [form for form in all_forms if form.deleted]
- else:
- forms_list = [form for form in all_forms if not form.deleted]
- return trans.fill_template( '/admin/forms/manage_forms.mako',
- fdc_list=forms_list,
- all_forms=all_forms,
- show_filter=show_filter,
- msg=msg,
- messagetype=messagetype )
+ def manage( self, trans, **kwd ):
+ if 'operation' in kwd:
+ operation = kwd['operation'].lower()
+ if not kwd.get( 'id', None ):
+ return trans.response.send_redirect( web.url_for( controller='forms',
+ action='manage',
+ status='error',
+ message="Invalid form ID") )
+ if operation == "view":
+ return self.__view( trans, **kwd )
+ elif operation == "delete":
+ return self.__delete( trans, **kwd )
+ elif operation == "undelete":
+ return self.__undelete( trans, **kwd )
+ elif operation == "edit":
+ return self.__edit( trans, **kwd )
+ return self.forms_grid( trans, **kwd )
+ def __view(self, trans, **kwd):
+ try:
+ fdc = trans.sa_session.query( trans.app.model.FormDefinitionCurrent )\
+ .get( trans.security.decode_id(kwd['id']) )
+ except:
+ return trans.response.send_redirect( web.url_for( controller='forms',
+ action='manage',
+ msg='Invalid form',
+ messagetype='error' ) )
+ return trans.fill_template( '/admin/forms/show_form_read_only.mako',
+ form=fdc.latest_form )
def __form_types_widget(self, trans, selected='none'):
form_type_selectbox = SelectField( 'form_type_selectbox',
refresh_on_change=True,
@@ -86,13 +148,14 @@
self.__get_saved_form( fd )
if self.__imported_from_file:
return trans.response.send_redirect( web.url_for( controller='forms',
- action='edit',
- show_form=True,
- form_id=fd.id) )
+ action='manage',
+ operation='edit',
+ id=trans.security.encode_id(fd.current.id)) )
else:
return trans.response.send_redirect( web.url_for( controller='forms',
- action='edit',
- form_id=fd.id,
+ action='manage',
+ operation='edit',
+ id=trans.security.encode_id(fd.current.id),
add_field_button='Add field',
name=fd.name,
description=fd.desc,
@@ -105,35 +168,43 @@
inputs=inputs,
msg=msg,
messagetype=messagetype )
- @web.expose
- @web.require_admin
- def delete( self, trans, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- fd = trans.sa_session.query( trans.app.model.FormDefinition ).get( int( util.restore_text( params.form_id ) ) )
- fd.form_definition_current.deleted = True
- trans.sa_session.add( fd.form_definition_current )
- trans.sa_session.flush()
- return self._show_forms_list(trans,
- msg='The form definition named %s is deleted.' % fd.name,
- messagetype='done')
- @web.expose
- @web.require_admin
- def undelete( self, trans, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- fd = trans.sa_session.query( trans.app.model.FormDefinition ).get( int( util.restore_text( params.form_id ) ) )
- fd.form_definition_current.deleted = False
- trans.sa_session.add( fd.form_definition_current )
- trans.sa_session.flush()
- return self._show_forms_list(trans,
- msg='The form definition named %s is undeleted.' % fd.name,
- messagetype='done')
- @web.expose
- @web.require_admin
- def edit( self, trans, **kwd ):
+ def __delete( self, trans, **kwd ):
+ id_list = util.listify( kwd['id'] )
+ delete_failed = []
+ for id in id_list:
+ try:
+ fdc = trans.sa_session.query( trans.app.model.FormDefinitionCurrent ).get( trans.security.decode_id(id) )
+ except:
+ return trans.response.send_redirect( web.url_for( controller='forms',
+ action='manage',
+ message='Invalid form',
+ status='error' ) )
+ fdc.deleted = True
+ trans.sa_session.add( fdc )
+ trans.sa_session.flush()
+ return trans.response.send_redirect( web.url_for( controller='forms',
+ action='manage',
+ message='%i form(s) is deleted.' % len(id_list),
+ status='done') )
+ def __undelete( self, trans, **kwd ):
+ id_list = util.listify( kwd['id'] )
+ delete_failed = []
+ for id in id_list:
+ try:
+ fdc = trans.sa_session.query( trans.app.model.FormDefinitionCurrent ).get( trans.security.decode_id(id) )
+ except:
+ return trans.response.send_redirect( web.url_for( controller='forms',
+ action='manage',
+ message='Invalid form',
+ status='error' ) )
+ fdc.deleted = False
+ trans.sa_session.add( fdc )
+ trans.sa_session.flush()
+ return trans.response.send_redirect( web.url_for( controller='forms',
+ action='manage',
+ message='%i form(s) is undeleted.' % len(id_list),
+ status='done') )
+ def __edit( self, trans, **kwd ):
'''
This callback method is for handling all the editing functions like
renaming fields, adding/deleting fields, changing fields attributes.
@@ -142,17 +213,28 @@
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
try:
- fd = trans.sa_session.query( trans.app.model.FormDefinition ).get( int( params.get( 'form_id', None ) ) )
+ fdc = trans.sa_session.query( trans.app.model.FormDefinitionCurrent ).get( trans.security.decode_id(kwd['id']) )
except:
return trans.response.send_redirect( web.url_for( controller='forms',
action='manage',
- msg='Invalid form',
- messagetype='error' ) )
+ message='Invalid form',
+ status='error' ) )
+ fd = fdc.latest_form
#
- # Show the form for editing
+ # Save changes
#
- if params.get( 'show_form', False ):
+ if params.get( 'save_changes_button', False ):
+ fd_new, msg = self.__save_form( trans, fdc_id=fd.form_definition_current.id, **kwd )
+ # if validation error encountered while saving the form, show the
+ # unsaved form, with the error message
+ if not fd_new:
+ current_form = self.__get_form( trans, **kwd )
+ return self.__show( trans=trans, form=fd, current_form=current_form,
+ msg=msg, messagetype='error', **kwd )
+ # everything went fine. form saved successfully. Show the saved form
+ fd = fd_new
current_form = self.__get_saved_form( fd )
+ msg = "The form '%s' has been updated with the changes." % fd.name
return self.__show( trans=trans, form=fd, current_form=current_form,
msg=msg, messagetype=messagetype, **kwd )
#
@@ -193,31 +275,6 @@
return self.__show( trans=trans, form=fd, current_form=current_form,
msg=msg, messagetype=messagetype, **kwd )
#
- # Save changes
- #
- elif params.get( 'save_changes_button', False ):
- fd_new, msg = self.__save_form( trans, fdc_id=fd.form_definition_current.id, **kwd )
- # if validation error encountered while saving the form, show the
- # unsaved form, with the error message
- if not fd_new:
- current_form = self.__get_form( trans, **kwd )
- return self.__show( trans=trans, form=fd, current_form=current_form,
- msg=msg, messagetype='error', **kwd )
- # everything went fine. form saved successfully. Show the saved form
- fd = fd_new
- current_form = self.__get_saved_form( fd )
- msg = "The form '%s' has been updated with the changes." % fd.name
- return self.__show( trans=trans, form=fd, current_form=current_form,
- msg=msg, messagetype=messagetype, **kwd )
- #
- # Show form read-only
- #
- elif params.get( 'read_only', False ):
- return trans.fill_template( '/admin/forms/show_form_read_only.mako',
- form=fd,
- msg=msg,
- messagetype=messagetype )
- #
# Add SelectField option
#
elif 'Add' in kwd.values():
@@ -234,6 +291,13 @@
current_form = self.__get_form( trans, **kwd )
return self.__show( trans=trans, form=fd, current_form=current_form,
msg=msg, messagetype=messagetype, **kwd )
+ #
+ # Show the form for editing
+ #
+ else:
+ current_form = self.__get_saved_form( fd )
+ return self.__show( trans=trans, form=fd, current_form=current_form,
+ msg=msg, messagetype=messagetype, **kwd )
def __add_selectbox_option( self, trans, fd, msg, messagetype, **kwd ):
'''
diff -r 56bb85457bc1 -r ed8972386675 lib/galaxy/web/controllers/requests.py
--- a/lib/galaxy/web/controllers/requests.py Tue Nov 17 13:43:34 2009 -0500
+++ b/lib/galaxy/web/controllers/requests.py Tue Nov 17 14:28:34 2009 -0500
@@ -12,57 +12,109 @@
log = logging.getLogger( __name__ )
-class RequestsListGrid( grids.Grid ):
+class RequestsGrid( grids.Grid ):
+ # Custom column types
+ class NameColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, request):
+ return request.name
+ class DescriptionColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, request):
+ return request.desc
+ class SamplesColumn( grids.GridColumn ):
+ def get_value(self, trans, grid, request):
+ return str(len(request.samples))
+ class TypeColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, request):
+ return request.type.name
+ class LastUpdateColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, request):
+ return request.update_time
+ class StateColumn( grids.GridColumn ):
+ def filter( self, db_session, query, column_filter ):
+ """ Modify query to filter request by state. """
+ if column_filter == "All":
+ return query
+ if column_filter:
+ query = query.filter( model.Request.state == column_filter )
+ return query
+ def get_accepted_filters( self ):
+ """ Returns a list of accepted filters for this column. """
+ accepted_filter_labels_and_vals = [ model.Request.states.UNSUBMITTED,
+ model.Request.states.SUBMITTED,
+ model.Request.states.COMPLETE,
+ "All"]
+ accepted_filters = []
+ for val in accepted_filter_labels_and_vals:
+ label = val.lower()
+ args = { self.key: val }
+ accepted_filters.append( grids.GridColumnFilter( label, args) )
+ return accepted_filters
+ class DeletedColumn( grids.GridColumn ):
+ def get_accepted_filters( self ):
+ """ Returns a list of accepted filters for this column. """
+ accepted_filter_labels_and_vals = { "active" : "False", "deleted" : "True", "all": "All" }
+ accepted_filters = []
+ for label, val in accepted_filter_labels_and_vals.items():
+ args = { self.key: val }
+ accepted_filters.append( grids.GridColumnFilter( label, args) )
+ return accepted_filters
+ # Grid definition
title = "Sequencing Requests"
- template = '/requests/grid.mako'
+ template = 'requests/grid.mako'
model_class = model.Request
default_sort_key = "-create_time"
- show_filter = model.Request.states.UNSUBMITTED
+ num_rows_per_page = 50
+ preserve_state = True
+ use_paging = True
+ default_filter = dict( deleted="False", state=model.Request.states.UNSUBMITTED)
columns = [
- grids.GridColumn( "Name", key="name",
- link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ),
- attach_popup=True ),
- grids.GridColumn( "Description", key='desc'),
- grids.GridColumn( "Sample(s)", method='number_of_samples',
- link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ), ),
- grids.GridColumn( "Type", key="request_type_id", method='get_request_type'),
- grids.GridColumn( "Last update", key="update_time", format=time_ago ),
- grids.GridColumn( "State", key='state'),
+ NameColumn( "Name",
+ key="name",
+ model_class=model.Request,
+ link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ),
+ attach_popup=True,
+ filterable="advanced" ),
+ DescriptionColumn( "Description",
+ key='desc',
+ model_class=model.Request,
+ filterable="advanced" ),
+ SamplesColumn( "Sample(s)",
+ link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ), ),
+ TypeColumn( "Type" ),
+ LastUpdateColumn( "Last update",
+ format=time_ago ),
+ StateColumn( "State",
+ key='state',
+ filterable="advanced"),
+ DeletedColumn( "Deleted",
+ key="deleted",
+ visible=True,
+ filterable="advanced" )
]
+ columns.append( grids.MulticolFilterColumn( "Search",
+ cols_to_filter=[ columns[0], columns[1] ],
+ key="free-text-search",
+ visible=False,
+ filterable="standard" ) )
operations = [
grids.GridOperation( "Submit", allow_multiple=False, condition=( lambda item: not item.deleted and item.unsubmitted() and item.samples ) ),
grids.GridOperation( "Edit", allow_multiple=False, condition=( lambda item: not item.deleted and item.unsubmitted() ) ),
- grids.GridOperation( "Delete", allow_multiple=False, condition=( lambda item: not item.deleted and item.unsubmitted() ) ),
- grids.GridOperation( "Undelete", allow_multiple=False, condition=( lambda item: item.deleted ) )
+ grids.GridOperation( "Delete", allow_multiple=True, condition=( lambda item: not item.deleted and item.unsubmitted() ) ),
+ grids.GridOperation( "Undelete", allow_multiple=True, condition=( lambda item: item.deleted ) )
]
- standard_filters = [
- grids.GridColumnFilter( model.Request.states.UNSUBMITTED,
- args=dict( state=model.Request.states.UNSUBMITTED, deleted=False ) ),
- grids.GridColumnFilter( model.Request.states.SUBMITTED,
- args=dict( state=model.Request.states.SUBMITTED, deleted=False ) ),
- grids.GridColumnFilter( model.Request.states.COMPLETE, args=dict( state=model.Request.states.COMPLETE, deleted=False ) ),
- grids.GridColumnFilter( "Deleted", args=dict( deleted=True ) ),
- grids.GridColumnFilter( "All", args={} )
+ global_actions = [
+ grids.GridAction( "Create new request", dict( controller='requests',
+ action='new',
+ select_request_type='True' ) )
]
- #default_filter = dict( deleted=False )
- def get_current_item( self, trans ):
- return None
- def get_request_type(self, trans, request):
- return request.type.name
- def apply_default_filter( self, trans, query, **kwargs ):
- query = query.filter_by( user=trans.user )
- if self.default_filter:
- return query.filter_by( **self.default_filter )
- else:
- return query
- def number_of_samples(self, trans, request):
- return str(len(request.samples))
- def get_state(self, trans, request):
- return request.state
+ def apply_default_filter( self, trans, query, **kwd ):
+ return query.filter_by( user=trans.user )
+ def build_initial_query( self, session ):
+ return session.query( self.model_class )
class Requests( BaseController ):
- request_grid = RequestsListGrid()
+ request_grid = RequestsGrid()
@web.expose
@web.require_login( "create/submit sequencing requests" )
@@ -71,50 +123,43 @@
@web.expose
@web.require_login( "create/submit sequencing requests" )
- def list( self, trans, **kwargs ):
+ def list( self, trans, **kwd ):
'''
List all request made by the current user
'''
- status = message = None
- self.request_grid.default_filter = dict(state=trans.app.model.Request.states.UNSUBMITTED,
- deleted=False)
- if 'operation' in kwargs:
- operation = kwargs['operation'].lower()
+
+ if 'operation' in kwd:
+ operation = kwd['operation'].lower()
+ if not kwd.get( 'id', None ):
+ return trans.response.send_redirect( web.url_for( controller='requests',
+ action='list',
+ status='error',
+ message="Invalid request ID") )
if operation == "show_request":
- id = trans.security.decode_id(kwargs['id'])
- return self.__show_request(trans, id, kwargs.get('add_sample', False))
+ return self.__show_request( trans, **kwd )
elif operation == "submit":
- id = trans.security.decode_id(kwargs['id'])
- return self.__submit_request(trans, id)
+ return self.__submit_request( trans, **kwd )
elif operation == "delete":
- id = trans.security.decode_id(kwargs['id'])
- return self.__delete_request(trans, id)
+ return self.__delete_request( trans, **kwd )
elif operation == "undelete":
- id = trans.security.decode_id(kwargs['id'])
- return self.__undelete_request(trans, id)
+ return self.__undelete_request( trans, **kwd )
elif operation == "edit":
- id = trans.security.decode_id(kwargs['id'])
- return self.__edit_request(trans, id)
- if 'show_filter' in kwargs.keys():
- if kwargs['show_filter'] == 'All':
- self.request_grid.default_filter = {}
- elif kwargs['show_filter'] == 'Deleted':
- self.request_grid.default_filter = dict(deleted=True)
- else:
- self.request_grid.default_filter = dict(state=kwargs['show_filter'], deleted=False)
- self.request_grid.show_filter = kwargs.get('show_filter', trans.app.model.Request.states.UNSUBMITTED)
+ return self.__edit_request( trans, **kwd )
# Render the list view
- return self.request_grid( trans, **kwargs )
+ return self.request_grid( trans, **kwd )
- def __show_request(self, trans, id, add_sample=False):
+ def __show_request(self, trans, **kwd):
+ params = util.Params( kwd )
+ msg = util.restore_text( params.get( 'msg', '' ) )
+ messagetype = params.get( 'messagetype', 'done' )
+ add_sample = params.get('add_sample', False)
try:
- request = trans.sa_session.query( trans.app.model.Request ).get( id )
+ request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
except:
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
status='error',
- message="Invalid request ID",
- **kwd) )
+ message="Invalid request ID" ) )
current_samples = []
for s in request.samples:
current_samples.append([s.name, s.values.content])
@@ -122,10 +167,11 @@
current_samples.append(['Sample_%i' % (len(current_samples)+1),['' for field in request.type.sample_form.fields]])
return trans.fill_template( '/requests/show_request.mako',
request=request,
- request_details=self.request_details(trans, id),
+ request_details=self.request_details(trans, request.id),
current_samples = current_samples,
sample_copy=self.__copy_sample(current_samples),
- details='hide', edit_mode='False')
+ details='hide', edit_mode='False',
+ msg=msg, messagetype=messagetype )
def request_details(self, trans, id):
'''
Shows the request details
@@ -685,7 +731,7 @@
message="Invalid request ID",
**kwd) )
if params.get('show', False) == 'True':
- return self.__edit_request(trans, request.id, **kwd)
+ return self.__edit_request(trans, **kwd)
elif params.get('save_changes_request_button', False) == 'Save changes' \
or params.get('edit_samples_button', False) == 'Edit samples':
request_type = trans.sa_session.query( trans.app.model.RequestType ).get( int( params.select_request_type ) )
@@ -714,11 +760,11 @@
messagetype='done',
**new_kwd) )
elif params.get('refresh', False) == 'true':
- return self.__edit_request(trans, request.id, **kwd)
+ return self.__edit_request(trans, **kwd)
- def __edit_request(self, trans, id, **kwd):
+ def __edit_request(self, trans, **kwd):
try:
- request = trans.sa_session.query( trans.app.model.Request ).get( id )
+ request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
except:
msg = "Invalid request ID"
log.warn( msg )
@@ -758,59 +804,61 @@
msg=msg,
messagetype=messagetype)
return self.__show_request_form(trans)
- def __delete_request(self, trans, id):
- try:
- request = trans.sa_session.query( trans.app.model.Request ).get( id )
- except:
- msg = "Invalid request ID"
- log.warn( msg )
- return trans.response.send_redirect( web.url_for( controller='requests',
- action='list',
- status='error',
- message=msg,
- **kwd) )
- # change request's submitted field
- if not request.unsubmitted():
- return trans.response.send_redirect( web.url_for( controller='requests',
- action='list',
- status='error',
- message='This request cannot be deleted as it is already been submitted',
- **kwd) )
- request.deleted = True
- trans.sa_session.add( request )
- trans.sa_session.flush()
- kwd = {}
- kwd['id'] = trans.security.encode_id(request.id)
+ def __delete_request(self, trans, **kwd):
+ id_list = util.listify( kwd['id'] )
+ delete_failed = []
+ for id in id_list:
+ try:
+ request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(id) )
+ except:
+ msg = "Invalid request ID"
+ log.warn( msg )
+ return trans.response.send_redirect( web.url_for( controller='requests',
+ action='list',
+ status='error',
+ message=msg,
+ **kwd) )
+ # a request cannot be deleted once its submitted
+ if not request.unsubmitted():
+ delete_failed.append(request.name)
+ else:
+ request.deleted = True
+ trans.sa_session.add( request )
+ trans.sa_session.flush()
+ if not len(delete_failed):
+ msg = '%i request(s) has been deleted.' % len(id_list)
+ status = 'done'
+ else:
+ msg = '%i request(s) has been deleted. %i request %s could not be deleted as they have been submitted.' % (len(id_list)-len(delete_failed),
+ len(delete_failed), str(delete_failed))
+ status = 'warning'
+ return trans.response.send_redirect( web.url_for( controller='requests',
+ action='list',
+ status=status,
+ message=msg) )
+ def __undelete_request(self, trans, **kwd):
+ id_list = util.listify( kwd['id'] )
+ for id in id_list:
+ try:
+ request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(id) )
+ except:
+ msg = "Invalid request ID"
+ log.warn( msg )
+ return trans.response.send_redirect( web.url_for( controller='requests',
+ action='list',
+ status='error',
+ message=msg,
+ **kwd) )
+ request.deleted = False
+ trans.sa_session.add( request )
+ trans.sa_session.flush()
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
status='done',
- message='The request <b>%s</b> has been deleted.' % request.name,
- **kwd) )
- def __undelete_request(self, trans, id):
+ message='%i request(s) has been undeleted.' % len(id_list) ) )
+ def __submit_request(self, trans, **kwd):
try:
- request = trans.sa_session.query( trans.app.model.Request ).get( id )
- except:
- msg = "Invalid request ID"
- log.warn( msg )
- return trans.response.send_redirect( web.url_for( controller='requests',
- action='list',
- status='error',
- message=msg,
- **kwd) )
- # change request's submitted field
- request.deleted = False
- trans.sa_session.add( request )
- trans.sa_session.flush()
- kwd = {}
- kwd['id'] = trans.security.encode_id(request.id)
- return trans.response.send_redirect( web.url_for( controller='requests',
- action='list',
- status='done',
- message='The request <b>%s</b> has been undeleted.' % request.name,
- **kwd) )
- def __submit_request(self, trans, id):
- try:
- request = trans.sa_session.query( trans.app.model.Request ).get( id )
+ request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
except:
msg = "Invalid request ID"
log.warn( msg )
@@ -837,14 +885,12 @@
request.state = request.states.SUBMITTED
trans.sa_session.add( request )
trans.sa_session.flush()
- kwd = {}
- kwd['id'] = trans.security.encode_id(request.id)
- kwd['status'] = 'done'
- kwd['message'] = 'The request <b>%s</b> has been submitted.' % request.name
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
- show_filter=trans.app.model.Request.states.SUBMITTED,
- **kwd) )
+ id=trans.security.encode_id(request.id),
+ status='done',
+ message='The request <b>%s</b> has been submitted.' % request.name
+ ) )
@web.expose
@web.require_login( "create/submit sequencing requests" )
def show_events(self, trans, **kwd):
diff -r 56bb85457bc1 -r ed8972386675 lib/galaxy/web/controllers/requests_admin.py
--- a/lib/galaxy/web/controllers/requests_admin.py Tue Nov 17 13:43:34 2009 -0500
+++ b/lib/galaxy/web/controllers/requests_admin.py Tue Nov 17 14:28:34 2009 -0500
@@ -15,63 +15,187 @@
# ---- Request Grid ------------------------------------------------------------
#
-class RequestsListGrid( grids.Grid ):
+class RequestsGrid( grids.Grid ):
+ # Custom column types
+ class NameColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, request):
+ return request.name
+ class DescriptionColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, request):
+ return request.desc
+ class SamplesColumn( grids.GridColumn ):
+ def get_value(self, trans, grid, request):
+ return str(len(request.samples))
+ class TypeColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, request):
+ return request.type.name
+ class LastUpdateColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, request):
+ return request.update_time
+ class StateColumn( grids.GridColumn ):
+ def filter( self, db_session, query, column_filter ):
+ """ Modify query to filter request by state. """
+ if column_filter == "All":
+ return query
+ if column_filter:
+ query = query.filter( model.Request.state == column_filter )
+ return query
+ def get_accepted_filters( self ):
+ """ Returns a list of accepted filters for this column. """
+ accepted_filter_labels_and_vals = [ model.Request.states.UNSUBMITTED,
+ model.Request.states.SUBMITTED,
+ model.Request.states.COMPLETE,
+ "All"]
+ accepted_filters = []
+ for val in accepted_filter_labels_and_vals:
+ label = val.lower()
+ args = { self.key: val }
+ accepted_filters.append( grids.GridColumnFilter( label, args) )
+ return accepted_filters
+ class UserColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, request):
+ return request.user.email
+ class DeletedColumn( grids.GridColumn ):
+ def get_accepted_filters( self ):
+ """ Returns a list of accepted filters for this column. """
+ accepted_filter_labels_and_vals = { "active" : "False", "deleted" : "True", "all": "All" }
+ accepted_filters = []
+ for label, val in accepted_filter_labels_and_vals.items():
+ args = { self.key: val }
+ accepted_filters.append( grids.GridColumnFilter( label, args) )
+ return accepted_filters
+ # Grid definition
title = "Sequencing Requests"
template = "admin/requests/grid.mako"
model_class = model.Request
default_sort_key = "-create_time"
- show_filter = model.Request.states.SUBMITTED
+ num_rows_per_page = 50
+ preserve_state = True
+ use_paging = True
+ default_filter = dict( deleted="False", state=model.Request.states.SUBMITTED)
columns = [
- grids.GridColumn( "Name", key="name",
- link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ),
- attach_popup=True ),
- grids.GridColumn( "Description", key="desc"),
- grids.GridColumn( "Sample(s)", method='number_of_samples',
- link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ), ),
- grids.GridColumn( "Type", key="request_type_id", method='get_request_type'),
- grids.GridColumn( "Last update", key="update_time", format=time_ago ),
- grids.GridColumn( "State", key='state'),
- grids.GridColumn( "User", key="user_id", method='get_user')
-
+ NameColumn( "Name",
+ key="name",
+ model_class=model.Request,
+ link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ),
+ attach_popup=True,
+ filterable="advanced" ),
+ DescriptionColumn( "Description",
+ key='desc',
+ model_class=model.Request,
+ filterable="advanced" ),
+ SamplesColumn( "Sample(s)",
+ link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ), ),
+ TypeColumn( "Type" ),
+ LastUpdateColumn( "Last update",
+ format=time_ago ),
+ StateColumn( "State",
+ key='state',
+ filterable="advanced"),
+ UserColumn( "User",
+ key='user.email',
+ model_class=model.Request,
+ filterable="advanced" ),
+ DeletedColumn( "Deleted",
+ key="deleted",
+ visible=True,
+ filterable="advanced" )
]
+ columns.append( grids.MulticolFilterColumn( "Search",
+ cols_to_filter=[ columns[0], columns[1], columns[6] ],
+ key="free-text-search",
+ visible=False,
+ filterable="standard" ) )
operations = [
grids.GridOperation( "Submit", allow_multiple=False, condition=( lambda item: not item.deleted and item.unsubmitted() and item.samples ) ),
grids.GridOperation( "Edit", allow_multiple=False, condition=( lambda item: not item.deleted ) ),
grids.GridOperation( "Reject", allow_multiple=False, condition=( lambda item: not item.deleted and item.submitted() ) ),
- grids.GridOperation( "Delete", allow_multiple=False, condition=( lambda item: not item.deleted and item.unsubmitted() ) ),
+ grids.GridOperation( "Delete", allow_multiple=True, condition=( lambda item: not item.deleted and item.unsubmitted() ) ),
grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ) ),
]
- standard_filters = [
- grids.GridColumnFilter( model.Request.states.UNSUBMITTED,
- args=dict( state=model.Request.states.UNSUBMITTED, deleted=False ) ),
- grids.GridColumnFilter( model.Request.states.SUBMITTED,
- args=dict( state=model.Request.states.SUBMITTED, deleted=False ) ),
- grids.GridColumnFilter( model.Request.states.COMPLETE, args=dict( state=model.Request.states.COMPLETE, deleted=False ) ),
- grids.GridColumnFilter( "Deleted", args=dict( deleted=True ) ),
- grids.GridColumnFilter( "All", args=dict( deleted=False ) )
+ global_actions = [
+ grids.GridAction( "Create new request", dict( controller='requests_admin',
+ action='new',
+ select_request_type='True' ) )
]
- def get_user(self, trans, request):
- return trans.sa_session.query( trans.app.model.User ).get( request.user_id ).email
- def get_current_item( self, trans ):
- return None
- def get_request_type(self, trans, request):
- request_type = trans.sa_session.query( trans.app.model.RequestType ).get( request.request_type_id )
- return request_type.name
- def number_of_samples(self, trans, request):
- return str(len(request.samples))
- def apply_default_filter( self, trans, query, **kwargs ):
- if self.default_filter:
- return query.filter_by( **self.default_filter )
- else:
- return query
-
+
+#
+# ---- Request Type Gridr ------------------------------------------------------
+#
+class RequestTypeGrid( grids.Grid ):
+ # Custom column types
+ class NameColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, request_type):
+ return request_type.name
+ class DescriptionColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, request_type):
+ return request_type.desc
+ class RequestFormColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, request_type):
+ return request_type.request_form.name
+ class SampleFormColumn( grids.TextColumn ):
+ def get_value(self, trans, grid, request_type):
+ return request_type.sample_form.name
+ class DeletedColumn( grids.GridColumn ):
+ def get_accepted_filters( self ):
+ """ Returns a list of accepted filters for this column. """
+ accepted_filter_labels_and_vals = { "active" : "False", "deleted" : "True", "all": "All" }
+ accepted_filters = []
+ for label, val in accepted_filter_labels_and_vals.items():
+ args = { self.key: val }
+ accepted_filters.append( grids.GridColumnFilter( label, args) )
+ return accepted_filters
+ # Grid definition
+ title = "Requests Types"
+ template = "admin/requests/manage_request_types.mako"
+ model_class = model.RequestType
+ default_sort_key = "-create_time"
+ num_rows_per_page = 50
+ preserve_state = True
+ use_paging = True
+ default_filter = dict( deleted="False" )
+ columns = [
+ NameColumn( "Name",
+ key="name",
+ model_class=model.RequestType,
+ link=( lambda item: iff( item.deleted, None, dict( operation="view", id=item.id ) ) ),
+ attach_popup=True,
+ filterable="advanced" ),
+ DescriptionColumn( "Description",
+ key='desc',
+ model_class=model.Request,
+ filterable="advanced" ),
+ RequestFormColumn( "Request Form",
+ link=( lambda item: iff( item.deleted, None, dict( operation="view_form", id=item.request_form.id ) ) ), ),
+ SampleFormColumn( "Sample Form",
+ link=( lambda item: iff( item.deleted, None, dict( operation="view_form", id=item.sample_form.id ) ) ), ),
+ DeletedColumn( "Deleted",
+ key="deleted",
+ visible=False,
+ filterable="advanced" )
+ ]
+ columns.append( grids.MulticolFilterColumn( "Search",
+ cols_to_filter=[ columns[0], columns[1] ],
+ key="free-text-search",
+ visible=False,
+ filterable="standard" ) )
+ operations = [
+ #grids.GridOperation( "Update", allow_multiple=False, condition=( lambda item: not item.deleted ) ),
+ grids.GridOperation( "Delete", allow_multiple=True, condition=( lambda item: not item.deleted ) ),
+ grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ) ),
+ ]
+ global_actions = [
+ grids.GridAction( "Create new request type", dict( controller='requests_admin',
+ action='create_request_type' ) )
+ ]
#
# ---- Request Controller ------------------------------------------------------
#
class Requests( BaseController ):
- request_grid = RequestsListGrid()
+ request_grid = RequestsGrid()
+ requesttype_grid = RequestTypeGrid()
@web.expose
@web.require_admin
@@ -80,67 +204,59 @@
@web.expose
@web.require_admin
- def list( self, trans, **kwargs ):
+ def list( self, trans, **kwd ):
'''
List all request made by the current user
'''
- message = util.restore_text( kwargs.get( 'message', '' ) )
- status = kwargs.get( 'status', 'done' )
- self.request_grid.default_filter = dict(state=trans.app.model.Request.states.SUBMITTED,
- deleted=False)
- if 'operation' in kwargs:
- operation = kwargs['operation'].lower()
+ if 'operation' in kwd:
+ operation = kwd['operation'].lower()
+ if not kwd.get( 'id', None ):
+ return trans.response.send_redirect( web.url_for( controller='requests_admin',
+ action='list',
+ status='error',
+ message="Invalid request ID") )
if operation == "show_request":
- id = trans.security.decode_id(kwargs['id'])
- return self.__show_request(trans, id, status, message)
+ return self.__show_request( trans, **kwd )
elif operation == "submit":
- id = trans.security.decode_id(kwargs['id'])
- return self.__submit_request(trans, id)
+ return self.__submit_request( trans, **kwd )
+ elif operation == "delete":
+ return self.__delete_request( trans, **kwd )
+ elif operation == "undelete":
+ return self.__undelete_request( trans, **kwd )
elif operation == "edit":
- id = trans.security.decode_id(kwargs['id'])
- return self.__edit_request(trans, id)
- elif operation == "delete":
- id = trans.security.decode_id(kwargs['id'])
- return self.__delete_request(trans, id)
- elif operation == "undelete":
- id = trans.security.decode_id(kwargs['id'])
- return self.__undelete_request(trans, id)
+ return self.__edit_request( trans, **kwd )
elif operation == "reject":
- id = trans.security.decode_id(kwargs['id'])
- return self.__reject_request(trans, id)
- if 'show_filter' in kwargs.keys():
- if kwargs['show_filter'] == 'All':
- self.request_grid.default_filter = {}
- elif kwargs['show_filter'] == 'Deleted':
- self.request_grid.default_filter = dict(deleted=True)
- else:
- self.request_grid.default_filter = dict(state=kwargs['show_filter'], deleted=False)
- self.request_grid.show_filter = kwargs.get('show_filter', trans.app.model.Request.states.SUBMITTED)
- # Render the list view
- return self.request_grid( trans, **kwargs )
- def __show_request(self, trans, id, messagetype, msg):
+ return self.__reject_request( trans, **kwd )
+ # Render the grid view
+ return self.request_grid( trans, **kwd )
+ def __show_request(self, trans, **kwd):
+ params = util.Params( kwd )
+ msg = util.restore_text( params.get( 'msg', '' ) )
+ messagetype = params.get( 'messagetype', 'done' )
+ add_sample = params.get('add_sample', False)
try:
- request = trans.sa_session.query( trans.app.model.Request ).get( id )
+ request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
except:
return trans.response.send_redirect( web.url_for( controller='requests_admin',
action='list',
status='error',
- message="Invalid request ID",
- **kwd) )
+ message="Invalid request ID") )
current_samples = []
for s in request.samples:
current_samples.append([s.name, s.values.content])
+ if add_sample:
+ current_samples.append(['Sample_%i' % (len(current_samples)+1),['' for field in request.type.sample_form.fields]])
return trans.fill_template( '/admin/requests/show_request.mako',
request=request,
- request_details=self.request_details(trans, id),
+ request_details=self.request_details(trans, request.id),
current_samples = current_samples,
sample_copy=self.__copy_sample(current_samples),
details='hide', edit_mode='False',
- msg=msg, messagetype=messagetype)
+ msg=msg, messagetype=messagetype )
- def __edit_request(self, trans, id, **kwd):
+ def __edit_request(self, trans, **kwd):
try:
- request = trans.sa_session.query( trans.app.model.Request ).get( id )
+ request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
except:
msg = "Invalid request ID"
log.warn( msg )
@@ -180,61 +296,61 @@
msg=msg,
messagetype=messagetype)
return self.__show_request_form(trans)
- def __delete_request(self, trans, id):
- try:
- request = trans.sa_session.query( trans.app.model.Request ).get( id )
- except:
- msg = "Invalid request ID"
- log.warn( msg )
- return trans.response.send_redirect( web.url_for( controller='requests_admin',
- action='list',
- status='error',
- message=msg,
- **kwd) )
- # change request's submitted field
- if not request.unsubmitted():
- return trans.response.send_redirect( web.url_for( controller='requests_admin',
- action='list',
- status='error',
- message='This request cannot be deleted as it is already been submitted',
- **kwd) )
- request.deleted = True
- trans.sa_session.add( request )
- trans.sa_session.flush()
- kwd = {}
- kwd['id'] = trans.security.encode_id(request.id)
+ def __delete_request(self, trans, **kwd):
+ id_list = util.listify( kwd['id'] )
+ delete_failed = []
+ for id in id_list:
+ try:
+ request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(id) )
+ except:
+ msg = "Invalid request ID"
+ log.warn( msg )
+ return trans.response.send_redirect( web.url_for( controller='requests_admin',
+ action='list',
+ status='error',
+ message=msg,
+ **kwd) )
+ # a request cannot be deleted once its submitted
+ if not request.unsubmitted():
+ delete_failed.append(request.name)
+ else:
+ request.deleted = True
+ trans.sa_session.add( request )
+ trans.sa_session.flush()
+ if not len(delete_failed):
+ msg = '%i request(s) has been deleted.' % len(id_list)
+ status = 'done'
+ else:
+ msg = '%i request(s) has been deleted. %i request %s could not be deleted as they have been submitted.' % (len(id_list)-len(delete_failed),
+ len(delete_failed), str(delete_failed))
+ status = 'warning'
return trans.response.send_redirect( web.url_for( controller='requests_admin',
action='list',
- show_filter=trans.app.model.Request.states.UNSUBMITTED,
- status='done',
- message='The request <b>%s</b> has been deleted.' % request.name,
- **kwd) )
- def __undelete_request(self, trans, id):
- try:
- request = trans.sa_session.query( trans.app.model.Request ).get( id )
- except:
- msg = "Invalid request ID"
- log.warn( msg )
- return trans.response.send_redirect( web.url_for( controller='requests_admin',
- action='list',
- status='error',
- message=msg,
- **kwd) )
- # change request's submitted field
- request.deleted = False
- trans.sa_session.add( request )
- trans.sa_session.flush()
- kwd = {}
- kwd['id'] = trans.security.encode_id(request.id)
+ status=status,
+ message=msg) )
+ def __undelete_request(self, trans, **kwd):
+ id_list = util.listify( kwd['id'] )
+ for id in id_list:
+ try:
+ request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(id) )
+ except:
+ msg = "Invalid request ID"
+ log.warn( msg )
+ return trans.response.send_redirect( web.url_for( controller='requests_admin',
+ action='list',
+ status='error',
+ message=msg,
+ **kwd) )
+ request.deleted = False
+ trans.sa_session.add( request )
+ trans.sa_session.flush()
return trans.response.send_redirect( web.url_for( controller='requests_admin',
action='list',
- show_filter=trans.app.model.Request.states.UNSUBMITTED,
status='done',
- message='The request <b>%s</b> has been undeleted.' % request.name,
- **kwd) )
- def __submit_request(self, trans, id):
+ message='%i request(s) has been undeleted.' % len(id_list) ) )
+ def __submit_request(self, trans, **kwd):
try:
- request = trans.sa_session.query( trans.app.model.Request ).get( id )
+ request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
except:
msg = "Invalid request ID"
log.warn( msg )
@@ -260,15 +376,32 @@
request.state = request.states.SUBMITTED
trans.sa_session.add( request )
trans.sa_session.flush()
- kwd = {}
- kwd['id'] = trans.security.encode_id(request.id)
- kwd['status'] = 'done'
- kwd['message'] = 'The request <b>%s</b> has been submitted.' % request.name
return trans.response.send_redirect( web.url_for( controller='requests_admin',
action='list',
- show_filter=trans.app.model.Request.states.SUBMITTED,
- **kwd) )
-
+ id=trans.security.encode_id(request.id),
+ status='done',
+ message='The request <b>%s</b> has been submitted.' % request.name
+ ) )
+ def __reject_request(self, trans, **kwd):
+ try:
+ request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
+ except:
+ msg = "Invalid request ID"
+ log.warn( msg )
+ return trans.response.send_redirect( web.url_for( controller='requests_admin',
+ action='list',
+ status='error',
+ message=msg,
+ **kwd) )
+ # change request's submitted field
+ request.state = request.states.UNSUBMITTED
+ trans.sa_session.add( request )
+ trans.sa_session.flush()
+ return trans.response.send_redirect( web.url_for( controller='requests_admin',
+ action='list',
+ status='done',
+ message='The request <b>%s</b> is now unsubmitted.' % request.name
+ ) )
#
#---- Request Creation ----------------------------------------------------------
#
@@ -325,7 +458,6 @@
if params.get('create_request_button', False) == 'Save':
return trans.response.send_redirect( web.url_for( controller='requests_admin',
action='list',
- show_filter=trans.app.model.Request.states.UNSUBMITTED,
message=msg ,
status='done') )
elif params.get('create_request_samples_button', False) == 'Add samples':
@@ -664,29 +796,6 @@
**new_kwd) )
elif params.get('refresh', False) == 'true':
return self.__edit_request(trans, request.id, **kwd)
- def __reject_request(self, trans, id):
- try:
- request = trans.sa_session.query( trans.app.model.Request ).get( id )
- except:
- msg = "Invalid request ID"
- log.warn( msg )
- return trans.response.send_redirect( web.url_for( controller='requests_admin',
- action='list',
- status='error',
- message=msg,
- **kwd) )
- # change request's submitted field
- request.state = request.states.UNSUBMITTED
- trans.sa_session.add( request )
- trans.sa_session.flush()
- kwd = {}
- kwd['id'] = trans.security.encode_id(request.id)
- kwd['status'] = 'done'
- kwd['message'] = 'The request <b>%s</b> is now unsubmitted.' % request.name
- return trans.response.send_redirect( web.url_for( controller='requests_admin',
- action='list',
- show_filter=trans.app.model.Request.states.UNSUBMITTED,
- **kwd) )
def __update_samples(self, request, **kwd):
'''
This method retrieves all the user entered sample information and
@@ -1049,8 +1158,8 @@
action='list',
operation='show_request',
id=trans.security.encode_id(request.id),
- message='Bar codes have been saved for this request',
- status='done'))
+ msg='Bar codes have been saved for this request',
+ messagetype='done'))
def __set_request_state( self, trans, request ):
# check if all the samples of the current request are in the final state
complete = True
@@ -1138,50 +1247,72 @@
##
@web.expose
@web.require_admin
- def manage_request_types( self, trans, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- show_filter = util.restore_text( params.get( 'show_filter', 'Active' ) )
- forms = get_all_forms(trans, all_versions=True)
- request_types_list = trans.sa_session.query( trans.app.model.RequestType )
- if show_filter == 'All':
- request_types = request_types_list
- elif show_filter == 'Deleted':
- request_types = [rt for rt in request_types_list if rt.deleted]
- else:
- request_types = [rt for rt in request_types_list if not rt.deleted]
- return trans.fill_template( '/admin/requests/manage_request_types.mako',
- request_types=request_types,
- forms=forms,
- show_filter=show_filter,
- msg=msg,
- messagetype=messagetype )
+ def manage_request_types( self, trans, **kwd ):
+ if 'operation' in kwd:
+ operation = kwd['operation'].lower()
+ if not kwd.get( 'id', None ):
+ return trans.response.send_redirect( web.url_for( controller='requests_admin',
+ action='manage_request_types',
+ status='error',
+ message="Invalid requesttype ID") )
+ if operation == "view":
+ return self.__view_request_type( trans, **kwd )
+ elif operation == "view_form":
+ return self.__view_form( trans, **kwd )
+ elif operation == "delete":
+ return self.__delete_request_type( trans, **kwd )
+ elif operation == "undelete":
+ return self.__undelete_request_type( trans, **kwd )
+# elif operation == "update":
+# return self.__edit_request( trans, **kwd )
+ # Render the grid view
+ return self.requesttype_grid( trans, **kwd )
+ def __view_request_type(self, trans, **kwd):
+ try:
+ rt = trans.sa_session.query( trans.app.model.RequestType ).get( trans.security.decode_id(kwd['id']) )
+ except:
+ return trans.response.send_redirect( web.url_for( controller='requests_admin',
+ action='manage_request_types',
+ status='error',
+ message="Invalid requesttype ID") )
+ return trans.fill_template( '/admin/requests/view_request_type.mako',
+ request_type=rt,
+ forms=get_all_forms( trans ),
+ states_list=rt.states )
+ def __view_form(self, trans, **kwd):
+ try:
+ fd = trans.sa_session.query( trans.app.model.FormDefinition ).get( trans.security.decode_id(kwd['id']) )
+ except:
+ return trans.response.send_redirect( web.url_for( controller='requests_admin',
+ action='manage_request_types',
+ status='error',
+ message="Invalid form ID") )
+ return trans.fill_template( '/admin/forms/show_form_read_only.mako',
+ form=fd )
+
@web.expose
@web.require_admin
- def request_type( self, trans, **kwd ):
+ def create_request_type( self, trans, **kwd ):
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
- if params.get( 'create', False ):
+ if params.get( 'add_state_button', False ):
+ rt_info, rt_states = self.__create_request_type_form(trans, **kwd)
+ rt_states.append(("", ""))
return trans.fill_template( '/admin/requests/create_request_type.mako',
- request_forms=get_all_forms( trans,
- filter=dict(deleted=False),
- form_type=trans.app.model.FormDefinition.types.REQUEST ),
- sample_forms=get_all_forms( trans,
- filter=dict(deleted=False),
- form_type=trans.app.model.FormDefinition.types.SAMPLE ),
+ rt_info_widgets=rt_info,
+ rt_states_widgets=rt_states,
msg=msg,
messagetype=messagetype)
- elif params.get( 'define_states_button', False ):
- return trans.fill_template( '/admin/requests/add_states.mako',
- request_type_name=util.restore_text( params.name ),
- desc=util.restore_text( params.description ),
- num_states=int(util.restore_text( params.num_states )),
- request_form_id=int(util.restore_text( params.request_form_id )),
- sample_form_id=int(util.restore_text( params.sample_form_id )),
+ elif params.get( 'remove_state_button', False ):
+ rt_info, rt_states = self.__create_request_type_form(trans, **kwd)
+ index = int(params.get( 'remove_state_button', '' ).split(" ")[2])
+ del rt_states[index-1]
+ return trans.fill_template( '/admin/requests/create_request_type.mako',
+ rt_info_widgets=rt_info,
+ rt_states_widgets=rt_states,
msg=msg,
- messagetype=messagetype)
+ messagetype=messagetype)
elif params.get( 'save_request_type', False ):
st, msg = self.__save_request_type(trans, **kwd)
if not st:
@@ -1191,32 +1322,65 @@
messagetype='error')
return trans.response.send_redirect( web.url_for( controller='requests_admin',
action='manage_request_types',
- msg='Request type <b>%s</b> has been created' % st.name,
- messagetype='done') )
- elif params.get('view', False):
- rt = trans.sa_session.query( trans.app.model.RequestType ).get( int( util.restore_text( params.id ) ) )
- return trans.fill_template( '/admin/requests/view_request_type.mako',
- request_type=rt,
- forms=get_all_forms( trans ),
- states_list=rt.states,
- deleted=False,
- show_deleted=False,
+ message='Request type <b>%s</b> has been created' % st.name,
+ status='done') )
+ else:
+ rt_info, rt_states = self.__create_request_type_form(trans, **kwd)
+ return trans.fill_template( '/admin/requests/create_request_type.mako',
+ rt_info_widgets=rt_info,
+ rt_states_widgets=rt_states,
msg=msg,
- messagetype=messagetype )
+ messagetype=messagetype)
+ def __create_request_type_form(self, trans, **kwd):
+ request_forms=get_all_forms( trans,
+ filter=dict(deleted=False),
+ form_type=trans.app.model.FormDefinition.types.REQUEST )
+ sample_forms=get_all_forms( trans,
+ filter=dict(deleted=False),
+ form_type=trans.app.model.FormDefinition.types.SAMPLE )
+ if not len(request_forms) or not len(sample_forms):
+ return [],[]
+ params = util.Params( kwd )
+ rt_info = []
+ rt_info.append(dict(label='Name',
+ widget=TextField('name', 40, util.restore_text( params.get( 'name', '' ) ) ) ))
+ rt_info.append(dict(label='Description',
+ widget=TextField('desc', 40, util.restore_text( params.get( 'desc', '' ) ) ) ))
+
+ rf_selectbox = SelectField('request_form_id')
+ for fd in request_forms:
+ if str(fd.id) == params.get( 'request_form_id', '' ):
+ rf_selectbox.add_option(fd.name, fd.id, selected=True)
+ else:
+ rf_selectbox.add_option(fd.name, fd.id)
+ rt_info.append(dict(label='Request form',
+ widget=rf_selectbox ))
+
+ sf_selectbox = SelectField('sample_form_id')
+ for fd in sample_forms:
+ if str(fd.id) == params.get( 'sample_form_id', '' ):
+ sf_selectbox.add_option(fd.name, fd.id, selected=True)
+ else:
+ sf_selectbox.add_option(fd.name, fd.id)
+ rt_info.append(dict(label='Sample form',
+ widget=sf_selectbox ))
+ # possible sample states
+ rt_states = []
+ i=0
+ while True:
+ if kwd.has_key( 'state_name_%i' % i ):
+ rt_states.append((params.get( 'state_name_%i' % i, '' ),
+ params.get( 'state_desc_%i' % i, '' )))
+ i=i+1
+ else:
+ break
+ return rt_info, rt_states
+
def __save_request_type(self, trans, **kwd):
params = util.Params( kwd )
- num_states = int( util.restore_text( params.get( 'num_states', 0 ) ))
- proceed = True
- for i in range( num_states ):
- if not util.restore_text( params.get( 'state_name_%i' % i, None ) ):
- proceed = False
- break
- if not proceed:
- msg = "All the state name(s) must be completed."
- return None, msg
rt = trans.app.model.RequestType()
- rt.name = util.restore_text( params.name )
- rt.desc = util.restore_text( params.description ) or ""
+ rt.name = util.restore_text( params.get( 'name', '' ) )
+ rt.desc = util.restore_text( params.get( 'desc', '' ) )
rt.request_form = trans.sa_session.query( trans.app.model.FormDefinition ).get( int( params.request_form_id ) )
rt.sample_form = trans.sa_session.query( trans.app.model.FormDefinition ).get( int( params.sample_form_id ) )
trans.sa_session.add( rt )
@@ -1226,37 +1390,50 @@
for ss in ss_list:
trans.sa_session.delete( ss )
trans.sa_session.flush()
- for i in range( num_states ):
- name = util.restore_text( params.get( 'state_name_%i' % i, None ))
- desc = util.restore_text( params.get( 'state_desc_%i' % i, None ))
- ss = trans.app.model.SampleState(name, desc, rt)
- trans.sa_session.add( ss )
+ i=0
+ while True:
+ if kwd.has_key( 'state_name_%i' % i ):
+ name = util.restore_text( params.get( 'state_name_%i' % i, None ))
+ desc = util.restore_text( params.get( 'state_desc_%i' % i, None ))
+ ss = trans.app.model.SampleState(name, desc, rt)
+ trans.sa_session.add( ss )
+ trans.sa_session.flush()
+ i = i + 1
+ else:
+ break
+ msg = "The new request type named '%s' with %s state(s) has been created" % (rt.name, i)
+ return rt, msg
+ def __delete_request_type( self, trans, **kwd ):
+ id_list = util.listify( kwd['id'] )
+ for id in id_list:
+ try:
+ rt = trans.sa_session.query( trans.app.model.RequestType ).get( trans.security.decode_id(id) )
+ except:
+ return trans.response.send_redirect( web.url_for( controller='requests_admin',
+ action='manage_request_types',
+ msg='Invalid request type ID',
+ messagetype='error') )
+ rt.deleted = True
+ trans.sa_session.add( rt )
trans.sa_session.flush()
- msg = "The new request type named '%s' with %s state(s) has been created" % (rt.name, num_states)
- return rt, msg
- @web.expose
- @web.require_admin
- def delete_request_type( self, trans, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- rt = trans.sa_session.query( trans.app.model.RequestType ).get( int( util.restore_text( params.request_type_id ) ) )
- rt.deleted = True
- trans.sa_session.flush()
return trans.response.send_redirect( web.url_for( controller='requests_admin',
action='manage_request_types',
- msg='Request type <b>%s</b> has been deleted' % rt.name,
+ msg='%i request type(s) has been deleted' % len(id_list),
messagetype='done') )
- @web.expose
- @web.require_admin
- def undelete_request_type( self, trans, **kwd ):
- params = util.Params( kwd )
- msg = util.restore_text( params.get( 'msg', '' ) )
- messagetype = params.get( 'messagetype', 'done' )
- rt = trans.sa_session.query( trans.app.model.RequestType ).get( int( util.restore_text( params.request_type_id ) ) )
- rt.deleted = False
- trans.sa_session.flush()
+ def __undelete_request_type( self, trans, **kwd ):
+ id_list = util.listify( kwd['id'] )
+ for id in id_list:
+ try:
+ rt = trans.sa_session.query( trans.app.model.RequestType ).get( trans.security.decode_id(id) )
+ except:
+ return trans.response.send_redirect( web.url_for( controller='requests_admin',
+ action='manage_request_types',
+ msg='Invalid request type ID',
+ messagetype='error') )
+ rt.deleted = False
+ trans.sa_session.add( rt )
+ trans.sa_session.flush()
return trans.response.send_redirect( web.url_for( controller='requests_admin',
action='manage_request_types',
- msg='Request type <b>%s</b> has been undeleted' % rt.name,
+ msg='%i request type(s) has been undeleted' % len(id_list),
messagetype='done') )
diff -r 56bb85457bc1 -r ed8972386675 templates/admin/forms/edit_form.mako
--- a/templates/admin/forms/edit_form.mako Tue Nov 17 13:43:34 2009 -0500
+++ b/templates/admin/forms/edit_form.mako Tue Nov 17 14:28:34 2009 -0500
@@ -85,7 +85,7 @@
<div class="toolForm">
<div class="toolFormTitle">Edit form definition "${form.name}"</div>
- <form id="edit_form" name="edit_form" action="${h.url_for( controller='forms', action='edit', form_id=form.id )}" method="post" >
+ <form id="edit_form" name="edit_form" action="${h.url_for( controller='forms', action='manage', operation="Edit", id=trans.security.encode_id(form.current.id) )}" method="post" >
%for label, input in form_details:
<div class="form-row">
<label>${label}</label>
diff -r 56bb85457bc1 -r ed8972386675 templates/admin/forms/grid.mako
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/admin/forms/grid.mako Tue Nov 17 14:28:34 2009 -0500
@@ -0,0 +1,1 @@
+<%inherit file="/grid_base.mako"/>
diff -r 56bb85457bc1 -r ed8972386675 templates/admin/forms/manage_forms.mako
--- a/templates/admin/forms/manage_forms.mako Tue Nov 17 13:43:34 2009 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-<%inherit file="/base.mako"/>
-<%namespace file="/message.mako" import="render_msg" />
-
-<%def name="title()">Manage Form Definitions</%def>
-
-%if msg:
- ${render_msg( msg, messagetype )}
-%endif
-
-## Render a row
-<%def name="render_row( form, ctr )">
- %if ctr % 2 == 1:
- <tr class="odd_row">
- %else:
- <tr>
- %endif
- <td>
- <a href="${h.url_for( controller='forms', action='edit', form_id=form.id, read_only=True )}">${form.name}</a>
- <a id="form-${form.id}-popup" class="popup-arrow" style="display: none;">▼</a>
- %if form.form_definition_current.deleted:
- <div popupmenu="form-${form.id}-popup">
- <a class="action-button" href="${h.url_for( action='undelete', form_id=form.id )}">Undelete</a>
- </div>
- %else:
- <div popupmenu="form-${form.id}-popup">
- <a class="action-button" href="${h.url_for( action='edit', form_id=form.id, show_form=True )}">Edit</a>
- <a class="action-button" confirm="Click OK to delete the form ${form.name}." href="${h.url_for( action='delete', form_id=form.id )}">Delete</a>
- </div>
- %endif
- </td>
- <td><i>${form.desc}</i></td>
- <td>${form.type}</td>
- </tr>
-</%def>
-
-<h2>Forms</h2>
-
-<ul class="manage-table-actions">
- <li>
- <a class="action-button" href="${h.url_for( controller='forms', action='new' )}">
- <span>Create a new form</span></a>
- </li>
-</ul>
-
-%if not all_forms:
- There are no forms.
-%else:
- <div class="grid-header">
- %for i, filter in enumerate( ['Active', 'Deleted', 'All'] ):
- %if i > 0:
- <span>|</span>
- %endif
- %if show_filter == filter:
- <span class="filter"><a href="${h.url_for( controller='forms', action='manage', show_filter=filter )}"><b>${filter}</b></a></span>
- %else:
- <span class="filter"><a href="${h.url_for( controller='forms', action='manage', show_filter=filter )}">${filter}</a></span>
- %endif
- %endfor
- </div>
- <table class="grid">
- <thead>
- <tr>
- <th>Name</th>
- <th>Description</th>
- <th>Type</th>
- </tr>
- </thead>
- <tbody>
- %for ctr, fdc in enumerate( fdc_list ):
- <tr>
- ${render_row( fdc.latest_form, ctr )}
- </tr>
- %endfor
- </tbody>
- </table>
-%endif
diff -r 56bb85457bc1 -r ed8972386675 templates/admin/forms/show_form_read_only.mako
--- a/templates/admin/forms/show_form_read_only.mako Tue Nov 17 13:43:34 2009 -0500
+++ b/templates/admin/forms/show_form_read_only.mako Tue Nov 17 14:28:34 2009 -0500
@@ -66,14 +66,14 @@
<div class="toolFormTitle">${form.name} - <i> ${form.desc}</i> (${form.type})
<a id="form-${form.id}-popup" class="popup-arrow" style="display: none;">▼</a>
<div popupmenu="form-${form.id}-popup">
- <a class="action-button" href="${h.url_for( action='edit', form_id=form.id, show_form=True )}">Edit</a>
+ <a class="action-button" href="${h.url_for( controller='forms', action='manage', operation='Edit', id=trans.security.encode_id(form.current.id) )}">Edit</a>
</div>
</div>
%else:
<div class="toolFormTitle">${form.name} (${form.type})
<a id="form-${form.id}-popup" class="popup-arrow" style="display: none;">▼</a>
<div popupmenu="form-${form.id}-popup">
- <a class="action-button" href="${h.url_for( action='edit', form_id=form.id, show_form=True )}">Edit</a>
+ <a class="action-button" href="${h.url_for( controller='forms', action='manage', operation='Edit', id=trans.security.encode_id(form.current.id) )}">Edit</a>
</div>
</div>
%endif
diff -r 56bb85457bc1 -r ed8972386675 templates/admin/requests/create_request_type.mako
--- a/templates/admin/requests/create_request_type.mako Tue Nov 17 13:43:34 2009 -0500
+++ b/templates/admin/requests/create_request_type.mako Tue Nov 17 14:28:34 2009 -0500
@@ -6,63 +6,59 @@
${render_msg( msg, messagetype )}
%endif
+<%def name="render_state( element_count, state_name, state_desc )">
+ <div class="repeat-group-item">
+ <div class="form-row">
+ <label>${1+element_count}. State name:</label>
+ <input type="text" name="state_name_${element_count}" value="${state_name}" size="40"/>
+ <input type="submit" name="remove_state_button" value="Remove state ${1+element_count}"/>
+ </div>
+ <div class="form-row">
+ <label>Description:</label>
+ <input type="text" name="state_desc_${element_count}" value="${state_desc}" size="40"/>
+ <div class="toolParamHelp" style="clear: both;">
+ optional
+ </div>
+
+ </div>
+ <div style="clear: both"></div>
+ </div>
+</%def>
+
<div class="toolForm">
<div class="toolFormTitle">Create a new request type</div>
- %if not request_forms or not sample_forms:
+ %if not rt_info_widgets:
Create a request & sample form definition first to create a new request type.
%else:
- <div class="toolFormBody">
- <form name="create_request_type" action="${h.url_for( controller='requests_admin', action='request_type')}" method="post" >
+ <form name="create_request_type" action="${h.url_for( controller='requests_admin', action='create_request_type')}" method="post" >
+ %for rt_info in rt_info_widgets:
<div class="form-row">
- <label>Name:</label>
+ <label>${rt_info['label']}</label>
<div style="float: left; width: 250px; margin-right: 10px;">
- <input type="text" name="name" value="New Request Type" size="40"/>
+ ${rt_info['widget'].get_html()}
</div>
<div style="clear: both"></div>
</div>
- <div class="form-row">
- <label>Description:</label>
- <div style="float: left; width: 250px; margin-right: 10px;">
- <input type="text" name="description" value="" size="40"/>
- </div>
- <div style="clear: both"></div>
+ %endfor
+ <div class="toolFormTitle">Possible sample states</div>
+ %if len(rt_states_widgets):
+ %for index, info in enumerate(rt_states_widgets):
+ ${render_state( index, info[0], info[1] )}
+ %endfor
+ %endif
+ <div class="form-row">
+ <input type="submit" name="add_state_button" value="Add state"/>
+ </div>
+ <div class="form-row">
+ <div style="float: left; width: 250px; margin-right: 10px;">
+ <input type="hidden" name="new" value="submitted" size="40"/>
</div>
- <div class="form-row">
- <label>
- Request Form definition:
- </label>
- <select name="request_form_id">
- %for form in request_forms:
- <option value="${form.id}">${form.name}</option>
- %endfor
- </select>
- </div>
- <div class="form-row">
- <label>
- Sample Form definition:
- </label>
- <select name="sample_form_id">
- %for form in sample_forms:
- <option value="${form.id}">${form.name}</option>
- %endfor
- </select>
- </div>
- <div class="form-row">
- <label>Number of sample states:</label>
- <div style="float: left; width: 250px; margin-right: 10px;">
- <input type="text" size="3" name="num_states" value="1"/>
- </div>
- </div>
- <div class="form-row">
- <div style="float: left; width: 250px; margin-right: 10px;">
- <input type="hidden" name="new" value="submitted" size="40"/>
- </div>
- <div style="clear: both"></div>
- </div>
- <div class="form-row">
- <input type="submit" name="define_states_button" value="Define states"/>
- </div>
- </form>
- </div>
+ <div style="clear: both"></div>
+ </div>
+ <div class="form-row">
+ <input type="submit" name="save_request_type" value="Save"/>
+ </div>
+ </form>
+
%endif
</div>
\ No newline at end of file
diff -r 56bb85457bc1 -r ed8972386675 templates/admin/requests/grid.mako
--- a/templates/admin/requests/grid.mako Tue Nov 17 13:43:34 2009 -0500
+++ b/templates/admin/requests/grid.mako Tue Nov 17 14:28:34 2009 -0500
@@ -1,217 +1,1 @@
-<%inherit file="/base.mako"/>
-<%namespace file="/message.mako" import="render_msg" />
-
-<%def name="title()">Browse Requests</%def>
-
-%if message:
- <p>
- <div class="${message_type}message transient-message">${message}</div>
- <div style="clear: both"></div>
- </p>
-%endif
-
-<%def name="javascripts()">
- ${parent.javascripts()}
- <script type="text/javascript">
- ## TODO: generalize and move into galaxy.base.js
- $(document).ready(function() {
- $(".grid").each( function() {
- var grid = this;
- var checkboxes = $(this).find("input.grid-row-select-checkbox");
- var update = $(this).find( "span.grid-selected-count" );
- $(checkboxes).each( function() {
- $(this).change( function() {
- var n = $(checkboxes).filter("[checked]").size();
- update.text( n );
- });
- })
- });
- });
- ## Can this be moved into base.mako?
- %if refresh_frames:
- %if 'masthead' in refresh_frames:
- ## Refresh masthead == user changes (backward compatibility)
- if ( parent.user_changed ) {
- %if trans.user:
- parent.user_changed( "${trans.user.email}", ${int( app.config.is_admin_user( trans.user ) )} );
- %else:
- parent.user_changed( null, false );
- %endif
- }
- %endif
- %if 'history' in refresh_frames:
- if ( parent.frames && parent.frames.galaxy_history ) {
- parent.frames.galaxy_history.location.href="${h.url_for( controller='root', action='history')}";
- if ( parent.force_right_panel ) {
- parent.force_right_panel( 'show' );
- }
- }
- %endif
- %if 'tools' in refresh_frames:
- if ( parent.frames && parent.frames.galaxy_tools ) {
- parent.frames.galaxy_tools.location.href="${h.url_for( controller='root', action='tool_menu')}";
- if ( parent.force_left_panel ) {
- parent.force_left_panel( 'show' );
- }
- }
- %endif
- %endif
- </script>
-</%def>
-
-<%def name="stylesheets()">
- <link href="${h.url_for('/static/style/base.css')}" rel="stylesheet" type="text/css" />
- <style>
- ## Not generic to all grids -- move to base?
- .count-box {
- min-width: 1.1em;
- padding: 5px;
- border-width: 1px;
- border-style: solid;
- text-align: center;
- display: inline-block;
- }
- </style>
-</%def>
-
-<div class="grid-header">
- <h2>${grid.title}</h2>
- %if trans.sa_session.query( trans.app.model.Request ).count():
- ##<span class="title">Filter:</span>
- %for i, filter in enumerate( grid.standard_filters ):
- %if i > 0:
- <span>|</span>
- %endif
- %if grid.show_filter == filter.label:
- <span class="filter"><a href="${h.url_for( controller='requests_admin', action='list', show_filter=filter.label )}"><b>${filter.label}</b></a></span>
- %else:
- <span class="filter"><a href="${h.url_for( controller='requests_admin', action='list', show_filter=filter.label )}">${filter.label}</a></span>
- %endif
- %endfor
- %endif
-</div>
-
-<ul class="manage-table-actions">
- <li>
- <a class="action-button" href="${h.url_for( controller='requests_admin', action='new', select_request_type=True )}">
- <img src="${h.url_for('/static/images/silk/add.png')}" />
- <span>Create a new request</span></a>
- </li>
-</ul>
-
-%if not len(query.all()):
- There are no requests.
-%else:
-<form name="history_actions" action="${url()}" method="post" >
- <table class="grid">
- <thead>
- <tr>
- ##<th></th>
- %for column in grid.columns:
- %if column.visible:
- <%
- href = ""
- extra = ""
- if column.sortable:
- if sort_key == column.key:
- if sort_order == "asc":
- href = url( sort=( "-" + column.key ) )
- extra = "↓"
- else:
- href = url( sort=( column.key ) )
- extra = "↑"
- else:
- href = url( sort=column.key )
- %>
- <th\
- %if column.ncells > 1:
- colspan="${column.ncells}"
- %endif
- >
- %if href:
- <a href="${href}">${column.label}</a>
- %else:
- ${column.label}
- %endif
- <span>${extra}</span>
- </th>
- %endif
- %endfor
- <th></th>
- </tr>
- </thead>
- <tbody>
- %for i, item in enumerate( query ):
- <tr \
- %if current_item == item:
- class="current" \
- %endif
- >
- ## Item selection column
- ##<td style="width: 1.5em;">
- ## <input type="checkbox" name="id" value=${trans.security.encode_id( item.id )} class="grid-row-select-checkbox" />
- ##</td>
- ## Data columns
- %for column in grid.columns:
- %if column.visible:
- <%
- # Link
- if column.link and column.link( item ):
- href = url( **column.link( item ) )
- else:
- href = None
- # Value (coerced to list so we can loop)
- value = column.get_value( trans, grid, item )
- if column.ncells == 1:
- value = [ value ]
- %>
- %for cellnum, v in enumerate( value ):
- <%
- # Attach popup menu?
- if column.attach_popup and cellnum == 0:
- extra = '<a id="grid-%d-popup" class="popup-arrow" style="display: none;">▼</a>' % i
- else:
- extra = ""
- %>
- %if href:
- <td><a href="${href}">${v}</a> ${extra}</td>
- %else:
- <td >${v}${extra}</td>
- %endif
- </td>
- %endfor
- %endif
- %endfor
- ## Actions column
- <td>
- <div popupmenu="grid-${i}-popup">
- %for operation in grid.operations:
- %if operation.allowed( item ):
- %if operation.label == 'Submit':
- <a class="action-button" confirm="More samples cannot be added to this request once it is submitted. Click OK to submit." href="${url( operation=operation.label, id=item.id )}">${operation.label}</a>
- %else:
- <a class="action-button" href="${url( operation=operation.label, id=item.id )}">${operation.label}</a>
- %endif
- %endif
- %endfor
- </div>
- </td>
- </tr>
- %endfor
- </tbody>
-## <tfoot>
-## <tr>
-## <td></td>
-## <td colspan="100">
-## For <span class="grid-selected-count"></span> selected requests:
-## %for operation in grid.operations:
-## %if operation.allow_multiple:
-## <input type="submit" name="operation" value="${operation.label}" class="action-button">
-## %endif
-## %endfor
-## </td>
-## </tr>
-## </tfoot>
- </table>
-</form>
-%endif
\ No newline at end of file
+<%inherit file="/grid_base.mako"/>
\ No newline at end of file
diff -r 56bb85457bc1 -r ed8972386675 templates/admin/requests/manage_request_types.mako
--- a/templates/admin/requests/manage_request_types.mako Tue Nov 17 13:43:34 2009 -0500
+++ b/templates/admin/requests/manage_request_types.mako Tue Nov 17 14:28:34 2009 -0500
@@ -1,68 +1,1 @@
-<%inherit file="/base.mako"/>
-<%namespace file="/message.mako" import="render_msg" />
-
-<%def name="title()">request Types</%def>
-
-%if msg:
- ${render_msg( msg, messagetype )}
-%endif
-
-<h2>
- Request Types
-</h2>
-
-<ul class="manage-table-actions">
- <li>
- <a class="action-button" href="${h.url_for( controller='requests_admin', action='request_type', create=True )}"><span>Create a new request type</span></a>
- </li>
-</ul>
-
-<div class="grid-header">
- ##<span class="title">Filter:</span>
- %for i, filter in enumerate( ['Active', 'Deleted', 'All'] ):
- %if i > 0:
- <span>|</span>
- %endif
- %if show_filter == filter:
- <span class="filter"><a href="${h.url_for( controller='requests_admin', action='manage_request_types', show_filter=filter )}"><b>${filter}</b></a></span>
- %else:
- <span class="filter"><a href="${h.url_for( controller='requests_admin', action='manage_request_types', show_filter=filter )}">${filter}</a></span>
- %endif
- %endfor
-</div>
-%if not request_types:
- There are no request types.
-%else:
- <table class="grid">
- <thead>
- <tr>
- <th>Name</th>
- <th>Description</th>
- <th>Request Form</th>
- <th>Sample Form</th>
- </tr>
- </thead>
- <tbody>
- %for request_type in request_types:
- <tr>
- <td>
- <a href="${h.url_for( controller='requests_admin', action='request_type', view='True', id=request_type.id)}">${request_type.name}</a>
- <a id="request_type-${request_type.id}-popup" class="popup-arrow" style="display: none;">▼</a>
- %if request_type.deleted:
- <div popupmenu="request_type-${request_type.id}-popup">
- <a class="action-button" href="${h.url_for( action='undelete_request_type', request_type_id=request_type.id )}">Undelete</a>
- </div>
- %else:
- <div popupmenu="request_type-${request_type.id}-popup">
- <a class="action-button" confirm="Click OK to delete the request type ${request_type.name}." href="${h.url_for( action='delete_request_type', request_type_id=request_type.id )}">Delete</a>
- </div>
- %endif
- </td>
- <td><i>${request_type.desc}</i></td>
- <td><a href="${h.url_for( controller='forms', action='edit', form_id=request_type.request_form.id, read_only=True)}">${request_type.request_form.name}</a></td>
- <td><a href="${h.url_for( controller='forms', action='edit', form_id=request_type.sample_form.id, read_only=True)}">${request_type.sample_form.name}</a></td>
- </tr>
- %endfor
- </tbody>
- </table>
-%endif
\ No newline at end of file
+<%inherit file="/grid_base.mako"/>
\ No newline at end of file
diff -r 56bb85457bc1 -r ed8972386675 templates/admin/requests/show_request.mako
--- a/templates/admin/requests/show_request.mako Tue Nov 17 13:43:34 2009 -0500
+++ b/templates/admin/requests/show_request.mako Tue Nov 17 14:28:34 2009 -0500
@@ -127,7 +127,7 @@
<div class="form-row">
<ul class="manage-table-actions">
<li>
- <a class="action-button" href="${h.url_for( controller='requests_admin', action='edit', show=True, request_id=request.id)}">
+ <a class="action-button" href="${h.url_for( controller='requests_admin', action='list', operation='Edit', id=trans.security.encode_id(request.id))}">
<span>Edit request details</span></a>
</li>
</ul>
diff -r 56bb85457bc1 -r ed8972386675 templates/admin/requests/view_request_type.mako
--- a/templates/admin/requests/view_request_type.mako Tue Nov 17 13:43:34 2009 -0500
+++ b/templates/admin/requests/view_request_type.mako Tue Nov 17 14:28:34 2009 -0500
@@ -7,43 +7,37 @@
%endif
<div class="toolForm">
- <div class="toolFormTitle">View request type details</div>
- <div class="toolFormBody">
- <form name="library">
- <div class="form-row">
- <label>Name</label>
- ${request_type.name}
+ <div class="toolFormTitle">Request type information</div>
+ <form name="library">
+ <div class="form-row">
+ <label>Name</label>
+ ${request_type.name}
+ <div style="clear: both"></div>
+ </div>
+ <div class="form-row">
+ <label>Description</label>
+ ${request_type.desc}
+ <div style="clear: both"></div>
+ </div>
+ <div class="form-row">
+ <label>
+ Request Form definition
+ </label>
+ ${request_type.request_form.name}
+ </div>
+ <div class="form-row">
+ <label>
+ Sample Form definition
+ </label>
+ ${request_type.sample_form.name}
+ </div>
+ <div class="toolFormTitle">Possible sample states</div>
+ %for element_count, state in enumerate(states_list):
+ <div class="form-row">
+ <label>${1+element_count}. ${state.name}</label>
+ ${state.desc}
+ </div>
<div style="clear: both"></div>
- </div>
- <div class="form-row">
- <label>Description</label>
- ${request_type.desc}
- <div style="clear: both"></div>
- </div>
- <div class="form-row">
- <label>
- Request Form definition
- </label>
- ${request_type.request_form.name}
- </div>
- <div class="form-row">
- <label>
- Sample Form definition
- </label>
- ${request_type.sample_form.name}
- </div>
- <div class="form-row">
- <label>
- Possible states
- </label>
- %for element_count, state in enumerate(states_list):
- <div class="form-row">
- <label>${1+element_count}. ${state.name}</label>
- ${state.desc}
- </div>
- <div style="clear: both"></div>
- %endfor
- </div>
- </form>
- </div>
+ %endfor
+ </form>
</div>
\ No newline at end of file
diff -r 56bb85457bc1 -r ed8972386675 templates/requests/grid.mako
--- a/templates/requests/grid.mako Tue Nov 17 13:43:34 2009 -0500
+++ b/templates/requests/grid.mako Tue Nov 17 14:28:34 2009 -0500
@@ -1,217 +1,1 @@
-<%inherit file="/base.mako"/>
-<%namespace file="/message.mako" import="render_msg" />
-
-<%def name="title()">Browse Samples</%def>
-
-%if message:
- <p>
- <div class="${message_type}message transient-message">${message}</div>
- <div style="clear: both"></div>
- </p>
-%endif
-
-<%def name="javascripts()">
- ${parent.javascripts()}
- <script type="text/javascript">
- ## TODO: generalize and move into galaxy.base.js
- $(document).ready(function() {
- $(".grid").each( function() {
- var grid = this;
- var checkboxes = $(this).find("input.grid-row-select-checkbox");
- var update = $(this).find( "span.grid-selected-count" );
- $(checkboxes).each( function() {
- $(this).change( function() {
- var n = $(checkboxes).filter("[checked]").size();
- update.text( n );
- });
- })
- });
- });
- ## Can this be moved into base.mako?
- %if refresh_frames:
- %if 'masthead' in refresh_frames:
- ## Refresh masthead == user changes (backward compatibility)
- if ( parent.user_changed ) {
- %if trans.user:
- parent.user_changed( "${trans.user.email}", ${int( app.config.is_admin_user( trans.user ) )} );
- %else:
- parent.user_changed( null, false );
- %endif
- }
- %endif
- %if 'history' in refresh_frames:
- if ( parent.frames && parent.frames.galaxy_history ) {
- parent.frames.galaxy_history.location.href="${h.url_for( controller='root', action='history')}";
- if ( parent.force_right_panel ) {
- parent.force_right_panel( 'show' );
- }
- }
- %endif
- %if 'tools' in refresh_frames:
- if ( parent.frames && parent.frames.galaxy_tools ) {
- parent.frames.galaxy_tools.location.href="${h.url_for( controller='root', action='tool_menu')}";
- if ( parent.force_left_panel ) {
- parent.force_left_panel( 'show' );
- }
- }
- %endif
- %endif
- </script>
-</%def>
-
-<%def name="stylesheets()">
- <link href="${h.url_for('/static/style/base.css')}" rel="stylesheet" type="text/css" />
- <style>
- ## Not generic to all grids -- move to base?
- .count-box {
- min-width: 1.1em;
- padding: 5px;
- border-width: 1px;
- border-style: solid;
- text-align: center;
- display: inline-block;
- }
- </style>
-</%def>
-
-<div class="grid-header">
- <h2>${grid.title}</h2>
- %if len(trans.user.requests):
- ##<span class="title">Filter:</span>
- %for i, filter in enumerate( grid.standard_filters ):
- %if i > 0:
- <span>|</span>
- %endif
- %if grid.show_filter == filter.label:
- <span class="filter"><a href="${h.url_for( controller='requests', action='list', show_filter=filter.label )}"><b>${filter.label}</b></a></span>
- %else:
- <span class="filter"><a href="${h.url_for( controller='requests', action='list', show_filter=filter.label )}">${filter.label}</a></span>
- %endif
- %endfor
- %endif
-</div>
-
-<ul class="manage-table-actions">
- <li>
- <a class="action-button" href="${h.url_for( controller='requests', action='new', select_request_type=True )}">
- <img src="${h.url_for('/static/images/silk/add.png')}" />
- <span>Create a new request</span></a>
- </li>
-</ul>
-
-%if not len(query.all()):
- There are no request(s).
-%else:
-<form name="history_actions" action="${url()}" method="post" >
- <table class="grid">
- <thead>
- <tr>
- ##<th></th>
- %for column in grid.columns:
- %if column.visible:
- <%
- href = ""
- extra = ""
- if column.sortable:
- if sort_key == column.key:
- if sort_order == "asc":
- href = url( sort=( "-" + column.key ) )
- extra = "↓"
- else:
- href = url( sort=( column.key ) )
- extra = "↑"
- else:
- href = url( sort=column.key )
- %>
- <th\
- %if column.ncells > 1:
- colspan="${column.ncells}"
- %endif
- >
- %if href:
- <a href="${href}">${column.label}</a>
- %else:
- ${column.label}
- %endif
- <span>${extra}</span>
- </th>
- %endif
- %endfor
- <th></th>
- </tr>
- </thead>
- <tbody>
- %for i, item in enumerate( query ):
- <tr \
- %if current_item == item:
- class="current" \
- %endif
- >
- ## Item selection column
- ##<td style="width: 1.5em;">
- ## <input type="checkbox" name="id" value=${trans.security.encode_id( item.id )} class="grid-row-select-checkbox" />
- ##</td>
- ## Data columns
- %for column in grid.columns:
- %if column.visible:
- <%
- # Link
- if column.link and column.link( item ):
- href = url( **column.link( item ) )
- else:
- href = None
- # Value (coerced to list so we can loop)
- value = column.get_value( trans, grid, item )
- if column.ncells == 1:
- value = [ value ]
- %>
- %for cellnum, v in enumerate( value ):
- <%
- # Attach popup menu?
- if column.attach_popup and cellnum == 0:
- extra = '<a id="grid-%d-popup" class="popup-arrow" style="display: none;">▼</a>' % i
- else:
- extra = ""
- %>
- %if href:
- <td><a href="${href}">${v}</a> ${extra}</td>
- %else:
- <td >${v}${extra}</td>
- %endif
- </td>
- %endfor
- %endif
- %endfor
- ## Actions column
- <td>
- <div popupmenu="grid-${i}-popup">
- %for operation in grid.operations:
- %if operation.allowed( item ):
- %if operation.label == 'Submit':
- <a class="action-button" confirm="More samples cannot be added to this request once it is submitted. Click OK to submit." href="${url( operation=operation.label, id=item.id)}">${operation.label}</a>
- %else:
- <a class="action-button" href="${url( operation=operation.label, id=item.id )}">${operation.label}</a>
- %endif
- %endif
- %endfor
- </div>
- </td>
- </tr>
- %endfor
- </tbody>
- <tfoot>
-## <tr>
-## <td></td>
-## <td colspan="100">
-## For <span class="grid-selected-count"></span> selected requests:
-## %for operation in grid.operations:
-## %if operation.allow_multiple:
-## <input type="submit" name="operation" value="${operation.label}" class="action-button">
-## %endif
-## %endfor
-## </td>
-## </tr>
- </tfoot>
- </table>
-</form>
-%endif
+<%inherit file="/grid_base.mako"/>
\ No newline at end of file
diff -r 56bb85457bc1 -r ed8972386675 templates/requests/show_request.mako
--- a/templates/requests/show_request.mako Tue Nov 17 13:43:34 2009 -0500
+++ b/templates/requests/show_request.mako Tue Nov 17 14:28:34 2009 -0500
@@ -119,7 +119,7 @@
<div class="form-row">
<ul class="manage-table-actions">
<li>
- <a class="action-button" href="${h.url_for( controller='requests', action='edit', show=True, request_id=request.id)}">
+ <a class="action-button" href="${h.url_for( controller='requests', action='list', operation='Edit', id=trans.security.encode_id(request.id) )}">
<span>Edit request details</span></a>
</li>
</ul>
diff -r 56bb85457bc1 -r ed8972386675 test/base/twilltestcase.py
--- a/test/base/twilltestcase.py Tue Nov 17 13:43:34 2009 -0500
+++ b/test/base/twilltestcase.py Tue Nov 17 14:28:34 2009 -0500
@@ -1169,24 +1169,24 @@
self.check_page_for_string( desc )
self.check_page_for_string( formtype )
self.home()
- def edit_form( self, form_id, form_name, new_form_name="Form One's Name (Renamed)", new_form_desc="This is Form One's description (Re-described)"):
+ def edit_form( self, form_current_id, form_name, new_form_name="Form One's Name (Renamed)", new_form_desc="This is Form One's description (Re-described)"):
"""
Edit form details; name & description
"""
self.home()
- self.visit_url( "%s/forms/edit?form_id=%i&show_form=True" % (self.url, form_id) )
+ self.visit_url( "%s/forms/manage?sort=create_time&f-name=All&f-desc=All&f-deleted=False&operation=Edit&id=%s" % ( self.url, self.security.encode_id(form_current_id) ) )
self.check_page_for_string( 'Edit form definition "%s"' % form_name )
tc.fv( "1", "name", new_form_name )
tc.fv( "1", "description", new_form_desc )
tc.submit( "save_changes_button" )
self.check_page_for_string( "The form '%s' has been updated with the changes." % new_form_name )
self.home()
- def form_add_field( self, form_id, form_name, form_desc, form_type, field_index, fields):
+ def form_add_field( self, form_current_id, form_name, form_desc, form_type, field_index, fields):
"""
Add a new fields to the form definition
"""
self.home()
- self.visit_url( "%s/forms/edit?form_id=%i&show_form=True" % (self.url, form_id) )
+ self.visit_url( "%s/forms/manage?sort=create_time&f-name=All&f-desc=All&f-deleted=False&operation=Edit&id=%s" % ( self.url, self.security.encode_id(form_current_id) ) )
self.check_page_for_string( 'Edit form definition "%s"' % form_name)
for i, field in enumerate(fields):
index = i+field_index
@@ -1198,8 +1198,8 @@
if field['type'] == 'SelectField':
options = ''
for option_index, option in enumerate(field['selectlist']):
- url_str = "%s/forms/edit?description=%s&form_id=%i&form_type_selectbox=%s&addoption_%i=Add&name=%s&field_name_%i=%s&field_helptext_%i=%s&field_type_%i=%s" % \
- (self.url, form_desc.replace(" ", "+"), form_id, form_type.replace(" ", "+"),
+ url_str = "%s/forms/manage?operation=Edit&description=%s&id=%s&form_type_selectbox=%s&addoption_%i=Add&name=%s&field_name_%i=%s&field_helptext_%i=%s&field_type_%i=%s" % \
+ (self.url, form_desc.replace(" ", "+"), self.security.encode_id(form_current_id), form_type.replace(" ", "+"),
index, form_name.replace(" ", "+"), index, field['name'].replace(" ", "+"),
index, field['desc'].replace(" ", "+"), index, field['type'])
self.visit_url( url_str + options )
@@ -1214,7 +1214,7 @@
Remove a field from the form definition
"""
self.home()
- self.visit_url( "%s/forms/edit?form_id=%i&show_form=True" % (self.url, form_id) )
+ self.visit_url( "%s/forms/manage?operation=Edit&form_id=%i&show_form=True" % (self.url, form_id) )
self.check_page_for_string( 'Edit form definition "%s"' % form_name)
tc.submit( "remove_button" )
tc.submit( "save_changes_button" )
@@ -1222,18 +1222,26 @@
self.check_page_for_string( check_str )
self.home()
# Requests stuff
+ def check_request_grid(self, state, request_name, deleted=False):
+ self.home()
+ self.visit_url('%s/requests/list?sort=create_time&f-state=%s&f-deleted=%s' \
+ % (self.url, state, str(deleted)))
+ self.check_page_for_string( request_name )
+ def check_request_admin_grid(self, state, request_name, deleted=False):
+ self.home()
+ self.visit_url('%s/requests_admin/list?sort=create_time&f-state=%s&f-deleted=%s' \
+ % (self.url, state, str(deleted)))
+ self.check_page_for_string( request_name )
def create_request_type( self, name, desc, request_form_id, sample_form_id, states ):
self.home()
- self.visit_url( "%s/requests_admin/request_type?create=True" % self.url )
+ self.visit_url( "%s/requests_admin/create_request_type" % self.url )
self.check_page_for_string( 'Create a new request type' )
tc.fv( "1", "name", name )
- tc.fv( "1", "description", desc )
+ tc.fv( "1", "desc", desc )
tc.fv( "1", "request_form_id", request_form_id )
tc.fv( "1", "sample_form_id", sample_form_id )
- tc.fv( "1", "num_states", str( len( states ) ) )
- tc.submit( "define_states_button" )
- self.check_page_for_string( "Create %i states for the '%s' request type" % ( len(states), name ))
for index, state in enumerate(states):
+ tc.submit( "add_state_button" )
tc.fv("1", "state_name_%i" % index, state[0])
tc.fv("1", "state_desc_%i" % index, state[1])
tc.submit( "save_request_type" )
@@ -1255,7 +1263,7 @@
self.check_page_for_string( desc )
def edit_request( self, request_id, name, new_name, new_desc, new_library_id, new_folder_id, new_fields):
self.home()
- self.visit_url( "%s/requests/edit?request_id=%i&show=True" % (self.url, request_id) )
+ self.visit_url( "%s/requests/list?operation=Edit&id=%s" % (self.url, self.security.encode_id(request_id) ) )
self.check_page_for_string( 'Edit request "%s"' % name )
tc.fv( "1", "name", new_name )
tc.fv( "1", "desc", new_desc )
diff -r 56bb85457bc1 -r ed8972386675 test/functional/test_forms_and_requests.py
--- a/test/functional/test_forms_and_requests.py Tue Nov 17 13:43:34 2009 -0500
+++ b/test/functional/test_forms_and_requests.py Tue Nov 17 14:28:34 2009 -0500
@@ -29,6 +29,7 @@
.filter( galaxy.model.FormDefinitionCurrent.table.c.deleted==False ) \
.order_by( galaxy.model.FormDefinitionCurrent.table.c.create_time.desc() )
for fdc in fdc_list:
+ sa_session.refresh( fdc )
sa_session.refresh( fdc.latest_form )
if form_name == fdc.latest_form.name:
return fdc.latest_form
@@ -51,7 +52,7 @@
# edit form & add few more fields
new_name = "Request Form (Renamed)"
new_desc = "This is Form One's Re-described"
- self.edit_form( form_one.id, form_one.name, new_form_name=new_name, new_form_desc=new_desc )
+ self.edit_form( form_one.current.id, form_one.name, new_form_name=new_name, new_form_desc=new_desc )
self.home()
self.visit_page( 'forms/manage' )
self.check_page_for_string( new_name )
@@ -73,13 +74,13 @@
type='TextField',
required='required')]
form_one = get_latest_form(form_one_name)
- self.form_add_field(form_one.id, form_one.name, form_one.desc, form_one.type, field_index=len(form_one.fields), fields=fields)
- form_one_latest = get_latest_form(form_one_name)
+ self.form_add_field(form_one.current.id, form_one.name, form_one.desc, form_one.type, field_index=len(form_one.fields), fields=fields)
+ form_one_latest = get_latest_form(form_one_name)
assert len(form_one_latest.fields) == len(form_one.fields)+len(fields)
def test_015_create_sample_form( self ):
"""Testing creating another form (for samples)"""
global form_two_name
- desc = "This is Form One's description"
+ desc = "This is Form Two's description"
formtype = 'Sequencing Sample Form'
self.create_form( name=form_two_name, desc=desc, formtype=formtype )
self.home()
@@ -207,16 +208,12 @@
request_one.desc+' (Re-described)', library_one.id, folder_one.id, fields)
sa_session.refresh( request_one )
# check if the request is showing in the 'unsubmitted' filter
- self.home()
- self.visit_url( '%s/requests/list?show_filter=Unsubmitted' % self.url )
- self.check_page_for_string( request_one.name )
+ self.check_request_grid(state='Unsubmitted', request_name=request_one.name)
# submit the request
self.submit_request( request_one.id, request_one.name )
sa_session.refresh( request_one )
# check if the request is showing in the 'submitted' filter
- self.home()
- self.visit_url( '%s/requests/list?show_filter=Submitted' % self.url )
- self.check_page_for_string( request_one.name )
+ self.check_request_grid(state='Submitted', request_name=request_one.name)
# check if the request's state is now set to 'submitted'
assert request_one.state is not request_one.states.SUBMITTED, "The state of the request '%s' should be set to '%s'" \
% ( request_one.name, request_one.states.SUBMITTED )
@@ -225,9 +222,7 @@
# goto admin manage requests page
self.logout()
self.login( email='test(a)bx.psu.edu' )
- self.home()
- self.visit_page( 'requests_admin/list' )
- self.check_page_for_string( request_one.name )
+ self.check_request_admin_grid(state='Submitted', request_name=request_one.name)
self.visit_url( "%s/requests_admin/list?sort=-create_time&operation=show_request&id=%s" \
% ( self.url, self.security.encode_id( request_one.id ) ))
self.check_page_for_string( 'Sequencing Request "%s"' % request_one.name )
@@ -240,9 +235,10 @@
self.change_sample_state( sample.name, sample.id, request_type.states[2].id, request_type.states[2].name )
self.home()
sa_session.refresh( request_one )
+ self.logout()
+ self.login( email='test1(a)bx.psu.edu' )
# check if the request's state is now set to 'complete'
- self.visit_url('%s/requests_admin/list?show_filter=Complete' % self.url)
- self.check_page_for_string( request_one.name )
+ self.check_request_grid(state='Complete', request_name=request_one.name)
assert request_one.state is not request_one.states.COMPLETE, "The state of the request '%s' should be set to '%s'" \
% ( request_one.name, request_one.states.COMPLETE )
def test_040_admin_create_request_on_behalf_of_regular_user( self ):
@@ -262,9 +258,7 @@
galaxy.model.Request.table.c.deleted==False ) ) \
.first()
# check if the request is showing in the 'unsubmitted' filter
- self.home()
- self.visit_url( '%s/requests_admin/list?show_filter=Unsubmitted' % self.url )
- self.check_page_for_string( request_two.name )
+ self.check_request_admin_grid(state='Unsubmitted', request_name=request_two.name)
# check if the request's state is now set to 'unsubmitted'
assert request_two.state is not request_two.states.UNSUBMITTED, "The state of the request '%s' should be set to '%s'" \
% ( request_two.name, request_two.states.UNSUBMITTED )
@@ -277,17 +271,13 @@
self.submit_request_as_admin( request_two.id, request_two.name )
sa_session.refresh( request_two )
# check if the request is showing in the 'submitted' filter
- self.home()
- self.visit_url( '%s/requests_admin/list?show_filter=Submitted' % self.url )
- self.check_page_for_string( request_two.name )
+ self.check_request_admin_grid(state='Submitted', request_name=request_two.name)
# check if the request's state is now set to 'submitted'
assert request_two.state is not request_two.states.SUBMITTED, "The state of the request '%s' should be set to '%s'" \
% ( request_two.name, request_two.states.SUBMITTED )
# check if both the requests is showing in the 'All' filter
- self.home()
- self.visit_url( '%s/requests_admin/list?show_filter=All' % self.url )
- self.check_page_for_string( request_one.name )
- self.check_page_for_string( request_two.name )
+ self.check_request_admin_grid(state='All', request_name=request_one.name)
+ self.check_request_admin_grid(state='All', request_name=request_two.name)
def test_045_reject_request( self ):
'''Testing rejecting a request'''
self.logout()
@@ -295,9 +285,7 @@
self.reject_request( request_two.id, request_two.name )
sa_session.refresh( request_two )
# check if the request is showing in the 'unsubmitted' filter
- self.home()
- self.visit_url( '%s/requests_admin/list?show_filter=Unsubmitted' % self.url )
- self.check_page_for_string( request_two.name )
+ self.check_request_admin_grid(state='Unsubmitted', request_name=request_two.name)
# check if the request's state is now set to 'submitted'
assert request_two.state is not request_two.states.UNSUBMITTED, "The state of the request '%s' should be set to '%s'" \
% ( request_two.name, request_two.states.UNSUBMITTED )
diff -r 56bb85457bc1 -r ed8972386675 test/functional/test_user_info.py
--- a/test/functional/test_user_info.py Tue Nov 17 13:43:34 2009 -0500
+++ b/test/functional/test_user_info.py Tue Nov 17 14:28:34 2009 -0500
@@ -14,6 +14,7 @@
.filter( galaxy.model.FormDefinitionCurrent.table.c.deleted==False ) \
.order_by( galaxy.model.FormDefinitionCurrent.table.c.create_time.desc() )
for fdc in fdc_list:
+ sa_session.refresh( fdc )
sa_session.refresh( fdc.latest_form )
if form_name == fdc.latest_form.name:
return fdc.latest_form
@@ -49,7 +50,7 @@
type='CheckboxField',
required='optional')]
form_one = get_latest_form(form_one_name)
- self.form_add_field(form_one.id, form_one.name, form_one.desc, form_one.type, field_index=len(form_one.fields), fields=fields)
+ self.form_add_field(form_one.current.id, form_one.name, form_one.desc, form_one.type, field_index=len(form_one.fields), fields=fields)
form_one_latest = get_latest_form(form_one_name)
assert len(form_one_latest.fields) == len(form_one.fields)+len(fields)
# create the second form
@@ -75,7 +76,7 @@
type='CheckboxField',
required='optional')]
form_two = get_latest_form(form_two_name)
- self.form_add_field(form_two.id, form_two.name, form_two.desc, form_two.type, field_index=len(form_one.fields), fields=fields)
+ self.form_add_field(form_two.current.id, form_two.name, form_two.desc, form_two.type, field_index=len(form_one.fields), fields=fields)
form_two_latest = get_latest_form(form_two_name)
assert len(form_two_latest.fields) == len(form_two.fields)+len(fields)
def test_005_user_reqistration_multiple_user_info_forms( self ):
@@ -103,7 +104,7 @@
sa_session.add( form_two_latest.current )
sa_session.flush()
self.home()
- self.visit_page('forms/manage?show_filter=Deleted')
+ self.visit_page('forms/manage?sort=create_time&f-deleted=True')
self.check_page_for_string(form_two_latest.name)
self.logout()
# user a new user with 'Student' user info form
@@ -157,7 +158,7 @@
sa_session.add( form_one_latest.current )
sa_session.flush()
self.home()
- self.visit_page('forms/manage?show_filter=Deleted')
+ self.visit_page('forms/manage?sort=create_time&f-deleted=True')
self.check_page_for_string(form_one_latest.name)
self.logout()
1
0
Hi,
I have updated Galaxy today with the latest changes.
While trying to upload a file from the system path without copying to
Galaxy I am getting the following Server error:
AttributeError: 'ScopedSession' object has no attribute 'data'
The full message is below.
This does not occur if the file is copied in to galaxy.
I have made local changes to a few of the upload files to support an
additional binary file type, but I can't see how these would affect
upload from system path.
Is any one else having a similar issue?
Any help would be appreciated
Thanks
Shaun Webb
URL: http://bifx3.bio.ed.ac.uk:8080/library_admin/upload_library_dataset
Module paste.exceptions.errormiddleware:143 in __call__
>> app_iter = self.application(environ, start_response)
Module paste.debug.prints:98 in __call__
>> environ, self.app)
Module paste.wsgilib:539 in intercept_output
>> app_iter = application(environ, replacement_start_response)
Module paste.recursive:80 in __call__
>> return self.application(environ, start_response)
Module paste.httpexceptions:632 in __call__
>> return self.application(environ, start_response)
Module galaxy.web.framework.base:125 in __call__
>> body = self.call_body_method( method, trans, kwargs )
Module galaxy.web.framework.base:144 in call_body_method
>> return method( trans, **kwargs )
Module galaxy.web.framework:87 in decorator
>> return func( self, trans, *args, **kwargs )
Module galaxy.web.controllers.library_admin:712 in upload_library_dataset
>> **kwd )
Module galaxy.web.controllers.library_common:87 in upload_dataset
>> uploaded_datasets, err_redirect, msg =
>> self.get_path_paste_uploaded_datasets( trans, params,
>> library_bunch, err_redirect, msg )
Module galaxy.web.controllers.library_common:171 in
get_path_paste_uploaded_datasets
>> uploaded_datasets.append( self.make_library_uploaded_dataset(
>> trans, params, name, path, 'path_paste', library_bunch ) )
Module galaxy.web.controllers.library_common:121 in
make_library_uploaded_dataset
>> trans.sa_session.data.flush()
AttributeError: 'ScopedSession' object has no attribute 'data'
--
The University of Edinburgh is a charitable body, registered in
Scotland, with registration number SC005336.
2
1
Kathleen,
Please install a local instance of Galaxy and develop a data source
tool that works between your Galaxy instance and GMap. You can
download Galaxy from http://bitbucket.org/galaxy/galaxy-central/wiki/
GetGalaxy. When you have your tool working, please submit it to us
for possible inclusion in the public Galaxy instance. Thanks very
much for your interest in doing this.
Greg Von Kuster
On Nov 17, 2009, at 11:27 AM, wangjun(a)mail.cbi.pku.edu.cn wrote:
> Hello Greg Von Kuster,
>
> You can access test GMap at http://202.38.125.5:8383/.
> Click the big button "search" and submit using the default params,
> then
> you can see four tracks. You can click the entry of the second
> track, for
> example the red one, then you can see the detail info in the right
> panel.
> Click the "view sequence", there is a button "submit to Galaxy",
> you can
> try it.
>
> Thanks a lot!
> Kathleen
>
>> Kathleen, sorry, I thought you had your own local Galaxy instance.
>> Can you give us more information on GMap? Do you have a wiki or
>> something we can access online to read about it?
>>
>> Thanks!
>>
>> On Nov 17, 2009, at 10:37 AM, wangjun(a)mail.cbi.pku.edu.cn wrote:
>>
>>> Hello Greg Von Kuster,
>>>
>>> I am talking about your public Galaxy instance, and we don't have
>>> local one.
>>> We find that UCSC's data can be saved in your site directly, so we
>>> hope
>>> that Galaxy can also save our GMap data directly. We use the same
>>> post
>>> method like UCSC and the data can be saved now, but the data
>>> title is
>>> wrong. So I am writing to you to hope that you can help us.
>>>
>>> Thanks you.
>>>
>>> Kathleen
>>>
>>>> Hello Kathleen,
>>>>
>>>> Are you talking about your own local Galaxy instance or our main
>>>> public Galaxy instance that is hosted here at Penn State
>>>> University?
>>>>
>>>> Greg Von Kuster
>>>>
>>>> On Nov 17, 2009, at 10:10 AM, WangJun wrote:
>>>>
>>>>> Hello Greg Von Kuster,
>>>>>
>>>>> Thanks for your reply, but I think you misunderstood my meaning.
>>>>> I am now working on a genome browser project GMap, and I hope that
>>>>> I can post request from GMap to Galaxy, then Galaxy can retrieve
>>>>> and save the data in the History space like the UCSC request.
>>>>> Untill now, I can post a request, including a url and params, and
>>>>> Galaxy can retrieve the data and save it. However, the title of
>>>>> the
>>>>> data is still "UCSC Main". I think that's because of the tool_id
>>>>> param's value is still "ucsc_table_direct1". I mean whether you
>>>>> can
>>>>> support us by adding a new tool_id named "CBI GMap". Then our post
>>>>> data can be shown with title "CBI GMap", not "UCSC Main".
>>>>>
>>>>> Thanks a lot!
>>>>> Kathleen
>>>>>
>>>>>
>>>>> 发件人: Greg Von Kuster
>>>>> 发送时间: 2009-11-17 21:49:22
>>>>> 收件人: WangJun
>>>>> 抄送:
>>>>> 主题: Re: [galaxy-dev] Questions about Galaxy!
>>>>> Kathleen,
>>>>>
>>>>> I'm not sure I understand the question, but if you are simply
>>>>> creating a new tool that is very similar to the
>>>>> "ucsc_table_direct1" tool , and you want the ID of your new
>>>>> tool to
>>>>> be "CBIGMap" ( I would advise against space characters in the tool
>>>>> ID ), then your tools config tag can be something like this:
>>>>>
>>>>>> <tool id="CBIGMap" name="CBIG Map" version="1.0.0" hidden="false"
>>>>>> tool_type="data_source" URL_method="post">
>>>>>
>>>>> If you have questions about how to add a new tool to your Galaxy
>>>>> instance, see our wiki at http://bitbucket.org/galaxy/galaxy-
>>>>> central/wiki/AddToolTutorial
>>>>>
>>>>>
>>>>> On Nov 17, 2009, at 8:38 AM, WangJun wrote:
>>>>>
>>>>>> Hello Greg Von Kuster,
>>>>>>
>>>>>> Now I have solved the second problem.:)
>>>>>> And for the first one, could you help me to add a new tool_id
>>>>>> named "CBI GMap" to support our data source?
>>>>>> This is a project in Center for Bioinformatics in Peking
>>>>>> University in China. And I am a PhD student working on it. If you
>>>>>> have other questions, please email me.:)
>>>>>> <tool id="ucsc_table_direct1" name="UCSC Main" version="1.0.0"
>>>>>> hidden="false" tool_type="data_source" URL_method="post">
>>>>>> Thanks a lot!
>>>>>>
>>>>>> Best,
>>>>>> Kathleen
>>>>>> 20091117
>>>>>>
>>>>>> =================================================================
>>>>>> ==
>>>>>> =
>>>>>> Hello Greg Von Kuster,
>>>>>>
>>>>>> Thanks a lot for your reply.
>>>>>> But I still have a question:
>>>>>>
>>>>>> I have a url, and I include three necessary params in the
>>>>>> following form. After I post it to Galaxy, I can see that Galaxy
>>>>>> fetch the data. However, there are two point that I want to ask:
>>>>>> 1. the "tool_id" param. My data's title is still "UCSC Main", I
>>>>>> think that's because I use the "ucsc_table_direct1" value for
>>>>>> "tool_id", right? Then how do I change this title? Can I
>>>>>> adjust it
>>>>>> by other param to change the title?
>>>>>> 2. If I submit data from UCSC, then I can see a white box
>>>>>> containing the data in the History part. However, I can only see
>>>>>> the data info without data if I submit from my own site. (You can
>>>>>> refer to attachment for detail. The No.20 data is from UCSC,
>>>>>> and I
>>>>>> can see the sequence. While the No.22 data is from my site, and I
>>>>>> can not see the sequence.) And I don't know why.
>>>>>>
>>>>>> <form method="POST" action="http://main.g2.bx.psu.edu/
>>>>>> tool_runner">
>>>>>> <input type="HIDDEN" value="ucsc_table_direct1"
>>>>>> name="tool_id"/>
>>>>>> <input type="HIDDEN" value="http://202.38.125.5:8383/
>>>>>> entry/
>>>>>> rice_nucleotide_frame_galaxy.jsp" name="URL"/>
>>>>>> <input type="HIDDEN" value="<%=id%>" name="id"/>
>>>>>> <input type="HIDDEN" value="<%=trackName%>"
>>>>>> name="trackName"/>
>>>>>> <input type="HIDDEN" value="<%=type%>" name="type"/>
>>>>>> <input type="HIDDEN" value="rice" name="db"/>
>>>>>> <input type="HIDDEN" value="Rice" name="org"/>
>>>>>> <input type="SUBMIT" value="Send query to Galaxy"
>>>>>> name="submitGalaxy"/>
>>>>>> </form>
>>>>>>
>>>>>> (test data: http://202.38.125.5:8383/entry/
>>>>>> rice_nucleotide_frame_galaxy.jsp?
>>>>>> id=LOC_Os02g01370&trackName=MSU_Osa1_Rice_Loci&type=seq )
>>>>>>
>>>>>> Thank a lot!
>>>>>> Best,
>>>>>> Kathleen
>>>>>> 20091117
>>>>>>
>>>>>>
>>>>>> 发件人: Greg Von Kuster
>>>>>> 发送时间: 2009-11-17 04:50:55
>>>>>> 收件人: WangJun
>>>>>> 抄送: galaxy-user(a)bx.psu.edu; galaxy-dev(a)bx.psu.edu
>>>>>> 主题: Re: [galaxy-dev] Questions about Galaxy!
>>>>>> Hello Kathleen,
>>>>>>
>>>>>> Please see our wiki at http://bitbucket.org/galaxy/galaxy-
>>>>>> central/
>>>>>> wiki/DataSources for details about how Galaxy communicates with
>>>>>> external data sources. Your "dataset platform" will need to
>>>>>> build
>>>>>> an url that includes all of the parameters that are needed to
>>>>>> retrieve the data, and send that url to Galaxy in the URL
>>>>>> parameter so that Galaxy can execute the post.
>>>>>>
>>>>>>
>>>>>> On Nov 16, 2009, at 9:06 AM, WangJun wrote:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> This is a question about Galaxy interaction with UCSC data.
>>>>>>>
>>>>>>> I hava a dataset platform, and I want to add a button like the
>>>>>>> UCSC's "Send query to Galaxy".
>>>>>>>
>>>>>>> I find that it's actually a form:
>>>>>>> <form method="POST" action="http://main.g2.bx.psu.edu/
>>>>>>> tool_runner">
>>>>>>> <input type="HIDDEN" value="ucsc_table_direct1" name="tool_id"/>
>>>>>>> <input type="HIDDEN" value="http://genome.ucsc.edu/cgi-bin/
>>>>>>> hgTables" name="URL"/>
>>>>>>> <input type="HIDDEN" value="296389734" name="hguid"/>
>>>>>>> <input type="HIDDEN" value="hg18" name="db"/>
>>>>>>> <input type="HIDDEN" value="Human" name="org"/>
>>>>>>> <input type="HIDDEN" value="multiz28way" name="hgta_table"/>
>>>>>>> <input type="HIDDEN" value="multiz28way" name="hgta_track"/>
>>>>>>> <input type="HIDDEN" value="range" name="hgta_regionType"/>
>>>>>>> <input type="HIDDEN" value="primaryTable"
>>>>>>> name="hgta_outputType"/>
>>>>>>> <input type="HIDDEN" value="chr3:130734948-130736581"
>>>>>>> name="position"/>
>>>>>>> <input type="HIDDEN" value="get output"
>>>>>>> name="hgta_doTopSubmit"/>
>>>>>>> <input type="HIDDEN" value="146683120" name="hgsid"/>
>>>>>>> <input type="SUBMIT" value="Send query to Galaxy"
>>>>>>> name="hgta_doGalaxyQuery"/>
>>>>>>> </form>
>>>>>>>
>>>>>>> I have a url and three params, and I tried. But I can't see my
>>>>>>> data in the right-side green box.
>>>>>>> And what's the tool_id param used for?
>>>>>>>
>>>>>>> Thanks in advance!
>>>>>>>
>>>>>>> Best,
>>>>>>> Kathleen
>>>>>>> 2009-11-16
>>>>>>> _______________________________________________
>>>>>>> galaxy-dev mailing list
>>>>>>> galaxy-dev(a)lists.bx.psu.edu
>>>>>>> http://lists.bx.psu.edu/listinfo/galaxy-dev
>>>>>>
>>>>>> Greg Von Kuster
>>>>>> Galaxy Development Team
>>>>>> greg(a)bx.psu.edu
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>> Greg Von Kuster
>>>>> Galaxy Development Team
>>>>> greg(a)bx.psu.edu
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>> Greg Von Kuster
>>>> Galaxy Development Team
>>>> greg(a)bx.psu.edu
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>
>> Greg Von Kuster
>> Galaxy Development Team
>> greg(a)bx.psu.edu
>>
>>
>>
>>
>
>
Greg Von Kuster
Galaxy Development Team
greg(a)bx.psu.edu
1
0
Hi,
some tools in Graph/Display Data give us error messages. Since our
version of R is "not so fresh" (2.7.2) I suspect this is the reason.
Can anybody confirm that a newer version of R is required?
Problems:
Histogramm:
Error in hist.default(list(1, 2, 3, 4, 5), xlab = "V1", breaks =
"Sturges", :
'x' must be numeric
Scatterplot:
Warning messages:
1: In min(x) : no non-missing arguments to min; returning Inf
2: In max(x) : no non-missing arguments to max; returning -Inf
3: In min(x) : no non-missing arguments to min; returning Inf
4: In max(x) : no non-missing arguments to max; returning -Inf
Error in plot.window(...) : need finite 'xlim' values
Bar chart requires python module Numeric which is quite dated and
superseded by numpy. Are there any plans to fix that? I don't want to
install an unsupported python module.
regards, Andreas
2
1
Hi,
Since updating Galaxy I am having issues running some of the tools I
have created.
The problem is with if statements in the code (I believe it is
Cheetah) within the <command> tab.
This is an example:
#if $input_type.in_source == "user": #rand2_seq.pl --in $in --cutsites
$cutsites --out $out --length $length
#else: #rand2_seq.pl --in $in --out $out --length $length
#end if
I am receiving the following error:
File
"/opt/galaxy_dist/eggs/py2.5-linux-x86_64-ucs4/Cheetah-2.2.2-py2.5-linux-x86_64.egg/Cheetah/Parser.py", line 2645, in
popFromOpenDirectivesStack
raise ParseError(self, msg="#end found, but nothing to end")
ParseError:
#end found, but nothing to end
Line 4, column 1
Line|Cheetah Code
----|-------------------------------------------------------------
2 | #else: #rand2_seq.pl --in $in --out $out --length $length
3 | #end if
4 |
^
I am guessing there has been some sort of update to the way these
scripts are compiled as they worked fine before.
Thanks for your help
Shaun Webb
--
The University of Edinburgh is a charitable body, registered in
Scotland, with registration number SC005336.
2
1

17 Nov '09
details: http://www.bx.psu.edu/hg/galaxy/rev/2eb1e3c4d143
changeset: 3041:2eb1e3c4d143
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Mon Nov 16 15:06:07 2009 -0500
description:
Unicode fix: allow non-ascii characters to be displayed in tool help.
diffstat:
templates/tool_form.mako | 16 +++++++++++-----
1 files changed, 11 insertions(+), 5 deletions(-)
diffs (26 lines):
diff -r 84f96ae27ef4 -r 2eb1e3c4d143 templates/tool_form.mako
--- a/templates/tool_form.mako Mon Nov 16 14:52:51 2009 -0500
+++ b/templates/tool_form.mako Mon Nov 16 15:06:07 2009 -0500
@@ -221,11 +221,17 @@
%if tool.help:
<div class="toolHelp">
<div class="toolHelpBody">
- %if tool.has_multiple_pages:
- ${tool.help_by_page[tool_state.page]}
- %else:
- ${tool.help}
- %endif
+ <%
+ if tool.has_multiple_pages:
+ tool_help = tool.help_by_page[tool_state.page]
+ else:
+ tool_help = tool.help
+
+ # Convert to unicode to display non-ascii characters.
+ if type( tool_help ) is not unicode:
+ tool_help = unicode( tool_help, 'utf-8')
+ %>
+ ${tool_help}
</div>
</div>
%endif
1
0

17 Nov '09
details: http://www.bx.psu.edu/hg/galaxy/rev/df9814119044
changeset: 3042:df9814119044
user: Greg Von Kuster <greg(a)bx.psu.edu>
date: Mon Nov 16 16:27:48 2009 -0500
description:
Enhance history item error reports that are emailed
- report form now defaults to include the users email address if they are logged in
- email now includes the id of both the dataset and the history, the hid and hda.display_name(), and a link to the history
- admin users now have "view" access to any history and dataset ( this uses the new ~/history/view?id=... feature )
diffstat:
lib/galaxy/web/controllers/dataset.py | 61 +++++++++++++++++++-----------
lib/galaxy/web/controllers/history.py | 12 ++----
lib/galaxy/web/controllers/user.py | 2 -
lib/galaxy/web/framework/__init__.py | 10 +----
templates/dataset/errors.mako | 17 +++++---
templates/mobile/history/detail.mako | 2 +-
templates/root/history_common.mako | 4 +-
test/base/twilltestcase.py | 6 +++
test/functional/test_history_functions.py | 6 +++
9 files changed, 70 insertions(+), 50 deletions(-)
diffs (319 lines):
diff -r 2eb1e3c4d143 -r df9814119044 lib/galaxy/web/controllers/dataset.py
--- a/lib/galaxy/web/controllers/dataset.py Mon Nov 16 15:06:07 2009 -0500
+++ b/lib/galaxy/web/controllers/dataset.py Mon Nov 16 16:27:48 2009 -0500
@@ -20,25 +20,38 @@
This error report was sent from the Galaxy instance hosted on the server
"${host}"
-----------------------------------------------------------------------------
-This is in reference to output dataset ${dataset_id}.
+This is in reference to dataset id ${dataset_id} from history id ${history_id}
+-----------------------------------------------------------------------------
+You should be able to view the history containing the related history item
+
+${hid}: ${history_item_name}
+
+by logging in as a Galaxy admin user to the Galaxy instance referenced above
+and pointing your browser to the following link.
+
+${history_view_link}
-----------------------------------------------------------------------------
The user '${email}' provided the following information:
+
${message}
-----------------------------------------------------------------------------
job id: ${job_id}
-tool id: ${tool_id}
+tool id: ${job_tool_id}
+-----------------------------------------------------------------------------
+job command line:
+${job_command_line}
-----------------------------------------------------------------------------
job stderr:
-${stderr}
+${job_stderr}
-----------------------------------------------------------------------------
job stdout:
-${stdout}
+${job_stdout}
-----------------------------------------------------------------------------
job info:
-${info}
+${job_info}
-----------------------------------------------------------------------------
job traceback:
-${traceback}
+${job_traceback}
-----------------------------------------------------------------------------
(This is an automated message).
"""
@@ -103,41 +116,45 @@
@web.expose
def errors( self, trans, id ):
- dataset = trans.sa_session.query( model.HistoryDatasetAssociation ).get( id )
- return trans.fill_template( "dataset/errors.mako", dataset=dataset )
-
+ hda = trans.sa_session.query( model.HistoryDatasetAssociation ).get( id )
+ return trans.fill_template( "dataset/errors.mako", hda=hda )
@web.expose
def stderr( self, trans, id ):
dataset = trans.sa_session.query( model.HistoryDatasetAssociation ).get( id )
job = dataset.creating_job_associations[0].job
trans.response.set_content_type( 'text/plain' )
return job.stderr
-
@web.expose
def report_error( self, trans, id, email='', message="" ):
smtp_server = trans.app.config.smtp_server
if smtp_server is None:
- return trans.show_error_message( "Sorry, mail is not configured for this galaxy instance" )
+ return trans.show_error_message( "Mail is not configured for this galaxy instance" )
to_address = trans.app.config.error_email_to
if to_address is None:
- return trans.show_error_message( "Sorry, error reporting has been disabled for this galaxy instance" )
+ return trans.show_error_message( "Error reporting has been disabled for this galaxy instance" )
# Get the dataset and associated job
- dataset = trans.sa_session.query( model.HistoryDatasetAssociation ).get( id )
- job = dataset.creating_job_associations[0].job
+ hda = trans.sa_session.query( model.HistoryDatasetAssociation ).get( id )
+ job = hda.creating_job_associations[0].job
# Get the name of the server hosting the Galaxy instance from which this report originated
host = trans.request.host
+ history_view_link = "%s/history/view?id=%s" % ( str( host ), trans.security.encode_id( hda.history_id ) )
# Build the email message
msg = MIMEText( string.Template( error_report_template )
.safe_substitute( host=host,
- dataset_id=dataset.id,
+ dataset_id=hda.dataset_id,
+ history_id=hda.history_id,
+ hid=hda.hid,
+ history_item_name=hda.get_display_name(),
+ history_view_link=history_view_link,
+ job_id=job.id,
+ job_tool_id=job.tool_id,
+ job_command_line=job.command_line,
+ job_stderr=job.stderr,
+ job_stdout=job.stdout,
+ job_info=job.info,
+ job_traceback=job.traceback,
email=email,
- message=message,
- job_id=job.id,
- tool_id=job.tool_id,
- stderr=job.stderr,
- stdout=job.stdout,
- traceback=job.traceback,
- info=job.info ) )
+ message=message ) )
frm = to_address
# Check email a bit
email = email.strip()
diff -r 2eb1e3c4d143 -r df9814119044 lib/galaxy/web/controllers/history.py
--- a/lib/galaxy/web/controllers/history.py Mon Nov 16 15:06:07 2009 -0500
+++ b/lib/galaxy/web/controllers/history.py Mon Nov 16 16:27:48 2009 -0500
@@ -438,23 +438,20 @@
Warning! If you import this history, you will lose your current
history. Click <a href="%s">here</a> to confirm.
""" % web.url_for( id=id, confirm=True ) )
-
@web.expose
def view( self, trans, id=None ):
"""View a history. If a history is importable, then it is viewable by any user."""
-
# Get history to view.
if not id:
return trans.show_error_message( "You must specify a history you want to view." )
history_to_view = get_history( trans, id, False)
-
# Integrity checks.
if not history_to_view:
- return trans.show_error_message( "The specified history does not exist.")
+ return trans.show_error_message( "The specified history does not exist." )
+ # Admin users can view any history
# TODO: Use a new flag to determine if history is viewable?
- if not history_to_view.importable:
- error( "The owner of this history has not published this history." )
-
+ if not trans.user_is_admin and not history_to_view.importable:
+ error( "Either you are not allowed to view this history or the owner of this history has not published it." )
# View history.
query = trans.sa_session.query( model.HistoryDatasetAssociation ) \
.filter( model.HistoryDatasetAssociation.history == history_to_view ) \
@@ -469,7 +466,6 @@
datasets = query.all(),
user_owns_history = user_owns_history,
show_deleted = False )
-
@web.expose
@web.require_login( "share histories with other users" )
def share( self, trans, id=None, email="", **kwd ):
diff -r 2eb1e3c4d143 -r df9814119044 lib/galaxy/web/controllers/user.py
--- a/lib/galaxy/web/controllers/user.py Mon Nov 16 15:06:07 2009 -0500
+++ b/lib/galaxy/web/controllers/user.py Mon Nov 16 16:27:48 2009 -0500
@@ -181,9 +181,7 @@
refresh_frames = [ 'masthead', 'history' ]
if not trans.app.config.allow_user_creation and not trans.user_is_admin():
return trans.show_error_message( 'User registration is disabled. Please contact your Galaxy administrator for an account.' )
- #
# Create the user, save all the user info and login to Galaxy
- #
if params.get('create_user_button', None) == "Submit":
# check email and password validity
error = self.__validate(trans, params, email, password, confirm)
diff -r 2eb1e3c4d143 -r df9814119044 lib/galaxy/web/framework/__init__.py
--- a/lib/galaxy/web/framework/__init__.py Mon Nov 16 15:06:07 2009 -0500
+++ b/lib/galaxy/web/framework/__init__.py Mon Nov 16 16:27:48 2009 -0500
@@ -446,13 +446,11 @@
self.sa_session.flush()
# This method is not called from the Galaxy reports, so the cookie will always be galaxysession
self.__update_session_cookie( name='galaxysession' )
-
def get_galaxy_session( self ):
"""
Return the current galaxy session
"""
return self.galaxy_session
-
def get_history( self, create=False ):
"""
Load the current history, creating a new one only if there is not
@@ -497,7 +495,6 @@
self.sa_session.add_all( ( self.galaxy_session, history ) )
self.sa_session.flush()
return history
-
def get_user( self ):
"""Return the current user if logged in or None."""
return self.galaxy_session.user
@@ -507,7 +504,6 @@
self.sa_session.add( self.galaxy_session )
self.sa_session.flush()
user = property( get_user, set_user )
-
def get_user_and_roles( self ):
user = self.get_user()
if user:
@@ -515,13 +511,9 @@
else:
roles = []
return user, roles
-
def user_is_admin( self ):
admin_users = self.app.config.get( "admin_users", "" ).split( "," )
- if self.user and admin_users and self.user.email in admin_users:
- return True
- return False
-
+ return self.user and admin_users and self.user.email in admin_users
def get_toolbox(self):
"""Returns the application toolbox"""
return self.app.toolbox
diff -r 2eb1e3c4d143 -r df9814119044 templates/dataset/errors.mako
--- a/templates/dataset/errors.mako Mon Nov 16 15:06:07 2009 -0500
+++ b/templates/dataset/errors.mako Mon Nov 16 16:27:48 2009 -0500
@@ -18,10 +18,10 @@
<body>
<h2>Dataset generation errors</h2>
- <p><b>Dataset ${dataset.hid}: ${dataset.display_name()}</b></p>
+ <p><b>Dataset ${hda.hid}: ${hda.display_name()}</b></p>
- %if dataset.creating_job_associations:
- <% job = dataset.creating_job_associations[0].job %>
+ %if hda.creating_job_associations:
+ <% job = hda.creating_job_associations[0].job %>
%if job.traceback:
The Galaxy framework encountered the following error while attempting to run the tool:
<pre>${job.traceback}</pre>
@@ -43,7 +43,12 @@
%else:
The tool did not create any additional job / error info.
%endif
-
+ <%
+ if trans.user:
+ user_email = trans.user.email
+ else:
+ user_email = ''
+ %>
<h2>Report this error to the Galaxy Team</h2>
<p>
The Galaxy team regularly reviews errors that occur in the application.
@@ -56,10 +61,10 @@
<div class="toolFormTitle">Error Report</div>
<div class="toolFormBody">
<form name="report_error" action="${h.url_for( action='report_error')}" method="post" >
- <input type="hidden" name="id" value="${dataset.id}" />
+ <input type="hidden" name="id" value="${hda.id}" />
<div class="form-row">
<label>Your email</label>
- <input type="text" name="email" size="40" />
+ <input type="text" name="email" size="40" value="${user_email}" />
</div>
<div class="form-row">
<label>Message</label>
diff -r 2eb1e3c4d143 -r df9814119044 templates/mobile/history/detail.mako
--- a/templates/mobile/history/detail.mako Mon Nov 16 15:06:07 2009 -0500
+++ b/templates/mobile/history/detail.mako Mon Nov 16 16:27:48 2009 -0500
@@ -37,7 +37,7 @@
<div class="secondary">
## Body for history items, extra info and actions, data "peek"
<% user, roles = trans.get_user_and_roles() %>
- %if not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
+ %if not trans.user_is_admin() and not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
<div>You do not have permission to view this dataset.</div>
%elif data_state == "queued":
<div>Job is waiting to run</div>
diff -r 2eb1e3c4d143 -r df9814119044 templates/root/history_common.mako
--- a/templates/root/history_common.mako Mon Nov 16 15:06:07 2009 -0500
+++ b/templates/root/history_common.mako Mon Nov 16 16:27:48 2009 -0500
@@ -9,7 +9,7 @@
data_state = data.state
user, roles = trans.get_user_and_roles()
%>
- %if not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
+ %if not trans.user_is_admin() and not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
<div class="historyItemWrapper historyItem historyItem-${data_state} historyItem-noPermission" id="historyItem-${data.id}">
%else:
<div class="historyItemWrapper historyItem historyItem-${data_state}" id="historyItem-${data.id}">
@@ -49,7 +49,7 @@
## Body for history items, extra info and actions, data "peek"
<div id="info${data.id}" class="historyItemBody">
- %if not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
+ %if not trans.user_is_admin() and not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
<div>You do not have permission to view this dataset.</div>
%elif data_state == "upload":
<div>Dataset is uploading</div>
diff -r 2eb1e3c4d143 -r df9814119044 test/base/twilltestcase.py
--- a/test/base/twilltestcase.py Mon Nov 16 15:06:07 2009 -0500
+++ b/test/base/twilltestcase.py Mon Nov 16 16:27:48 2009 -0500
@@ -430,6 +430,12 @@
if check_str:
self.check_page_for_string( check_str )
self.home()
+ def view_history( self, history_id, check_str='' ):
+ """Displays a history for viewing"""
+ self.visit_url( '%s/history/view?id=%s' % ( self.url, self.security.encode_id( history_id ) ) )
+ if check_str:
+ self.check_page_for_string( check_str )
+ self.home()
def edit_hda_attribute_info( self, hda_id, new_name='', new_info='', new_dbkey='', new_startcol='' ):
"""Edit history_dataset_association attribute information"""
self.home()
diff -r 2eb1e3c4d143 -r df9814119044 test/functional/test_history_functions.py
--- a/test/functional/test_history_functions.py Mon Nov 16 15:06:07 2009 -0500
+++ b/test/functional/test_history_functions.py Mon Nov 16 16:27:48 2009 -0500
@@ -603,6 +603,12 @@
except:
pass
self.check_history_for_string( 'You do not have permission to view this dataset' )
+ # Admin users can view all datasets ( using the history/view feature ), so make sure 2.bed is accessible to the admin
+ self.logout()
+ self.login( email=admin_user.email )
+ self.view_history( str( hda_2_bed.history_id ), check_str='<td>NM_005997_cds_0_0_chr1_147962193_r</td>' )
+ self.logout()
+ self.login( email=regular_user3.email )
# Delete the clone so the next test will be valid
self.delete_history( id=self.security.encode_id( history5_clone4.id ) )
def test_065_sharing_private_history_by_choosing_to_not_share( self ):
1
0

17 Nov '09
details: http://www.bx.psu.edu/hg/galaxy/rev/3d0e1bdd6ce1
changeset: 3037:3d0e1bdd6ce1
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Mon Nov 16 11:27:30 2009 -0500
description:
Fix unicode error in data.display_info(). Fixes #226.
diffstat:
lib/galaxy/datatypes/data.py | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diffs (15 lines):
diff -r b7c6a418c571 -r 3d0e1bdd6ce1 lib/galaxy/datatypes/data.py
--- a/lib/galaxy/datatypes/data.py Mon Nov 16 10:57:31 2009 -0500
+++ b/lib/galaxy/datatypes/data.py Mon Nov 16 11:27:30 2009 -0500
@@ -160,6 +160,11 @@
info = info.replace( '\r', '<br/>' )
if info.find( '\n' ) >= 0:
info = info.replace( '\n', '<br/>' )
+
+ # Convert to unicode to display non-ascii characters.
+ if type( info ) is not unicode:
+ info = unicode( info, 'utf-8')
+
return info
except:
return "info unavailable"
1
0