Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (4.01 KB)

1
# -*- coding: utf-8 -*-
2
# vim:set expandtab tabstop=4 shiftwidth=4:
3
# Copyright (C) 2007-2020 CS GROUP - France
4
# License: GNU GPL v2 <http://www.gnu.org/licenses/gpl-2.0.html>
5

    
6
"""
7
Un plugin pour VigiBoard qui ajoute 3 colonnes au tableau des événements :
8
    -   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
"""
14
import urllib
15
import tg
16
import tw.forms as twf
17
from tg.i18n import lazy_ugettext as l_
18

    
19
from vigilo.models.tables import CorrEvent, StateName
20
from vigilo.models.functions import sql_escape_like
21
from vigiboard.controllers.plugins import VigiboardRequestPlugin, ITEMS
22

    
23
class PluginStatus(VigiboardRequestPlugin):
24
    """
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
    def get_generated_columns_count(self):
30
        """
31
        Renvoie le nombre de colonnes que ce plugin ajoute.
32
        Ce plugin en ajoute 4, au lieu de 1 comme la plupart des plugins.
33
        """
34
        return 4
35

    
36
    def get_search_fields(self):
37
        options = [
38
            ('', l_('All alerts')),
39
            # 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
        ]
45

    
46
        return [
47
            twf.TextField(
48
                'trouble_ticket',
49
                label_text=l_('Trouble Ticket'),
50
                validator=twf.validators.UnicodeString(if_missing=None),
51
            ),
52
            twf.SingleSelectField(
53
                'ack',
54
                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
        ]
63

    
64
    def handle_search_fields(self, query, search, state, subqueries):
65
        if state != ITEMS:
66
            return
67

    
68
        if search.get('trouble_ticket'):
69
            tt = sql_escape_like(search['trouble_ticket'])
70
            query.add_filter(CorrEvent.trouble_ticket.ilike(tt))
71

    
72
        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

    
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
        link = tg.config.get('vigiboard_links.tt', '')
87
        if event[0].trouble_ticket:
88
            trouble_ticket_id = event[0].trouble_ticket
89
            trouble_ticket_link = link % {
90
                'id': event[0].idcorrevent,
91
                '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
                'tt': trouble_ticket_id and \
94
                        urllib.quote(trouble_ticket_id.encode('utf8'), '') or \
95
                        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

    
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)
112