Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

vigiboard / vigiboard / controllers / plugins / status.py @ 011743be

History | View | Annotate | Download (4.01 KB)

1 15b98053 Francois POIROTTE
# -*- coding: utf-8 -*-
2 4febadf0 Francois POIROTTE
# vim:set expandtab tabstop=4 shiftwidth=4:
3 011743be Francois POIROTTE
# Copyright (C) 2007-2020 CS GROUP - France
4 9b8d9497 Francois POIROTTE
# License: GNU GPL v2 <http://www.gnu.org/licenses/gpl-2.0.html>
5 a77de887 Francois POIROTTE
6 15b98053 Francois POIROTTE
"""
7 4febadf0 Francois POIROTTE
Un plugin pour VigiBoard qui ajoute 3 colonnes au tableau des événements :
8 e181e86c Francois POIROTTE
    -   la première colonne contient l'état d'acquittement de l'événement.
9
    -   la seconde colonne contient un lien permettant d'éditer certaines
10
        propriétés associées à l'événement corrélé.
11
    -   la dernière colonne permet de (dé)sélectionner l'événement pour
12
        effectuer un traitement par lot.
13 15b98053 Francois POIROTTE
"""
14 a2fa6a5b Francois POIROTTE
import urllib
15
import tg
16 27140946 Francois POIROTTE
import tw.forms as twf
17 02c4a1e7 Francois POIROTTE
from tg.i18n import lazy_ugettext as l_
18 27140946 Francois POIROTTE
19 a2fa6a5b Francois POIROTTE
from vigilo.models.tables import CorrEvent, StateName
20 27140946 Francois POIROTTE
from vigilo.models.functions import sql_escape_like
21 86662bc9 Francois POIROTTE
from vigiboard.controllers.plugins import VigiboardRequestPlugin, ITEMS
22 15b98053 Francois POIROTTE
23
class PluginStatus(VigiboardRequestPlugin):
24 4febadf0 Francois POIROTTE
    """
25
    Ajoute des colonnes permettant de voir le statut d'acquittement
26
    d'un événement corrélé et de modifier certaines de ses propriétés.
27
    """
28
29 07b62a01 Francois POIROTTE
    def get_generated_columns_count(self):
30 4febadf0 Francois POIROTTE
        """
31
        Renvoie le nombre de colonnes que ce plugin ajoute.
32 f744bc14 Francois POIROTTE
        Ce plugin en ajoute 4, au lieu de 1 comme la plupart des plugins.
33 4febadf0 Francois POIROTTE
        """
34 f744bc14 Francois POIROTTE
        return 4
35 27140946 Francois POIROTTE
36
    def get_search_fields(self):
37 f3eff455 Francois POIROTTE
        options = [
38
            ('', l_('All alerts')),
39 8ba2de75 Francois POIROTTE
            # On doit passer un type basestring pour les options.
40
            # Donc, on convertit les constantes (entiers) en type str.
41
            (str(CorrEvent.ACK_NONE),   l_('New alerts')),
42
            (str(CorrEvent.ACK_KNOWN),  l_('Alerts marked as Acknowledged')),
43
            (str(CorrEvent.ACK_CLOSED), l_('Alerts marked as Closed')),
44 f3eff455 Francois POIROTTE
        ]
45
46 27140946 Francois POIROTTE
        return [
47
            twf.TextField(
48
                'trouble_ticket',
49
                label_text=l_('Trouble Ticket'),
50 02c4a1e7 Francois POIROTTE
                validator=twf.validators.UnicodeString(if_missing=None),
51 f3eff455 Francois POIROTTE
            ),
52
            twf.SingleSelectField(
53 8ba2de75 Francois POIROTTE
                'ack',
54 f3eff455 Francois POIROTTE
                label_text=l_('Acknowledgement Status'),
55
                options=options,
56
                validator=twf.validators.OneOf(
57
                    dict(options).keys(),
58
                    if_invalid=None,
59
                    if_missing=None,
60
                ),
61
            ),
62 27140946 Francois POIROTTE
        ]
63
64 86662bc9 Francois POIROTTE
    def handle_search_fields(self, query, search, state, subqueries):
65
        if state != ITEMS:
66
            return
67
68 27140946 Francois POIROTTE
        if search.get('trouble_ticket'):
69
            tt = sql_escape_like(search['trouble_ticket'])
70
            query.add_filter(CorrEvent.trouble_ticket.ilike(tt))
71 f3eff455 Francois POIROTTE
72 8ba2de75 Francois POIROTTE
        if search.get('ack'):
73
            try:
74
                query.add_filter(CorrEvent.ack == int(search['ack']))
75
            except (ValueError, TypeError):
76
                # On ignore silencieusement le critère de recherche erroné.
77
                pass
78 a2fa6a5b Francois POIROTTE
79
    def get_data(self, event):
80
        cause = event[0].cause
81
        ack = event[0].ack
82
        state = StateName.value_to_statename(cause.current_state)
83
84
        trouble_ticket_id = None
85
        trouble_ticket_link = None
86 303d9596 Francois POIROTTE
        link = tg.config.get('vigiboard_links.tt', '')
87 a2fa6a5b Francois POIROTTE
        if event[0].trouble_ticket:
88
            trouble_ticket_id = event[0].trouble_ticket
89 303d9596 Francois POIROTTE
            trouble_ticket_link = link % {
90 a2fa6a5b Francois POIROTTE
                'id': event[0].idcorrevent,
91 32b2c767 Thomas BURGUIERE
                'host': event[1] and urllib.quote(event[1].encode('utf8'), '') or event[1],
92
                'service': event[2] and urllib.quote(event[2].encode('utf8'), '') or event[2],
93 a2fa6a5b Francois POIROTTE
                'tt': trouble_ticket_id and \
94 32b2c767 Thomas BURGUIERE
                        urllib.quote(trouble_ticket_id.encode('utf8'), '') or \
95 a2fa6a5b Francois POIROTTE
                        trouble_ticket_id,
96
            }
97
98
        return {
99
            'trouble_ticket_link': trouble_ticket_link,
100
            'trouble_ticket_id': trouble_ticket_id,
101
            'state': state,
102
            'id': event[0].idcorrevent,
103
            'ack': ack,
104
        }
105 5a845c93 Vincent QUEMENER
106
    def get_sort_criterion(self, query, column):
107
        criteria = {
108
            'ticket': CorrEvent.trouble_ticket,
109
            'ack': CorrEvent.ack,
110
        }
111
        return criteria.get(column)