Ejemplo n.º 1
0
 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)
Ejemplo n.º 3
0
 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 )
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
 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)
Ejemplo n.º 7
0
 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)
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
    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
Ejemplo n.º 10
0
 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 ) )
Ejemplo n.º 11
0
    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)
Ejemplo n.º 12
0
 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)
Ejemplo n.º 13
0
 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)
Ejemplo n.º 14
0
 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
Ejemplo n.º 15
0
 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 )
Ejemplo n.º 16
0
 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)
Ejemplo n.º 17
0
 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)
Ejemplo n.º 18
0
 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
Ejemplo n.º 19
0
 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)
Ejemplo n.º 20
0
 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
Ejemplo n.º 21
0
    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)
Ejemplo n.º 22
0
 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]
Ejemplo n.º 23
0
 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)
Ejemplo n.º 24
0
    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
Ejemplo n.º 25
0
    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
Ejemplo n.º 26
0
    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
Ejemplo n.º 27
0
 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 )
Ejemplo n.º 28
0
 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)
Ejemplo n.º 29
0
 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 }
Ejemplo n.º 30
0
 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 )