Project

General

Profile

Revision b430ccc5

IDb430ccc508ccc259db8d1b30f85b473ff4da4ab5
Parent 8f6567c2
Child 7e6517fe

Added by Francois POIROTTE over 13 years ago

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

View differences:

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