def __save_external_service( self, trans, **kwd ): # Here we save a newly created external_service or save changed # attributes of an existing external_service. params = util.Params( kwd ) external_service_id = params.get( 'id', None ) name = util.restore_text( params.get( 'external_service_name', '' ) ) description = util.restore_text( params.get( 'external_service_description', '' ) ) version = util.restore_text( params.get( 'external_service_version', '' ) ) external_service_type_id = params.get( 'external_service_type_id', '' ) if external_service_id: # We're saving changed attributes of an existing external_service. external_service = trans.sa_session.query( trans.model.ExternalService ).get( trans.security.decode_id( external_service_id ) ) external_service.name = name external_service.description = description external_service.version = version external_service.form_values.content = self.get_form_values( trans, trans.user, external_service.form_definition, **kwd ) trans.sa_session.add( external_service ) trans.sa_session.add( external_service.form_values ) trans.sa_session.flush() else: # We're saving a newly created external_service external_service_type = self.get_external_service_type( trans, external_service_type_id ) external_service = trans.model.ExternalService( name, description, external_service_type_id, version ) external_service.form_definition = external_service_type.form_definition # Get the form values from kwd, some of which may be different than the defaults in the external service # type config because the user could have overwritten them. values = self.get_form_values( trans, trans.user, external_service.form_definition, **kwd ) external_service.form_values = trans.model.FormValues( external_service.form_definition, values ) trans.sa_session.add( external_service ) trans.sa_session.add( external_service.form_definition ) trans.sa_session.add( external_service.form_values ) trans.sa_session.flush() return external_service
def reload_tool_data_tables(app, **kwargs): params = util.Params(kwargs) log.debug("Executing tool data table reload for %s" % params.get('table_names', 'all tables')) table_names = app.tool_data_tables.reload_tables( table_names=params.get('table_name', None)) log.debug("Finished data table reload for %s" % table_names)
def show_editable_form_definition( self, trans, form_definition, current_form, message='', status='done', response_redirect=None, **kwd ): """ Displays the form and any of the changes made to it in edit mode. In this method all the widgets are build for all name, description and all the fields of a form definition. """ params = util.Params( kwd ) # name & description form_details = [ ( 'Name', TextField( 'name', 40, current_form[ 'name' ] ) ), ( 'Description', TextField( 'description', 40, current_form[ 'desc' ] ) ), ( 'Type', HiddenField( 'form_type_select_field', current_form['type']) ) ] form_layout = [] if current_form[ 'type' ] == trans.app.model.FormDefinition.types.SAMPLE: for index, layout_name in enumerate( current_form[ 'layout' ] ): form_layout.append( TextField( 'grid_layout%i' % index, 40, layout_name )) # fields field_details = [] for field_index, field in enumerate( current_form[ 'fields' ] ): field_widgets = self.build_form_definition_field_widgets( trans=trans, layout_grids=current_form['layout'], field_index=field_index, field=field, form_type=current_form['type'] ) field_details.append( field_widgets ) return trans.fill_template( '/admin/forms/edit_form_definition.mako', form_details=form_details, field_details=field_details, form_definition=form_definition, field_types=trans.model.FormDefinition.supported_field_types, message=message, status=status, current_form_type=current_form[ 'type' ], layout_grids=form_layout, response_redirect=response_redirect )
def update(self, trans, id, key, payload, **kwd): """ PUT /api/requests/{encoded_request_id} Updates a request state, sample state or sample dataset transfer status depending on the update_type """ params = util.Params(kwd) update_type = None if 'update_type' not in payload: trans.response.status = 400 return "Missing required 'update_type' parameter. Please consult the API documentation for help." else: update_type = payload.pop('update_type') if update_type not in self._update_type_values: trans.response.status = 400 return "Invalid value for 'update_type' parameter ( %s ) specified. Please consult the API documentation for help." % update_type try: request_id = trans.security.decode_id(id) except TypeError: trans.response.status = 400 return "Malformed request id ( %s ) specified, unable to decode." % str( id) try: request = trans.sa_session.query( trans.app.model.Request).get(request_id) except: request = None if not request or not (trans.user_is_admin() or request.user.id == trans.user.id): trans.response.status = 400 return "Invalid request id ( %s ) specified." % str(request_id) # check update type if update_type == 'request_state': return self.__update_request_state(trans, encoded_request_id=id)
def edit_username(self, trans, cntrller, **kwd): params = util.Params(kwd) is_admin = cntrller == 'admin' and trans.user_is_admin() message = util.restore_text(params.get('message', '')) status = params.get('status', 'done') user_id = params.get('user_id', None) if user_id and is_admin: user = trans.sa_session.query(trans.app.model.User).get( trans.security.decode_id(user_id)) else: user = trans.user if user and params.get('change_username_button', False): username = kwd.get('username', '') if username: message = validate_publicname(trans, username, user) if message: status = 'error' else: user.username = username trans.sa_session.add(user) trans.sa_session.flush() message = 'The username has been updated with the changes.' return trans.fill_template('/webapps/tool_shed/user/username.mako', cntrller=cntrller, user=user, username=user.username, message=message, status=status)
def per_month_all(self, trans, **kwd): params = util.Params(kwd) message = '' monitor_email = params.get('monitor_email', '*****@*****.**') q = sa.select( (sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time)).label('date'), sa.func.sum( sa.case([(model.User.table.c.email == monitor_email, 1)], else_=0)).label('monitor_jobs'), sa.func.count(model.Job.table.c.id).label('total_jobs')), from_obj=[sa.outerjoin(model.Job.table, model.User.table)], group_by=[ sa.func.date_trunc('month', sa.func.date(model.Job.table.c.create_time)) ], order_by=[sa.desc('date')]) jobs = [] for row in q.execute(): jobs.append( (row.date.strftime("%Y-%m"), row.total_jobs - row.monitor_jobs, row.monitor_jobs, row.total_jobs, row.date.strftime("%B"), row.date.strftime("%Y"))) return trans.fill_template('/webapps/reports/jobs_per_month_all.mako', jobs=jobs, message=message)
def tool_per_month(self, trans, **kwd): params = util.Params(kwd) message = '' tool_id = params.get('tool_id', 'Add a column1') specified_date = params.get('specified_date', datetime.utcnow().strftime("%Y-%m-%d")) q = sa.select( (sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time)).label('date'), sa.func.count(model.Job.table.c.id).label('total_jobs')), whereclause=model.Job.table.c.tool_id == tool_id, from_obj=[model.Job.table], group_by=[ sa.func.date_trunc('month', sa.func.date(model.Job.table.c.create_time)) ], order_by=[sa.desc('date')]) jobs = [] for row in q.execute(): jobs.append((row.date.strftime("%Y-%m"), row.total_jobs, row.date.strftime("%B"), row.date.strftime("%Y"))) return trans.fill_template('/webapps/reports/jobs_tool_per_month.mako', specified_date=specified_date, tool_id=tool_id, jobs=jobs, message=message)
def tool_per_month(self, trans, **kwd): message = '' params = util.Params(kwd) monitor_email = params.get('monitor_email', '*****@*****.**') # In case we don't know which is the monitor user we will query for all jobs monitor_user_id = get_monitor_id(trans, monitor_email) tool_id = params.get('tool_id', 'Add a column1') specified_date = params.get('specified_date', datetime.utcnow().strftime("%Y-%m-%d")) q = sa.select( (self.select_month(model.Job.table.c.create_time).label('date'), sa.func.count(model.Job.table.c.id).label('total_jobs')), whereclause=sa.and_(model.Job.table.c.tool_id == tool_id, model.Job.table.c.user_id != monitor_user_id), from_obj=[model.Job.table], group_by=self.group_by_month(model.Job.table.c.create_time), order_by=[sa.desc('date')]) jobs = [] for row in q.execute(): jobs.append((row.date.strftime("%Y-%m"), row.total_jobs, row.date.strftime("%B"), row.date.strftime("%Y"))) return trans.fill_template('/webapps/reports/jobs_tool_per_month.mako', specified_date=specified_date, tool_id=tool_id, jobs=jobs, message=message, is_user_jobs_only=monitor_user_id)
def activate(self, trans, **kwd): """ Check whether token fits the user and then activate the user's account. """ params = util.Params(kwd, sanitize=False) email = params.get('email', None) if email is not None: email = unquote(email) activation_token = params.get('activation_token', None) if email is None or activation_token is None: # We don't have the email or activation_token, show error. return trans.show_error_message("You are using an invalid activation link. Try to log in and we will send you a new activation email. <br><a href='%s'>Go to login page.</a>") % web.url_for(controller="root", action="index") else: # Find the user user = trans.sa_session.query(trans.app.model.User).filter(trans.app.model.User.table.c.email == email).first() if not user: # Probably wrong email address return trans.show_error_message("You are using an invalid activation link. Try to log in and we will send you a new activation email. <br><a href='%s'>Go to login page.</a>") % web.url_for(controller="root", action="index") # If the user is active already don't try to activate if user.active is True: return trans.show_ok_message("Your account is already active. Nothing has changed. <br><a href='%s'>Go to login page.</a>") % web.url_for(controller='root', action='index') if user.activation_token == activation_token: user.activation_token = None self.user_manager.activate(user) return trans.show_ok_message("Your account has been successfully activated! <br><a href='%s'>Go to login page.</a>") % web.url_for(controller='root', action='index') else: # Tokens don't match. Activation is denied. return trans.show_error_message("You are using an invalid activation link. Try to log in and we will send you a new activation email. <br><a href='%s'>Go to login page.</a>") % web.url_for(controller='root', action='index') return
def reject_request( self, trans, **kwd ): params = util.Params( kwd ) request_id = params.get( 'id', '' ) status = params.get( 'status', 'done' ) message = params.get( 'message', 'done' ) if params.get( 'cancel_reject_button', False ): return trans.response.send_redirect( web.url_for( controller='requests_common', action='view_request', cntrller='requests_admin', id=request_id ) ) try: request = trans.sa_session.query( trans.model.Request ).get( trans.security.decode_id( request_id ) ) except: return invalid_id_redirect( trans, 'requests_admin', request_id ) # Validate comment = util.restore_text( params.get( 'comment', '' ) ) if not comment: status='error' message='A reason for rejecting the request is required.' return trans.fill_template( '/admin/requests/reject.mako', cntrller='requests_admin', request=request, status=status, message=message ) # Create an event with state 'Rejected' for this request event_comment = "Sequencing request marked rejected by %s. Reason: %s " % ( trans.user.email, comment ) event = trans.model.RequestEvent( request, request.states.REJECTED, event_comment ) trans.sa_session.add( event ) trans.sa_session.flush() message='Sequencing request (%s) has been rejected.' % request.name return trans.response.send_redirect( web.url_for( controller='requests_admin', action='browse_requests', status=status, message=message, **kwd ) )
def per_month_in_error(self, trans, **kwd): """ Queries the DB for user jobs in error. Filters out monitor jobs. """ message = '' params = util.Params(kwd) monitor_email = params.get('monitor_email', '*****@*****.**') # In case we don't know which is the monitor user we will query for all jobs monitor_user_id = get_monitor_id(trans, monitor_email) jobs_in_error_by_month = sa.select( (self.select_month(model.Job.table.c.create_time).label('date'), sa.func.count(model.Job.table.c.id).label('total_jobs')), whereclause=sa.and_(model.Job.table.c.state == 'error', model.Job.table.c.user_id != monitor_user_id), from_obj=[model.Job.table], group_by=self.group_by_month(model.Job.table.c.create_time), order_by=[sa.desc('date')]) jobs = [] for row in jobs_in_error_by_month.execute(): jobs.append((row.date.strftime("%Y-%m"), row.total_jobs, row.date.strftime("%B"), row.date.strftime("%y"))) return trans.fill_template( '/webapps/reports/jobs_per_month_in_error.mako', jobs=jobs, message=message, is_user_jobs_only=monitor_user_id)
def reload_external_service_types(self, trans, **kwd): params = util.Params(kwd) message = util.restore_text(params.get('message', '')) status = params.get('status', 'done') external_service_type_id = params.get('external_service_type_id', 'none') if params.get('reload_external_service_type_button', False): new_external_service_type = trans.app.external_service_types.reload( external_service_type_id) status = 'done' message = 'Reloaded external service type: %s' % new_external_service_type.name external_service_type_select_field = self.__build_external_service_type_select_field( trans, external_service_type_id, refresh_on_change=False, visible_external_service_types_only=False) if not trans.app.external_service_types.visible_external_service_types: message = 'There are no visible external service types in the external service types config file.' status = 'error' return trans.response.send_redirect( web.url_for(controller='external_service', action='browse_external_services', message=message, status=status)) return trans.fill_template( '/admin/external_service/reload_external_service_types.mako', external_service_type_select_field= external_service_type_select_field, message=message, status=status)
def edit_external_service(self, trans, **kwd): params = util.Params(kwd) message = util.restore_text(params.get('message', '')) status = params.get('status', 'done') external_service_id = params.get('id', None) try: external_service = trans.sa_session.query( trans.model.ExternalService).get( trans.security.decode_id(external_service_id)) except: return invalid_id_redirect(trans, 'external_service', external_service_id, 'external_service', action='browse_external_services') if params.get('edit_external_service_button', False): external_service = self.__save_external_service(trans, **kwd) trans.sa_session.refresh(external_service) message = 'Changes made to external service (%s) have been saved' % external_service.name widgets = self.__build_external_service_widgets( trans, external_service, **kwd) widgets.extend( external_service.form_definition.get_widgets( trans.user, external_service.form_values.content, **kwd)) external_service_type = self.get_external_service_type( trans, external_service.external_service_type_id) return trans.fill_template( '/admin/external_service/edit_external_service.mako', external_service=external_service, widgets=widgets, message=message, status=status, external_service_type=external_service_type)
def __build_external_service_widgets( self, trans, external_service=None, **kwd ): params = util.Params( kwd ) if external_service: name = external_service.name description = external_service.description version = external_service.version seq_type = external_service.external_service_type_id else: name = util.restore_text( params.get( 'external_service_name', '' ) ) description = util.restore_text( params.get( 'external_service_description', '' ) ) version = util.restore_text( params.get( 'external_service_version', '' ) ) selected_seq_type = params.get( 'external_service_type_id', '' ) if trans.app.external_service_types.all_external_service_types.has_key( selected_seq_type ): seq_type = trans.app.external_service_types.all_external_service_types[ selected_seq_type ].id else: seq_type = 'none' widgets = [ dict( label='Name', widget=TextField( 'external_service_name', 40, name ), helptext='' ), dict( label='Description', widget=TextField( 'external_service_description', 40, description ), helptext='' ), dict( label='Version', widget=TextField( 'external_service_version', 40, version ), helptext='' ) ] # Do not show the external_service_type selectfield when editing a external_service if not external_service: widgets.append( dict( label='External service type', widget=self.__build_external_service_type_select_field( trans, seq_type, visible_external_service_types_only=True ), helptext='') ) return widgets
def index( self, trans, **kwd ): params = util.Params( kwd ) message = '' if params.userless_histories_days: userless_histories_days = params.userless_histories_days else: userless_histories_days = '60' if params.deleted_histories_days: deleted_histories_days = params.deleted_histories_days else: deleted_histories_days = '60' if params.deleted_datasets_days: deleted_datasets_days = params.deleted_datasets_days else: deleted_datasets_days = '60' file_path, disk_usage, datasets, file_size_str = self.disk_usage( trans, **kwd ) if 'action' in kwd: if kwd['action'] == "userless_histories": userless_histories_days, message = self.userless_histories( trans, **kwd ) elif kwd['action'] == "deleted_histories": deleted_histories_days, message = self.deleted_histories( trans, **kwd ) elif kwd['action'] == "deleted_datasets": deleted_datasets_days, message = self.deleted_datasets( trans, **kwd ) return trans.fill_template( '/webapps/reports/system.mako', file_path=file_path, disk_usage=disk_usage, datasets=datasets, file_size_str=file_size_str, userless_histories_days=userless_histories_days, deleted_histories_days=deleted_histories_days, deleted_datasets_days=deleted_datasets_days, message=message, nice_size=nice_size )
def user_per_month(self, trans, **kwd): params = util.Params(kwd) message = '' email = util.restore_text(params.get('email', '')) user_id = trans.security.decode_id(params.get('id', '')) q = sa.select((sa.func.date_trunc( 'month', sa.func.date( model.Request.table.c.create_time)).label('date'), sa.func.count(model.Request.table.c.id).label('total')), whereclause=model.Request.table.c.user_id == user_id, from_obj=[model.Request.table], group_by=[ sa.func.date_trunc( 'month', sa.func.date(model.Request.table.c.create_time)) ], order_by=[sa.desc('date')]) requests = [] for row in q.execute(): requests.append((row.date.strftime("%Y-%m"), row.total, row.date.strftime("%B"), row.date.strftime("%Y"))) return trans.fill_template( '/webapps/reports/requests_user_per_month.mako', email=util.sanitize_text(email), requests=requests, message=message)
def specified_month_in_error(self, trans, **kwd): params = util.Params(kwd) message = '' # If specified_date is not received, we'll default to the current month specified_date = kwd.get('specified_date', datetime.utcnow().strftime("%Y-%m-%d")) specified_month = specified_date[:7] year, month = map(int, specified_month.split("-")) start_date = date(year, month, 1) end_date = start_date + timedelta( days=calendar.monthrange(year, month)[1]) month_label = start_date.strftime("%B") year_label = start_date.strftime("%Y") q = sa.select( (sa.func.date(model.Job.table.c.create_time).label('date'), sa.func.count(model.Job.table.c.id).label('total_jobs')), whereclause=sa.and_(model.Job.table.c.state == 'error', model.Job.table.c.create_time >= start_date, model.Job.table.c.create_time < end_date), from_obj=[sa.outerjoin(model.Job.table, model.User.table)], group_by=['date'], order_by=[sa.desc('date')]) jobs = [] for row in q.execute(): jobs.append((row.date.strftime("%A"), row.date, row.total_jobs, row.date.strftime("%d"))) return trans.fill_template( '/webapps/reports/jobs_specified_month_in_error.mako', month_label=month_label, year_label=year_label, month=month, jobs=jobs, message=message)
def delete( self, **kwd ): params = util.Params(kwd) msg = '' if params.days: if params.passwd==self.app.config.admin_pass: days = int(params.days) values = [] for row in self.app.model.Dataset.table.select().execute(): values.append(self.app.model.Dataset.get(row.id)) for row in self.app.model.History.table.select().execute(): values.append(self.app.model.History.get(row.id)) #for row in self.app.model.User.table.select().execute(): # values.append(self.app.model.User.get(row.id)) count = 0 for value in values: now = time.time() last = time.mktime( time.strptime( value.update_time.strftime('%a %b %d %H:%M:%S %Y') )) diff = (now - last) /3600/24 # days if diff>days: value.delete() count += 1 try: self.app.model.flush() except: pass msg = 'Deleted %d objects' % count else: msg = 'Invalid password' return msg
def user_per_month(self, trans, **kwd): params = util.Params(kwd) message = '' email = util.restore_text(params.get('email', '')) q = sa.select( (sa.func.date_trunc( 'month', sa.func.date( model.Job.table.c.create_time)).label('date'), sa.func.count(model.Job.table.c.id).label('total_jobs')), whereclause=sa.and_( model.Job.table.c.session_id == model.GalaxySession.table.c.id, model.GalaxySession.table.c.user_id == model.User.table.c.id, model.User.table.c.email == email), from_obj=[sa.join(model.Job.table, model.User.table)], group_by=[ sa.func.date_trunc('month', sa.func.date(model.Job.table.c.create_time)) ], order_by=[sa.desc('date')]) jobs = [] for row in q.execute(): jobs.append((row.date.strftime("%Y-%m"), row.total_jobs, row.date.strftime("%B"), row.date.strftime("%Y"))) return trans.fill_template('/webapps/reports/jobs_user_per_month.mako', email=util.sanitize_text(email), jobs=jobs, message=message)
def show(self, trans, id, deleted='False', **kwd): """ GET /api/libraries/{encoded_library_id} GET /api/libraries/deleted/{encoded_library_id} Displays information about a library. """ library_id = id deleted = util.string_as_bool(deleted) params = util.Params(kwd) try: decoded_library_id = trans.security.decode_id(library_id) except TypeError: raise HTTPBadRequest( detail= 'Malformed library id ( %s ) specified, unable to decode.' % id) try: library = trans.sa_session.query( trans.app.model.Library).get(decoded_library_id) assert library.deleted == deleted except: library = None if not library or not (trans.user_is_admin() or trans.app.security_agent.can_access_library( trans.get_current_user_roles(), library)): raise HTTPBadRequest( detail='Invalid library id ( %s ) specified.' % id) item = library.get_api_value(view='element') #item['contents_url'] = url_for( 'contents', library_id=library_id ) item['contents_url'] = url_for('library_contents', library_id=library_id) return item
def user_per_month(self, trans, **kwd): params = util.Params(kwd) message = '' specs = sorter('date', kwd) sort_id = specs.sort_id order = specs.order arrow = specs.arrow _order = specs.exc_order email = util.restore_text(params.get('email', '')) user_id = trans.security.decode_id(params.get('id', '')) q = sa.select( (self.select_month( model.StoredWorkflow.table.c.create_time).label('date'), sa.func.count( model.StoredWorkflow.table.c.id).label('total_workflows')), whereclause=model.StoredWorkflow.table.c.user_id == user_id, from_obj=[model.StoredWorkflow.table], group_by=self.group_by_month( model.StoredWorkflow.table.c.create_time), order_by=[_order]) all_workflows_user_month = sa.select( (self.select_day( model.StoredWorkflow.table.c.create_time).label('date'), model.StoredWorkflow.table.c.id), whereclause=model.StoredWorkflow.table.c.user_id == user_id, from_obj=[model.StoredWorkflow.table]) trends = dict() for workflow in all_workflows_user_month.execute(): workflow_day = int(workflow.date.strftime("%-d")) - 1 workflow_month = int(workflow.date.strftime("%-m")) workflow_month_name = workflow.date.strftime("%B") workflow_year = workflow.date.strftime("%Y") key = str(workflow_month_name + workflow_year) try: trends[key][workflow_day] += 1 except KeyError: workflow_year = int(workflow_year) wday, day_range = calendar.monthrange(workflow_year, workflow_month) trends[key] = [0] * day_range trends[key][workflow_day] += 1 workflows = [] for row in q.execute(): workflows.append( (row.date.strftime("%Y-%m"), row.total_workflows, row.date.strftime("%B"), row.date.strftime("%Y"))) return trans.fill_template( '/webapps/reports/workflows_user_per_month.mako', email=util.sanitize_text(email), order=order, arrow=arrow, sort_id=sort_id, trends=trends, workflows=workflows, message=message)
def create(self, trans, payload, **kwd): """ POST /api/libraries Creates a new library. """ if not trans.user_is_admin(): raise HTTPForbidden( detail='You are not authorized to create a new library.') params = util.Params(payload) name = util.restore_text(params.get('name', None)) if not name: raise HTTPBadRequest(detail="Missing required parameter 'name'.") description = util.restore_text(params.get('description', '')) synopsis = util.restore_text(params.get('synopsis', '')) if synopsis in ['None', None]: synopsis = '' library = trans.app.model.Library(name=name, description=description, synopsis=synopsis) root_folder = trans.app.model.LibraryFolder(name=name, description='') library.root_folder = root_folder trans.sa_session.add_all((library, root_folder)) trans.sa_session.flush() encoded_id = trans.security.encode_id(library.id) rval = {} rval['url'] = url_for('library', id=encoded_id) rval['name'] = name rval['id'] = encoded_id return [rval]
def manage_user_info(self, trans, cntrller, **kwd): '''Manage a user's login, password, public username, type, addresses, etc.''' params = util.Params(kwd) user_id = params.get('id', None) if user_id: user = trans.sa_session.query(trans.app.model.User).get( trans.security.decode_id(user_id)) else: user = trans.user if not user: raise AssertionError("The user id (%s) is not valid" % str(user_id)) email = util.restore_text(params.get('email', user.email)) username = util.restore_text(params.get('username', '')) if not username: username = user.username message = escape(util.restore_text(params.get('message', ''))) status = params.get('status', 'done') return trans.fill_template('/webapps/tool_shed/user/manage_info.mako', cntrller=cntrller, user=user, email=email, username=username, message=message, status=status)
def create(self, trans, payload, **kwd): """ create( self, trans, payload, **kwd ) * POST /api/libraries: Creates a new library. Only ``name`` parameter is required. .. note:: Currently, only admin users can create libraries. :param payload: dictionary structure containing:: 'name': the new library's name (required) 'description': the new library's description (optional) 'synopsis': the new library's synopsis (optional) :type payload: dict :returns: detailed library information :rtype: dict :raises: ItemAccessibilityException, RequestParameterMissingException """ params = util.Params(payload) name = util.restore_text(params.get('name', None)) if not name: raise exceptions.RequestParameterMissingException( "Missing required parameter 'name'.") description = util.restore_text(params.get('description', '')) synopsis = util.restore_text(params.get('synopsis', '')) if synopsis in ['None', None]: synopsis = '' library = self.library_manager.create(trans, name, description, synopsis) library_dict = self.library_manager.get_library_dict(trans, library) return library_dict
def deleted_histories(self, trans, **kwd): """ The number of histories that were deleted more than the specified number of days ago, but have not yet been purged. Also included is the number of datasets associated with the histories. """ params = util.Params(kwd) message = '' if params.deleted_histories_days: deleted_histories_days = int(params.deleted_histories_days) cutoff_time = datetime.utcnow() - timedelta( days=deleted_histories_days) history_count = 0 dataset_count = 0 disk_space = 0 histories = trans.sa_session.query(model.History) \ .filter(and_(model.History.table.c.deleted == true(), model.History.table.c.purged == false(), model.History.table.c.update_time < cutoff_time)) \ .options(eagerload('datasets')) for history in histories: for hda in history.datasets: if not hda.dataset.purged: dataset_count += 1 try: disk_space += hda.dataset.file_size except Exception: pass history_count += 1 message = "%d histories ( including a total of %d datasets ) were deleted more than %d days ago, but have not yet been purged, " \ "disk space: %s." % (history_count, dataset_count, deleted_histories_days, nice_size(disk_space, True)) else: message = "Enter the number of days." return str(deleted_histories_days), message
def set_permissions_old(self, trans, library, payload, **kwd): """ *** old implementation for backward compatibility *** POST /api/libraries/{encoded_library_id}/permissions Updates the library permissions. """ params = util.Params(payload) permissions = {} for k, v in trans.app.model.Library.permitted_actions.items(): role_params = params.get(k + '_in', []) in_roles = [ trans.sa_session.query(trans.app.model.Role).get( trans.security.decode_id(x)) for x in util.listify(role_params) ] permissions[trans.app.security_agent.get_action( v.action)] = in_roles trans.app.security_agent.set_all_library_permissions( trans, library, permissions) trans.sa_session.refresh(library) # Copy the permissions to the root folder trans.app.security_agent.copy_library_permissions( trans, library, library.root_folder) item = library.to_dict(view='element', value_mapper={ 'id': trans.security.encode_id, 'root_folder_id': trans.security.encode_id }) return item
def create_form_definition( self, trans, **kwd ): params = util.Params( kwd ) message = util.restore_text( params.get( 'message', '' ) ) status = params.get( 'status', 'done' ) self.__imported_from_file = False if params.get( 'create_form_button', False ): form_definition, message = self.save_form_definition( trans, form_definition_current_id=None, **kwd ) if not form_definition: return trans.response.send_redirect( web.url_for( controller='forms', action='create_form_definition', message=message, status='error', name=util.restore_text( params.get( 'name', '' ) ), description=util.restore_text( params.get( 'description', '' ) ) )) if self.__imported_from_file: return trans.response.send_redirect( web.url_for( controller='forms', action='edit_form_definition', id=trans.security.encode_id( form_definition.current.id )) ) else: return trans.response.send_redirect( web.url_for( controller='forms', action='edit_form_definition', id=trans.security.encode_id( form_definition.current.id ), add_field_button='Add field', name=form_definition.name, description=form_definition.desc, form_type_select_field=form_definition.type ) ) inputs = [ ( 'Name', TextField( 'name', 40, util.restore_text( params.get( 'name', '' ) ) ) ), ( 'Description', TextField( 'description', 40, util.restore_text( params.get( 'description', '' ) ) ) ), ( 'Type', self.__build_form_types_widget( trans, selected=params.get( 'form_type', 'none' ) ) ), ( 'Import from csv file (Optional)', FileField( 'file_data', 40, '' ) ) ] return trans.fill_template( '/admin/forms/create_form.mako', inputs=inputs, message=message, status=status )
def view_editable_request_type(self, trans, **kwd): params = util.Params(kwd) message = util.restore_text(params.get('message', '')) status = params.get('status', 'done') request_type_id = params.get('id', None) try: request_type = trans.sa_session.query(trans.model.RequestType).get( trans.security.decode_id(request_type_id)) except: return invalid_id_redirect(trans, 'request_type', request_type_id, 'request type', action='browse_request_types') # See if we have any associated templates widgets = request_type.get_template_widgets(trans) widget_fields_have_contents = self.widget_fields_have_contents(widgets) # get all the external services selected till now external_service_select_fields_list = [] for index, external_service in enumerate( request_type.external_services): external_service_select_field = self.__build_external_service_select_field( trans, 'external_service_id_%i' % index, external_service) external_service_select_fields_list.append( external_service_select_field) return trans.fill_template( '/admin/request_type/edit_request_type.mako', request_type=request_type, widgets=widgets, widget_fields_have_contents=widget_fields_have_contents, external_service_select_fields_list= external_service_select_fields_list, message=message, status=status)
def __get_field( self, index, **kwd ): ''' This method retrieves all the user-entered details of a field and returns a dict. ''' params = util.Params( kwd ) label = util.restore_text( params.get( 'field_label_%i' % index, '' ) ) name = util.restore_text( params.get( 'field_name_%i' % index, '' ) ) helptext = util.restore_text( params.get( 'field_helptext_%i' % index, '' ) ) required = params.get( 'field_required_%i' % index, False ) field_type = util.restore_text( params.get( 'field_type_%i' % index, '' ) ) layout = params.get( 'field_layout_%i' % index, '0' ) default = util.restore_text( params.get( 'field_default_%i' % index, '' ) ) if not name.strip(): name = '%i_field_name' % index if field_type == 'SelectField': options = self.__get_select_field_options(index, **kwd) return { 'name': name, 'label': label, 'helptext': helptext, 'visible': True, 'required': required, 'type': field_type, 'selectlist': options, 'layout': layout, 'default': default } return { 'name': name, 'label': label, 'helptext': helptext, 'visible': True, 'required': required, 'type': field_type, 'layout': layout, 'default': default }
def __show( self, trans, form, current_form, msg='', messagetype='done', **kwd ): ''' This method displays the form and any of the changes made to it, The empty_form param allows for this method to simulate clicking the "add_field_button" on the edit_form.mako page so that the page is displayed with the first field to be added, saving a mouse click. ''' params = util.Params( kwd ) # name & description form_details = [ ( 'Name', TextField( 'name', 40, current_form[ 'name' ] ) ), ( 'Description', TextField( 'description', 40, current_form[ 'desc' ] ) ), ( 'Type', self.__form_types_widget(trans, selected=current_form[ 'type' ]) ) ] form_layout = [] if current_form[ 'type' ] == trans.app.model.FormDefinition.types.SAMPLE: for index, lg in enumerate(current_form[ 'layout' ]): form_layout.append( TextField( 'grid_layout%i' % index, 40, lg )) # fields field_details = [] for index, field in enumerate( current_form[ 'fields' ] ): if current_form['type'] == trans.app.model.FormDefinition.types.SAMPLE: field_ui = self.FieldUI( current_form['layout'], index, field ) else: field_ui = self.FieldUI( None, 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, current_form_type=current_form[ 'type' ], layout_grids=form_layout )