Revision b430ccc5
Fusion du travail fait dans la branche 'nested_sets' vers le trunk.
git-svn-id: https://vigilo-dev.si.c-s.fr/svn@6116 b22e2e97-25c9-44ff-b637-2e5ceca36478
vigigraph/controllers/rpc.py | ||
---|---|---|
30 | 30 |
from vigilo.models.tables import SupItemGroup |
31 | 31 |
from vigilo.models.tables import PerfDataSource |
32 | 32 |
from vigilo.models.tables import Graph, GraphGroup |
33 |
from vigilo.models.tables.grouphierarchy import GroupHierarchy |
|
34 | 33 |
from vigilo.models.tables import Change |
35 | 34 |
|
36 | 35 |
from vigilo.models.tables.secondary_tables import SUPITEM_GROUP_TABLE |
... | ... | |
97 | 96 |
Un critere peut correspondre a un intitule complet hote ou graphe |
98 | 97 |
ou a un extrait. |
99 | 98 |
|
100 |
@param kwargs : arguments nommes |
|
101 |
@type kwargs : dict |
|
102 |
( arguments nommes -> host et graphe ) |
|
103 |
|
|
104 | 99 |
@return: couples hote-graphe |
105 |
@rtype: document json (sous forme de dict)
|
|
100 |
@rtype: dict
|
|
106 | 101 |
""" |
107 | 102 |
user = get_current_user() |
108 | 103 |
items = [] |
... | ... | |
110 | 105 |
if user is None: |
111 | 106 |
return dict(items=[]) |
112 | 107 |
|
113 |
# On a un nom d'indicateur, mais pas de nom d'hôte,
|
|
114 |
# on considère que l'utilisateur veut tous les indicateurs
|
|
108 |
# On a un nom de graphe, mais pas de nom d'hôte,
|
|
109 |
# on considère que l'utilisateur veut tous les graphes
|
|
115 | 110 |
# correspondant au motif, quel que soit l'hôte. |
116 | 111 |
if search_form_graph: |
117 | 112 |
if not search_form_host: |
... | ... | |
166 | 161 |
if not is_manager: |
167 | 162 |
supitemgroups = [sig[0] for sig in user.supitemgroups() if sig[1]] |
168 | 163 |
# pylint: disable-msg=E1103 |
169 |
items = items.join( |
|
170 |
(GroupHierarchy, GroupHierarchy.idchild == \ |
|
171 |
SUPITEM_GROUP_TABLE.c.idgroup) |
|
172 |
).filter(GroupHierarchy.idparent.in_(supitemgroups)) |
|
164 |
items = items.filter( |
|
165 |
SUPITEM_GROUP_TABLE.c.idgroup.in_(supitemgroups)) |
|
173 | 166 |
|
174 | 167 |
items = items.limit(100).all() # pylint: disable-msg=E1103 |
175 | 168 |
if not search_form_graph: |
... | ... | |
355 | 348 |
is_manager = in_group('managers').is_met(request.environ) |
356 | 349 |
if not is_manager: |
357 | 350 |
supitemgroups = [sig[0] for sig in user.supitemgroups() if sig[1]] |
358 |
graphs = graphs.join( |
|
359 |
(GroupHierarchy, GroupHierarchy.idchild == \ |
|
360 |
SUPITEM_GROUP_TABLE.c.idgroup) |
|
361 |
).filter(GroupHierarchy.idparent.in_(supitemgroups)) |
|
351 |
graphs = graphs.filter( |
|
352 |
SUPITEM_GROUP_TABLE.c.idgroup.in_(supitemgroups)) |
|
362 | 353 |
|
363 | 354 |
graphs = graphs.all() |
364 | 355 |
return dict(host=host, start=start, duration=duration, |
... | ... | |
394 | 385 |
).join( |
395 | 386 |
(SUPITEM_GROUP_TABLE, SUPITEM_GROUP_TABLE.c.idsupitem == \ |
396 | 387 |
Host.idhost), |
397 |
).filter(Host.name.like(query + '%') |
|
388 |
).filter(Host.name.like(query + u'%')
|
|
398 | 389 |
).order_by( |
399 | 390 |
Host.name.asc(), |
400 | 391 |
) |
... | ... | |
404 | 395 |
is_manager = in_group('managers').is_met(request.environ) |
405 | 396 |
if not is_manager: |
406 | 397 |
supitemgroups = [sig[0] for sig in user.supitemgroups() if sig[1]] |
407 |
hosts = hosts.join( |
|
408 |
(GroupHierarchy, GroupHierarchy.idchild == \ |
|
409 |
SUPITEM_GROUP_TABLE.c.idgroup) |
|
410 |
).filter(GroupHierarchy.idparent.in_(supitemgroups)) |
|
398 |
hosts = hosts.filter( |
|
399 |
SUPITEM_GROUP_TABLE.c.idgroup.in_(supitemgroups)) |
|
411 | 400 |
|
412 | 401 |
return dict(hosts=hosts) |
413 | 402 |
|
... | ... | |
434 | 423 |
|
435 | 424 |
# Si l'identifiant du groupe parent n'est pas |
436 | 425 |
# spécifié, on retourne la liste des groupes racines, |
437 |
# fournie par la méthode get_root_hosts_groups.
|
|
426 |
# fournie par la méthode get_root_host_groups. |
|
438 | 427 |
if parent_id is None: |
439 | 428 |
return self.get_root_host_groups() |
440 | 429 |
|
441 | 430 |
# TODO: Utiliser un schéma de validation |
442 | 431 |
parent_id = int(parent_id) |
443 |
|
|
444 |
# On vérifie si le groupe parent fait partie des |
|
445 |
# groupes auxquel l'utilisateur a accès, et on |
|
446 |
# retourne une liste vide dans le cas contraire |
|
432 |
parent = DBSession.query(SupItemGroup).get(parent_id) |
|
433 |
if not parent: |
|
434 |
return dict(groups = [], leaves = []) |
|
435 |
|
|
436 |
# On récupère la liste des groupes qui ont pour parent |
|
437 |
# le groupe dont l'identifiant est passé en paramètre |
|
438 |
# et auquel l'utilisateur a accès. |
|
439 |
db_groups = list(parent.children) # copie |
|
440 |
user = get_current_user() |
|
447 | 441 |
is_manager = in_group('managers').is_met(request.environ) |
442 |
user_groups = {} |
|
448 | 443 |
if not is_manager: |
449 |
direct_access = False |
|
450 |
user = get_current_user() |
|
451 | 444 |
user_groups = dict(user.supitemgroups()) |
452 |
# On regarde d'abord si le groupe fait partie de ceux |
|
453 |
# auquels l'utilisateur a explicitement accès, ou s'il |
|
454 |
# est un parent des groupes auxquels l'utilisateur a accès |
|
455 |
if parent_id in user_groups.keys(): |
|
456 |
direct_access = user_groups[parent_id] |
|
457 |
# Dans le cas contraire, on vérifie si le groupe est un |
|
458 |
# sous-groupe des groupes auxquels l'utilisateur a accès |
|
459 |
else: |
|
460 |
id_list = [ug for ug in user_groups.keys() if user_groups[ug]] |
|
461 |
child_groups = DBSession.query(SupItemGroup.idgroup |
|
462 |
).distinct( |
|
463 |
).join( |
|
464 |
(GroupHierarchy, |
|
465 |
GroupHierarchy.idchild == SupItemGroup.idgroup), |
|
466 |
).filter(GroupHierarchy.idparent.in_(id_list) |
|
467 |
).filter(GroupHierarchy.hops > 0 |
|
468 |
).all() |
|
469 |
for ucg in child_groups: |
|
470 |
if ucg.idgroup == parent_id: |
|
471 |
direct_access = True |
|
472 |
break |
|
473 |
# Sinon, l'utilisateur n'a pas accès à ce groupe |
|
474 |
else: |
|
475 |
return dict(groups = [], leaves = []) |
|
476 |
|
|
477 |
# On récupère la liste des groupes dont |
|
478 |
# l'identifiant du parent est passé en paramètre |
|
479 |
db_groups = DBSession.query( |
|
480 |
SupItemGroup |
|
481 |
).join( |
|
482 |
(GroupHierarchy, GroupHierarchy.idchild == \ |
|
483 |
SupItemGroup.idgroup), |
|
484 |
).filter(GroupHierarchy.hops == 1 |
|
485 |
).filter(GroupHierarchy.idparent == parent_id |
|
486 |
).order_by(SupItemGroup.name.asc()) |
|
487 |
if not is_manager and not direct_access: |
|
488 |
id_list = [ug for ug in user_groups.keys()] |
|
489 |
|
|
490 |
db_groups = db_groups.filter( |
|
491 |
SupItemGroup.idgroup.in_(id_list)) |
|
445 |
copy = list(db_groups) |
|
446 |
for db_group in copy: |
|
447 |
if not user_groups.get(db_group.idgroup, False): |
|
448 |
db_groups.remove(db_group) |
|
449 |
|
|
492 | 450 |
groups = [] |
493 |
for group in db_groups.all():
|
|
451 |
for group in db_groups: |
|
494 | 452 |
groups.append({ |
495 | 453 |
'id' : group.idgroup, |
496 | 454 |
'name' : group.name, |
... | ... | |
499 | 457 |
# On récupère la liste des hôtes appartenant au |
500 | 458 |
# groupe dont l'identifiant est passé en paramètre |
501 | 459 |
hosts = [] |
502 |
if is_manager or direct_access:
|
|
460 |
if is_manager or user_groups.get(parent_id, False):
|
|
503 | 461 |
db_hosts = DBSession.query( |
504 | 462 |
Host.idhost, |
505 | 463 |
Host.name, |
506 | 464 |
).join( |
507 |
(SUPITEM_GROUP_TABLE, |
|
508 |
SUPITEM_GROUP_TABLE.c.idsupitem == Host.idhost |
|
509 |
), |
|
465 |
SUPITEM_GROUP_TABLE, |
|
510 | 466 |
).filter(SUPITEM_GROUP_TABLE.c.idgroup == parent_id |
511 | 467 |
).order_by(Host.name.asc()) |
512 | 468 |
hosts = [] |
... | ... | |
531 | 487 |
# Si l'identifiant de l'hôte n'est pas spécifié, on |
532 | 488 |
# retourne un dictionnaire contenant deux listes vides |
533 | 489 |
if host_id is None: |
534 |
return dict(groups = [], graphs=[])
|
|
490 |
return dict(groups = [], leaves=[])
|
|
535 | 491 |
|
536 | 492 |
# On vérifie les permissions sur l'hôte |
537 | 493 |
# TODO: Utiliser un schéma de validation |
538 | 494 |
host_id = int(host_id) |
539 |
host = DBSession.query(Host |
|
540 |
).filter(Host.idhost == host_id |
|
541 |
).first() |
|
495 |
host = DBSession.query(Host).get(host_id) |
|
542 | 496 |
if host is None: |
543 |
return dict(groups = [], graphs=[])
|
|
497 |
return dict(groups = [], leaves=[])
|
|
544 | 498 |
user = get_current_user() |
545 | 499 |
if not host.is_allowed_for(user): |
546 |
return dict(groups = [], graphs=[])
|
|
500 |
return dict(groups = [], leaves=[])
|
|
547 | 501 |
|
548 | 502 |
# On récupère la liste des groupes de graphes associés à l'hôte |
549 | 503 |
host_graph_groups = DBSession.query( |
... | ... | |
557 | 511 |
GRAPH_PERFDATASOURCE_TABLE.c.idgraph == Graph.idgraph), |
558 | 512 |
(PerfDataSource, PerfDataSource.idperfdatasource == \ |
559 | 513 |
GRAPH_PERFDATASOURCE_TABLE.c.idperfdatasource), |
560 |
(SUPITEM_GROUP_TABLE, \ |
|
561 |
SUPITEM_GROUP_TABLE.c.idsupitem == PerfDataSource.idhost), |
|
562 | 514 |
).filter(PerfDataSource.idhost == host_id |
563 |
).order_by(GraphGroup.name.asc() |
|
564 |
).all()
|
|
515 |
).order_by(GraphGroup.name.asc())
|
|
516 |
host_graph_groups = host_graph_groups.all()
|
|
565 | 517 |
|
566 | 518 |
# Si l'identifiant du groupe parent n'est pas spécifié, |
567 | 519 |
# on récupère la liste des groupes de graphes racines. |
568 | 520 |
if parent_id is None: |
569 |
graph_groups = GraphGroup.get_top_groups() |
|
521 |
graph_groups = GraphGroup.get_top_groups()[0].children
|
|
570 | 522 |
|
571 | 523 |
# Sinon on récupère la liste des graphes dont le |
572 |
# groupe passé en paramètre est le parent direct |
|
524 |
# groupe passé en paramètre est le parent direct.
|
|
573 | 525 |
else: |
574 | 526 |
# TODO: Utiliser un schéma de validation |
575 | 527 |
parent_id = int(parent_id) |
576 |
graph_groups = DBSession.query( |
|
577 |
GraphGroup |
|
578 |
).join( |
|
579 |
(GroupHierarchy, GroupHierarchy.idchild == \ |
|
580 |
GraphGroup.idgroup), |
|
581 |
).filter(GroupHierarchy.hops == 1 |
|
582 |
).filter(GroupHierarchy.idparent == parent_id |
|
583 |
).order_by(GraphGroup.name.asc() |
|
584 |
).all() |
|
528 |
parent = DBSession.query(GraphGroup).get(parent_id) |
|
529 |
graph_groups = parent.children |
|
585 | 530 |
|
586 | 531 |
# On réalise l'intersection des deux listes |
587 | 532 |
groups = [] |
... | ... | |
628 | 573 |
@rtype : C{dict} of C{list} of C{dict} of C{mixed} |
629 | 574 |
""" |
630 | 575 |
|
631 |
# On récupère tous les groupes qui ont un parent. |
|
632 |
children = DBSession.query( |
|
633 |
SupItemGroup, |
|
634 |
).distinct( |
|
635 |
).join( |
|
636 |
(GroupHierarchy, GroupHierarchy.idchild == SupItemGroup.idgroup) |
|
637 |
).filter(GroupHierarchy.hops > 0) |
|
638 |
|
|
639 |
# Ensuite on les exclut de la liste des groupes, |
|
640 |
# pour ne garder que ceux qui sont au sommet de |
|
641 |
# l'arbre et qui constituent nos "root groups". |
|
642 |
root_groups = DBSession.query( |
|
643 |
SupItemGroup, |
|
644 |
).except_(children |
|
645 |
).order_by(SupItemGroup.name) |
|
576 |
root_groups = list(SupItemGroup.get_top_groups()[0].children) |
|
646 | 577 |
|
647 | 578 |
# On filtre ces groupes racines afin de ne |
648 | 579 |
# retourner que ceux auquels l'utilisateur a accès |
649 | 580 |
user = get_current_user() |
650 | 581 |
is_manager = in_group('managers').is_met(request.environ) |
651 | 582 |
if not is_manager: |
652 |
user_groups = [ug[0] for ug in user.supitemgroups()] |
|
653 |
root_groups = root_groups.filter( |
|
654 |
SupItemGroup.idgroup.in_(user_groups)) |
|
583 |
user_groups = [sig[0] for sig in user.supitemgroups()] |
|
584 |
copy = list(root_groups) |
|
585 |
for root_group in copy: |
|
586 |
if root_group.idgroup not in user_groups: |
|
587 |
root_groups.remove(root_group) |
|
655 | 588 |
|
656 | 589 |
groups = [] |
657 |
for group in root_groups.all():
|
|
590 |
for group in root_groups: |
|
658 | 591 |
groups.append({ |
659 | 592 |
'id' : group.idgroup, |
660 | 593 |
'name' : group.name, |
vigigraph/tests/functional/test_graph_selection_form.py | ||
---|---|---|
7 | 7 |
from vigigraph.tests import TestController |
8 | 8 |
from vigilo.models.session import DBSession |
9 | 9 |
from vigilo.models.tables import Host, Graph, GraphGroup |
10 |
from vigilo.models.demo.functions import \ |
|
11 |
add_graph, add_graphgroup, add_graph2group, \ |
|
12 |
add_perfdatasource, add_perfdatasource2graph, \ |
|
13 |
add_vigiloserver, add_application |
|
10 |
from vigilo.models.demo.functions import * |
|
14 | 11 |
|
15 | 12 |
from vigigraph.tests.functional.test_host_selection_form import populateDB |
16 | 13 |
|
... | ... | |
238 | 235 |
# de graphes retournée est vide |
239 | 236 |
self.assertEqual( |
240 | 237 |
json, { |
241 |
'graphs': [],
|
|
238 |
'leaves': [],
|
|
242 | 239 |
'groups': [] |
243 | 240 |
} |
244 | 241 |
) |
... | ... | |
254 | 251 |
# de graphes retournée est vide |
255 | 252 |
self.assertEqual( |
256 | 253 |
json, { |
257 |
'graphs': [],
|
|
254 |
'leaves': [],
|
|
258 | 255 |
'groups': [] |
259 | 256 |
} |
260 | 257 |
) |
... | ... | |
270 | 267 |
# de graphes retournée est vide |
271 | 268 |
self.assertEqual( |
272 | 269 |
json, { |
273 |
'graphs': [],
|
|
270 |
'leaves': [],
|
|
274 | 271 |
'groups': [] |
275 | 272 |
} |
276 | 273 |
) |
... | ... | |
307 | 304 |
# de graphes retournée est vide |
308 | 305 |
self.assertEqual( |
309 | 306 |
json, { |
310 |
'graphs': [],
|
|
307 |
'leaves': [],
|
|
311 | 308 |
'groups': [] |
312 | 309 |
} |
313 | 310 |
) |
... | ... | |
498 | 495 |
# de graphes retournée est vide |
499 | 496 |
self.assertEqual( |
500 | 497 |
json, { |
501 |
'graphs': [],
|
|
498 |
'leaves': [],
|
|
502 | 499 |
'groups': [] |
503 | 500 |
} |
504 | 501 |
) |
... | ... | |
515 | 512 |
# de graphes retournée est vide |
516 | 513 |
self.assertEqual( |
517 | 514 |
json, { |
518 |
'graphs': [],
|
|
515 |
'leaves': [],
|
|
519 | 516 |
'groups': [] |
520 | 517 |
} |
521 | 518 |
) |
... | ... | |
532 | 529 |
# de graphes retournée est vide |
533 | 530 |
self.assertEqual( |
534 | 531 |
json, { |
535 |
'graphs': [],
|
|
532 |
'leaves': [],
|
|
536 | 533 |
'groups': [] |
537 | 534 |
} |
538 | 535 |
) |
... | ... | |
575 | 572 |
# graphes retournée est vide |
576 | 573 |
self.assertEqual( |
577 | 574 |
json, { |
578 |
'graphs': [],
|
|
575 |
'leaves': [],
|
|
579 | 576 |
'groups': [] |
580 | 577 |
} |
581 | 578 |
) |
vigigraph/tests/functional/test_host_selection_form.py | ||
---|---|---|
7 | 7 |
from vigigraph.tests import TestController |
8 | 8 |
from vigilo.models.session import DBSession |
9 | 9 |
from vigilo.models.tables import Host, SupItemGroup, Permission |
10 |
from vigilo.models.demo.functions import add_supitemgroup, \ |
|
11 |
add_host, add_host2group, add_usergroup, add_user, \ |
|
12 |
add_supitemgrouppermission, add_usergroup_permission |
|
10 |
from vigilo.models.demo.functions import * |
|
13 | 11 |
|
14 | 12 |
|
15 | 13 |
def populateDB(): |
... | ... | |
26 | 24 |
""" |
27 | 25 |
|
28 | 26 |
# Ajout d'un groupe d'hôtes principal |
29 |
mainhostgroup = add_supitemgroup(u'mhg', None)
|
|
27 |
mainhostgroup = add_supitemgroup(u'mhg') |
|
30 | 28 |
|
31 | 29 |
# Ajout d'un premier groupe d'hôtes de second niveau |
32 | 30 |
hostgroup1 = add_supitemgroup(u'hg1', mainhostgroup) |
... | ... | |
259 | 257 |
self.assertEqual( |
260 | 258 |
json, { |
261 | 259 |
'leaves': [ |
262 |
{'id': host1.idhost, 'name': host1.name} |
|
260 |
{'id': host1.idhost, 'name': host1.name},
|
|
263 | 261 |
], |
264 | 262 |
'groups': [ |
265 | 263 |
{'id': hostgroup1.idgroup, 'name': hostgroup1.name}, |
... | ... | |
271 | 269 |
# Récupération des groupes d'hôtes |
272 | 270 |
# accessibles à l'utilisateur 'poweruser' |
273 | 271 |
response = self.app.post( |
274 |
'/rpc/hosttree?parent_id=%s' % (mainhostgroup.idgroup, ), {
|
|
275 |
}, extra_environ={'REMOTE_USER': 'poweruser'})
|
|
272 |
'/rpc/hosttree?parent_id=%d' % mainhostgroup.idgroup, {},
|
|
273 |
extra_environ={'REMOTE_USER': 'poweruser'}) |
|
276 | 274 |
json = response.json |
277 | 275 |
|
278 | 276 |
# On s'assure que la liste de groupes d'hôtes retournée |
... | ... | |
280 | 278 |
self.assertEqual( |
281 | 279 |
json, { |
282 | 280 |
'leaves': [ |
283 |
{'id': host1.idhost, 'name': host1.name} |
|
281 |
{'id': host1.idhost, 'name': host1.name},
|
|
284 | 282 |
], |
285 | 283 |
'groups': [ |
286 | 284 |
{'id': hostgroup1.idgroup, 'name': hostgroup1.name}, |
... | ... | |
506 | 504 |
# Récupération des hôtes du groupe 'hg2' |
507 | 505 |
# accessibles à l'utilisateur 'user' |
508 | 506 |
response = self.app.post( |
509 |
'/rpc/hosttree?parent_id=%s' % (hostgroup2.idgroup, ), {
|
|
510 |
}, extra_environ={'REMOTE_USER': 'user'})
|
|
507 |
'/rpc/hosttree?parent_id=%s' % hostgroup2.idgroup, {},
|
|
508 |
extra_environ={'REMOTE_USER': 'user'}) |
|
511 | 509 |
json = response.json |
512 | 510 |
|
513 | 511 |
# On s'assure que la liste d'hôtes retournée est vide |
... | ... | |
518 | 516 |
# Récupération des hôtes du groupe 'mhg' |
519 | 517 |
# accessibles à l'utilisateur 'visitor' |
520 | 518 |
response = self.app.post( |
521 |
'/rpc/hosttree?parent_id=%s' % (mainhostgroup.idgroup, ), {
|
|
522 |
}, extra_environ={'REMOTE_USER': 'visitor'})
|
|
519 |
'/rpc/hosttree?parent_id=%s' % mainhostgroup.idgroup, {},
|
|
520 |
extra_environ={'REMOTE_USER': 'visitor'}) |
|
523 | 521 |
json = response.json |
524 | 522 |
|
525 | 523 |
# On s'assure que la liste d'hôtes retournée est vide |
vigigraph/tests/functional/test_search_form.py | ||
---|---|---|
38 | 38 |
""" |
39 | 39 |
Résultats de la recherche sur un hôte avec les bons droits |
40 | 40 |
""" |
41 |
|
|
42 | 41 |
# Récupération du groupe d'hôtes 'mhg' dans la base de données |
43 | 42 |
mainhostgroup = DBSession.query(SupItemGroup).filter( |
44 | 43 |
SupItemGroup.name == u'mhg').first() |
... | ... | |
96 | 95 |
|
97 | 96 |
# On s'assure que les deux listes retournées contiennent |
98 | 97 |
# respectivement le nom de l'hôte et son identifiant |
98 |
print repr(DBSession.query(SupItemGroup.name, SupItemGroup.left, SupItemGroup.right, SupItemGroup.depth).all()) |
|
99 | 99 |
self.assertEqual( |
100 | 100 |
json, { |
101 | 101 |
'labels': [[host2.name, None]], |
Also available in: Unified diff