Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (3.94 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 une colonne avec les groupes
8
d'éléments supervisés auxquels appartient l'objet associé
9
à l'événement corrélé.
10
"""
11
import tw.forms as twf
12
from tg.i18n import lazy_ugettext as l_
13

    
14
from vigiboard.controllers.plugins import VigiboardRequestPlugin, INNER
15
from vigilo.models.session import DBSession
16
from vigilo.models import tables
17
from vigilo.models.tables.group import Group
18
from vigilo.models.tables.grouphierarchy import GroupHierarchy
19
from vigilo.models.tables.secondary_tables import SUPITEM_GROUP_TABLE
20
from sqlalchemy.orm import aliased
21
from sqlalchemy import or_
22

    
23

    
24
class GroupSelector(twf.InputField):
25
    params = ["choose_text", "text_value", "clear_text"]
26
    choose_text = l_('Choose')
27
    clear_text = l_('Clear')
28
    text_value = ''
29

    
30
    template = """
31
<div xmlns="http://www.w3.org/1999/xhtml"
32
   xmlns:py="http://genshi.edgewall.org/" py:strip="">
33
<input type="hidden" name="${name}" class="${css_class}"
34
    id="${id}.value" value="${value}" py:attrs="attrs" />
35
<input type="text" class="${css_class}" id="${id}.ui"
36
    value="${text_value}" readonly="readonly" py:attrs="attrs" />
37
<input type="button" class="${css_class}" id="${id}"
38
    value="${choose_text}" py:attrs="attrs" />
39
<input type="button" class="${css_class}" id="${id}.clear"
40
    value="${clear_text}" py:attrs="attrs" />
41
</div>
42
"""
43

    
44
    def update_params(self, d):
45
        super(GroupSelector, self).update_params(d)
46
        text_value = DBSession.query(Group.name).filter(
47
                        Group.idgroup == d.value).scalar()
48
        if not text_value:
49
            d.value = ''
50
        else:
51
            d.text_value = text_value
52

    
53

    
54
class PluginGroups(VigiboardRequestPlugin):
55
    """
56
    Affiche les groupes d'éléments supervisés auxquels
57
    appartient l'événement corrélé.
58
    """
59
    def get_search_fields(self):
60
        return [
61
            GroupSelector(
62
                'supitemgroup',
63
                label_text=l_('Group'),
64
                validator=twf.validators.Int(if_invalid=None, if_missing=None),
65
            )
66
        ]
67

    
68
    def handle_search_fields(self, query, search, state, subqueries):
69
        if search.get('supitemgroup') is None or state != INNER:
70
            return
71

    
72
        # Il s'agit d'un manager. On applique le filtre
73
        # indépendamment aux 2 sous-requêtes.
74
        if len(subqueries) == 2:
75
            subqueries[0] = subqueries[0].join(
76
                (SUPITEM_GROUP_TABLE,
77
                    or_(
78
                        SUPITEM_GROUP_TABLE.c.idsupitem == \
79
                            tables.LowLevelService.idhost,
80
                        SUPITEM_GROUP_TABLE.c.idsupitem == \
81
                            tables.LowLevelService.idservice,
82
                    )
83
                ),
84
                (GroupHierarchy, GroupHierarchy.idchild ==
85
                    SUPITEM_GROUP_TABLE.c.idgroup)
86
            ).filter(
87
                GroupHierarchy.idparent == search['supitemgroup']
88
            )
89

    
90
            subqueries[1] = subqueries[1].join(
91
                (SUPITEM_GROUP_TABLE,
92
                    SUPITEM_GROUP_TABLE.c.idsupitem == \
93
                        tables.Host.idhost,
94
                ),
95
                (GroupHierarchy, GroupHierarchy.idchild ==
96
                    SUPITEM_GROUP_TABLE.c.idgroup)
97
            ).filter(
98
                GroupHierarchy.idparent == search['supitemgroup']
99
            )
100

    
101
        # Il s'agit d'un utilisateur normal.
102
        else:
103
            GroupHierarchy_aliased = aliased(GroupHierarchy,
104
                name='GroupHierarchy_aliased')
105
            subqueries[0] = subqueries[0].join(
106
                (GroupHierarchy_aliased, GroupHierarchy_aliased.idchild ==
107
                    tables.UserSupItem.idsupitemgroup)
108
            ).filter(
109
                 GroupHierarchy_aliased.idparent == search['supitemgroup']
110
            )
111