Revision 0f0e32ed
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
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