Project

General

Profile

Revision 7e6517fe

ID7e6517fef8d37e946cf046be3cf0679569208dd8
Parent b430ccc5
Child a7846115

Added by Francois POIROTTE over 13 years ago

Retrait des modifications liées à la fusion de la branche nested_sets du trunk (révisions r6116, r6121 et r6129).
Le nouveau mécanisme nécessite encore des ajustements pour être utilisable.

git-svn-id: https://vigilo-dev.si.c-s.fr/svn@6135 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
33 34
from vigilo.models.tables import Change
34 35

  
35 36
from vigilo.models.tables.secondary_tables import SUPITEM_GROUP_TABLE
......
96 97
        Un critere peut correspondre a un intitule complet hote ou graphe
97 98
        ou a un extrait.
98 99

  
100
        @param kwargs : arguments nommes
101
        @type kwargs : dict
102
                         ( arguments nommes -> host et graphe )
103

  
99 104
        @return: couples hote-graphe
100
        @rtype: dict
105
        @rtype: document json (sous forme de dict)
101 106
        """
102 107
        user = get_current_user()
103 108
        items = []
......
105 110
        if user is None:
106 111
            return dict(items=[])
107 112

  
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
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
110 115
        # correspondant au motif, quel que soit l'hôte.
111 116
        if search_form_graph:
112 117
            if not search_form_host:
......
161 166
        if not is_manager:
162 167
            supitemgroups = [sig[0] for sig in user.supitemgroups() if sig[1]]
163 168
            # pylint: disable-msg=E1103
164
            items = items.filter(
165
                SUPITEM_GROUP_TABLE.c.idgroup.in_(supitemgroups))
169
            items = items.join(
170
                (GroupHierarchy, GroupHierarchy.idchild == \
171
                    SUPITEM_GROUP_TABLE.c.idgroup)
172
            ).filter(GroupHierarchy.idparent.in_(supitemgroups))
166 173

  
167 174
        items = items.limit(100).all() # pylint: disable-msg=E1103
168 175
        if not search_form_graph:
......
348 355
        is_manager = in_group('managers').is_met(request.environ)
349 356
        if not is_manager:
350 357
            supitemgroups = [sig[0] for sig in user.supitemgroups() if sig[1]]
351
            graphs = graphs.filter(
352
                SUPITEM_GROUP_TABLE.c.idgroup.in_(supitemgroups))
358
            graphs = graphs.join(
359
                    (GroupHierarchy, GroupHierarchy.idchild == \
360
                        SUPITEM_GROUP_TABLE.c.idgroup)
361
                ).filter(GroupHierarchy.idparent.in_(supitemgroups))
353 362

  
354 363
        graphs = graphs.all()
355 364
        return dict(host=host, start=start, duration=duration,
......
385 394
            ).join(
386 395
                (SUPITEM_GROUP_TABLE, SUPITEM_GROUP_TABLE.c.idsupitem == \
387 396
                    Host.idhost),
388
            ).filter(Host.name.like(query + u'%')
397
            ).filter(Host.name.like(query + '%')
389 398
            ).order_by(
390 399
                Host.name.asc(),
391 400
            )
......
395 404
        is_manager = in_group('managers').is_met(request.environ)
396 405
        if not is_manager:
397 406
            supitemgroups = [sig[0] for sig in user.supitemgroups() if sig[1]]
398
            hosts = hosts.filter(
399
                SUPITEM_GROUP_TABLE.c.idgroup.in_(supitemgroups))
407
            hosts = hosts.join(
408
                    (GroupHierarchy, GroupHierarchy.idchild == \
409
                        SUPITEM_GROUP_TABLE.c.idgroup)
410
                ).filter(GroupHierarchy.idparent.in_(supitemgroups))
400 411

  
401 412
        return dict(hosts=hosts)
402 413

  
......
423 434

  
424 435
        # Si l'identifiant du groupe parent n'est pas
425 436
        # spécifié, on retourne la liste des groupes racines,
426
        # fournie par la méthode get_root_host_groups.
437
        # fournie par la méthode get_root_hosts_groups.
427 438
        if parent_id is None:
428 439
            return self.get_root_host_groups()
429 440

  
430 441
        # TODO: Utiliser un schéma de validation
431 442
        parent_id = int(parent_id)
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()
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
441 447
        is_manager = in_group('managers').is_met(request.environ)
442
        user_groups = {}
443 448
        if not is_manager:
449
            direct_access = False
450
            user = get_current_user()
444 451
            user_groups = dict(user.supitemgroups())
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

  
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))
450 492
        groups = []
451
        for group in db_groups:
493
        for group in db_groups.all():
452 494
            groups.append({
453 495
                'id'   : group.idgroup,
454 496
                'name' : group.name,
......
457 499
        # On récupère la liste des hôtes appartenant au
458 500
        # groupe dont l'identifiant est passé en paramètre
459 501
        hosts = []
460
        if is_manager or user_groups.get(parent_id, False):
502
        if is_manager or direct_access:
461 503
            db_hosts = DBSession.query(
462 504
                Host.idhost,
463 505
                Host.name,
464 506
            ).join(
465
                SUPITEM_GROUP_TABLE,
507
                (SUPITEM_GROUP_TABLE,
508
                    SUPITEM_GROUP_TABLE.c.idsupitem == Host.idhost
509
                    ),
466 510
            ).filter(SUPITEM_GROUP_TABLE.c.idgroup == parent_id
467 511
            ).order_by(Host.name.asc())
468 512
            hosts = []
......
487 531
        # Si l'identifiant de l'hôte n'est pas spécifié, on
488 532
        # retourne un dictionnaire contenant deux listes vides
489 533
        if host_id is None:
490
            return dict(groups = [], leaves=[])
534
            return dict(groups = [], graphs=[])
491 535

  
492 536
        # On vérifie les permissions sur l'hôte
493 537
        # TODO: Utiliser un schéma de validation
494 538
        host_id = int(host_id)
495
        host = DBSession.query(Host).get(host_id)
539
        host = DBSession.query(Host
540
            ).filter(Host.idhost == host_id
541
            ).first()
496 542
        if host is None:
497
            return dict(groups = [], leaves=[])
543
            return dict(groups = [], graphs=[])
498 544
        user = get_current_user()
499 545
        if not host.is_allowed_for(user):
500
            return dict(groups = [], leaves=[])
546
            return dict(groups = [], graphs=[])
501 547

  
502 548
        # On récupère la liste des groupes de graphes associés à l'hôte
503 549
        host_graph_groups = DBSession.query(
......
511 557
                    GRAPH_PERFDATASOURCE_TABLE.c.idgraph == Graph.idgraph),
512 558
            (PerfDataSource, PerfDataSource.idperfdatasource == \
513 559
                    GRAPH_PERFDATASOURCE_TABLE.c.idperfdatasource),
560
            (SUPITEM_GROUP_TABLE, \
561
                SUPITEM_GROUP_TABLE.c.idsupitem == PerfDataSource.idhost),
514 562
        ).filter(PerfDataSource.idhost == host_id
515
        ).order_by(GraphGroup.name.asc())
516
        host_graph_groups = host_graph_groups.all()
563
        ).order_by(GraphGroup.name.asc()
564
        ).all()
517 565

  
518 566
        # Si l'identifiant du groupe parent n'est pas spécifié,
519 567
        # on récupère la liste des groupes de graphes racines.
520 568
        if parent_id is None:
521
            graph_groups = GraphGroup.get_top_groups()[0].children
569
            graph_groups = GraphGroup.get_top_groups()
522 570

  
523 571
        # Sinon on récupère la liste des graphes dont le
524
        # groupe passé en paramètre est le parent direct.
572
        # groupe passé en paramètre est le parent direct
525 573
        else:
526 574
            # TODO: Utiliser un schéma de validation
527 575
            parent_id = int(parent_id)
528
            parent = DBSession.query(GraphGroup).get(parent_id)
529
            graph_groups = parent.children
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()
530 585

  
531 586
        # On réalise l'intersection des deux listes
532 587
        groups = []
......
573 628
        @rtype : C{dict} of C{list} of C{dict} of C{mixed}
574 629
        """
575 630

  
576
        root_groups = list(SupItemGroup.get_top_groups()[0].children)
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)
577 646

  
578 647
        # On filtre ces groupes racines afin de ne
579 648
        # retourner que ceux auquels l'utilisateur a accès
580 649
        user = get_current_user()
581 650
        is_manager = in_group('managers').is_met(request.environ)
582 651
        if not is_manager:
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)
652
            user_groups = [ug[0] for ug in user.supitemgroups()]
653
            root_groups = root_groups.filter(
654
                SupItemGroup.idgroup.in_(user_groups))
588 655

  
589 656
        groups = []
590
        for group in root_groups:
657
        for group in root_groups.all():
591 658
            groups.append({
592 659
                'id'   : group.idgroup,
593 660
                '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 *
10
from vigilo.models.demo.functions import \
11
    add_graph, add_graphgroup, add_graph2group, \
12
    add_perfdatasource, add_perfdatasource2graph, \
13
    add_vigiloserver, add_application
11 14

  
12 15
from vigigraph.tests.functional.test_host_selection_form import populateDB
13 16

  
......
235 238
        # de graphes retournée est vide
236 239
        self.assertEqual(
237 240
            json, {
238
                'leaves': [],
241
                'graphs': [],
239 242
                'groups': []
240 243
            }
241 244
        )
......
251 254
        # de graphes retournée est vide
252 255
        self.assertEqual(
253 256
            json, {
254
                'leaves': [],
257
                'graphs': [],
255 258
                'groups': []
256 259
            }
257 260
        )
......
267 270
        # de graphes retournée est vide
268 271
        self.assertEqual(
269 272
            json, {
270
                'leaves': [],
273
                'graphs': [],
271 274
                'groups': []
272 275
            }
273 276
        )
......
304 307
        # de graphes retournée est vide
305 308
        self.assertEqual(
306 309
            json, {
307
                'leaves': [],
310
                'graphs': [],
308 311
                'groups': []
309 312
            }
310 313
        )
......
495 498
        # de graphes retournée est vide
496 499
        self.assertEqual(
497 500
            json, {
498
                'leaves': [],
501
                'graphs': [],
499 502
                'groups': []
500 503
            }
501 504
        )
......
512 515
        # de graphes retournée est vide
513 516
        self.assertEqual(
514 517
            json, {
515
                'leaves': [],
518
                'graphs': [],
516 519
                'groups': []
517 520
            }
518 521
        )
......
529 532
        # de graphes retournée est vide
530 533
        self.assertEqual(
531 534
            json, {
532
                'leaves': [],
535
                'graphs': [],
533 536
                'groups': []
534 537
            }
535 538
        )
......
572 575
        # graphes retournée est vide
573 576
        self.assertEqual(
574 577
            json, {
575
                'leaves': [],
578
                'graphs': [],
576 579
                'groups': []
577 580
            }
578 581
        )
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 *
10
from vigilo.models.demo.functions import add_supitemgroup, \
11
    add_host, add_host2group, add_usergroup, add_user, \
12
    add_supitemgrouppermission, add_usergroup_permission
11 13

  
12 14

  
13 15
def populateDB():
......
24 26
    """
25 27

  
26 28
    # Ajout d'un groupe d'hôtes principal
27
    mainhostgroup = add_supitemgroup(u'mhg')
29
    mainhostgroup = add_supitemgroup(u'mhg', None)
28 30

  
29 31
    # Ajout d'un premier groupe d'hôtes de second niveau
30 32
    hostgroup1 = add_supitemgroup(u'hg1', mainhostgroup)
......
257 259
        self.assertEqual(
258 260
            json, {
259 261
                'leaves': [
260
                    {'id': host1.idhost, 'name': host1.name},
262
                    {'id': host1.idhost, 'name': host1.name}
261 263
                ],
262 264
                'groups': [
263 265
                    {'id': hostgroup1.idgroup, 'name': hostgroup1.name},
......
269 271
        # Récupération des groupes d'hôtes
270 272
        # accessibles à l'utilisateur 'poweruser'
271 273
        response = self.app.post(
272
            '/rpc/hosttree?parent_id=%d' % mainhostgroup.idgroup, {},
273
            extra_environ={'REMOTE_USER': 'poweruser'})
274
            '/rpc/hosttree?parent_id=%s' % (mainhostgroup.idgroup, ), {
275
            }, extra_environ={'REMOTE_USER': 'poweruser'})
274 276
        json = response.json
275 277

  
276 278
        # On s'assure que la liste de groupes d'hôtes retournée
......
278 280
        self.assertEqual(
279 281
            json, {
280 282
                'leaves': [
281
                    {'id': host1.idhost, 'name': host1.name},
283
                    {'id': host1.idhost, 'name': host1.name}
282 284
                ],
283 285
                'groups': [
284 286
                    {'id': hostgroup1.idgroup, 'name': hostgroup1.name},
......
504 506
        # Récupération des hôtes du groupe 'hg2'
505 507
        # accessibles à l'utilisateur 'user'
506 508
        response = self.app.post(
507
            '/rpc/hosttree?parent_id=%s' % hostgroup2.idgroup, {},
508
            extra_environ={'REMOTE_USER': 'user'})
509
            '/rpc/hosttree?parent_id=%s' % (hostgroup2.idgroup, ), {
510
            }, extra_environ={'REMOTE_USER': 'user'})
509 511
        json = response.json
510 512

  
511 513
        # On s'assure que la liste d'hôtes retournée est vide
......
516 518
        # Récupération des hôtes du groupe 'mhg'
517 519
        # accessibles à l'utilisateur 'visitor'
518 520
        response = self.app.post(
519
            '/rpc/hosttree?parent_id=%s' % mainhostgroup.idgroup, {},
520
            extra_environ={'REMOTE_USER': 'visitor'})
521
            '/rpc/hosttree?parent_id=%s' % (mainhostgroup.idgroup, ), {
522
            }, extra_environ={'REMOTE_USER': 'visitor'})
521 523
        json = response.json
522 524

  
523 525
        # 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

  
41 42
        # Récupération du groupe d'hôtes 'mhg' dans la base de données
42 43
        mainhostgroup = DBSession.query(SupItemGroup).filter(
43 44
            SupItemGroup.name == u'mhg').first()
......
95 96

  
96 97
        # On s'assure que les deux listes retournées contiennent
97 98
        # 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