Example #1
0
    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,
        )