def index(self, page, sort=None, order=None, **search): """ Page d'accueil de Vigiboard. Elle affiche, suivant la page demandée (page 1 par defaut), la liste des événements, rangés par ordre de prise en compte, puis de sévérité. Pour accéder à cette page, l'utilisateur doit être authentifié. @param page: Numéro de la page souhaitée, commence à 1 @type page: C{int} @param sort: Colonne de tri @type sort: C{str} or C{None} @param order: Ordre du tri (asc ou desc) @type order: C{str} or C{None} @param search: Dictionnaire contenant les critères de recherche. @type search: C{dict} Cette méthode permet de satisfaire les exigences suivantes : - VIGILO_EXIG_VIGILO_BAC_0040, - VIGILO_EXIG_VIGILO_BAC_0070, - VIGILO_EXIG_VIGILO_BAC_0100, """ # Auto-supervision self.get_failures() user = get_current_user() aggregates = VigiboardRequest(user, search=search, sort=sort, order=order) aggregates.add_table( CorrEvent, aggregates.items.c.hostname, aggregates.items.c.servicename ) aggregates.add_join((Event, CorrEvent.idcause == Event.idevent)) aggregates.add_contains_eager(CorrEvent.cause) aggregates.add_group_by(Event) aggregates.add_join((aggregates.items, Event.idsupitem == aggregates.items.c.idsupitem)) aggregates.add_order_by(asc(aggregates.items.c.hostname)) # Certains arguments sont réservés dans routes.util.url_for(). # On effectue les substitutions adéquates. # Par exemple: "host" devient "host_". reserved = ('host', 'anchor', 'protocol', 'qualified') for column in search.copy(): if column in reserved: search[column + '_'] = search[column] del search[column] # On ne garde que les champs effectivement renseignés. for column in search.copy(): if not search[column]: del search[column] # On sérialise les champs de type dict. def serialize_dict(dct, key): if isinstance(dct[key], dict): for subkey in dct[key]: serialize_dict(dct[key], subkey) dct['%s.%s' % (key, subkey)] = dct[key][subkey] del dct[key] elif isinstance(dct[key], datetime): dct[key] = dct[key].strftime(dateformat.get_date_format()) fixed_search = search.copy() for column in fixed_search.copy(): serialize_dict(fixed_search, column) # Pagination des résultats aggregates.generate_request() items_per_page = int(session.get('items_per_page', config['vigiboard_items_per_page'])) page = paginate.Page(aggregates.req, page=page, items_per_page=items_per_page) # Récupération des données des plugins plugins_data = {} plugins = dict(config['columns_plugins']) ids_events = [event[0].idcause for event in page.items] ids_correvents = [event[0].idcorrevent for event in page.items] for plugin in plugins: plugin_data = plugins[plugin].get_bulk_data(ids_correvents) if plugin_data: plugins_data[plugin] = plugin_data else: plugins_data[plugin] = {} # Ajout des formulaires et préparation # des données pour ces formulaires. tmpl_context.last_modification = \ mktime(get_last_modification_timestamp(ids_events).timetuple()) tmpl_context.edit_event_form = EditEventForm("edit_event_form", submit_text=_('Apply'), action=url('/update')) if request.response_type == 'text/csv': # Sans les 2 en-têtes suivants qui désactivent la mise en cache, # Internet Explorer refuse de télécharger le fichier CSV (cf. #961). response.headers['Pragma'] = 'public' # Nécessaire pour IE. response.headers['Cache-Control'] = 'max-age=0' # Nécessaire pour IE. response.headers["Content-Type"] = "text/csv" response.headers['Content-Disposition'] = \ 'attachment;filename="alerts.csv"' return export_csv.export(page, plugins_data) return dict( hostname = None, servicename = None, plugins_data = plugins_data, page = page, sort = sort, order = order, event_edit_status_options = edit_event_status_options, search_form = create_search_form, search = search, fixed_search = fixed_search, )