Project

General

Profile

Revision 0bd9c069

ID0bd9c06917b20932fbfd6f30384dd5018c50f3e6
Parent 6f6efdcd
Child 6707e733

Added by Francois POIROTTE about 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:

vigiboard/controllers/root.py
31 31
from pylons.i18n import ugettext as _, lazy_ugettext as l_
32 32
from sqlalchemy import asc
33 33
from sqlalchemy.sql import func
34
from sqlalchemy.orm import aliased
35 34
from repoze.what.predicates import Any, All, in_group, \
36 35
                                    has_permission, not_anonymous, \
37 36
                                    NotAuthorizedError
......
42 41
from vigilo.models.tables import Event, EventHistory, CorrEvent, Host, \
43 42
                                    SupItem, SupItemGroup, LowLevelService, \
44 43
                                    StateName, State
44
from vigilo.models.tables.grouphierarchy import GroupHierarchy
45 45
from vigilo.models.functions import sql_escape_like
46 46
from vigilo.models.tables.secondary_tables import EVENTSAGGREGATE_TABLE
47 47

  
......
147 147

  
148 148
        # Application des filtres si nécessaire
149 149
        if supitemgroup:
150
            base = DBSession.query(SupItemGroup).get(supitemgroup)
151
            if base:
152
                search['supitemgroup'] = supitemgroup
153
                sig = aliased(SupItemGroup)
154
                aggregates.add_join(
155
                    (sig, aggregates.items.c.idsupitemgroup == sig.idgroup),
156
                )
157
                aggregates.add_filter(sig.left >= base.left)
158
                aggregates.add_filter(sig.right <= base.right)
150
            search['supitemgroup'] = supitemgroup
151
            aggregates.add_join((GroupHierarchy, GroupHierarchy.idchild ==
152
                aggregates.items.c.idsupitemgroup))
153
            aggregates.add_filter(GroupHierarchy.idparent == supitemgroup)
159 154

  
160 155
        if host:
161 156
            search['host_'] = host
162 157
            host = sql_escape_like(host)
163
            aggregates.add_filter(aggregates.items.c.hostname.ilike(host))
158
            aggregates.add_filter(aggregates.items.c.hostname.ilike(
159
                '%s' % host))
164 160

  
165 161
        if service:
166 162
            search['service'] = service
167 163
            service = sql_escape_like(service)
168
            aggregates.add_filter(aggregates.items.c.servicename.ilike(service))
164
            aggregates.add_filter(aggregates.items.c.servicename.ilike(
165
                '%s' % service))
169 166

  
170 167
        if output:
171 168
            search['output'] = output
172 169
            output = sql_escape_like(output)
173
            aggregates.add_filter(Event.message.ilike(output))
170
            aggregates.add_filter(Event.message.ilike('%s' % output))
174 171

  
175 172
        if trouble_ticket:
176 173
            search['tt'] = trouble_ticket
177 174
            trouble_ticket = sql_escape_like(trouble_ticket)
178
            aggregates.add_filter(CorrEvent.trouble_ticket.ilike(trouble_ticket))
175
            aggregates.add_filter(CorrEvent.trouble_ticket.ilike(
176
                '%s' % trouble_ticket))
179 177

  
180 178
        if from_date:
181 179
            search['from_date'] = from_date.lower()
......
207 205
            else:
208 206
                aggregates.add_filter(CorrEvent.timestamp_active <= to_date)
209 207

  
210

  
211 208
        # Calcul des éléments à afficher et du nombre de pages possibles
212 209
        total_rows = aggregates.num_rows()
213 210
        items_per_page = int(config['vigiboard_items_per_page'])
......
752 749
        if parent_id is None:
753 750
            return self.get_root_host_groups()
754 751

  
755
        parent = DBSession.query(SupItemGroup).get(parent_id)
752
        # TODO: Utiliser un schéma de validation
753
        parent_id = int(parent_id)
756 754

  
757 755
        # On vérifie si le groupe parent fait partie des
758 756
        # groupes auxquel l'utilisateur a accès, et on
759 757
        # retourne une liste vide dans le cas contraire
760 758
        is_manager = in_group('managers').is_met(request.environ)
759
        if not is_manager:
760
            direct_access = False
761
            user = get_current_user()
762
            user_groups = dict(user.supitemgroups())
763
            # On regarde d'abord si le groupe fait partie de ceux
764
            # auquels l'utilisateur a explicitement accès, ou s'il
765
            # est un parent des groupes auxquels l'utilisateur a accès
766
            if parent_id in user_groups.keys():
767
                direct_access = user_groups[parent_id]
768
            # Dans le cas contraire, on vérifie si le groupe est un
769
            # sous-groupe des groupes auxquels l'utilisateur a accès
770
            else:
771
                id_list = [ug for ug in user_groups.keys() if user_groups[ug]]
772
                child_groups = DBSession.query(SupItemGroup.idgroup
773
                    ).distinct(
774
                    ).join(
775
                        (GroupHierarchy,
776
                            GroupHierarchy.idchild == SupItemGroup.idgroup),
777
                    ).filter(GroupHierarchy.idparent.in_(id_list)
778
                    ).filter(GroupHierarchy.hops > 0
779
                    ).all()
780
                for ucg in child_groups:
781
                    if ucg.idgroup == parent_id:
782
                        direct_access = True
783
                        break
784
                # Sinon, l'utilisateur n'a pas accès à ce groupe
785
                else:
786
                    return dict(groups = [], leaves = [])
761 787

  
762 788
        # On récupère la liste des groupes dont
763 789
        # l'identifiant du parent est passé en paramètre
764 790
        db_groups = DBSession.query(
765 791
            SupItemGroup
766
        ).filter(SupItemGroup.depth == parent.depth + 1
767
        ).filter(SupItemGroup.left > parent.left
768
        ).filter(SupItemGroup.right < parent.right
792
        ).join(
793
            (GroupHierarchy, GroupHierarchy.idchild == \
794
                SupItemGroup.idgroup),
795
        ).filter(GroupHierarchy.hops == 1
796
        ).filter(GroupHierarchy.idparent == parent_id
769 797
        ).order_by(SupItemGroup.name.asc())
770

  
771
        if not is_manager:
772
            user = get_current_user()
773
            user_groups = [g[0] for g in user.supitemgroups() if g[1]]
774
            db_groups = db_groups.filter(SupItemGroup.idgroup.in_(user_groups))
775

  
798
        if not is_manager and not direct_access:
799
            id_list = [ug for ug in user_groups.keys()]
800
            db_groups = db_groups.filter(
801
                SupItemGroup.idgroup.in_(id_list))
776 802
        groups = []
777 803
        for group in db_groups.all():
778 804
            groups.append({
......
791 817
        @rtype : C{dict} of C{list} of C{dict} of C{mixed}
792 818
        """
793 819

  
794
        root_groups = SupItemGroup.get_top_groups()
820
        # On récupère tous les groupes qui ont un parent.
821
        children = DBSession.query(
822
            SupItemGroup,
823
        ).distinct(
824
        ).join(
825
            (GroupHierarchy, GroupHierarchy.idchild == SupItemGroup.idgroup)
826
        ).filter(GroupHierarchy.hops > 0)
827

  
828
        # Ensuite on les exclut de la liste des groupes,
829
        # pour ne garder que ceux qui sont au sommet de
830
        # l'arbre et qui constituent nos "root groups".
831
        root_groups = DBSession.query(
832
            SupItemGroup,
833
        ).except_(children
834
        ).order_by(SupItemGroup.name)
795 835

  
796 836
        # On filtre ces groupes racines afin de ne
797 837
        # retourner que ceux auquels l'utilisateur a accès
798 838
        user = get_current_user()
799 839
        is_manager = in_group('managers').is_met(request.environ)
800 840
        if not is_manager:
801
            user_groups = [sig[0] for sig in user.supitemgroups()]
802
            for root_group in root_groups:
803
                if root_group.idgroup not in user_groups:
804
                    root_groups.remove(root_group)
841
            user_groups = [ug[0] for ug in user.supitemgroups()]
842
            root_groups = root_groups.filter(
843
                SupItemGroup.idgroup.in_(user_groups))
805 844

  
806 845
        groups = []
807
        for group in root_groups:
846
        for group in root_groups.all():
808 847
            groups.append({
809 848
                'id'   : group.idgroup,
810 849
                'name' : group.name,

Also available in: Unified diff