mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-21 13:50:20 +08:00
First pass of the new Galaxy forms components including requests which based on form definitions and samples.
This commit is contained in:
@@ -15,6 +15,7 @@ import galaxy.datatypes.registry
|
||||
from galaxy.datatypes.metadata import MetadataCollection
|
||||
from galaxy.security import RBACAgent, get_permitted_actions
|
||||
|
||||
|
||||
import logging
|
||||
log = logging.getLogger( __name__ )
|
||||
|
||||
@@ -1095,6 +1096,58 @@ class MetadataFile( object ):
|
||||
raise
|
||||
# Return filename inside hashed directory
|
||||
return os.path.abspath( os.path.join( path, "metadata_%d.dat" % self.id ) )
|
||||
|
||||
|
||||
class FormDefinition( object ):
|
||||
def __init__(self, name=None, desc=None, fields=[], current_form_id=None):
|
||||
self.name = name
|
||||
self.desc = desc
|
||||
self.fields = fields
|
||||
self.form_definition_current_id = current_form_id
|
||||
|
||||
class FormDefinitionCurrent( object ):
|
||||
def __init__(self, form_definition_id=None):
|
||||
self.latest_form_id = form_definition_id
|
||||
|
||||
class FormValues( object ):
|
||||
def __init__(self, form_def_id=None, content=None):
|
||||
self.form_definition_id = form_def_id
|
||||
self.content = content
|
||||
|
||||
class Request( object ):
|
||||
def __init__(self, name=None, desc=None, request_type_id=None, user_id=None, form_values_id=None, library_id=None):
|
||||
self.name = name
|
||||
self.desc = desc
|
||||
self.request_type_id = request_type_id
|
||||
self.form_values_id = form_values_id
|
||||
self.user_id = user_id
|
||||
self.library_id = library_id
|
||||
|
||||
class RequestType( object ):
|
||||
def __init__(self, request_form_id=None, sample_form_id=None):
|
||||
self.request_form_id = request_form_id
|
||||
self.sample_form_id = sample_form_id
|
||||
|
||||
class Sample( object ):
|
||||
def __init__(self, name=None, desc=None, request_id=None, form_values_id=None):
|
||||
self.name = name
|
||||
self.desc = desc
|
||||
self.request_id = request_id
|
||||
self.form_values_id = form_values_id
|
||||
|
||||
class SampleState( object ):
|
||||
def __init__(self, name=None, desc=None, request_type_id=None):
|
||||
self.name = name
|
||||
self.desc = desc
|
||||
self.request_type_id = request_type_id
|
||||
|
||||
class SampleEvent( object ):
|
||||
def __init__(self, sample_id=None, sample_state_id=None, comment=''):
|
||||
self.sample_id = sample_id
|
||||
self.sample_state_id = sample_state_id
|
||||
self.comment = comment
|
||||
|
||||
|
||||
|
||||
## ---- Utility methods -------------------------------------------------------
|
||||
|
||||
|
||||
@@ -520,9 +520,115 @@ MetadataFile.table = Table( "metadata_file", metadata,
|
||||
Column( "deleted", Boolean, index=True, default=False ),
|
||||
Column( "purged", Boolean, index=True, default=False ) )
|
||||
|
||||
|
||||
FormDefinitionCurrent.table = Table('form_definition_current', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "latest_form_id", Integer, ForeignKey( "form_definition.id" ), index=True ),
|
||||
Column( "deleted", Boolean, index=True, default=False ))
|
||||
|
||||
# new table to store all the forms which is created by the admin
|
||||
FormDefinition.table = Table('form_definition', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "name", TrimmedString( 255 ), nullable=False ),
|
||||
Column( "desc", TEXT ),
|
||||
Column( "form_definition_current_id", Integer, ForeignKey( "form_definition_current.id" ), index=True ),
|
||||
Column( "fields", JSONType()))
|
||||
|
||||
RequestType.table = Table('request_type', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "name", TrimmedString( 255 ), nullable=False ),
|
||||
Column( "desc", TEXT ),
|
||||
Column( "request_form_id", Integer, ForeignKey( "form_definition.id" ), index=True ),
|
||||
Column( "sample_form_id", Integer, ForeignKey( "form_definition.id" ), index=True ) )
|
||||
|
||||
FormValues.table = Table('form_values', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "form_definition_id", Integer, ForeignKey( "form_definition.id" ), index=True ),
|
||||
Column( "content", JSONType()) )
|
||||
|
||||
Request.table = Table('request', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "name", TrimmedString( 255 ), nullable=False ),
|
||||
Column( "desc", TEXT ),
|
||||
Column( "form_values_id", Integer, ForeignKey( "form_values.id" ), index=True ),
|
||||
Column( "request_type_id", Integer, ForeignKey( "request_type.id" ), index=True ),
|
||||
Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
|
||||
Column( "library_id", Integer, ForeignKey( "library.id" ), index=True ),
|
||||
Column( "deleted", Boolean, index=True, default=False ) )
|
||||
|
||||
Sample.table = Table('sample', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "name", TrimmedString( 255 ), nullable=False ),
|
||||
Column( "desc", TEXT ),
|
||||
Column( "form_values_id", Integer, ForeignKey( "form_values.id" ), index=True ),
|
||||
Column( "request_id", Integer, ForeignKey( "request.id" ), index=True ),
|
||||
Column( "deleted", Boolean, index=True, default=False ) )
|
||||
|
||||
# new table to store all the possible sample states and the sample type it
|
||||
# belongs to
|
||||
SampleState.table = Table('sample_state', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "name", TrimmedString( 255 ), nullable=False ),
|
||||
Column( "desc", TEXT ),
|
||||
Column( "request_type_id", Integer, ForeignKey( "request_type.id" ), index=True ) )
|
||||
|
||||
SampleEvent.table = Table('sample_event', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "sample_id", Integer, ForeignKey( "sample.id" ), index=True ),
|
||||
Column( "sample_state_id", Integer, ForeignKey( "sample_state.id" ), index=True ),
|
||||
Column( "comment", TEXT ) )
|
||||
|
||||
|
||||
|
||||
# With the tables defined we can define the mappers and setup the
|
||||
# relationships between the model objects.
|
||||
|
||||
assign_mapper( context, Sample, Sample.table,
|
||||
properties=dict( events=relation( SampleEvent, backref="sample",
|
||||
order_by=desc(SampleEvent.table.c.update_time) ),
|
||||
) )
|
||||
|
||||
assign_mapper( context, FormValues, FormValues.table, properties=None)
|
||||
|
||||
assign_mapper( context, Request, Request.table, properties=None)
|
||||
|
||||
assign_mapper( context, RequestType, RequestType.table,
|
||||
properties=dict( states=relation( SampleState, backref="request_type",
|
||||
order_by=desc(SampleState.table.c.update_time) ),
|
||||
) )
|
||||
|
||||
assign_mapper( context, FormDefinition, FormDefinition.table, properties=None)
|
||||
|
||||
assign_mapper( context, FormDefinitionCurrent, FormDefinitionCurrent.table,
|
||||
properties=dict( forms=relation( FormDefinition, backref='form_definition_current',
|
||||
cascade="all, delete-orphan",
|
||||
primaryjoin=( FormDefinitionCurrent.table.c.id == FormDefinition.table.c.form_definition_current_id ) ),
|
||||
latest_form=relation( FormDefinition, post_update=True,
|
||||
primaryjoin=( FormDefinitionCurrent.table.c.latest_form_id == FormDefinition.table.c.id ) )
|
||||
) )
|
||||
|
||||
assign_mapper( context, SampleEvent, SampleEvent.table, properties=None)
|
||||
|
||||
assign_mapper( context, SampleState, SampleState.table,
|
||||
properties=None #dict( sample=relation( Sample, backref="sample" ),
|
||||
)# )
|
||||
|
||||
assign_mapper( context, ValidationError, ValidationError.table )
|
||||
|
||||
assign_mapper( context, HistoryDatasetAssociation, HistoryDatasetAssociation.table,
|
||||
@@ -590,6 +696,8 @@ assign_mapper( context, HistoryUserShareAssociation, HistoryUserShareAssociation
|
||||
assign_mapper( context, User, User.table,
|
||||
properties=dict( histories=relation( History, backref="user",
|
||||
order_by=desc(History.table.c.update_time) ),
|
||||
requests=relation( Request, backref="user",
|
||||
order_by=desc(Request.table.c.update_time) ),
|
||||
active_histories=relation( History, primaryjoin=( ( History.table.c.user_id == User.table.c.id ) & ( not_( History.table.c.deleted ) ) ), order_by=desc( History.table.c.update_time ) ),
|
||||
galaxy_sessions=relation( GalaxySession, order_by=desc( GalaxySession.table.c.update_time ) ),
|
||||
stored_workflow_menu_entries=relation( StoredWorkflowMenuEntry, backref="user",
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
from sqlalchemy import *
|
||||
from sqlalchemy.orm import *
|
||||
from sqlalchemy.exceptions import *
|
||||
from migrate import *
|
||||
from migrate.changeset import *
|
||||
|
||||
import datetime
|
||||
now = datetime.datetime.utcnow
|
||||
|
||||
import sys, logging
|
||||
log = logging.getLogger( __name__ )
|
||||
log.setLevel(logging.DEBUG)
|
||||
handler = logging.StreamHandler( sys.stdout )
|
||||
format = "%(name)s %(levelname)s %(asctime)s %(message)s"
|
||||
formatter = logging.Formatter( format )
|
||||
handler.setFormatter( formatter )
|
||||
log.addHandler( handler )
|
||||
|
||||
# Need our custom types, but don't import anything else from model
|
||||
from galaxy.model.custom_types import *
|
||||
|
||||
metadata = MetaData( migrate_engine )
|
||||
db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, transactional=False ) )
|
||||
|
||||
|
||||
FormDefinitionCurrent_table = Table('form_definition_current', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "latest_form_id", Integer,
|
||||
#ForeignKey( "form_definition.id", use_alter=True, name='form_definition_current_latest_form_id_fk'),
|
||||
index=True ),
|
||||
Column( "deleted", Boolean, index=True, default=False ))
|
||||
FormDefinition_table = Table('form_definition', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "name", TrimmedString( 255 ), nullable=False ),
|
||||
Column( "desc", TEXT ),
|
||||
Column( "form_definition_current_id", Integer, ForeignKey( "form_definition_current.id" ), index=True, nullable=False ),
|
||||
Column( "fields", JSONType()) )
|
||||
|
||||
FormValues_table = Table('form_values', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "form_definition_id", Integer, ForeignKey( "form_definition.id" ), index=True ),
|
||||
Column( "content", JSONType()) )
|
||||
|
||||
RequestType_table = Table('request_type', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "name", TrimmedString( 255 ), nullable=False ),
|
||||
Column( "desc", TEXT ),
|
||||
Column( "request_form_id", Integer, ForeignKey( "form_definition.id" ), index=True ),
|
||||
Column( "sample_form_id", Integer, ForeignKey( "form_definition.id" ), index=True ) )
|
||||
# request table
|
||||
Request_table = Table('request', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "name", TrimmedString( 255 ), nullable=False ),
|
||||
Column( "desc", TEXT ),
|
||||
Column( "form_values_id", Integer, ForeignKey( "form_values.id" ), index=True ),
|
||||
Column( "request_type_id", Integer, ForeignKey( "request_type.id" ), index=True ),
|
||||
Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True ),
|
||||
Column( "library_id", Integer, ForeignKey( "library.id" ), index=True ),
|
||||
Column( "deleted", Boolean, index=True, default=False ) )
|
||||
|
||||
Sample_table = Table('sample', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "name", TrimmedString( 255 ), nullable=False ),
|
||||
Column( "desc", TEXT ),
|
||||
Column( "form_values_id", Integer, ForeignKey( "form_values.id" ), index=True ),
|
||||
Column( "request_id", Integer, ForeignKey( "request.id" ), index=True ),
|
||||
Column( "deleted", Boolean, index=True, default=False ) )
|
||||
|
||||
SampleState_table = Table('sample_state', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "name", TrimmedString( 255 ), nullable=False ),
|
||||
Column( "desc", TEXT ),
|
||||
Column( "request_type_id", Integer, ForeignKey( "request_type.id" ), index=True ) )
|
||||
|
||||
SampleEvent_table = Table('sample_event', metadata,
|
||||
Column( "id", Integer, primary_key=True),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "sample_id", Integer, ForeignKey( "sample.id" ), index=True ),
|
||||
Column( "sample_state_id", Integer, ForeignKey( "sample_state.id" ), index=True ),
|
||||
Column( "comment", TEXT ) )
|
||||
|
||||
|
||||
|
||||
|
||||
def upgrade():
|
||||
# Load existing tables
|
||||
metadata.reflect()
|
||||
|
||||
# Add all of the new tables above
|
||||
# metadata.create_all()
|
||||
try:
|
||||
FormDefinitionCurrent_table.create()
|
||||
except Exception, e:
|
||||
log.debug( "Creating form_definition_current table failed: %s" % str( e ) )
|
||||
try:
|
||||
FormDefinition_table.create()
|
||||
except Exception, e:
|
||||
log.debug( "Creating form_definition table failed: %s" % str( e ) )
|
||||
# Add 1 foreign key constraint to the form_definition_current table
|
||||
if FormDefinitionCurrent_table and FormDefinition_table:
|
||||
try:
|
||||
cons = ForeignKeyConstraint( [FormDefinitionCurrent_table.c.latest_form_id],
|
||||
[FormDefinition_table.c.id],
|
||||
name='form_definition_current_latest_form_id_fk' )
|
||||
# Create the constraint
|
||||
cons.create()
|
||||
except Exception, e:
|
||||
log.debug( "Adding foreign key constraint 'form_definition_current_latest_form_id_fk' to table 'form_definition_current' failed: %s" % ( str( e ) ) )
|
||||
try:
|
||||
FormValues_table.create()
|
||||
except Exception, e:
|
||||
log.debug( "Creating form_values table failed: %s" % str( e ) )
|
||||
try:
|
||||
RequestType_table.create()
|
||||
except Exception, e:
|
||||
log.debug( "Creating request_type table failed: %s" % str( e ) )
|
||||
try:
|
||||
Request_table.create()
|
||||
except Exception, e:
|
||||
log.debug( "Creating request table failed: %s" % str( e ) )
|
||||
try:
|
||||
Sample_table.create()
|
||||
except Exception, e:
|
||||
log.debug( "Creating sample table failed: %s" % str( e ) )
|
||||
try:
|
||||
SampleState_table.create()
|
||||
except Exception, e:
|
||||
log.debug( "Creating sample_state table failed: %s" % str( e ) )
|
||||
try:
|
||||
SampleEvent_table.create()
|
||||
except Exception, e:
|
||||
log.debug( "Creating sample_event table failed: %s" % str( e ) )
|
||||
|
||||
|
||||
|
||||
def downgrade():
|
||||
# Load existing tables
|
||||
metadata.reflect()
|
||||
try:
|
||||
FormDefinition_table.drop()
|
||||
except Exception, e:
|
||||
log.debug( "Dropping form_definition table failed: %s" % str( e ) )
|
||||
try:
|
||||
FormDefinitionCurrent_table.drop()
|
||||
except Exception, e:
|
||||
log.debug( "Dropping form_definition_current table failed: %s" % str( e ) )
|
||||
try:
|
||||
FormValues_table.drop()
|
||||
except Exception, e:
|
||||
log.debug( "Dropping form_values table failed: %s" % str( e ) )
|
||||
try:
|
||||
Request_table.drop()
|
||||
except Exception, e:
|
||||
log.debug( "Dropping request table failed: %s" % str( e ) )
|
||||
try:
|
||||
RequestType_table.drop()
|
||||
except Exception, e:
|
||||
log.debug( "Dropping request_type table failed: %s" % str( e ) )
|
||||
try:
|
||||
Sample_table.drop()
|
||||
except Exception, e:
|
||||
log.debug( "Dropping sample table failed: %s" % str( e ) )
|
||||
try:
|
||||
SampleState_table.drop()
|
||||
except Exception, e:
|
||||
log.debug( "Dropping sample_state table failed: %s" % str( e ) )
|
||||
try:
|
||||
SampleEvent_table.drop()
|
||||
except Exception, e:
|
||||
log.debug( "Dropping sample_event table failed: %s" % str( e ) )
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ from datetime import datetime, timedelta
|
||||
from galaxy import util, datatypes
|
||||
from galaxy.web.base.controller import *
|
||||
from galaxy.model.orm import *
|
||||
import sys
|
||||
|
||||
import logging
|
||||
log = logging.getLogger( __name__ )
|
||||
@@ -2097,4 +2098,123 @@ class Admin( BaseController ):
|
||||
else:
|
||||
last_updated[job.id] = '%s minutes' % int( delta.seconds / 60 )
|
||||
return trans.fill_template( '/admin/jobs.mako', jobs = jobs, last_updated = last_updated, cutoff = cutoff, msg = msg, messagetype = messagetype )
|
||||
|
||||
|
||||
def _get_all_forms(self, trans, all_versions=False):
|
||||
'''
|
||||
This method returns all the latest forms from the
|
||||
form_definition_current table if all_versions is set to True. Otherwise
|
||||
this method return all the versions of all the forms from form_definition
|
||||
table
|
||||
'''
|
||||
if all_versions:
|
||||
return trans.app.model.FormDefinition.query().all()
|
||||
else:
|
||||
fdc_list = trans.app.model.FormDefinitionCurrent.query().all()
|
||||
return [fdc.latest_form for fdc in fdc_list]
|
||||
@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' )
|
||||
forms = self._get_all_forms(trans, all_versions=True)
|
||||
return trans.fill_template( '/admin/requests/manage_request_types.mako',
|
||||
request_types=trans.app.model.RequestType.query().all(),
|
||||
forms=forms,
|
||||
deleted=False,
|
||||
show_deleted=False,
|
||||
msg=msg,
|
||||
messagetype=messagetype )
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def 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) == 'True':
|
||||
return trans.fill_template( '/admin/requests/create_request_type.mako',
|
||||
forms=self._get_all_forms(trans, all_versions=False),
|
||||
msg=msg,
|
||||
messagetype=messagetype)
|
||||
elif params.get('add_states', False) == 'True':
|
||||
return trans.fill_template( '/admin/requests/add_states.mako',
|
||||
sample_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 )),
|
||||
msg=msg,
|
||||
messagetype=messagetype)
|
||||
elif params.get('save_new', False) == 'True':
|
||||
st, msg = self._save_request_type(trans, params, None)
|
||||
if not st:
|
||||
return trans.fill_template( '/admin/requests/create_request_type.mako',
|
||||
forms=self._get_all_forms(trans, all_versions=False),
|
||||
msg=msg,
|
||||
messagetype='error')
|
||||
return trans.fill_template( '/admin/requests/manage_request_types.mako',
|
||||
request_types=trans.app.model.RequestType.query().all(),
|
||||
forms=self._get_all_forms(trans, all_versions=True),
|
||||
deleted=False,
|
||||
show_deleted=False,
|
||||
msg=msg,
|
||||
messagetype=messagetype )
|
||||
elif params.get('edit', False) == 'True':
|
||||
rt = trans.app.model.RequestType.get(int(util.restore_text( params.id )))
|
||||
ss_list = trans.app.model.SampleState.filter(trans.app.model.SampleState.table.c.request_type_id == rt.id).all()
|
||||
return trans.fill_template( '/admin/requests/edit_request_type.mako',
|
||||
request_type=rt,
|
||||
forms=self._get_all_forms(trans, all_versions=False),
|
||||
states_list=ss_list,
|
||||
deleted=False,
|
||||
show_deleted=False,
|
||||
msg=msg,
|
||||
messagetype=messagetype )
|
||||
elif params.get('save_changes', False) == 'True':
|
||||
st = trans.app.model.SampleType.get(int(util.restore_text( params.id )))
|
||||
st, msg = self._save_sample_type(trans, params, st.id)
|
||||
if st:
|
||||
msg = "The sample type '%s' has been updated with the changes." % st.name
|
||||
messagetype = 'done'
|
||||
else:
|
||||
messagetype = 'error'
|
||||
ss_list = trans.app.model.SampleState.filter(trans.app.model.SampleState.table.c.sample_type_id == st.id).all()
|
||||
return trans.fill_template( '/admin/samples/edit_sample_type.mako',
|
||||
sample_type=st,
|
||||
forms=self._get_all_forms(trans, all_versions=False),
|
||||
states_list=ss_list,
|
||||
deleted=False,
|
||||
show_deleted=False,
|
||||
msg=msg,
|
||||
messagetype=messagetype )
|
||||
def _save_request_type(self, trans, params, request_type_id):
|
||||
num_states = int( params.get( 'num_states', 0 ) )
|
||||
proceed = True
|
||||
for i in range( num_states ):
|
||||
if not params.get( 'new_element_name_%i' % i, None ):
|
||||
proceed = False
|
||||
break
|
||||
if not proceed:
|
||||
msg = "All the state name(s) must be completed."
|
||||
return None, msg
|
||||
if not request_type_id: # create a new sample type to save
|
||||
rt = trans.app.model.RequestType()
|
||||
else: # use the existing sample type to save changes
|
||||
rt = trans.app.model.RequestType.get(request_type_id)
|
||||
rt.name = util.restore_text( params.name )
|
||||
rt.desc = util.restore_text( params.description ) or ""
|
||||
rt.request_form_id = int(util.restore_text( params.request_form_id ))
|
||||
rt.sample_form_id = int(util.restore_text( params.sample_form_id ))
|
||||
rt.flush()
|
||||
# set sample states
|
||||
ss_list = trans.app.model.SampleState.filter(trans.app.model.SampleState.table.c.request_type_id == rt.id).all()
|
||||
for ss in ss_list:
|
||||
ss.delete()
|
||||
ss.flush()
|
||||
for i in range( num_states ):
|
||||
name = params.get( 'new_element_name_%i' % i, None )
|
||||
desc = params.get( 'new_element_description_%i' % i, None )
|
||||
ss = trans.app.model.SampleState(name, desc, rt.id)
|
||||
ss.flush()
|
||||
msg = "The new sample type named '%s' with %s state(s) has been created" % (rt.name, num_states)
|
||||
return rt, msg
|
||||
|
||||
@@ -0,0 +1,323 @@
|
||||
from galaxy.web.base.controller import *
|
||||
from galaxy.model.orm import *
|
||||
from galaxy.datatypes import sniff
|
||||
from galaxy import util
|
||||
import logging, os, sys
|
||||
from galaxy.web.form_builder import *
|
||||
from galaxy.tools.parameters.basic import parameter_types
|
||||
from elementtree.ElementTree import XML, Element
|
||||
from galaxy.util.odict import odict
|
||||
import copy
|
||||
|
||||
log = logging.getLogger( __name__ )
|
||||
|
||||
|
||||
class Forms( BaseController ):
|
||||
@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' )
|
||||
return self._show_forms_list(trans, msg, messagetype)
|
||||
def _show_forms_list(self, trans, msg, messagetype):
|
||||
fdc_list = trans.app.model.FormDefinitionCurrent.query().all()
|
||||
return trans.fill_template( '/admin/forms/manage_forms.mako',
|
||||
fdc_list=fdc_list,
|
||||
deleted=False,
|
||||
show_deleted=False,
|
||||
msg=msg,
|
||||
messagetype=messagetype )
|
||||
def _get_all_forms(self, trans, all_versions=False):
|
||||
'''
|
||||
This method returns all the latest forms from the
|
||||
form_definition_current table if all_versions is set to True. Otherwise
|
||||
this method return all the versions of all the forms from form_definition
|
||||
table
|
||||
'''
|
||||
if all_versions:
|
||||
return trans.app.model.FormDefinition.query().all()
|
||||
else:
|
||||
fdc_list = trans.app.model.FormDefinitionCurrent.query().all()
|
||||
return [fdc.latest_form for fdc in fdc_list]
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def new( self, trans, **kwd ):
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
if params.get('new', False) and not params.get('create_form', False):
|
||||
self.current_form = {}
|
||||
self.current_form['name'] = 'New Form'
|
||||
self.current_form['desc'] = ''
|
||||
self.current_form['fields'] = []
|
||||
inputs = [ ( 'Name', TextField('name', 40,self.current_form['name'] ) ),
|
||||
( 'Description', TextField('description', 40, self.current_form['desc']) ) ]
|
||||
return trans.fill_template( '/admin/forms/create_form.mako',
|
||||
inputs=inputs,
|
||||
msg=msg,
|
||||
messagetype=messagetype )
|
||||
elif params.get('create_form', False) == 'True':
|
||||
if 'submitted' in params.new:
|
||||
self.num_add_fields = 0
|
||||
fd, msg = self.__save_form(trans, params)
|
||||
self.__get_saved_form(fd)
|
||||
return self._show_forms_list(trans, msg, messagetype)
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def edit( self, trans, **kwd ):
|
||||
'''
|
||||
This callback method is for handling all the editing functions like:
|
||||
remaning fields, adding/deleting fields, changing fields attributes
|
||||
'''
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
fd = trans.app.model.FormDefinition.get(int(util.restore_text( params.form_id )))
|
||||
# SHOW THE FORM FOR EDITING.
|
||||
if params.get('show_form', False) == 'True':
|
||||
self.__get_saved_form(fd)
|
||||
# the following two dicts store the unsaved select box options
|
||||
self.del_options = {}
|
||||
self.add_options = {}
|
||||
return self.__show(trans, params, fd)
|
||||
# DELETE FIELD
|
||||
elif params.get('remove_button', False):
|
||||
self.__update_current_form(params)
|
||||
index = int(params.get('remove_button', None).split(' ')[2])-1
|
||||
self.__remove_field(index)
|
||||
return self.__show(trans, params, fd)
|
||||
# SAVE CHANGES
|
||||
elif params.get('save_changes_button', False) == 'Save':
|
||||
self.__update_current_form(params)
|
||||
fd_new, msg = self.__save_form(trans, params, fd.form_definition_current.id)
|
||||
if not fd_new:
|
||||
return self.__show(trans, params, fd, msg, 'error')
|
||||
else:
|
||||
fd = fd_new
|
||||
msg = "The form '%s' has been updated with the changes." % fd.name
|
||||
return self.__show(trans, params, fd, msg)
|
||||
#ADD A FIELD
|
||||
elif params.get('add_field_button', False) == 'Add field':
|
||||
self.__update_current_form(params)
|
||||
self.__add_field()
|
||||
# show the form again with one empty field
|
||||
return self.__show(trans, params, fd)
|
||||
# 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 )
|
||||
# REFRESH PAGE, SelectField is selected/deselected as the type of a field
|
||||
elif params.get('refresh', False) == 'true':
|
||||
self.__update_current_form(params)
|
||||
return self.__show(trans, params, fd)
|
||||
# REMOVE SelectField OPTION
|
||||
elif params.get('select_box_options', False) == 'remove':
|
||||
#self.__update_current_form(params)
|
||||
index = int(params.get( 'field_index', None ))
|
||||
option = int(params.get( 'option_index', None ))
|
||||
del self.current_form['fields'][index]['selectlist'][option]
|
||||
return self.__show(trans, params, fd)
|
||||
# ADD SelectField OPTION
|
||||
elif params.get('select_box_options', False) == 'add':
|
||||
#self.__update_current_form(params)
|
||||
index = int(params.get( 'field_index', None ))
|
||||
self.current_form['fields'][index]['selectlist'].append('')
|
||||
return self.__show(trans, params, fd)
|
||||
def __remove_field(self, index):
|
||||
del self.current_form['fields'][index]
|
||||
def __add_field(self):
|
||||
'''
|
||||
add an empty field to the fields list
|
||||
'''
|
||||
empty_field = { 'label': '',
|
||||
'helptext': '',
|
||||
'visible': True,
|
||||
'required': False,
|
||||
'type': BaseField.form_field_types()[0],
|
||||
'selectlist': '' }
|
||||
self.current_form['fields'].append(empty_field)
|
||||
def __get_field(self, params, index):
|
||||
name = params.get( 'field_name_%i' % index, None )
|
||||
helptext = params.get( 'field_helptext_%i' % index, None )
|
||||
required = params.get( 'field_required_%i' % index, False )
|
||||
field_type = params.get( 'field_type_%i' % index, None )
|
||||
if field_type == 'SelectField':
|
||||
selectlist = self.__get_selectbox_options(params, index)
|
||||
else:
|
||||
selectlist = None
|
||||
return {'label': name,
|
||||
'helptext': helptext,
|
||||
'visible': True,
|
||||
'required': required,
|
||||
'type': field_type,
|
||||
'selectlist': selectlist }
|
||||
def __get_selectbox_options(self, params, index):
|
||||
'''
|
||||
This method gets all the options entered by the user for field when
|
||||
the fieldtype is SelectField
|
||||
'''
|
||||
ctr=0
|
||||
sb_options = []
|
||||
while True:
|
||||
option = params.get( 'field_'+str(index)+'_option_'+str(ctr), None )
|
||||
ctr = ctr+1
|
||||
if option:
|
||||
sb_options.append(option)
|
||||
else:
|
||||
return sb_options
|
||||
def __get_saved_form(self, fd):
|
||||
self.current_form = {}
|
||||
self.current_form['name'] = fd.name
|
||||
self.current_form['desc'] = fd.desc
|
||||
self.current_form['fields'] = list(copy.deepcopy(fd.fields))
|
||||
def __validate_form(self, params):
|
||||
'''
|
||||
This method checks the following text inputs are filled out by the user
|
||||
- the name of form
|
||||
- name of all the fields
|
||||
'''
|
||||
# form name
|
||||
if not util.restore_text( params.name ):
|
||||
return None, 'Form name must be filled.'
|
||||
# fields
|
||||
for i in range( len(self.current_form['fields']) ):
|
||||
if not params.get( 'field_name_%i' % i, None ):
|
||||
return None, "All the field label(s) must be completed."
|
||||
return True, ''
|
||||
def __get_form(self, params):
|
||||
name = util.restore_text( params.name )
|
||||
desc = util.restore_text( params.description ) or ""
|
||||
# set form fields
|
||||
fields = []
|
||||
for i in range( len(self.current_form['fields']) ):
|
||||
fields.append(self.__get_field(params, i))
|
||||
fields = fields
|
||||
return name, desc, fields
|
||||
def __update_current_form(self, params):
|
||||
name, desc, fields = self.__get_form(params)
|
||||
self.current_form = {}
|
||||
self.current_form['name'] = name
|
||||
self.current_form['desc'] = desc
|
||||
self.current_form['fields'] = fields
|
||||
|
||||
def __save_form(self, trans, params, fdc_id=None):
|
||||
'''
|
||||
This method saves the current form
|
||||
'''
|
||||
# check the form for invalid inputs
|
||||
flag, msg = self.__validate_form(params)
|
||||
if not flag:
|
||||
return None, msg
|
||||
fd = trans.app.model.FormDefinition()
|
||||
fd.name, fd.desc, fd.fields = self.__get_form(params)
|
||||
if fdc_id: # save changes to the existing form
|
||||
# change the pointer in the form_definition_current table to point
|
||||
# to this new record
|
||||
fdc = trans.app.model.FormDefinitionCurrent.get(fdc_id)
|
||||
else: # create a new form
|
||||
fdc = trans.app.model.FormDefinitionCurrent()
|
||||
# create corresponding row in the form_definition_current table
|
||||
fd.form_definition_current = fdc
|
||||
fdc.latest_form = fd
|
||||
trans.sa_session.save_or_update( fdc )
|
||||
trans.sa_session.flush()
|
||||
msg = "The new form named '%s' has been created. " % (fd.name)
|
||||
request_types = trans.app.model.RequestType.query().all()
|
||||
if not request_types:
|
||||
msg = msg + "Now you can create requests to associate with this form."
|
||||
return fd, msg
|
||||
|
||||
class FieldUI(object):
|
||||
def __init__(self, index, field=None, field_type=None):
|
||||
'''
|
||||
This method returns a list of widgets which describes a field. This
|
||||
includes label, helptext, type, & required/optional
|
||||
'''
|
||||
self.index = index
|
||||
self.label = TextField('field_name_'+str(index), 40, '')
|
||||
self.helptext = TextField('field_helptext_'+str(index), 40, '')
|
||||
self.fieldtype = SelectField('field_type_'+str(index),
|
||||
refresh_on_change=True,
|
||||
refresh_on_change_values=['SelectField'])
|
||||
self.selectbox_options = []
|
||||
for ft in BaseField.form_field_types():
|
||||
self.fieldtype.add_option(ft, ft)
|
||||
self.required = SelectField('field_required_'+str(index), display='radio')
|
||||
self.required.add_option('Required', 'true')
|
||||
self.required.add_option('Optional', 'true', selected=True)
|
||||
if field:
|
||||
self.fill(field, field_type)
|
||||
def fill(self, field, field_type=None):
|
||||
# label
|
||||
self.label.value = field['label']
|
||||
# helptext
|
||||
self.helptext.value = field['helptext']
|
||||
# type
|
||||
self.fieldtype = SelectField('field_type_'+str(self.index),
|
||||
refresh_on_change=True,
|
||||
refresh_on_change_values=['SelectField'])
|
||||
if field_type:
|
||||
field['type'] = unicode(field_type)
|
||||
if field_type == 'SelectField' and not field['selectlist']:
|
||||
field['selectlist'] = ['', '']
|
||||
for ft in BaseField.form_field_types():
|
||||
if ft == field['type']:
|
||||
self.fieldtype.add_option(ft, ft, selected=True)
|
||||
if ft == 'SelectField':
|
||||
self.selectbox_ui(field)
|
||||
else:
|
||||
self.fieldtype.add_option(ft, ft)
|
||||
# required/optional
|
||||
if field['required']:
|
||||
self.required = SelectField('required_'+str(self.index), display='radio')
|
||||
self.required.add_option('Required', 'true', selected=True)
|
||||
self.required.add_option('Optional', 'true')
|
||||
def selectbox_ui(self, field):
|
||||
self.selectbox_options = []
|
||||
if field['selectlist']:
|
||||
for ctr, option in enumerate(field['selectlist']):
|
||||
self.selectbox_options.append(('Option '+str(ctr+1),
|
||||
TextField('field_'+str(self.index)+'_option_'+str(ctr),
|
||||
40, option)))
|
||||
def get(self):
|
||||
return [( 'Label', self.label ),
|
||||
( 'Help text', self.helptext ),
|
||||
( 'Type', self.fieldtype, self.selectbox_options),
|
||||
( '', self.required)]
|
||||
def __repr__(self):
|
||||
return str(self.index)+'.'+self.label
|
||||
def label(self):
|
||||
return str(self.index)+'.'+self.label
|
||||
|
||||
def __show(self, trans, params, form, msg=None, messagetype='done'):
|
||||
'''
|
||||
This method displays the form and any of the changes made to it
|
||||
'''
|
||||
# name & description
|
||||
form_details = [ ( 'Name', TextField('name', 40, self.current_form['name']) ),
|
||||
( 'Description', TextField('description', 40, self.current_form['desc']) ) ]
|
||||
# fields
|
||||
field_details = []
|
||||
for index, field in enumerate(self.current_form['fields']):
|
||||
field_ui = self.FieldUI(index, field)
|
||||
field_details.append( field_ui.get() )
|
||||
return trans.fill_template( '/admin/forms/edit_form.mako',
|
||||
form_details=form_details,
|
||||
field_details=field_details,
|
||||
form=form,
|
||||
field_types=BaseField.form_field_types(),
|
||||
msg=msg,
|
||||
messagetype=messagetype )
|
||||
@@ -0,0 +1,429 @@
|
||||
from galaxy.web.base.controller import *
|
||||
from galaxy.web.framework.helpers import time_ago, iff, grids
|
||||
from galaxy.model.orm import *
|
||||
from galaxy.datatypes import sniff
|
||||
from galaxy import util
|
||||
from galaxy.util.streamball import StreamBall
|
||||
import logging, tempfile, zipfile, tarfile, os, sys
|
||||
from galaxy.web.form_builder import *
|
||||
|
||||
log = logging.getLogger( __name__ )
|
||||
|
||||
# States for passing messages
|
||||
SUCCESS, INFO, WARNING, ERROR = "done", "info", "warning", "error"
|
||||
|
||||
class RequestsListGrid( grids.Grid ):
|
||||
title = "Requests"
|
||||
model_class = model.Request
|
||||
default_sort_key = "-create_time"
|
||||
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="samples", id=item.id ) ) ), ),
|
||||
grids.GridColumn( "Type", key="request_type_id", method='get_request_type'),
|
||||
grids.GridColumn( "Last update", key="update_time", format=time_ago )
|
||||
]
|
||||
operations = [
|
||||
# grids.GridOperation( "Edit", allow_multiple=False, condition=( lambda item: not item.deleted ) ),
|
||||
grids.GridOperation( "Samples", allow_multiple=False, condition=( lambda item: not item.deleted ) ),
|
||||
# grids.GridOperation( "Delete", condition=( lambda item: not item.deleted ) ),
|
||||
# grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ) ),
|
||||
]
|
||||
standard_filters = [
|
||||
grids.GridColumnFilter( "Active", args=dict( deleted=False ) ),
|
||||
grids.GridColumnFilter( "Deleted", args=dict( deleted=True ) ),
|
||||
grids.GridColumnFilter( "All", args=dict( deleted='All' ) )
|
||||
]
|
||||
#default_filter = dict( deleted=False )
|
||||
def get_current_item( self, trans ):
|
||||
return None
|
||||
def get_request_type(self, trans, request):
|
||||
request_type = trans.app.model.RequestType.get(request.request_type_id)
|
||||
return request_type.name
|
||||
def apply_default_filter( self, trans, query ):
|
||||
return query.filter_by( user=trans.user )
|
||||
def number_of_samples(self, trans, request):
|
||||
return str(len(trans.app.model.Sample.filter(trans.app.model.Sample.table.c.request_id==request.id).all()))
|
||||
|
||||
class SamplesListGrid( grids.Grid ):
|
||||
model_class = model.Sample
|
||||
default_sort_key = "-create_time"
|
||||
columns = [
|
||||
grids.GridColumn( "Name", key="name",
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="show_sample", id=item.id ) ) ),
|
||||
attach_popup=True ),
|
||||
grids.GridColumn( "Description", key='desc' ),
|
||||
grids.GridColumn( "Status", method="get_status",
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="events", id=item.id ) ) )),
|
||||
|
||||
grids.GridColumn( "Last update", key="update_time", format=time_ago )
|
||||
|
||||
# Valid for filtering but invisible
|
||||
#grids.GridColumn( "Deleted", key="deleted", visible=False )
|
||||
]
|
||||
operations = [
|
||||
# grids.GridOperation( "Edit", allow_multiple=False, condition=( lambda item: not item.deleted ) ),
|
||||
# grids.GridOperation( "Delete", condition=( lambda item: not item.deleted ) ),
|
||||
# grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ) ),
|
||||
|
||||
]
|
||||
standard_filters = [
|
||||
grids.GridColumnFilter( "Active", args=dict( deleted=False ) ),
|
||||
grids.GridColumnFilter( "Deleted", args=dict( deleted=True ) ),
|
||||
grids.GridColumnFilter( "All", args=dict( deleted='All' ) )
|
||||
]
|
||||
def __init__(self, request):
|
||||
self.request = request
|
||||
def get_current_item( self, trans ):
|
||||
return None
|
||||
def apply_default_filter( self, trans, query ):
|
||||
return query.filter_by( request_id=self.request.id )
|
||||
def get_status(self, trans, sample):
|
||||
all_states = trans.app.model.SampleEvent.filter(trans.app.model.SampleEvent.table.c.sample_id == sample.id).all()
|
||||
curr_state = trans.app.model.SampleState.get(all_states[len(all_states)-1].sample_state_id)
|
||||
return curr_state.name
|
||||
|
||||
class Requests( BaseController ):
|
||||
request_grid = RequestsListGrid()
|
||||
|
||||
@web.expose
|
||||
def index( self, trans ):
|
||||
return trans.fill_template( "requests/index.mako" )
|
||||
def get_authorized_libs(self, trans):
|
||||
all_libraries = trans.app.model.Library.filter(trans.app.model.Library.table.c.deleted == False).order_by(trans.app.model.Library.name).all()
|
||||
authorized_libraries = []
|
||||
for library in all_libraries:
|
||||
if trans.app.security_agent.allow_action(trans.user, trans.app.security_agent.permitted_actions.LIBRARY_ADD, library_item=library) or trans.app.security_agent.allow_action(trans.user, trans.app.security_agent.permitted_actions.LIBRARY_MODIFY, library_item=library) or trans.app.security_agent.allow_action(trans.user, trans.app.security_agent.permitted_actions.LIBRARY_MANAGE, library_item=library) or trans.app.security_agent.check_folder_contents(trans.user, library) or trans.app.security_agent.show_library_item(trans.user, library):
|
||||
authorized_libraries.append(library)
|
||||
return authorized_libraries
|
||||
@web.expose
|
||||
def list( self, trans, **kwargs ):
|
||||
'''
|
||||
List all request made by the current user
|
||||
'''
|
||||
status = message = None
|
||||
if 'operation' in kwargs:
|
||||
operation = kwargs['operation'].lower()
|
||||
if operation == "show_request":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.show_read_only(trans, id)
|
||||
elif operation == "samples":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.show_samples(trans, id, kwargs)
|
||||
elif operation == "show_sample":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.show_sample_read_only(trans, id)
|
||||
elif operation == "events":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.show_events(trans, id)
|
||||
# Render the list view
|
||||
return self.request_grid( trans, status=status, message=message, template='/requests/grid.mako', **kwargs )
|
||||
def show_samples(self, trans, id, kwargs):
|
||||
'''
|
||||
Shows all the samples associated with this request
|
||||
'''
|
||||
status = message = None
|
||||
request = trans.app.model.Request.get(id)
|
||||
self.samples_grid = SamplesListGrid(request)
|
||||
return self.samples_grid( trans, status=status, message=message, template='/sample/grid.mako', **kwargs )
|
||||
def show_read_only(self, trans, id):
|
||||
'''
|
||||
Shows the request details
|
||||
'''
|
||||
request = trans.app.model.Request.get(id)
|
||||
request_type = trans.app.model.RequestType.get(request.request_type_id)
|
||||
request_form = trans.app.model.FormDefinition.get(request_type.request_form_id)
|
||||
request_values = trans.app.model.FormValues.get(request.form_values_id)
|
||||
libraries = self.get_authorized_libs(trans)
|
||||
# list of widgets to be rendered on the request form
|
||||
request_details = []
|
||||
# main details
|
||||
request_details.append(dict(label='Name',
|
||||
value=request.name,
|
||||
helptext=''))
|
||||
request_details.append(dict(label='Description',
|
||||
value=request.desc,
|
||||
helptext=''))
|
||||
request_details.append(dict(label='Type',
|
||||
value=request_type.name,
|
||||
helptext=''))
|
||||
request_details.append(dict(label='Date created',
|
||||
value=request.create_time,
|
||||
helptext=''))
|
||||
request_details.append(dict(label='Date updated',
|
||||
value=request.create_time,
|
||||
helptext=''))
|
||||
request_details.append(dict(label='User',
|
||||
value=str(trans.user.email),
|
||||
helptext=''))
|
||||
# library associated
|
||||
request_details.append(dict(label='Library',
|
||||
value=trans.app.model.Library.get(request.library_id).name,
|
||||
helptext='Associated library where the resultant \
|
||||
dataset will be stored'))
|
||||
# form fields
|
||||
for field in request_form.fields:
|
||||
if field['required']:
|
||||
req = 'Required'
|
||||
else:
|
||||
req = 'Optional'
|
||||
request_details.append(dict(label=field['label'],
|
||||
value=request_values.content[field['label']],
|
||||
helptext=field['helptext']+' ('+req+')'))
|
||||
return trans.fill_template( '/requests/view_request.mako',
|
||||
request_form_id=request_form.id,
|
||||
request_details=request_details,
|
||||
request_type=request_type)
|
||||
@web.expose
|
||||
def new(self, trans, **kwd):
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
if params.get('select_request_type', False) == 'True':
|
||||
return trans.fill_template( '/requests/select_request_type.mako',
|
||||
request_types=trans.app.model.RequestType.query().all(),
|
||||
libraries=self.get_authorized_libs(trans),
|
||||
msg=msg,
|
||||
messagetype=messagetype )
|
||||
elif params.get('create', False) == 'True':
|
||||
request_type_id = int(util.restore_text( params.request_type_id ))
|
||||
return self.__show_request_form(trans, params, request_type_id)
|
||||
elif params.get('save', False) == 'True':
|
||||
request = self.__save(trans, params)
|
||||
msg = 'The new request named %s has been created' % request.name
|
||||
request_type_id = int(util.restore_text( params.request_type_id ))
|
||||
return trans.response.send_redirect( web.url_for( controller='requests',
|
||||
action='list',
|
||||
msg=msg ,
|
||||
messagetype='done') )
|
||||
return self.__show_request_form(trans, params, request_type_id, request=request)
|
||||
def __save(self, trans, params, request_id=None):
|
||||
'''
|
||||
This method save a new request if request_id is None.
|
||||
'''
|
||||
if not request_id:
|
||||
request_type_id = int(util.restore_text( params.request_type_id ))
|
||||
request_form_id = trans.app.model.RequestType.get(request_type_id).request_form_id
|
||||
request_form = trans.app.model.FormDefinition.get(request_form_id)
|
||||
else:
|
||||
request = trans.app.model.Request.get(request_id)
|
||||
form_values = trans.app.model.FormValues.get(request.form_values_id)
|
||||
request_form = trans.app.model.FormDefinition.get(form_values.request_form_id)
|
||||
name = params.get('name', '')
|
||||
desc = params.get('desc', '')
|
||||
library_id = params.get('library', '')
|
||||
values = {}
|
||||
for field in request_form.fields:
|
||||
values[field['label']] = params.get(field['label'], '')
|
||||
if not request_id:
|
||||
form_values = trans.app.model.FormValues(request_form_id, values)
|
||||
form_values.flush()
|
||||
request = trans.app.model.Request(name, desc, request_type_id,
|
||||
trans.user.id, form_values.id,
|
||||
library_id)
|
||||
request.flush()
|
||||
else:
|
||||
form_values.content = values
|
||||
form_values.flush()
|
||||
return request
|
||||
def __show_request_form(self, trans, params, request_type_id, request=None):
|
||||
request_type = trans.app.model.RequestType.get(request_type_id)
|
||||
request_form_id = request_type.request_form_id
|
||||
if request:
|
||||
form_values = trans.app.model.FormValues.get(request.form_values_id)
|
||||
else:
|
||||
form_values = None
|
||||
# list of widgets to be rendered on the request form
|
||||
widgets = []
|
||||
widgets.append(dict(label='Name',
|
||||
widget=TextField('name'),
|
||||
helptext='(Required)'))
|
||||
widgets.append(dict(label='Description',
|
||||
widget=TextField('desc'),
|
||||
helptext='(Optional)'))
|
||||
widgets[0]['widget'].set_size(40)
|
||||
widgets[1]['widget'].set_size(40)
|
||||
# libraries selectbox
|
||||
libraries = self.get_authorized_libs(trans)
|
||||
lib_list = SelectField('library')
|
||||
for lib in libraries:
|
||||
lib_list.add_option(lib.name, lib.id)
|
||||
widgets.append(dict(label='Library',
|
||||
widget=lib_list,
|
||||
helptext='Associated library where the resultant \
|
||||
dataset will be stored'))
|
||||
widgets = self.__create_form(trans, params, request_form_id, widgets, form_values)
|
||||
title = 'Add a new request of type: %s' % request_type.name
|
||||
return trans.fill_template( '/requests/new_request.mako',
|
||||
request_form_id=request_form_id,
|
||||
request_type=request_type,
|
||||
widgets=widgets,
|
||||
title=title)
|
||||
|
||||
def __create_form(self, trans, params, form_id, widgets=[], form_values=None):
|
||||
form = trans.app.model.FormDefinition.get(form_id)
|
||||
if not form_values:
|
||||
values = {}
|
||||
for field in form.fields:
|
||||
if field['type'] in ['SelectField' or 'CheckBoxField']:
|
||||
values[field['label']] = False
|
||||
else:
|
||||
values[field['label']] = ''
|
||||
else:
|
||||
values = form_values.content
|
||||
# form fields
|
||||
for field in form.fields:
|
||||
fw = eval(field['type'])(field['label'])
|
||||
if field['type'] == 'TextField':
|
||||
fw.set_size(40)
|
||||
fw.value = values[field['label']]
|
||||
elif field['type'] == 'TextArea':
|
||||
fw.set_size(3, 40)
|
||||
fw.value = values[field['label']]
|
||||
elif field['type'] == 'SelectField':
|
||||
for option in field['selectlist']:
|
||||
fw.add_option(option, option, values[field['label']])
|
||||
elif field['type'] == 'CheckBoxField':
|
||||
fw.checked = values[field['label']]
|
||||
|
||||
if field['required']:
|
||||
req = 'Required'
|
||||
else:
|
||||
req = 'Optional'
|
||||
widgets.append(dict(label=field['label'],
|
||||
widget=fw,
|
||||
helptext=field['helptext']+' ('+req+')'))
|
||||
return widgets
|
||||
@web.expose
|
||||
def add_sample(self, trans, **kwd):
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
request_id = int(util.restore_text( params.get( 'id', '' ) ))
|
||||
return self.__show_sample_form(trans, params, request_id)
|
||||
|
||||
def __show_sample_form(self, trans, params, request_id, sample=None):
|
||||
request = trans.app.model.Request.get(request_id)
|
||||
request_type = trans.app.model.RequestType.get(request.request_type_id)
|
||||
sample_form_id = request_type.sample_form_id
|
||||
if sample:
|
||||
form_values = trans.app.model.FormValues.get(sample.form_values_id)
|
||||
else:
|
||||
form_values = None
|
||||
# list of widgets to be rendered on the request form
|
||||
widgets = []
|
||||
widgets.append(dict(label='Name',
|
||||
widget=TextField('name'),
|
||||
helptext='(Required)'))
|
||||
widgets.append(dict(label='Description',
|
||||
widget=TextField('desc'),
|
||||
helptext='(Optional)'))
|
||||
widgets[0]['widget'].set_size(40)
|
||||
widgets[1]['widget'].set_size(40)
|
||||
widgets = self.__create_form(trans, params, sample_form_id, widgets, form_values)
|
||||
title = 'Add a new sample to request: %s of type: %s' % (request.name, request_type.name)
|
||||
return trans.fill_template( '/sample/new_sample.mako',
|
||||
sample_form_id=sample_form_id,
|
||||
request_id=request.id,
|
||||
widgets=widgets,
|
||||
title=title)
|
||||
@web.expose
|
||||
def samples(self, trans, **kwd):
|
||||
params = util.Params( kwd )
|
||||
if params.get('save', False) == 'True':
|
||||
sample = self.__save_sample(trans, params)
|
||||
return trans.response.send_redirect( web.url_for( controller='requests',
|
||||
action='list',
|
||||
operation='samples',
|
||||
id=trans.security.encode_id(sample.request_id)) )
|
||||
def __save_sample(self, trans, params, sample_id=None):
|
||||
if not sample_id:
|
||||
request = trans.app.model.Request.get(int(util.restore_text( params.request_id )))
|
||||
request_type = trans.app.model.RequestType.get(request.request_type_id)
|
||||
sample_form = trans.app.model.FormDefinition.get(request_type.sample_form_id)
|
||||
else:
|
||||
sample = trans.app.model.Sample.get(sample_id)
|
||||
form_data = trans.app.model.FormData.get(sample.form_data_id)
|
||||
form = trans.app.model.FormDefinition.get(form_data.form_definition_id)
|
||||
name = params.get('name', '')
|
||||
desc = params.get('desc', '')
|
||||
values = {}
|
||||
for field in sample_form.fields:
|
||||
values[field['label']] = params.get(field['label'], '')
|
||||
if not sample_id:
|
||||
form_values = trans.app.model.FormValues(sample_form.id, values)
|
||||
form_values.flush()
|
||||
sample = trans.app.model.Sample(name, desc, request.id, form_values.id)
|
||||
sample.flush()
|
||||
# set the initial state
|
||||
state = trans.app.model.SampleState.filter(trans.app.model.SampleState.table.c.request_type_id == request_type.id).first()
|
||||
event = trans.app.model.SampleEvent(sample.id, state.id)
|
||||
event.flush()
|
||||
else:
|
||||
form_data.content = values
|
||||
form_data.flush()
|
||||
return sample
|
||||
def show_sample_read_only(self, trans, sample_id):
|
||||
'''
|
||||
Shows the sample details
|
||||
'''
|
||||
sample = trans.app.model.Sample.get(sample_id)
|
||||
request = trans.app.model.Request.get(sample.request_id)
|
||||
request_type = trans.app.model.RequestType.get(request.request_type_id)
|
||||
sample_form = trans.app.model.FormDefinition.get(request_type.sample_form_id)
|
||||
sample_values = trans.app.model.FormValues.get(sample.form_values_id)
|
||||
# list of widgets to be rendered on the request form
|
||||
sample_details = []
|
||||
# main details
|
||||
sample_details.append(dict(label='Name',
|
||||
value=sample.name,
|
||||
helptext=''))
|
||||
sample_details.append(dict(label='Description',
|
||||
value=sample.desc,
|
||||
helptext=''))
|
||||
sample_details.append(dict(label='Date created',
|
||||
value=sample.create_time,
|
||||
helptext=''))
|
||||
sample_details.append(dict(label='Date updated',
|
||||
value=sample.create_time,
|
||||
helptext=''))
|
||||
sample_details.append(dict(label='User',
|
||||
value=str(trans.user.email),
|
||||
helptext=''))
|
||||
sample_details.append(dict(label='Request',
|
||||
value=request.name,
|
||||
helptext='Name/ID of the request this sample belongs to.'))
|
||||
# get the current state of the sample
|
||||
all_states = trans.app.model.SampleEvent.filter(trans.app.model.SampleEvent.table.c.sample_id == sample_id).all()
|
||||
curr_state = trans.app.model.SampleState.get(all_states[len(all_states)-1].sample_state_id)
|
||||
sample_details.append(dict(label='State',
|
||||
value=curr_state.name,
|
||||
helptext=curr_state.desc))
|
||||
# form fields
|
||||
for field in sample_form.fields:
|
||||
if field['required']:
|
||||
req = 'Required'
|
||||
else:
|
||||
req = 'Optional'
|
||||
sample_details.append(dict(label=field['label'],
|
||||
value=sample_values.content[field['label']],
|
||||
helptext=field['helptext']+' ('+req+')'))
|
||||
return trans.fill_template( '/sample/view_sample.mako',
|
||||
sample_details=sample_details)
|
||||
def show_events(self, trans, sample_id):
|
||||
sample = trans.app.model.Sample.get(sample_id)
|
||||
events_list = []
|
||||
for event in trans.app.model.SampleEvent.filter(trans.app.model.SampleEvent.table.c.sample_id == sample_id).all():
|
||||
state = trans.app.model.SampleState.get(event.sample_state_id)
|
||||
events_list.append((state.name, event.update_time, state.desc, event.comment))
|
||||
return trans.fill_template( '/sample/sample_events.mako',
|
||||
events_list=events_list,
|
||||
sample_name=sample.name,
|
||||
request=trans.app.model.Request.get(sample.request_id).name)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,315 @@
|
||||
from galaxy.web.base.controller import *
|
||||
from galaxy.web.framework.helpers import time_ago, iff, grids
|
||||
from galaxy.model.orm import *
|
||||
from galaxy.datatypes import sniff
|
||||
from galaxy import util
|
||||
from galaxy.util.streamball import StreamBall
|
||||
import logging, tempfile, zipfile, tarfile, os, sys
|
||||
from galaxy.web.form_builder import *
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
log = logging.getLogger( __name__ )
|
||||
|
||||
|
||||
# States for passing messages
|
||||
SUCCESS, INFO, WARNING, ERROR = "done", "info", "warning", "error"
|
||||
|
||||
class RequestsListGrid( grids.Grid ):
|
||||
title = "Requests"
|
||||
model_class = model.Request
|
||||
default_sort_key = "-create_time"
|
||||
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="samples", 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( "User", key="user_id", method='get_user')
|
||||
|
||||
]
|
||||
operations = [
|
||||
# grids.GridOperation( "Edit", allow_multiple=False, condition=( lambda item: not item.deleted ) ),
|
||||
grids.GridOperation( "Samples", allow_multiple=False, condition=( lambda item: not item.deleted ) ),
|
||||
# grids.GridOperation( "Delete", condition=( lambda item: not item.deleted ) ),
|
||||
# grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ) ),
|
||||
]
|
||||
standard_filters = [
|
||||
grids.GridColumnFilter( "Active", args=dict( deleted=False ) ),
|
||||
grids.GridColumnFilter( "Deleted", args=dict( deleted=True ) ),
|
||||
grids.GridColumnFilter( "All", args=dict( deleted='All' ) )
|
||||
]
|
||||
def get_user(self, trans, request):
|
||||
return 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.app.model.RequestType.get(request.request_type_id)
|
||||
return request_type.name
|
||||
def apply_default_filter( self, trans, query ):
|
||||
return query
|
||||
def number_of_samples(self, trans, request):
|
||||
return str(len(trans.app.model.Sample.filter(trans.app.model.Sample.table.c.request_id==request.id).all()))
|
||||
|
||||
class SamplesListGrid( grids.Grid ):
|
||||
model_class = model.Sample
|
||||
default_sort_key = "-create_time"
|
||||
columns = [
|
||||
grids.GridColumn( "Name", key="name",
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="show_sample", id=item.id ) ) ),
|
||||
attach_popup=True ),
|
||||
grids.GridColumn( "Description", key='desc' ),
|
||||
grids.GridColumn( "Status", method="get_status",
|
||||
link=( lambda item: iff( item.deleted, None, dict( operation="events", id=item.id ) ) )),
|
||||
|
||||
grids.GridColumn( "Last update", key="update_time", format=time_ago )
|
||||
|
||||
# Valid for filtering but invisible
|
||||
#grids.GridColumn( "Deleted", key="deleted", visible=False )
|
||||
]
|
||||
operations = [
|
||||
# grids.GridOperation( "Edit", allow_multiple=False, condition=( lambda item: not item.deleted ) ),
|
||||
grids.GridOperation( "Change state", condition=( lambda item: not item.deleted ) ),
|
||||
# grids.GridOperation( "Delete", condition=( lambda item: not item.deleted ) ),
|
||||
# grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ) ),
|
||||
|
||||
]
|
||||
standard_filters = [
|
||||
grids.GridColumnFilter( "Active", args=dict( deleted=False ) ),
|
||||
grids.GridColumnFilter( "Deleted", args=dict( deleted=True ) ),
|
||||
grids.GridColumnFilter( "All", args=dict( deleted='All' ) )
|
||||
]
|
||||
def __init__(self, request, user):
|
||||
self.request = request
|
||||
self.user = user
|
||||
def get_current_item( self, trans ):
|
||||
return None
|
||||
def apply_default_filter( self, trans, query ):
|
||||
return query.filter_by( request_id=self.request.id )
|
||||
def get_status(self, trans, sample):
|
||||
all_states = trans.app.model.SampleEvent.filter(trans.app.model.SampleEvent.table.c.sample_id == sample.id).all()
|
||||
curr_state = trans.app.model.SampleState.get(all_states[len(all_states)-1].sample_state_id)
|
||||
return curr_state.name
|
||||
|
||||
class Requests( BaseController ):
|
||||
request_grid = RequestsListGrid()
|
||||
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def index( self, trans ):
|
||||
return trans.fill_template( "/admin/requests/index.mako" )
|
||||
def get_authorized_libs(self, trans):
|
||||
all_libraries = trans.app.model.Library.filter(trans.app.model.Library.table.c.deleted == False).order_by(trans.app.model.Library.name).all()
|
||||
authorized_libraries = []
|
||||
for library in all_libraries:
|
||||
if trans.app.security_agent.allow_action(trans.user, trans.app.security_agent.permitted_actions.LIBRARY_ADD, library_item=library) or trans.app.security_agent.allow_action(trans.user, trans.app.security_agent.permitted_actions.LIBRARY_MODIFY, library_item=library) or trans.app.security_agent.allow_action(trans.user, trans.app.security_agent.permitted_actions.LIBRARY_MANAGE, library_item=library) or trans.app.security_agent.check_folder_contents(trans.user, library) or trans.app.security_agent.show_library_item(trans.user, library):
|
||||
authorized_libraries.append(library)
|
||||
return authorized_libraries
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def list( self, trans, **kwargs ):
|
||||
'''
|
||||
List all request made by the current user
|
||||
'''
|
||||
status = message = None
|
||||
if 'operation' in kwargs:
|
||||
operation = kwargs['operation'].lower()
|
||||
if operation == "show_request":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.show_read_only(trans, id)
|
||||
elif operation == "samples":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.show_samples(trans, id, kwargs)
|
||||
elif operation == "show_sample":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.show_sample_read_only(trans, id)
|
||||
elif operation == "change state":
|
||||
id_list = [trans.security.decode_id(id) for id in util.listify(kwargs['id'])]
|
||||
return self.change_state(trans, id_list)
|
||||
elif operation == "events":
|
||||
id = trans.security.decode_id(kwargs['id'])
|
||||
return self.show_events(trans, id)
|
||||
# Render the list view
|
||||
return self.request_grid( trans, status=status, message=message, template='/admin/requests/grid.mako', **kwargs )
|
||||
def show_samples(self, trans, id, kwargs):
|
||||
'''
|
||||
Shows all the samples associated with this request
|
||||
'''
|
||||
status = message = None
|
||||
request = trans.app.model.Request.get(id)
|
||||
self.samples_grid = SamplesListGrid(request, trans.app.model.User.get(request.user_id))
|
||||
return self.samples_grid( trans, status=status, message=message, template='/admin/samples/grid.mako', **kwargs )
|
||||
def show_read_only(self, trans, id):
|
||||
'''
|
||||
Shows the request details
|
||||
'''
|
||||
request = trans.app.model.Request.get(id)
|
||||
request_type = trans.app.model.RequestType.get(request.request_type_id)
|
||||
request_form = trans.app.model.FormDefinition.get(request_type.request_form_id)
|
||||
request_values = trans.app.model.FormValues.get(request.form_values_id)
|
||||
libraries = self.get_authorized_libs(trans)
|
||||
# list of widgets to be rendered on the request form
|
||||
request_details = []
|
||||
# main details
|
||||
request_details.append(dict(label='Name',
|
||||
value=request.name,
|
||||
helptext=''))
|
||||
request_details.append(dict(label='Description',
|
||||
value=request.desc,
|
||||
helptext=''))
|
||||
request_details.append(dict(label='Type',
|
||||
value=request_type.name,
|
||||
helptext=''))
|
||||
request_details.append(dict(label='Date created',
|
||||
value=request.create_time,
|
||||
helptext=''))
|
||||
request_details.append(dict(label='Date updated',
|
||||
value=request.create_time,
|
||||
helptext=''))
|
||||
request_details.append(dict(label='User',
|
||||
value=str(trans.user.email),
|
||||
helptext=''))
|
||||
# library associated
|
||||
request_details.append(dict(label='Library',
|
||||
value=trans.app.model.Library.get(request.library_id).name,
|
||||
helptext='Associated library where the resultant \
|
||||
dataset will be stored'))
|
||||
# form fields
|
||||
for field in request_form.fields:
|
||||
if field['required']:
|
||||
req = 'Required'
|
||||
else:
|
||||
req = 'Optional'
|
||||
request_details.append(dict(label=field['label'],
|
||||
value=request_values.content[field['label']],
|
||||
helptext=field['helptext']+' ('+req+')'))
|
||||
return trans.fill_template( '/admin/requests/view_request.mako',
|
||||
request_form_id=request_form.id,
|
||||
request_details=request_details,
|
||||
request_type=request_type)
|
||||
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def samples(self, trans, **kwd):
|
||||
params = util.Params( kwd )
|
||||
if params.get('save', False) == 'True':
|
||||
sample = self.__save_sample(trans, params)
|
||||
return self.show_samples(trans, sample.request_id, {})
|
||||
def show_sample_read_only(self, trans, sample_id):
|
||||
'''
|
||||
Shows the sample details
|
||||
'''
|
||||
sample = trans.app.model.Sample.get(sample_id)
|
||||
request = trans.app.model.Request.get(sample.request_id)
|
||||
request_type = trans.app.model.RequestType.get(request.request_type_id)
|
||||
sample_form = trans.app.model.FormDefinition.get(request_type.sample_form_id)
|
||||
sample_values = trans.app.model.FormValues.get(sample.form_values_id)
|
||||
# list of widgets to be rendered on the request form
|
||||
sample_details = []
|
||||
# main details
|
||||
sample_details.append(dict(label='Name',
|
||||
value=request.name,
|
||||
helptext=''))
|
||||
sample_details.append(dict(label='Description',
|
||||
value=request.desc,
|
||||
helptext=''))
|
||||
sample_details.append(dict(label='Date created',
|
||||
value=sample.create_time,
|
||||
helptext=''))
|
||||
sample_details.append(dict(label='Date updated',
|
||||
value=sample.create_time,
|
||||
helptext=''))
|
||||
sample_details.append(dict(label='User',
|
||||
value=str(trans.user.email),
|
||||
helptext=''))
|
||||
sample_details.append(dict(label='Request',
|
||||
value=request.name,
|
||||
helptext='Name/ID of the request this sample belongs to.'))
|
||||
# get the current state of the sample
|
||||
all_states = trans.app.model.SampleEvent.filter(trans.app.model.SampleEvent.table.c.sample_id == sample_id).all()
|
||||
curr_state = trans.app.model.SampleState.get(all_states[len(all_states)-1].sample_state_id)
|
||||
sample_details.append(dict(label='State',
|
||||
value=curr_state.name,
|
||||
helptext=curr_state.desc))
|
||||
# form fields
|
||||
for field in sample_form.fields:
|
||||
if field['required']:
|
||||
req = 'Required'
|
||||
else:
|
||||
req = 'Optional'
|
||||
sample_details.append(dict(label=field['label'],
|
||||
value=sample_values.content[field['label']],
|
||||
helptext=field['helptext']+' ('+req+')'))
|
||||
return trans.fill_template( '/admin/samples/view_sample.mako',
|
||||
sample_details=sample_details)
|
||||
def __get_all_states(self, trans, sample):
|
||||
request = trans.app.model.Request.get(sample.request_id)
|
||||
request_type = trans.app.model.RequestType.get(request.request_type_id)
|
||||
all_states = trans.app.model.SampleEvent.filter(trans.app.model.SampleEvent.table.c.sample_id == sample.id).all()
|
||||
curr_state = trans.app.model.SampleState.get(all_states[len(all_states)-1].sample_state_id)
|
||||
states_list = trans.app.model.SampleState.filter(trans.app.model.SampleState.table.c.request_type_id == request_type.id)
|
||||
return states_list
|
||||
def __get_curr_state(self, trans, sample):
|
||||
all_states = trans.app.model.SampleEvent.filter(trans.app.model.SampleEvent.table.c.sample_id == sample.id).all()
|
||||
curr_state = trans.app.model.SampleState.get(all_states[len(all_states)-1].sample_state_id)
|
||||
return curr_state
|
||||
def change_state(self, trans, sample_id_list):
|
||||
sample = trans.app.model.Sample.get(sample_id_list[0])
|
||||
states_list = self.__get_all_states(trans, sample)
|
||||
curr_state = self.__get_curr_state(trans, sample)
|
||||
states_input = SelectField('select_state')
|
||||
for state in states_list:
|
||||
if len(sample_id_list) == 1:
|
||||
if curr_state.name == state.name:
|
||||
states_input.add_option(state.name+' (Current)', state.name, selected=True)
|
||||
else:
|
||||
states_input.add_option(state.name, state.name)
|
||||
else:
|
||||
states_input.add_option(state.name, state.name)
|
||||
widgets = []
|
||||
widgets.append(('Select the new state of the sample(s) from the list of possible state(s)',
|
||||
states_input))
|
||||
widgets.append(('Comments', TextArea('comment')))
|
||||
title = 'Change current state of sample: ' + sample.name
|
||||
return trans.fill_template( '/admin/samples/change_state.mako',
|
||||
widgets=widgets, title=title,
|
||||
sample_id_list=util.object_to_string(sample_id_list))
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def save_state(self, trans, **kwd):
|
||||
params = util.Params( kwd )
|
||||
sample_id_list = util.string_to_object(util.restore_text( params.sample_id_list ))
|
||||
comments = util.restore_text( params.comment )
|
||||
sample = trans.app.model.Sample.get(sample_id_list[0])
|
||||
request = trans.app.model.Request.get(sample.request_id)
|
||||
selected_state = util.restore_text( params.select_state )
|
||||
new_state = trans.app.model.SampleState.filter(trans.app.model.SampleState.table.c.request_type_id == request.request_type_id
|
||||
and trans.app.model.SampleState.table.c.name == selected_state)[0]
|
||||
for sample_id in sample_id_list:
|
||||
event = trans.app.model.SampleEvent(sample_id, new_state.id, comments)
|
||||
event.flush()
|
||||
return trans.response.send_redirect( web.url_for( controller='requests_admin',
|
||||
action='list',
|
||||
operation='samples',
|
||||
id=trans.security.encode_id(request.id)) )
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def show_events(self, trans, sample_id):
|
||||
sample = trans.app.model.Sample.get(sample_id)
|
||||
request = trans.app.model.Request.get(sample.request_id)
|
||||
events_list = []
|
||||
for event in trans.app.model.SampleEvent.filter(trans.app.model.SampleEvent.table.c.sample_id == sample_id).order_by(trans.app.model.SampleEvent.c.update_time.desc()).all():
|
||||
state = trans.app.model.SampleState.get(event.sample_state_id)
|
||||
delta = datetime.utcnow() - event.update_time
|
||||
if delta > timedelta( minutes=60 ):
|
||||
last_update = '%s hours' % int( delta.seconds / 60 / 60 )
|
||||
else:
|
||||
last_update = '%s minutes' % int( delta.seconds / 60 )
|
||||
events_list.append((state.name, state.desc, last_update, event.comment))
|
||||
return trans.fill_template( '/admin/samples/events.mako',
|
||||
events_list=events_list,
|
||||
sample_name=sample.name, user=trans.app.model.User.get(request.user_id),
|
||||
request=request.name)
|
||||
|
||||
@@ -9,6 +9,11 @@ class BaseField(object):
|
||||
def get_html( self, prefix="" ):
|
||||
"""Returns the html widget corresponding to the parameter"""
|
||||
raise TypeError( "Abstract Method" )
|
||||
@staticmethod
|
||||
def form_field_types():
|
||||
return ['TextField', 'TextArea', 'SelectField', 'CheckboxField']
|
||||
|
||||
|
||||
|
||||
class TextField(BaseField):
|
||||
"""
|
||||
@@ -26,6 +31,8 @@ class TextField(BaseField):
|
||||
def get_html( self, prefix="" ):
|
||||
return '<input type="text" name="%s%s" size="%d" value="%s">' \
|
||||
% ( prefix, self.name, self.size, self.value )
|
||||
def set_size(self, size):
|
||||
self.size = int( size )
|
||||
|
||||
class TextArea(BaseField):
|
||||
"""
|
||||
@@ -45,6 +52,9 @@ class TextArea(BaseField):
|
||||
def get_html( self, prefix="" ):
|
||||
return '<textarea name="%s%s" rows="%d" cols="%d">%s</textarea>' \
|
||||
% ( prefix, self.name, self.rows, self.cols, self.value )
|
||||
def set_size(self, rows, cols):
|
||||
self.rows = rows
|
||||
self.cols = cols
|
||||
|
||||
class CheckboxField(BaseField):
|
||||
"""
|
||||
@@ -215,6 +225,17 @@ class SelectField(BaseField):
|
||||
rval.insert( 0, '<select name="%s%s"%s%s%s>' % ( prefix, self.name, multiple, self.refresh_on_change_text, last_selected_value ) )
|
||||
rval.append( '</select>' )
|
||||
return "\n".join( rval )
|
||||
def get_selected(self):
|
||||
'''
|
||||
This method returns the currently selected option's text and value
|
||||
'''
|
||||
for text, value, selected in self.options:
|
||||
if selected:
|
||||
return text, value
|
||||
if self.options:
|
||||
return self.options[0]
|
||||
return None
|
||||
|
||||
|
||||
|
||||
class DrillDownField( BaseField ):
|
||||
|
||||
@@ -607,6 +607,11 @@ class UniverseWebTransaction( base.DefaultWebTransaction ):
|
||||
if dbkey == ds.dbkey:
|
||||
return ds
|
||||
return None
|
||||
|
||||
def request_types(self):
|
||||
if self.app.model.RequestType.query().all():
|
||||
return True
|
||||
return False
|
||||
|
||||
class FormBuilder( object ):
|
||||
"""
|
||||
|
||||
Regular → Executable
@@ -0,0 +1,31 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Create a new form definition</div>
|
||||
<div class="toolFormBody">
|
||||
<form name="create_form" action="${h.url_for( controller='forms', action='new', create_form=True, new=False, create_fields=False )}" method="post" >
|
||||
%for label, input in inputs:
|
||||
<div class="form-row">
|
||||
<label>${label}</label>
|
||||
<div style="float: left; width: 250px; margin-right: 10px;">
|
||||
${input.get_html()}
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
%endfor
|
||||
<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>
|
||||
<input type="submit" name="save_form" value="Save"/>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,105 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<script type="text/javascript">
|
||||
$( function() {
|
||||
$( "select[refresh_on_change='true']").change( function() {
|
||||
var refresh = false;
|
||||
var refresh_on_change_values = $( this )[0].attributes.getNamedItem( 'refresh_on_change_values' )
|
||||
if ( refresh_on_change_values ) {
|
||||
refresh_on_change_values = refresh_on_change_values.value.split( ',' );
|
||||
var last_selected_value = $( this )[0].attributes.getNamedItem( 'last_selected_value' );
|
||||
for( i= 0; i < refresh_on_change_values.length; i++ ) {
|
||||
if ( $( this )[0].value == refresh_on_change_values[i] || ( last_selected_value && last_selected_value.value == refresh_on_change_values[i] ) ){
|
||||
refresh = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
refresh = true;
|
||||
}
|
||||
if ( refresh ){
|
||||
$( "#edit_form" ).submit();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
|
||||
<%def name="render_selectbox_options( index, field_attr )">
|
||||
%if field_attr[0] == 'Type':
|
||||
%if field_attr[1].get_selected()[0] == 'SelectField':
|
||||
<% options = field_attr[2] %>
|
||||
<div class="repeat-group-item">
|
||||
<label> Options</label>
|
||||
%for i, option in enumerate(options):
|
||||
<b> ${i+1}</b>
|
||||
${option[1].get_html()}
|
||||
##<input type="submit" name="remove_option_${index}" value="Remove option ${i+1}"/><br>
|
||||
<a class="action-button" href="${h.url_for( controller='forms', action='edit', form_id=form.id, select_box_options='remove', field_index=index, option_index=i )}">Remove</a><br>
|
||||
%endfor
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<a class="action-button" href="${h.url_for( controller='forms', action='edit', form_id=form.id, select_box_options='add', field_index=index )}">Add</a>
|
||||
</div>
|
||||
##<div class="form-row">
|
||||
## <input type="submit" name="add_option_field_${index}" value="Add option"/>
|
||||
##</div>
|
||||
%endif
|
||||
%endif
|
||||
</%def>
|
||||
|
||||
|
||||
<%def name="render_field( index, field )">
|
||||
<div class="repeat-group-item">
|
||||
<div class="form-row">
|
||||
<label>Field ${1+index}</label>
|
||||
</div>
|
||||
%for field_attr in field:
|
||||
<div class="form-row">
|
||||
<label>${field_attr[0]}</label>
|
||||
${field_attr[1].get_html()}
|
||||
${render_selectbox_options( index, field_attr )}
|
||||
</div>
|
||||
%endfor
|
||||
<div class="form-row">
|
||||
<input type="submit" name="remove_button" value="Remove field ${index+1}"/>
|
||||
</div>
|
||||
</div>
|
||||
</%def>
|
||||
|
||||
<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, num_fields=len(form.fields) )}" method="post" >
|
||||
%for label, input in form_details:
|
||||
<div class="form-row">
|
||||
<label>${label}</label>
|
||||
<div style="float: left; width: 250px; margin-right: 10px;">
|
||||
${input.get_html()}
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
%endfor
|
||||
<div class="toolFormTitle">Sample fields (${len(form.fields)})</div>
|
||||
%for ctr, field in enumerate(field_details):
|
||||
${render_field( ctr, field )}
|
||||
%endfor
|
||||
<div class="form-row">
|
||||
<input type="submit" name="add_field_button" value="Add field"/>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<div style="float: left; width: 250px; margin-right: 10px;">
|
||||
<input type="hidden" name="refresh" value="true" size="40"/>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
<input type="submit" name="save_changes_button" value="Save"/>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,73 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
<%def name="title()">Manage Form Definitions</%def>
|
||||
|
||||
## Render a row
|
||||
<%def name="render_row( form, ctr )">
|
||||
%if ctr % 2 == 1:
|
||||
<tr class="odd_row">
|
||||
%else:
|
||||
<tr>
|
||||
%endif
|
||||
<td>
|
||||
<b><a href="${h.url_for( controller='forms', action='edit', form_id=form.id, read_only=True )}">${form.name}</a></b>
|
||||
<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 form definition</a>
|
||||
</div>
|
||||
</td>
|
||||
<td><i>${form.desc}</i></td>
|
||||
</tr>
|
||||
</%def>
|
||||
|
||||
|
||||
<h2>
|
||||
%if deleted:
|
||||
Deleted
|
||||
%endif
|
||||
Forms
|
||||
</h2>
|
||||
|
||||
|
||||
|
||||
<ul class="manage-table-actions">
|
||||
%if not deleted:
|
||||
<li>
|
||||
<a class="action-button" href="${h.url_for( controller='forms', action='new', new=True )}">
|
||||
<img src="${h.url_for('/static/images/silk/add.png')}" />
|
||||
<span>Define a new form</span></a>
|
||||
</li>
|
||||
%endif
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
%if not fdc_list:
|
||||
%if deleted:
|
||||
There are no deleted forms
|
||||
%else:
|
||||
There are no forms.
|
||||
%endif
|
||||
%else:
|
||||
<table class="grid">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
%for ctr, fdc in enumerate( fdc_list ):
|
||||
<tr>
|
||||
${render_row( fdc.latest_form, ctr )}
|
||||
</tr>
|
||||
%endfor
|
||||
</tbody>
|
||||
</table>
|
||||
%endif
|
||||
@@ -0,0 +1,67 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">${form.name} - <i>${form.desc}</i></div>
|
||||
<form name="library" action="${h.url_for( controller='forms', action='manage' )}" method="post" >
|
||||
<table class = "grid">
|
||||
<tbody>
|
||||
%for index, field in enumerate(form.fields):
|
||||
<tr>
|
||||
<td>
|
||||
<div class="form-row">
|
||||
<label>${1+index}. Label</label>
|
||||
<a>${field['label']}</a>
|
||||
%if field['type'] == 'SelectField':
|
||||
<a id="${field['label']}-popup" class="popup-arrow" style="display: none;">▼</a>
|
||||
%for option in field['selectlist']:
|
||||
<div popupmenu="${field['label']}-type-popup">
|
||||
<a class="action-button" href="" >${option}</a>
|
||||
</div>
|
||||
%endfor
|
||||
%endif
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="form-row">
|
||||
<label>Help text </label>
|
||||
%if not field['helptext']:
|
||||
<a><i>No helptext</i></a>
|
||||
%else:
|
||||
<a>${field['helptext']}</a>
|
||||
%endif
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="form-row">
|
||||
<label>Type:</label>
|
||||
<a>${field['type']}</a>
|
||||
%if field['type'] == 'SelectField':
|
||||
<a id="fieldtype-popup" class="popup-arrow" style="display: none;">▼</a>
|
||||
%for option in field['selectlist']:
|
||||
<div popupmenu="type-popup">
|
||||
<a class="action-button" href="" >${option}</a>
|
||||
</div>
|
||||
%endfor
|
||||
%endif
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="form-row">
|
||||
<label>Required?</label>
|
||||
<a>${field['required']}</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
%endfor
|
||||
</tbody>
|
||||
</table>
|
||||
##<input type="submit" name="save_changes_button" value="Back"/>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -103,13 +103,35 @@
|
||||
<div class="toolTitle"><a href="${h.url_for( controller='admin', action='jobs' )}" target="galaxy_main">Manage jobs</a></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="toolSectionPad"></div>
|
||||
<div class="toolSectionTitle">
|
||||
<span>Forms</span>
|
||||
</div>
|
||||
<div class="toolSectionBody">
|
||||
<div class="toolSectionBg">
|
||||
<div class="toolTitle"><a href="${h.url_for( controller='forms', action='manage' )}" target="galaxy_main">Manage forms</a></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="toolSectionPad"></div>
|
||||
<div class="toolSectionTitle">
|
||||
<span>Requests</span>
|
||||
</div>
|
||||
<div class="toolSectionBody">
|
||||
<div class="toolSectionBg">
|
||||
<div class="toolTitle"><a href="${h.url_for( controller='admin', action='manage_request_types' )}" target="galaxy_main">Manage request types</a></div>
|
||||
<div class="toolTitle"><a href="${h.url_for( controller='requests_admin', action='list')}" target="galaxy_main">Manage requests</a></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
##<iframe name="galaxy_admin" src="${h.url_for( controller='admin', action='index' )}" frameborder="0" style="position: absolute; margin: 0; border: 0 none; height: 100%; width: 100%;"> </iframe>
|
||||
</%def>
|
||||
|
||||
<%def name="center_panel()">
|
||||
|
||||
<iframe name="galaxy_main" id="galaxy_main" frameborder="0" style="position: absolute; width: 100%; height: 100%;" src="${h.url_for( action='center' )}"> </iframe>
|
||||
<%
|
||||
center_url = h.url_for( action='center' )
|
||||
%>
|
||||
<iframe name="galaxy_main" id="galaxy_main" frameborder="0" style="position: absolute; width: 100%; height: 100%;" src="${center_url}"> </iframe>
|
||||
|
||||
</%def>
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Create ${num_states} states for the '${sample_type_name}' sample type</div>
|
||||
<form name="new_form_fields" action="${h.url_for( controller='admin', action='request_type', save_new=True, create=False, edit=False, name=sample_type_name, description=desc, num_states=num_states, request_form_id=request_form_id, sample_form_id=sample_form_id)}" method="post" >
|
||||
<div class="toolFormBody">
|
||||
%for element_count in range( num_states ):
|
||||
<div class="form-row">
|
||||
<label>${1+element_count}) State name:</label>
|
||||
<input type="text" name="new_element_name_${element_count}" value="" size="40"/>
|
||||
<label>State help text (optional):</label>
|
||||
<input type="text" name="new_element_description_${element_count}" value="" size="40"/>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endfor
|
||||
</div>
|
||||
<div class="toolFormBody">
|
||||
<input type="submit" name="save_new_sample_type" value="Save"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -0,0 +1,66 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Create a new request type</div>
|
||||
%if not forms:
|
||||
Create a form definition first to create a new request type.
|
||||
%else:
|
||||
<div class="toolFormBody">
|
||||
<form name="create_request_type" action="${h.url_for( controller='admin', action='request_type', add_states=True, create=False, edit=False )}" method="post" >
|
||||
<div class="form-row">
|
||||
<label>Name:</label>
|
||||
<div style="float: left; width: 250px; margin-right: 10px;">
|
||||
<input type="text" name="name" value="New Request Type" size="40"/>
|
||||
</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>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>
|
||||
Request Form definition:
|
||||
</label>
|
||||
<select name="request_form_id">
|
||||
%for form in 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 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>
|
||||
<input type="submit" name="create_library_button" value="Define states"/>
|
||||
</form>
|
||||
</div>
|
||||
%endif
|
||||
</div>
|
||||
@@ -0,0 +1,78 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<% num_states=len(states_list) %>
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Edit the request type</div>
|
||||
<div class="toolFormBody">
|
||||
<form name="library" action="${h.url_for( controller='admin', action='request_type', save_changes=True, create=False, id=request_type.id, num_states=num_states )}" method="post" >
|
||||
<div class="form-row">
|
||||
<label>Name:</label>
|
||||
<div style="float: left; width: 250px; margin-right: 10px;">
|
||||
<input type="text" name="name" value="${request_type.name}" size="40"/>
|
||||
</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="${request_type.desc}" size="40"/>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>
|
||||
Request Form definition:
|
||||
</label>
|
||||
<select name="form_id">
|
||||
%for form in forms:
|
||||
%if form.id == request_type.request_form_id:
|
||||
<option value="${form.id}" selected>${form.name}</option>
|
||||
%else:
|
||||
<option value="${form.id}">${form.name}</option>
|
||||
%endif
|
||||
%endfor
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label>
|
||||
Sample Form definition:
|
||||
</label>
|
||||
<select name="form_id">
|
||||
%for form in forms:
|
||||
%if form.id == request_type.sample_form_id:
|
||||
<option value="${form.id}" selected>${form.name}</option>
|
||||
%else:
|
||||
<option value="${form.id}">${form.name}</option>
|
||||
%endif
|
||||
%endfor
|
||||
</select>
|
||||
</div>
|
||||
<div class="toolFormBody">
|
||||
%for element_count, state in enumerate(states_list):
|
||||
<div class="form-row">
|
||||
<label>${1+element_count}) State name:</label>
|
||||
<input type="text" name="new_element_name_${element_count}" value="${state.name}" size="40"/>
|
||||
<label>State help text (optional):</label>
|
||||
<input type="text" name="new_element_description_${element_count}" value="${state.desc}" size="40"/>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endfor
|
||||
</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>
|
||||
|
||||
<input type="submit" name="edit_request_type_button" value="Save"/>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,205 @@
|
||||
<%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 len(query.all()):
|
||||
<h3>All Users</h3>
|
||||
%endif
|
||||
## %if len(query.all()):
|
||||
## <span class="title">Filter:</span>
|
||||
## %for i, filter in enumerate( grid.standard_filters ):
|
||||
## %if i > 0:
|
||||
## <span>|</span>
|
||||
## %endif
|
||||
## <span class="filter"><a href="${url( filter.get_url_args() )}">${filter.label}</a></span>
|
||||
## %endfor
|
||||
## %endif
|
||||
</div>
|
||||
|
||||
|
||||
%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 ):
|
||||
<a class="action-button" href="${url( operation=operation.label, id=item.id )}">${operation.label}</a>
|
||||
%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
|
||||
@@ -0,0 +1,60 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
<%def name="title()">request Types</%def>
|
||||
|
||||
<h2>
|
||||
%if deleted:
|
||||
Deleted
|
||||
%endif
|
||||
Request Types
|
||||
</h2>
|
||||
|
||||
<ul class="manage-table-actions">
|
||||
<li>
|
||||
<a class="action-button" href="${h.url_for( controller='admin', action='request_type', create=True )}"><span>Create a new request type</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
%if not request_types:
|
||||
%if deleted:
|
||||
There are no deleted request types
|
||||
%else:
|
||||
There are no request types.
|
||||
%endif
|
||||
%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><b><a href="${h.url_for( controller='admin', action='request_type', edit='True', id=request_type.id)}">${request_type.name}</a></b></td>
|
||||
<td><i>${request_type.desc}</i></td>
|
||||
<% for form in forms:
|
||||
if form.id == request_type.request_form_id:
|
||||
form_name = form.name
|
||||
break
|
||||
%>
|
||||
<td><a href="${h.url_for( controller='forms', action='edit', form_id=request_type.request_form_id, read_only=True)}">${form_name}</a></td>
|
||||
<% for form in forms:
|
||||
if form.id == request_type.sample_form_id:
|
||||
form_name = form.name
|
||||
break
|
||||
%>
|
||||
<td><a href="${h.url_for( controller='forms', action='edit', form_id=request_type.sample_form_id, read_only=True)}">${form_name}</a></td>
|
||||
</tr>
|
||||
%endfor
|
||||
</tbody>
|
||||
</table>
|
||||
%endif
|
||||
@@ -0,0 +1,20 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Request Details: '${request_details[0]['value']}'</div>
|
||||
%for index, rd in enumerate(request_details):
|
||||
<div class="form-row">
|
||||
<label>${rd['label']}</label>
|
||||
##<i>${rd['helptext']}</i>
|
||||
${rd['value']}
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endfor
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,30 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">${title}</div>
|
||||
<div class="toolFormBody">
|
||||
<form name="event" action="${h.url_for( controller='requests_admin', action='save_state', new=True, sample_id_list=sample_id_list)}" method="post" >
|
||||
%for w in widgets:
|
||||
<div class="form-row">
|
||||
<label>
|
||||
${w[0]}
|
||||
</label>
|
||||
${w[1].get_html()}
|
||||
%if w[0] == 'Comments':
|
||||
<div class="toolParamHelp" style="clear: both;">
|
||||
Optional
|
||||
</div>
|
||||
%endif
|
||||
</div>
|
||||
%endfor
|
||||
<div class="form-row">
|
||||
<input type="submit" name="add_event" value="Save"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,83 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Edit sample named: ${values.content['Name']}</div>
|
||||
<div class="toolFormBody">
|
||||
<form name="sample" action="${h.url_for( controller='sample', action='do', save_changes=True, sample_id=sample.id )}" method="post" >
|
||||
<div class="form-row">
|
||||
<label>
|
||||
Library:
|
||||
</label>
|
||||
<select name="library_id">
|
||||
%for library in libraries:
|
||||
<option value="${library.id}">${library.name}</option>
|
||||
%endfor
|
||||
</select>
|
||||
</div>
|
||||
%for i, field in enumerate(form.fields):
|
||||
<div class="form-row">
|
||||
<label>${field['label']}</label>
|
||||
%if field['type'] == 'TextField':
|
||||
<input type="text" name="${field['label']}" value="${values.content[field['label']]}" size="40"/>
|
||||
%elif field['type'] == 'TextArea':
|
||||
<textarea name="${field['label']}" rows="3" cols="35">${values.content[field['label']]}</textarea>
|
||||
%elif field['type'] == 'CheckBox':
|
||||
%if values.content[field['label']] == "true":
|
||||
<input type="checkbox" name="${field['label']}" value="true" checked>
|
||||
%else:
|
||||
<input type="checkbox" name="${field['label']}" value="true">
|
||||
%endif
|
||||
%elif field['type'] == 'SelectBox':
|
||||
<select name="${field['label']}">
|
||||
%for ft in field['selectlist']:
|
||||
%if ft == values.content[field['label']]:
|
||||
<option value="${ft}" selected>${ft}</option>
|
||||
%else:
|
||||
<option value="${ft}">${ft}</option>
|
||||
%endif
|
||||
%endfor
|
||||
</select>
|
||||
%endif
|
||||
<div class="toolParamHelp" style="clear: both;">
|
||||
${field['helptext']}
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
%endfor
|
||||
<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="create_library_button" value="Save"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="toolForm">
|
||||
<div class="toolFormBody">
|
||||
<form name="event" action="${h.url_for( controller='admin', action='event', new=True, sample_id=sample.id)}" method="post" >
|
||||
<div class="form-row">
|
||||
<label>
|
||||
Change sample state to:
|
||||
</label>
|
||||
<select name="state_id">
|
||||
%for state in states:
|
||||
<option value="${state.id}">${state.name}</option>
|
||||
%endfor
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<input type="submit" name="add_event" value="Save"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,33 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
<%def name="title()">Events for Sample ${sample_name}</%def>
|
||||
|
||||
<h2>Events for Sample "${sample_name}" of Request: ${request}</h2>
|
||||
<h3>User: ${user.email}</h3>
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
|
||||
<table class="grid">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>State</th>
|
||||
<th>Description</th>
|
||||
<th>Last Update</th>
|
||||
<th>Comments</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
%for state, desc, updated, comments in events_list:
|
||||
<tr class="libraryRow libraryOrFolderRow" id="libraryRow">
|
||||
<td><b><a>${state}</a></b></td>
|
||||
<td><a>${desc}</a></td>
|
||||
<td><a>${updated}</a></td>
|
||||
<td><a>${comments}</a></td>
|
||||
</tr>
|
||||
%endfor
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -0,0 +1,203 @@
|
||||
<%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>Samples associated with request: ${grid.request.name}</h2>
|
||||
<h3>User: ${grid.user.email}</h3>
|
||||
## %if len(query.all()):
|
||||
## <span class="title">Filter:</span>
|
||||
## %for i, filter in enumerate( grid.standard_filters ):
|
||||
## %if i > 0:
|
||||
## <span>|</span>
|
||||
## %endif
|
||||
## <span class="filter"><a href="${url( filter.get_url_args() )}">${filter.label}</a></span>
|
||||
## %endfor
|
||||
## %endif
|
||||
</div>
|
||||
|
||||
%if not len(query.all()):
|
||||
There are no sample(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 ):
|
||||
<a class="action-button" href="${url( operation=operation.label, id=item.id )}">${operation.label}</a>
|
||||
%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
|
||||
@@ -0,0 +1,19 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Sample Details: '${sample_details[0]['value']}'</div>
|
||||
%for index, rd in enumerate(sample_details):
|
||||
<div class="form-row">
|
||||
<label>${rd['label']}</label>
|
||||
${rd['value']}
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endfor
|
||||
</div>
|
||||
</div>
|
||||
@@ -29,4 +29,33 @@ ${self.javascripts()}
|
||||
## <![endif]-->
|
||||
<script type="text/javascript" src="${h.url_for('/static/scripts/jquery.js')}"></script>
|
||||
<script type="text/javascript" src="${h.url_for('/static/scripts/galaxy.base.js')}"></script>
|
||||
|
||||
|
||||
</%def>
|
||||
|
||||
<script type="text/javascript">
|
||||
$( function() {
|
||||
$( "select[refresh_on_change='true']").change( function() {
|
||||
var refresh = false;
|
||||
var refresh_on_change_values = $( this )[0].attributes.getNamedItem( 'refresh_on_change_values' )
|
||||
if ( refresh_on_change_values ) {
|
||||
refresh_on_change_values = refresh_on_change_values.value.split( ',' );
|
||||
var last_selected_value = $( this )[0].attributes.getNamedItem( 'last_selected_value' );
|
||||
for( i= 0; i < refresh_on_change_values.length; i++ ) {
|
||||
if ( $( this )[0].value == refresh_on_change_values[i] || ( last_selected_value && last_selected_value.value == refresh_on_change_values[i] ) ){
|
||||
refresh = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
refresh = true;
|
||||
}
|
||||
if ( refresh ){
|
||||
$( ':file' ).each( function() {
|
||||
var file_value = $( this )[0].value;
|
||||
} );
|
||||
$( "#edit_form" ).submit();
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -153,6 +153,8 @@
|
||||
${tab( "workflow", "Workflow", h.url_for( controller='workflow', action='index' ))}
|
||||
|
||||
${tab( "libraries", "Libraries", h.url_for( controller='library', action='index' ))}
|
||||
|
||||
${tab( "requests", "Requests", h.url_for( controller='requests', action='index' ), visible = (trans.user and trans.request_types)) }
|
||||
|
||||
%if app.config.get_bool( 'enable_tracks', False ):
|
||||
<span class="tab">
|
||||
|
||||
@@ -0,0 +1,210 @@
|
||||
<%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(query.all()):
|
||||
## <span class="title">Filter:</span>
|
||||
## %for i, filter in enumerate( grid.standard_filters ):
|
||||
## %if i > 0:
|
||||
## <span>|</span>
|
||||
## %endif
|
||||
## <span class="filter"><a href="${url( filter.get_url_args() )}">${filter.label}</a></span>
|
||||
## %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>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 ):
|
||||
<a class="action-button" href="${url( operation=operation.label, id=item.id )}">${operation.label}</a>
|
||||
%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
|
||||
@@ -0,0 +1,16 @@
|
||||
<%inherit file="/base_panels.mako"/>
|
||||
|
||||
<%def name="init()">
|
||||
<%
|
||||
self.has_left_panel=False
|
||||
self.has_right_panel=False
|
||||
self.active_view="requests"
|
||||
self.message_box_visible=False
|
||||
%>
|
||||
</%def>
|
||||
|
||||
<%def name="center_panel()">
|
||||
|
||||
<iframe name="galaxy_main" id="galaxy_main" frameborder="0" style="position: absolute; width: 100%; height: 100%;" src="${h.url_for( controller="requests", action="list" )}"> </iframe>
|
||||
|
||||
</%def>
|
||||
@@ -0,0 +1,32 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">${title}</div>
|
||||
<div class="toolFormBody">
|
||||
<form name="sample" action="${h.url_for( controller='requests', action='new', save=True, request_form_id=request_form_id, request_type_id=request_type.id )}" method="post" >
|
||||
%for i, field in enumerate(widgets):
|
||||
<div class="form-row">
|
||||
<label>${field['label']}</label>
|
||||
${field['widget'].get_html()}
|
||||
<div class="toolParamHelp" style="clear: both;">
|
||||
${field['helptext']}
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
%endfor
|
||||
<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>
|
||||
<input type="submit" name="create_library_button" value="Save"/>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,31 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Add a new request</div>
|
||||
%if not request_types:
|
||||
There are no request types created for a new request.
|
||||
%else:
|
||||
<div class="toolFormBody">
|
||||
<form name="select_request_type" action="${h.url_for( controller='requests', action='new', create=True )}" method="post" >
|
||||
<div class="form-row">
|
||||
<label>
|
||||
Select Request Type:
|
||||
</label>
|
||||
<select name="request_type_id">
|
||||
%for rt in request_types:
|
||||
<option value="${rt.id}">${rt.name}</option>
|
||||
%endfor
|
||||
</select>
|
||||
<input type="submit" name="create_request" value="Go"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
%endif
|
||||
</div>
|
||||
@@ -0,0 +1,20 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Request Details: '${request_details[0]['value']}'</div>
|
||||
%for index, rd in enumerate(request_details):
|
||||
<div class="form-row">
|
||||
<label>${rd['label']}</label>
|
||||
##<i>${rd['helptext']}</i>
|
||||
${rd['value']}
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endfor
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,43 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
<%def name="title()">Browse Samples</%def>
|
||||
|
||||
<h2>Samples</h2>
|
||||
|
||||
<ul class="manage-table-actions">
|
||||
%if not deleted:
|
||||
<li>
|
||||
<a class="action-button" href="${h.url_for( controller='sample', action='do', new=True )}"><span>Add Sample</span></a>
|
||||
</li>
|
||||
%endif
|
||||
</ul>
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
%if not samples_list:
|
||||
You have no samples.
|
||||
%else:
|
||||
<table class="grid">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Description</th>
|
||||
<th>Type</th>
|
||||
<th>State</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
%for id, name, desc, st, state in samples_list:
|
||||
<tr class="libraryRow libraryOrFolderRow" id="libraryRow">
|
||||
<td><b><a href="${h.url_for( controller='sample', action='do', sample_id=id, edit=True)}">${name}</a></b></td>
|
||||
<td><a>${desc}</a></td>
|
||||
<td><a>${st}</a></td>
|
||||
<td><a href="${h.url_for( controller='sample', action='events', sample_id=id)}">${state}</a></td>
|
||||
</tr>
|
||||
%endfor
|
||||
</tbody>
|
||||
</table>
|
||||
%endif
|
||||
@@ -0,0 +1,64 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Edit sample named: ${values.content['Name']}</div>
|
||||
<div class="toolFormBody">
|
||||
<form name="sample" action="${h.url_for( controller='sample', action='do', save_changes=True, sample_id=sample.id )}" method="post" >
|
||||
<div class="form-row">
|
||||
<label>
|
||||
Library:
|
||||
</label>
|
||||
<select name="library_id">
|
||||
%for library in libraries:
|
||||
<option value="${library.id}">${library.name}</option>
|
||||
%endfor
|
||||
</select>
|
||||
</div>
|
||||
%for i, field in enumerate(form.fields):
|
||||
<div class="form-row">
|
||||
<label>${field['label']}</label>
|
||||
%if field['type'] == 'TextField':
|
||||
<input type="text" name="${field['label']}" value="${values.content[field['label']]}" size="40"/>
|
||||
%elif field['type'] == 'TextArea':
|
||||
<textarea name="${field['label']}" rows="3" cols="35">${values.content[field['label']]}</textarea>
|
||||
%elif field['type'] == 'CheckBox':
|
||||
%if values.content[field['label']] == "true":
|
||||
<input type="checkbox" name="${field['label']}" value="true" checked>
|
||||
%else:
|
||||
<input type="checkbox" name="${field['label']}" value="true">
|
||||
%endif
|
||||
%elif field['type'] == 'SelectBox':
|
||||
<select name="${field['label']}">
|
||||
%for ft in field['selectlist']:
|
||||
%if ft == values.content[field['label']]:
|
||||
<option value="${ft}" selected>${ft}</option>
|
||||
%else:
|
||||
<option value="${ft}">${ft}</option>
|
||||
%endif
|
||||
%endfor
|
||||
</select>
|
||||
%endif
|
||||
<div class="toolParamHelp" style="clear: both;">
|
||||
${field['helptext']}
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
%endfor
|
||||
<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="create_library_button" value="Save"/>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,210 @@
|
||||
<%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>Samples associated with request: ${grid.request.name}</h2>
|
||||
## %if len(query.all()):
|
||||
## <span class="title">Filter:</span>
|
||||
## %for i, filter in enumerate( grid.standard_filters ):
|
||||
## %if i > 0:
|
||||
## <span>|</span>
|
||||
## %endif
|
||||
## <span class="filter"><a href="${url( filter.get_url_args() )}">${filter.label}</a></span>
|
||||
## %endfor
|
||||
## %endif
|
||||
</div>
|
||||
|
||||
<ul class="manage-table-actions">
|
||||
<li>
|
||||
<a class="action-button" href="${h.url_for( controller='requests', action='add_sample', id=grid.request.id)}">
|
||||
<img src="${h.url_for('/static/images/silk/add.png')}" />
|
||||
<span>Add sample</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
%if not len(query.all()):
|
||||
There are no sample(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 ):
|
||||
## <a class="action-button" href="${url( operation=operation.label, id=trans.security.encode_id( item.id ) )}">${operation.label}</a>
|
||||
## %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
|
||||
@@ -0,0 +1,16 @@
|
||||
<%inherit file="/base_panels.mako"/>
|
||||
|
||||
<%def name="init()">
|
||||
<%
|
||||
self.has_left_panel=False
|
||||
self.has_right_panel=False
|
||||
self.active_view="requests"
|
||||
|
||||
%>
|
||||
</%def>
|
||||
|
||||
<%def name="center_panel()">
|
||||
|
||||
<iframe name="galaxy_main" id="galaxy_main" frameborder="0" style="position: absolute; width: 100%; height: 100%;" src="${h.url_for( controller="sample", action="list", request_id=request_id )}"> </iframe>
|
||||
|
||||
</%def>
|
||||
@@ -0,0 +1,32 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">${title}</div>
|
||||
<div class="toolFormBody">
|
||||
<form name="sample" action="${h.url_for( controller='requests', action='samples', save=True, sample_form_id=sample_form_id, request_id=request_id )}" method="post" >
|
||||
%for i, field in enumerate(widgets):
|
||||
<div class="form-row">
|
||||
<label>${field['label']}</label>
|
||||
${field['widget'].get_html()}
|
||||
<div class="toolParamHelp" style="clear: both;">
|
||||
${field['helptext']}
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
%endfor
|
||||
<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>
|
||||
<input type="submit" name="create_sample_button" value="Save"/>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,32 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
<%def name="title()">Events for Sample ${sample_name}</%def>
|
||||
|
||||
<h2>Events for Sample "${sample_name}" of Request: ${request}</h2>
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
|
||||
<table class="grid">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>State</th>
|
||||
<th>Updated</th>
|
||||
<th>Description</th>
|
||||
<th>Comments</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
%for state, updated, desc, comments in events_list:
|
||||
<tr class="libraryRow libraryOrFolderRow" id="libraryRow">
|
||||
<td><b><a>${state}</a></b></td>
|
||||
<td><a>${updated}</a></td>
|
||||
<td><a>${desc}</a></td>
|
||||
<td><a>${comments}</a></td>
|
||||
</tr>
|
||||
%endfor
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -0,0 +1,19 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Sample Details: '${sample_details[0]['value']}'</div>
|
||||
%for index, rd in enumerate(sample_details):
|
||||
<div class="form-row">
|
||||
<label>${rd['label']}</label>
|
||||
${rd['value']}
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endfor
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user