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/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