Project

General

Profile

Revision 0f0e32ed

ID0f0e32eddeeeb503c97a9a8d17966e19356a3e2b
Parent db58b89e
Child 809955f3

Added by Francois POIROTTE about 13 years ago

Refait fonctionner la recherche sur les supitemgroups (#595).

git-svn-id: https://vigilo-dev.si.c-s.fr/svn@6680 b22e2e97-25c9-44ff-b637-2e5ceca36478

View differences:

vigiboard/controllers/plugins/__init__.py
90 90
    def get_search_fields(self):
91 91
        return []
92 92

  
93
    def handle_search_fields(self, query, search):
93
    def handle_search_fields(self, query, search, subqueries):
94 94
        pass
vigiboard/controllers/plugins/date.py
77 77
            ),
78 78
        ]
79 79

  
80
    def handle_search_fields(self, query, search):
80
    def handle_search_fields(self, query, search, subqueries):
81 81
        if search.get('from_date'):
82 82
            query.add_filter(tables.CorrEvent.timestamp_active >=
83 83
                search['from_date'])
vigiboard/controllers/plugins/groups.py
28 28

  
29 29
from vigiboard.controllers.plugins import VigiboardRequestPlugin
30 30
from vigilo.models.session import DBSession
31
from vigilo.models import tables
31 32
from vigilo.models.tables.group import Group
32 33
from vigilo.models.tables.grouphierarchy import GroupHierarchy
34
from vigilo.models.tables.secondary_tables import SUPITEM_GROUP_TABLE
33 35

  
34 36
from repoze.what.predicates import in_group
35 37
from tg import request
......
78 80
            )
79 81
        ]
80 82

  
81
    def handle_search_fields(self, query, search):
82
        pass
83
    def handle_search_fields(self, query, search, subqueries):
84
        if search.get('supitemgroup') is None:
85
            return
86

  
87
        # Il s'agit d'un manager. On applique le filtre
88
        # indépendamment aux 2 sous-requêtes.
89
        if len(subqueries) == 2:
90
            subqueries[0] = subqueries[0].join(
91
                (SUPITEM_GROUP_TABLE,
92
                    or_(
93
                        SUPITEM_GROUP_TABLE.c.idsupitem == \
94
                            tables.LowLevelService.idhost,
95
                        SUPITEM_GROUP_TABLE.c.idsupitem == \
96
                            tables.LowLevelService.idservice,
97
                    )
98
                ),
99
                (GroupHierarchy, GroupHierarchy.idchild ==
100
                    SUPITEM_GROUP_TABLE.c.idgroup)
101
            ).filter(
102
                GroupHierarchy.idparent == search['supitemgroup']
103
            )
104

  
105
            subqueries[1] = subqueries[1].join(
106
                (SUPITEM_GROUP_TABLE,
107
                    SUPITEM_GROUP_TABLE.c.idsupitem == \
108
                        tables.Host.idhost,
109
                ),
110
                (GroupHierarchy, GroupHierarchy.idchild ==
111
                    SUPITEM_GROUP_TABLE.c.idgroup)
112
            ).filter(
113
                GroupHierarchy.idparent == search['supitemgroup']
114
            )
115

  
116
        # Il s'agit d'un utilisateur normal.
117
        else:
118
            subqueries[0] = subqueries[0].filter(
119
                tables.UserSupItem.idsupitemgroup == search['supitemgroup']
120
            )
vigiboard/controllers/plugins/hostname.py
40 40
            )
41 41
        ]
42 42

  
43
    def handle_search_fields(self, query, search):
43
    def handle_search_fields(self, query, search, subqueries):
44 44
        if search.get('host'):
45 45
            host = sql_escape_like(search['host'])
46 46
            query.add_filter(query.items.c.hostname.ilike(host))
vigiboard/controllers/plugins/output.py
40 40
            )
41 41
        ]
42 42

  
43
    def handle_search_fields(self, query, search):
43
    def handle_search_fields(self, query, search, subqueries):
44 44
        if search.get('output'):
45 45
            output = sql_escape_like(search['output'])
46 46
            query.add_filter(Event.message.ilike(output))
vigiboard/controllers/plugins/priority.py
109 109
            )
110 110
        ]
111 111

  
112
    def handle_search_fields(self, query, search):
112
    def handle_search_fields(self, query, search, subqueries):
113 113
        if (not search.get('priority')):
114 114
            return
115 115

  
vigiboard/controllers/plugins/servicename.py
43 43
            )
44 44
        ]
45 45

  
46
    def handle_search_fields(self, query, search):
46
    def handle_search_fields(self, query, search, subqueries):
47 47
        if search.get('service'):
48 48
            service = sql_escape_like(search['service'])
49 49
            query.add_filter(query.items.c.servicename.ilike(service))
vigiboard/controllers/plugins/status.py
55 55
            )
56 56
        ]
57 57

  
58
    def handle_search_fields(self, query, search):
58
    def handle_search_fields(self, query, search, subqueries):
59 59
        if search.get('trouble_ticket'):
60 60
            tt = sql_escape_like(search['trouble_ticket'])
61 61
            query.add_filter(CorrEvent.trouble_ticket.ilike(tt))
vigiboard/controllers/root.py
132 132
        """
133 133

  
134 134
        user = get_current_user()
135
        if 'supitemgroup' in search:
136
            aggregates = VigiboardRequest(
137
                user, supitemgroup=search['supitemgroup'])
138
        else:
139
            aggregates = VigiboardRequest(user)
135
        aggregates = VigiboardRequest(user, search=search)
140 136

  
141 137
        aggregates.add_table(
142 138
            CorrEvent,
......
150 146
            Event.idsupitem == aggregates.items.c.idsupitem))
151 147
        aggregates.add_order_by(asc(aggregates.items.c.hostname))
152 148

  
153
        # Application des filtres des plugins si nécessaire.
154
        for plugin, instance in config.get('columns_plugins', []):
155
            instance.handle_search_fields(aggregates, search)
156

  
157 149
        # Certains arguments sont réservés dans routes.util.url_for().
158 150
        # On effectue les substitutions adéquates.
159 151
        # Par exemple: "host" devient "host_".
vigiboard/controllers/vigiboardrequest.py
51 51
        'AAClosed': '_Ack',
52 52
    }
53 53

  
54
    def __init__(self, user, mask_closed_events=True, supitemgroup=None):
54
    def __init__(self, user, mask_closed_events=True, search=None):
55 55
        """
56 56
        Initialisation de l'objet qui effectue les requêtes de VigiBoard
57 57
        sur la base de données.
......
59 59
        l'utilisateur sur les données manipulées.
60 60
        """
61 61

  
62
        # Permet s'appliquer des filtres de recherche aux sous-requêtes.
63
        self.subqueries = []
62 64
        self.generaterq = False
63 65

  
64 66
        is_manager = in_group('managers').is_met(request.environ)
......
66 68
        # Si l'utilisateur fait partie du groupe 'managers',
67 69
        # il a accès à tous les hôtes/services sans restriction.
68 70
        if is_manager:
69

  
70 71
            # Sélection de tous les services de la BDD.
71
            self.lls_query = DBSession.query(
72
            lls_query = DBSession.query(
72 73
                LowLevelService.idservice.label("idsupitem"),
73 74
                LowLevelService.servicename.label("servicename"),
74 75
                Host.name.label("hostname"),
75 76
            ).join(
76 77
                (Host, Host.idhost == LowLevelService.idhost),
77
            )
78

  
79
            # Ajout d'un filtre sur le groupe de supitems
80
            if supitemgroup:
81
                self.lls_query = self.lls_query.join(
82
                    (SUPITEM_GROUP_TABLE,
83
                        or_(
84
                            SUPITEM_GROUP_TABLE.c.idsupitem == \
85
                                LowLevelService.idhost,
86
                            SUPITEM_GROUP_TABLE.c.idsupitem == \
87
                                LowLevelService.idservice,
88
                        )
89
                    ),
90
                    (GroupHierarchy, GroupHierarchy.idchild ==
91
                        SUPITEM_GROUP_TABLE.c.idgroup)
92
                ).filter(
93
                    GroupHierarchy.idparent == supitemgroup
94
                )
95

  
96
            self.lls_query = self.lls_query.distinct()
78
            ).distinct()
97 79

  
98 80
            # Sélection de tous les hôtes de la BDD.
99
            self.host_query = DBSession.query(
81
            host_query = DBSession.query(
100 82
                Host.idhost.label("idsupitem"),
101 83
                expr_null().label("servicename"),
102 84
                Host.name.label("hostname"),
103
            )
104

  
105
            # Ajout d'un filtre sur le groupe de supitems
106
            if supitemgroup:
107
                self.host_query = self.host_query.join(
108
                    (SUPITEM_GROUP_TABLE,
109
                        SUPITEM_GROUP_TABLE.c.idsupitem == \
110
                            Host.idhost,
111
                    ),
112
                    (GroupHierarchy, GroupHierarchy.idchild ==
113
                        SUPITEM_GROUP_TABLE.c.idgroup)
114
                ).filter(
115
                    GroupHierarchy.idparent == supitemgroup
116
                )
117

  
118
            self.host_query = self.host_query.distinct()
85
            ).host_query.distinct()
86

  
87
            # Application des filtres des plugins si nécessaire.
88
            if search is not None:
89
                # On tire ici partie du fait que les listes sont passées
90
                # par référence dans les fonctions.
91
                subqueries = [lls_query, host_query]
92
                for plugin, instance in config.get('columns_plugins', []):
93
                    instance.handle_search_fields(self, search, )
94
                lls_query = subqueries[0]
95
                host_query = subqueries[1]
119 96

  
120 97
            # Union des deux sélections précédentes
121 98
            self.items = union_all(
122
                self.lls_query,
123
                self.host_query,
99
                lls_query,
100
                host_query,
124 101
                correlate=False
125 102
            ).alias()
126 103

  
......
132 109
                UserSupItem.hostname,
133 110
            ).filter(
134 111
                UserSupItem.username == user.user_name
135
            )
112
            ).distinct()
136 113

  
137
            # Ajout d'un filtre sur le groupe de supitems
138
            if supitemgroup:
139
                items = items.filter(
140
                    UserSupItem.idsupitemgroup == supitemgroup
141
                )
114
            # Application des filtres des plugins si nécessaire.
115
            if search is not None:
116
                # On tire ici partie du fait que les listes sont passées
117
                # par référence dans les fonctions.
118
                subqueries = [items]
119
                for plugin, instance in config.get('columns_plugins', []):
120
                    instance.handle_search_fields(self, search, subqueries)
121
                items = subqueries[0]
142 122

  
143
            self.items = items.distinct().subquery()
123
            self.items = items.subquery()
144 124

  
145 125
        # Éléments à retourner (SELECT ...)
146 126
        self.table = []
......
266 246
            self.req = self.req.group_by(i)
267 247
        for i in self.orderby:
268 248
            self.req = self.req.order_by(i)
269

  
270 249
        self.generaterq = True
271 250

  
272 251
    def num_rows(self):

Also available in: Unified diff