From efed83a82814c164413fcfcd0788ed7c9165dee8 Mon Sep 17 00:00:00 2001 From: Greg Von Kuster Date: Fri, 19 Nov 2010 10:14:08 -0500 Subject: [PATCH] Move the sequencer interface ( RequestType ) components from the requests_admin controller to a new sequencer controller. --- lib/galaxy/web/controllers/requests_admin.py | 327 +----------------- lib/galaxy/web/controllers/sequencer.py | 327 ++++++++++++++++++ .../request_type/create_request_type.mako | 2 +- .../admin/request_type/edit_request_type.mako | 21 +- templates/admin/request_type/grid.mako | 1 + .../request_type_permissions.mako | 11 +- .../admin/request_type/view_request_type.mako | 19 +- .../requests/select_datasets_to_transfer.mako | 2 +- templates/requests/common/common.mako | 4 - templates/webapps/galaxy/admin/index.mako | 2 +- test/base/twilltestcase.py | 6 +- 11 files changed, 368 insertions(+), 354 deletions(-) create mode 100644 lib/galaxy/web/controllers/sequencer.py create mode 100644 templates/admin/request_type/grid.mako diff --git a/lib/galaxy/web/controllers/requests_admin.py b/lib/galaxy/web/controllers/requests_admin.py index abb6cc8ec23..6b974b9d2b8 100644 --- a/lib/galaxy/web/controllers/requests_admin.py +++ b/lib/galaxy/web/controllers/requests_admin.py @@ -29,64 +29,6 @@ class AdminRequestsGrid( RequestsGrid ): cntrller='requests_admin' ) ) ] -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 - - # Grid definition - webapp = "galaxy" - title = "Sequencer Configurations" - template = "admin/requests/grid.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", - link=( lambda item: iff( item.deleted, None, dict( operation="view_request_type", id=item.id ) ) ), - attach_popup=True, - filterable="advanced" ), - DescriptionColumn( "Description", - key='desc', - filterable="advanced" ), - RequestFormColumn( "Request Form", - link=( lambda item: iff( item.deleted, None, dict( operation="view_form_definition", id=item.request_form.id ) ) ) ), - SampleFormColumn( "Sample Form", - link=( lambda item: iff( item.deleted, None, dict( operation="view_form_definition", id=item.sample_form.id ) ) ) ), - grids.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 configuration", allow_multiple=False, condition=( lambda item: not item.deleted ) ), - grids.GridOperation( "Edit permissions", allow_multiple=False, condition=( lambda item: not item.deleted ) ), - grids.GridOperation( "Delete configuration", allow_multiple=True, condition=( lambda item: not item.deleted ) ), - grids.GridOperation( "Undelete configuration", condition=( lambda item: item.deleted ) ), - ] - global_actions = [ - grids.GridAction( "Create new configuration", dict( controller='requests_admin', action='create_request_type' ) ) - ] - class DataTransferGrid( grids.Grid ): # Custom column types class NameColumn( grids.TextColumn ): @@ -145,7 +87,6 @@ class DataTransferGrid( grids.Grid ): class RequestsAdmin( BaseController, UsesFormDefinitionWidgets ): request_grid = AdminRequestsGrid() - requesttype_grid = RequestTypeGrid() datatx_grid = DataTransferGrid() @web.expose @@ -181,7 +122,9 @@ class RequestsAdmin( BaseController, UsesFormDefinitionWidgets ): if operation == "reject": return self.reject_request( trans, **kwd ) if operation == "view_type": - return self.view_request_type( trans, **kwd ) + return trans.response.send_redirect( web.url_for( controller='sequencer', + action='view_request_type', + **kwd ) ) if operation == "delete": return trans.response.send_redirect( web.url_for( controller='requests_common', action='delete_request', @@ -521,11 +464,6 @@ class RequestsAdmin( BaseController, UsesFormDefinitionWidgets ): request_id=trans.security.encode_id( request.id ), status=status, message=message ) ) - def __check_path( self, a_path ): - # Return a valid folder_path - if a_path and not a_path.endswith( os.sep ): - a_path += os.sep - return a_path def __save_sample_datasets( self, trans, sample, selected_datasets_to_transfer ): sample_dataset_file_names = [] if selected_datasets_to_transfer: @@ -734,253 +672,6 @@ class RequestsAdmin( BaseController, UsesFormDefinitionWidgets ): trans.sa_session.add( sample_dataset ) trans.sa_session.flush() return 200, 'Done' - # Request Type Stuff - @web.expose - @web.require_admin - def browse_request_types( self, trans, **kwd ): - if 'operation' in kwd: - operation = kwd['operation'].lower() - obj_id = kwd.get( 'id', None ) - if operation == "view_form_definition": - return self.view_form_definition( trans, **kwd ) - elif operation == "view_request_type": - return self.view_request_type( trans, **kwd ) - elif operation == "edit configuration": - return self.edit_request_type( trans, **kwd ) - elif operation == "delete configuration": - return self.delete_request_type( trans, **kwd ) - elif operation == "undelete configuration": - return self.undelete_request_type( trans, **kwd ) - elif operation == "edit permissions": - return self.request_type_permissions( trans, **kwd ) - # Render the grid view - return self.requesttype_grid( trans, **kwd ) - @web.expose - @web.require_admin - def create_request_type( self, trans, **kwd ): - params = util.Params( kwd ) - message = util.restore_text( params.get( 'message', '' ) ) - status = params.get( 'status', 'done' ) - rt_info_widgets, rt_states_widgets = self.__get_populated_request_type_widgets( trans, **kwd ) - rename_dataset_select_field = self.__build_rename_dataset_select_field( trans ) - if params.get( 'add_state_button', False ): - # Append a new tuple to the set of states which will result in - # empty state name and description TextFields being displayed on - # the form. - rt_states_widgets.append( ( "", "" ) ) - elif params.get( 'remove_state_button', False ): - index = int( params.get( 'remove_state_button', '' ).split(" ")[2] ) - del rt_states_widgets[ index-1 ] - elif params.get( 'create_request_type_button', False ): - self.__save_request_type( trans, **kwd ) - message = 'The sequencer configuration has been created.' - return trans.response.send_redirect( web.url_for( controller='requests_admin', - action='browse_request_types', - message=message, - status=status ) ) - return trans.fill_template( '/admin/request_type/create_request_type.mako', - rt_info_widgets=rt_info_widgets, - rt_states_widgets=rt_states_widgets, - rename_dataset_select_field=rename_dataset_select_field, - message=message, - status=status ) - @web.expose - @web.require_admin - def view_request_type( self, trans, **kwd ): - request_type_id = kwd.get( 'id', None ) - try: - request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( request_type_id ) ) - except: - return invalid_id_redirect( trans, 'requests_admin', request_type_id, action='browse_request_types' ) - rename_dataset_select_field = self.__build_rename_dataset_select_field( trans, request_type ) - return trans.fill_template( '/admin/request_type/view_request_type.mako', - request_type=request_type, - rename_dataset_select_field=rename_dataset_select_field ) - @web.expose - @web.require_admin - def edit_request_type( self, trans, **kwd ): - ## TODO: RC: add the ability to edit the name and description of exisitng states - params = util.Params( kwd ) - message = util.restore_text( params.get( 'message', '' ) ) - status = params.get( 'status', 'done' ) - request_type_id = params.get( 'id', None ) - try: - request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( request_type_id ) ) - except: - return invalid_id_redirect( trans, 'requests_admin', request_type_id, action='browse_request_types' ) - rename_dataset_select_field = self.__build_rename_dataset_select_field( trans ) - if params.get( 'add_state_button', False ): - # Append a new tuple to the set of states which will result in - # empty state name and description TextFields being displayed on - # the form. - rt_states_widgets.append( ( "", "" ) ) - elif params.get( 'remove_state_button', False ): - index = int( params.get( 'remove_state_button', '' ).split(" ")[2] ) - del rt_states_widgets[ index-1 ] - if params.get( 'edit_request_type_button', False ): - self.__save_request_type( trans, **kwd ) - message = 'Changes made to sequencer configuration (%s) have been saved' % request_type.name - return trans.fill_template( '/admin/request_type/edit_request_type.mako', - request_type=request_type, - rename_dataset_select_field=rename_dataset_select_field, - message=message, - status=status ) - def __save_request_type( self, trans, **kwd ): - # Here we save a newly created request_type or save changed - # attributes of an existing request_type. - params = util.Params( kwd ) - request_type_id = params.get( 'id', None ) - name = util.restore_text( params.get( 'name', '' ) ) - desc = util.restore_text( params.get( 'desc', '' ) ) - request_form_id = params.get( 'request_form_id', None ) - request_form = trans.sa_session.query( trans.model.FormDefinition ).get( trans.security.decode_id( request_form_id ) ) - sample_form_id = params.get( 'sample_form_id', None ) - sample_form = trans.sa_session.query( trans.model.FormDefinition ).get( trans.security.decode_id( sample_form_id ) ) - data_dir = util.restore_text( params.get( 'data_dir', '' ) ) - data_dir = self.__check_path( data_dir ) - # Data transfer info - Make sure password is retrieved from kwd rather than Params - # since Params may have munged the characters. - datatx_info = dict( host=util.restore_text( params.get( 'host', '' ) ), - username=util.restore_text( params.get( 'username', '' ) ), - password=kwd.get( 'password', '' ), - data_dir=data_dir, - rename_dataset=util.restore_text( params.get( 'rename_dataset', '' ) ) ) - if request_type_id: - # We're saving changed attributes of an existing request_type. - request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( request_type_id ) ) - request_type.name = name - request_type.desc = desc - request_type.request_form = request_form - request_type.sample_form = sample_form - request_type.datatx_info = datatx_info - else: - # We're saving a newly created request_type - request_type = trans.model.RequestType( name=name, - desc=desc, - request_form=request_form, - sample_form=sample_form, - datatx_info=datatx_info ) - trans.sa_session.add( request_type ) - trans.sa_session.flush() - 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.model.SampleState( name, desc, request_type ) - trans.sa_session.add( ss ) - trans.sa_session.flush() - i += 1 - else: - break - def __get_populated_request_type_widgets( self, trans, **kwd ): - request_form_definitions = self.get_all_forms( trans, - filter=dict( deleted=False ), - form_type=trans.model.FormDefinition.types.REQUEST ) - sample_form_definitions = self.get_all_forms( trans, - filter=dict( deleted=False ), - form_type=trans.model.FormDefinition.types.SAMPLE ) - if not request_form_definitions or not sample_form_definitions: - return [],[] - params = util.Params( kwd ) - request_form_id = params.get( 'request_form_id', 'none' ) - sample_form_id = params.get( 'sample_form_id', 'none' ) - request_form_id_select_field = build_select_field( trans, - objs=request_form_definitions, - label_attr='name', - select_field_name='request_form_id', - selected_value=request_form_id, - refresh_on_change=False ) - sample_form_id_select_field = build_select_field( trans, - objs=sample_form_definitions, - label_attr='name', - select_field_name='sample_form_id', - selected_value=sample_form_id, - refresh_on_change=False ) - rt_info_widgets = [ dict( label='Name', - widget=TextField( 'name', 40, util.restore_text( params.get( 'name', '' ) ) ) ), - dict( label='Description', - widget=TextField( 'desc', 40, util.restore_text( params.get( 'desc', '' ) ) ) ), - dict( label='Request form', - widget=request_form_id_select_field ), - dict( label='Sample form', - widget=sample_form_id_select_field ) ] - # Sample states defined for this sequencer configuration - 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 += 1 - else: - break - return rt_info_widgets, rt_states - @web.expose - @web.require_admin - def delete_request_type( self, trans, **kwd ): - rt_id = kwd.get( 'id', '' ) - rt_id_list = util.listify( rt_id ) - for rt_id in rt_id_list: - try: - request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( rt_id ) ) - except: - return invalid_id_redirect( trans, 'requests_admin', rt_id, action='browse_request_types' ) - request_type.deleted = True - trans.sa_session.add( request_type ) - trans.sa_session.flush() - status = 'done' - message = '%i sequencer configurations has been deleted' % len( rt_id_list ) - return trans.response.send_redirect( web.url_for( controller='requests_admin', - action='browse_request_types', - message=message, - status='done' ) ) - @web.expose - @web.require_admin - def undelete_request_type( self, trans, **kwd ): - rt_id = kwd.get( 'id', '' ) - rt_id_list = util.listify( rt_id ) - for rt_id in rt_id_list: - try: - request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( rt_id ) ) - except: - return invalid_id_redirect( trans, 'requests_admin', rt_id, action='browse_request_types' ) - request_type.deleted = False - trans.sa_session.add( request_type ) - trans.sa_session.flush() - status = 'done' - message = '%i sequencer configurations have been undeleted' % len( rt_id_list ) - return trans.response.send_redirect( web.url_for( controller='requests_admin', - action='browse_request_types', - message=message, - status=status ) ) - @web.expose - @web.require_admin - def request_type_permissions( self, trans, **kwd ): - params = util.Params( kwd ) - message = util.restore_text( params.get( 'message', '' ) ) - status = params.get( 'status', 'done' ) - request_type_id = kwd.get( 'id', '' ) - try: - request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( request_type_id ) ) - except: - return invalid_id_redirect( trans, 'requests_admin', request_type_id, action='browse_request_types' ) - roles = trans.sa_session.query( trans.model.Role ) \ - .filter( trans.model.Role.table.c.deleted==False ) \ - .order_by( trans.model.Role.table.c.name ) - if params.get( 'update_roles_button', False ): - permissions = {} - for k, v in trans.model.RequestType.permitted_actions.items(): - in_roles = [ trans.sa_session.query( trans.model.Role ).get( x ) for x in util.listify( params.get( k + '_in', [] ) ) ] - permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles - trans.app.security_agent.set_request_type_permissions( request_type, permissions ) - trans.sa_session.refresh( request_type ) - message = "Permissions updated for sequencer configuration '%s'" % request_type.name - return trans.fill_template( '/admin/request_type/request_type_permissions.mako', - request_type=request_type, - roles=roles, - status=status, - message=message ) @web.expose @web.require_admin def view_form_definition( self, trans, **kwd ): @@ -994,17 +685,7 @@ class RequestsAdmin( BaseController, UsesFormDefinitionWidgets ): # ===== Methods for building SelectFields used on various admin_requests forms def __build_sample_id_select_field( self, trans, request, selected_value ): return build_select_field( trans, request.samples, 'name', 'sample_id', selected_value=selected_value, refresh_on_change=False ) - def __build_rename_dataset_select_field( self, trans, request_type=None ): - if request_type: - selected_value = request_type.datatx_info.get( 'rename_dataset', trans.model.RequestType.rename_dataset_options.NO ) - else: - selected_value = trans.model.RequestType.rename_dataset_options.NO - return build_select_field( trans, - objs=[ v for k, v in trans.model.RequestType.rename_dataset_options.items() ], - label_attr='self', - select_field_name='rename_dataset', - selected_value=selected_value, - refresh_on_change=False ) + # ===== Methods for building SelectFields used on various admin_requests forms - used outside this controller ===== def build_rename_datasets_for_sample_select_field( trans, sample_dataset, selected_value='none' ): options = [] diff --git a/lib/galaxy/web/controllers/sequencer.py b/lib/galaxy/web/controllers/sequencer.py new file mode 100644 index 00000000000..42f71a29def --- /dev/null +++ b/lib/galaxy/web/controllers/sequencer.py @@ -0,0 +1,327 @@ +from galaxy.web.base.controller import * +from galaxy.web.framework.helpers import time_ago, iff, grids +from galaxy.model.orm import * +from galaxy import model, util +from galaxy.web.form_builder import * +from galaxy.web.controllers.requests_common import invalid_id_redirect +import logging, os + +log = logging.getLogger( __name__ ) + +class SequencerGrid( 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 + + # Grid definition + webapp = "galaxy" + title = "Sequencer Configurations" + template = "admin/request_type/grid.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", + link=( lambda item: iff( item.deleted, None, dict( operation="view_request_type", id=item.id ) ) ), + attach_popup=True, + filterable="advanced" ), + DescriptionColumn( "Description", + key='desc', + filterable="advanced" ), + RequestFormColumn( "Request Form", + link=( lambda item: iff( item.deleted, None, dict( operation="view_form_definition", id=item.request_form.id ) ) ) ), + SampleFormColumn( "Sample Form", + link=( lambda item: iff( item.deleted, None, dict( operation="view_form_definition", id=item.sample_form.id ) ) ) ), + grids.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 configuration", allow_multiple=False, condition=( lambda item: not item.deleted ) ), + grids.GridOperation( "Edit permissions", allow_multiple=False, condition=( lambda item: not item.deleted ) ), + grids.GridOperation( "Delete configuration", allow_multiple=True, condition=( lambda item: not item.deleted ) ), + grids.GridOperation( "Undelete configuration", condition=( lambda item: item.deleted ) ), + ] + global_actions = [ + grids.GridAction( "Create new configuration", dict( controller='sequencer', action='create_request_type' ) ) + ] + +class Sequencer( BaseController, UsesFormDefinitionWidgets ): + sequencer_grid = SequencerGrid() + + @web.expose + @web.require_admin + def browse_request_types( self, trans, **kwd ): + if 'operation' in kwd: + operation = kwd['operation'].lower() + obj_id = kwd.get( 'id', None ) + if operation == "view_form_definition": + return self.view_form_definition( trans, **kwd ) + elif operation == "view_request_type": + return self.view_request_type( trans, **kwd ) + elif operation == "edit configuration": + return self.edit_request_type( trans, **kwd ) + elif operation == "delete configuration": + return self.delete_request_type( trans, **kwd ) + elif operation == "undelete configuration": + return self.undelete_request_type( trans, **kwd ) + elif operation == "edit permissions": + return self.request_type_permissions( trans, **kwd ) + # Render the grid view + return self.sequencer_grid( trans, **kwd ) + @web.expose + @web.require_admin + def create_request_type( self, trans, **kwd ): + params = util.Params( kwd ) + message = util.restore_text( params.get( 'message', '' ) ) + status = params.get( 'status', 'done' ) + rt_info_widgets, rt_states_widgets = self.__get_populated_request_type_widgets( trans, **kwd ) + rename_dataset_select_field = self.__build_rename_dataset_select_field( trans ) + if params.get( 'add_state_button', False ): + # Append a new tuple to the set of states which will result in + # empty state name and description TextFields being displayed on + # the form. + rt_states_widgets.append( ( "", "" ) ) + elif params.get( 'remove_state_button', False ): + index = int( params.get( 'remove_state_button', '' ).split( " " )[2] ) + del rt_states_widgets[ index-1 ] + elif params.get( 'create_request_type_button', False ): + self.__save_request_type( trans, **kwd ) + message = 'The sequencer configuration has been created.' + return trans.response.send_redirect( web.url_for( controller='sequencer', + action='browse_request_types', + message=message, + status=status ) ) + return trans.fill_template( '/admin/request_type/create_request_type.mako', + rt_info_widgets=rt_info_widgets, + rt_states_widgets=rt_states_widgets, + rename_dataset_select_field=rename_dataset_select_field, + message=message, + status=status ) + @web.expose + @web.require_admin + def view_request_type( self, trans, **kwd ): + request_type_id = kwd.get( 'id', None ) + try: + request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( request_type_id ) ) + except: + return invalid_id_redirect( trans, 'sequencer', request_type_id, action='browse_request_types' ) + rename_dataset_select_field = self.__build_rename_dataset_select_field( trans, request_type ) + return trans.fill_template( '/admin/request_type/view_request_type.mako', + request_type=request_type, + rename_dataset_select_field=rename_dataset_select_field ) + @web.expose + @web.require_admin + def edit_request_type( self, trans, **kwd ): + ## TODO: RC: add the ability to edit the name and description of exisitng states + params = util.Params( kwd ) + message = util.restore_text( params.get( 'message', '' ) ) + status = params.get( 'status', 'done' ) + request_type_id = params.get( 'id', None ) + try: + request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( request_type_id ) ) + except: + return invalid_id_redirect( trans, 'sequencer', request_type_id, action='browse_request_types' ) + rename_dataset_select_field = self.__build_rename_dataset_select_field( trans ) + if params.get( 'edit_request_type_button', False ): + self.__save_request_type( trans, **kwd ) + message = 'Changes made to sequencer configuration (%s) have been saved' % request_type.name + return trans.fill_template( '/admin/request_type/edit_request_type.mako', + request_type=request_type, + rename_dataset_select_field=rename_dataset_select_field, + message=message, + status=status ) + def __save_request_type( self, trans, **kwd ): + # Here we save a newly created request_type or save changed + # attributes of an existing request_type. + params = util.Params( kwd ) + request_type_id = params.get( 'id', None ) + name = util.restore_text( params.get( 'name', '' ) ) + desc = util.restore_text( params.get( 'desc', '' ) ) + request_form_id = params.get( 'request_form_id', None ) + request_form = trans.sa_session.query( trans.model.FormDefinition ).get( trans.security.decode_id( request_form_id ) ) + sample_form_id = params.get( 'sample_form_id', None ) + sample_form = trans.sa_session.query( trans.model.FormDefinition ).get( trans.security.decode_id( sample_form_id ) ) + data_dir = util.restore_text( params.get( 'data_dir', '' ) ) + data_dir = self.__check_path( data_dir ) + # Data transfer info - Make sure password is retrieved from kwd rather than Params + # since Params may have munged the characters. + datatx_info = dict( host=util.restore_text( params.get( 'host', '' ) ), + username=util.restore_text( params.get( 'username', '' ) ), + password=kwd.get( 'password', '' ), + data_dir=data_dir, + rename_dataset=util.restore_text( params.get( 'rename_dataset', '' ) ) ) + if request_type_id: + # We're saving changed attributes of an existing request_type. + request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( request_type_id ) ) + request_type.name = name + request_type.desc = desc + request_type.request_form = request_form + request_type.sample_form = sample_form + request_type.datatx_info = datatx_info + else: + # We're saving a newly created request_type + request_type = trans.model.RequestType( name=name, + desc=desc, + request_form=request_form, + sample_form=sample_form, + datatx_info=datatx_info ) + trans.sa_session.add( request_type ) + trans.sa_session.flush() + 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.model.SampleState( name, desc, request_type ) + trans.sa_session.add( ss ) + trans.sa_session.flush() + i += 1 + else: + break + def __check_path( self, a_path ): + # Return a valid folder_path + if a_path and not a_path.endswith( os.sep ): + a_path += os.sep + return a_path + def __get_populated_request_type_widgets( self, trans, **kwd ): + request_form_definitions = self.get_all_forms( trans, + filter=dict( deleted=False ), + form_type=trans.model.FormDefinition.types.REQUEST ) + sample_form_definitions = self.get_all_forms( trans, + filter=dict( deleted=False ), + form_type=trans.model.FormDefinition.types.SAMPLE ) + if not request_form_definitions or not sample_form_definitions: + return [],[] + params = util.Params( kwd ) + request_form_id = params.get( 'request_form_id', 'none' ) + sample_form_id = params.get( 'sample_form_id', 'none' ) + request_form_id_select_field = build_select_field( trans, + objs=request_form_definitions, + label_attr='name', + select_field_name='request_form_id', + selected_value=request_form_id, + refresh_on_change=False ) + sample_form_id_select_field = build_select_field( trans, + objs=sample_form_definitions, + label_attr='name', + select_field_name='sample_form_id', + selected_value=sample_form_id, + refresh_on_change=False ) + rt_info_widgets = [ dict( label='Name', + widget=TextField( 'name', 40, util.restore_text( params.get( 'name', '' ) ) ) ), + dict( label='Description', + widget=TextField( 'desc', 40, util.restore_text( params.get( 'desc', '' ) ) ) ), + dict( label='Request form', + widget=request_form_id_select_field ), + dict( label='Sample form', + widget=sample_form_id_select_field ) ] + # Unsaved sample states being defined for this sequencer configuration + rt_states = [] + i=0 + while True: + if kwd.has_key( 'state_name_%i' % i ): + rt_states.append( ( util.restore_text( params.get( 'state_name_%i' % i, '' ) ), + util.restore_text( params.get( 'state_desc_%i' % i, '' ) ) ) ) + i += 1 + else: + break + return rt_info_widgets, rt_states + @web.expose + @web.require_admin + def delete_request_type( self, trans, **kwd ): + rt_id = kwd.get( 'id', '' ) + rt_id_list = util.listify( rt_id ) + for rt_id in rt_id_list: + try: + request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( rt_id ) ) + except: + return invalid_id_redirect( trans, 'sequencer', rt_id, action='browse_request_types' ) + request_type.deleted = True + trans.sa_session.add( request_type ) + trans.sa_session.flush() + status = 'done' + message = '%i sequencer configurations has been deleted' % len( rt_id_list ) + return trans.response.send_redirect( web.url_for( controller='sequencer', + action='browse_request_types', + message=message, + status='done' ) ) + @web.expose + @web.require_admin + def undelete_request_type( self, trans, **kwd ): + rt_id = kwd.get( 'id', '' ) + rt_id_list = util.listify( rt_id ) + for rt_id in rt_id_list: + try: + request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( rt_id ) ) + except: + return invalid_id_redirect( trans, 'sequencer', rt_id, action='browse_request_types' ) + request_type.deleted = False + trans.sa_session.add( request_type ) + trans.sa_session.flush() + status = 'done' + message = '%i sequencer configurations have been undeleted' % len( rt_id_list ) + return trans.response.send_redirect( web.url_for( controller='sequencer', + action='browse_request_types', + message=message, + status=status ) ) + @web.expose + @web.require_admin + def request_type_permissions( self, trans, **kwd ): + params = util.Params( kwd ) + message = util.restore_text( params.get( 'message', '' ) ) + status = params.get( 'status', 'done' ) + request_type_id = kwd.get( 'id', '' ) + try: + request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( request_type_id ) ) + except: + return invalid_id_redirect( trans, 'sequencer', request_type_id, action='browse_request_types' ) + roles = trans.sa_session.query( trans.model.Role ) \ + .filter( trans.model.Role.table.c.deleted==False ) \ + .order_by( trans.model.Role.table.c.name ) + if params.get( 'update_roles_button', False ): + permissions = {} + for k, v in trans.model.RequestType.permitted_actions.items(): + in_roles = [ trans.sa_session.query( trans.model.Role ).get( x ) for x in util.listify( params.get( k + '_in', [] ) ) ] + permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles + trans.app.security_agent.set_request_type_permissions( request_type, permissions ) + trans.sa_session.refresh( request_type ) + message = "Permissions updated for sequencer configuration '%s'" % request_type.name + return trans.fill_template( '/admin/request_type/request_type_permissions.mako', + request_type=request_type, + roles=roles, + status=status, + message=message ) + + # ===== Methods for building SelectFields used on various admin_requests forms + def __build_rename_dataset_select_field( self, trans, request_type=None ): + if request_type: + selected_value = request_type.datatx_info.get( 'rename_dataset', trans.model.RequestType.rename_dataset_options.NO ) + else: + selected_value = trans.model.RequestType.rename_dataset_options.NO + return build_select_field( trans, + objs=[ v for k, v in trans.model.RequestType.rename_dataset_options.items() ], + label_attr='self', + select_field_name='rename_dataset', + selected_value=selected_value, + refresh_on_change=False ) diff --git a/templates/admin/request_type/create_request_type.mako b/templates/admin/request_type/create_request_type.mako index 029a2945c9c..27d21c1bbaa 100644 --- a/templates/admin/request_type/create_request_type.mako +++ b/templates/admin/request_type/create_request_type.mako @@ -17,7 +17,7 @@ and a Sequencing Sample Form, which must be created first. Click the Create new form button to create them. %else: -
+
Create a new sequencer configuration
%for rt_info in rt_info_widgets: diff --git a/templates/admin/request_type/edit_request_type.mako b/templates/admin/request_type/edit_request_type.mako index fa16e40a552..b0e535eff0e 100644 --- a/templates/admin/request_type/edit_request_type.mako +++ b/templates/admin/request_type/edit_request_type.mako @@ -4,21 +4,24 @@

%if message: ${render_msg( message, status )} %endif - +
"Edit ${request_type.name}" sequencer configuration
diff --git a/templates/admin/request_type/grid.mako b/templates/admin/request_type/grid.mako new file mode 100644 index 00000000000..6a41b688c5e --- /dev/null +++ b/templates/admin/request_type/grid.mako @@ -0,0 +1 @@ +<%inherit file="/grid_base.mako"/> diff --git a/templates/admin/request_type/request_type_permissions.mako b/templates/admin/request_type/request_type_permissions.mako index dff3dadbeb7..6e9097e349d 100644 --- a/templates/admin/request_type/request_type_permissions.mako +++ b/templates/admin/request_type/request_type_permissions.mako @@ -25,9 +25,12 @@

%if message: @@ -37,7 +40,7 @@
Manage access permissions on sequencer interface "${request_type.name}"
- +
<% current_actions = request_type.actions diff --git a/templates/admin/request_type/view_request_type.mako b/templates/admin/request_type/view_request_type.mako index 2d3cddc79f2..61458aad258 100644 --- a/templates/admin/request_type/view_request_type.mako +++ b/templates/admin/request_type/view_request_type.mako @@ -3,14 +3,17 @@

%if message: diff --git a/templates/admin/requests/select_datasets_to_transfer.mako b/templates/admin/requests/select_datasets_to_transfer.mako index feecf4b62eb..541af0fa916 100644 --- a/templates/admin/requests/select_datasets_to_transfer.mako +++ b/templates/admin/requests/select_datasets_to_transfer.mako @@ -77,7 +77,7 @@ ${h.js( "ui.core", "jquery.cookie", "jquery.dynatree" )}

%else: ${sample_widget_name} diff --git a/templates/webapps/galaxy/admin/index.mako b/templates/webapps/galaxy/admin/index.mako index f16a0c448f8..944b27a8c68 100644 --- a/templates/webapps/galaxy/admin/index.mako +++ b/templates/webapps/galaxy/admin/index.mako @@ -114,7 +114,7 @@
diff --git a/test/base/twilltestcase.py b/test/base/twilltestcase.py index 05c9cd2e52a..5ced0459648 100644 --- a/test/base/twilltestcase.py +++ b/test/base/twilltestcase.py @@ -1463,7 +1463,7 @@ class TwillTestCase( unittest.TestCase ): self.check_page_for_string( check_str ) def create_request_type( self, name, desc, request_form_id, sample_form_id, states, strings_displayed=[], strings_displayed_after_submit=[] ): self.home() - self.visit_url( "%s/requests_admin/create_request_type" % self.url ) + self.visit_url( "%s/sequencer/create_request_type" % self.url ) for check_str in strings_displayed: self.check_page_for_string( check_str ) tc.fv( "1", "name", name ) @@ -1479,7 +1479,7 @@ class TwillTestCase( unittest.TestCase ): self.check_page_for_string( check_str ) def request_type_permissions( self, request_type_id, request_type_name, role_ids_str, permissions_in, permissions_out ): # role_ids_str must be a comma-separated string of role ids - url = "requests_admin/request_type_permissions?id=%s&update_roles_button=Save" % ( request_type_id ) + url = "sequencer/request_type_permissions?id=%s&update_roles_button=Save" % ( request_type_id ) for po in permissions_out: key = '%s_out' % po url ="%s&%s=%s" % ( url, key, role_ids_str ) @@ -1494,7 +1494,7 @@ class TwillTestCase( unittest.TestCase ): def view_request_type( self, request_type_id, request_type_name, sample_states, strings_displayed=[] ): '''View request_type details''' self.home() - self.visit_url( "%s/requests_admin/view_request_type?id=%s" % ( self.url, request_type_id ) ) + self.visit_url( "%s/sequencer/view_request_type?id=%s" % ( self.url, request_type_id ) ) self.check_page_for_string( '"%s" sequencer configuration' % request_type_name ) for name, desc in sample_states: self.check_page_for_string( name )