Project

General

Profile

Revision 6f6efdcd

ID6f6efdcd325be1f197f3f271ffeef4b2bc0a4560
Parent 88cac5bb
Child 0bd9c069

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

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
34 35
from repoze.what.predicates import Any, All, in_group, \
35 36
                                    has_permission, not_anonymous, \
36 37
                                    NotAuthorizedError
......
41 42
from vigilo.models.tables import Event, EventHistory, CorrEvent, Host, \
42 43
                                    SupItem, SupItemGroup, LowLevelService, \
43 44
                                    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
            search['supitemgroup'] = supitemgroup
151
            aggregates.add_join((GroupHierarchy, GroupHierarchy.idchild ==
152
                aggregates.items.c.idsupitemgroup))
153
            aggregates.add_filter(GroupHierarchy.idparent == 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)
154 159

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

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

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

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

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

  
210

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

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

  
755 757
        # On vérifie si le groupe parent fait partie des
756 758
        # groupes auxquel l'utilisateur a accès, et on
757 759
        # retourne une liste vide dans le cas contraire
758 760
        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 = [])
787 761

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

  
802 776
        groups = []
803 777
        for group in db_groups.all():
804 778
            groups.append({
......
817 791
        @rtype : C{dict} of C{list} of C{dict} of C{mixed}
818 792
        """
819 793

  
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)
794
        root_groups = SupItemGroup.get_top_groups()
835 795

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

  
845 806
        groups = []
846
        for group in root_groups.all():
807
        for group in root_groups:
847 808
            groups.append({
848 809
                'id'   : group.idgroup,
849 810
                'name' : group.name,
vigiboard/controllers/vigiboardrequest.py
244 244
        Retourne le nombre de lignes de la requête.
245 245
        Si celle-ci n'est pas encore générée, on le fait.
246 246

  
247
        @return: Nombre de ligne
247
        @return: Nombre de lignes
248 248
        """
249 249

  
250 250
        self.generate_request()
vigiboard/tests/functional/plugins/test_details_plugin.py
9 9

  
10 10
from vigiboard.tests import TestController
11 11
from vigilo.models.session import DBSession
12
from vigilo.models.tables import SupItemGroup, User, UserGroup, \
12
from vigilo.models.tables import User, UserGroup, \
13 13
                            Permission, DataPermission, StateName, \
14 14
                            LowLevelService, Event, CorrEvent, Host
15
from vigilo.models.demo.functions import *
15 16

  
16 17
def insert_deps(return_service):
17 18
    """
......
27 28
    """
28 29
    timestamp = datetime.now()
29 30

  
30
    hostgroup = SupItemGroup(name=u'foo')
31
    DBSession.add(hostgroup)
31
    hostgroup = add_supitemgroup(name=u'foo')
32 32

  
33 33
    host = Host(
34 34
        name=u'bar',
......
47 47
    hostgroup.supitems.append(host)
48 48
    DBSession.flush()
49 49

  
50
    servicegroup = SupItemGroup(name=u'bar')
51
    DBSession.add(servicegroup)
50
    servicegroup = add_supitemgroup(name=u'bar')
52 51

  
53 52
    service = LowLevelService(
54 53
        host=host,
......
235 234
                'idcorrevent': idcorrevent,
236 235
                'plugin_name': 'details',
237 236
            }, status=401)
238

  
vigiboard/tests/functional/plugins/test_plugin_hls.py
7 7

  
8 8
from vigilo.models.session import DBSession
9 9
from vigilo.models.tables import Permission, DataPermission, StateName, \
10
                            SupItemGroup, Host, HighLevelService, \
10
                            Host, HighLevelService, \
11 11
                            Event, CorrEvent, ImpactedPath, ImpactedHLS, \
12 12
                            User, UserGroup
13
from vigilo.models.demo.functions import *
13 14
from vigiboard.tests import TestController
14 15

  
15 16
def populate_DB():
16 17
    """ Peuple la base de données. """
17 18

  
18 19
    # On ajoute un groupe d'hôtes
19
    hostmanagers = SupItemGroup(name=u'managersgroup')
20
    DBSession.add(hostmanagers)
21
    DBSession.flush()
20
    hostmanagers = add_supitemgroup(name=u'managersgroup')
22 21

  
23 22
    # On lui octroie les permissions
24 23
    usergroup = UserGroup.by_group_name(u'users_with_access')
......
31 30

  
32 31
    # On crée un hôte de test.
33 32
    host = Host(
34
        name = u'host', 
33
        name = u'host',
35 34
        checkhostcmd = u'halt',
36 35
        snmpcommunity = u'public',
37 36
        hosttpl = u'/dev/null',
......
57 56

  
58 57
    # On ajoute un évènement corrélé causé par cet évènement 'brut'.
59 58
    aggregate = CorrEvent(
60
        idcause = event1.idevent, 
59
        idcause = event1.idevent,
61 60
        timestamp_active = datetime.now(),
62 61
        priority = 1,
63 62
        status = u'None')
64 63
    aggregate.events.append(event1)
65 64
    DBSession.add(aggregate)
66 65
    DBSession.flush()
67
    
66

  
68 67
    transaction.commit()
69 68
    return aggregate
70 69

  
71 70
def add_paths(path_number, path_length, idsupitem):
72
    """ 
71
    """
73 72
    Ajoute path_number chemins de services de haut niveau impactés
74 73
    dans la base de donnée. Leur longeur sera égale à path_length.
75 74
    La 3ème valeur passée en paramètre est l'id du supitem impactant.
76
     
77
    path_number * path_length services de 
75

  
76
    path_number * path_length services de
78 77
    haut niveau sont créés dans l'opération.
79 78
    """
80 79

  
......
89 88

  
90 89
    # Création des chemins de services de haut niveau impactés.
91 90
    for j in range(path_number):
92
        
91

  
93 92
        # On crée le chemin en lui-même
94 93
        path = ImpactedPath(idsupitem = idsupitem)
95 94
        DBSession.add(path)
96 95
        DBSession.flush()
97
        
96

  
98 97
        # Pour chaque étage du chemin,
99 98
        for i in range(path_length):
100 99
            # on ajoute un service de haut niveau dans la BDD,
101 100
            hls = HighLevelService(
102
                servicename = u'HLS' + str(j + 1) + str(i + 1), 
101
                servicename = u'HLS' + str(j + 1) + str(i + 1),
103 102
                **hls_template)
104 103
            DBSession.add(hls)
105
            # et on ajoute un étage au chemin contenant ce service. 
104
            # et on ajoute un étage au chemin contenant ce service.
106 105
            DBSession.add(
107 106
                ImpactedHLS(
108 107
                    path = path,
109 108
                    hls = hls,
110 109
                    distance = i + 1,
111 110
                    ))
112
    
111

  
113 112
    DBSession.flush()
114 113
    transaction.commit()
115 114

  
116 115

  
117 116
class TestHLSPlugin(TestController):
118 117
    """
119
    Classe de test du contrôleur listant les services 
118
    Classe de test du contrôleur listant les services
120 119
    de haut niveau impactés par un évènement corrélé.
121 120
    """
122 121
    def setUp(self):
......
159 158
        Teste la valeur de retour du plugin lorsque
160 159
        aucun service de haut niveau n'est impacté.
161 160
        """
162
        
161

  
163 162
        # On peuple la base de données avant le test.
164 163
        DBSession.add(self.aggregate)
165 164
        add_paths(0, 0, self.aggregate.events[0].idsupitem)
166 165
        DBSession.add(self.aggregate)
167
        
166

  
168 167
        ### 1er cas : l'utilisateur n'est pas connecté.
169 168
        # On vérifie que le plugin retourne bien une erreur 401.
170 169
        resp = self.app.post(
171
            '/get_plugin_value', 
170
            '/get_plugin_value',
172 171
            {"idcorrevent" : str(self.aggregate.idcorrevent),
173 172
             "plugin_name" : "hls"},
174 173
            status = 401,)
175
        
174

  
176 175
        ### 2ème cas : l'utilisateur n'a pas les
177 176
        ### droits sur l'hôte ayant causé le correvent.
178 177
        # On vérifie que le plugin retourne bien une erreur 404.
179 178
        resp = self.app.post(
180
            '/get_plugin_value', 
179
            '/get_plugin_value',
181 180
            {"idcorrevent" : str(self.aggregate.idcorrevent),
182 181
             "plugin_name" : "hls"},
183 182
            status = 404,
184 183
            extra_environ={'REMOTE_USER': 'no_access'})
185
        
184

  
186 185
        ### 3ème cas : l'utilisateur a cette fois les droits.
187 186
        resp = self.app.post(
188
            '/get_plugin_value', 
187
            '/get_plugin_value',
189 188
            {"idcorrevent" : str(self.aggregate.idcorrevent),
190 189
             "plugin_name" : "hls"},
191 190
            extra_environ={'REMOTE_USER': 'access'})
192 191
        # On vérifie que le plugin ne retourne toujours rien.
193 192
        assert_equal(resp.json, {"services": []})
194
    
193

  
195 194
    def test_1_impacted_hls_path(self):
196 195
        """
197 196
        Retour du plugin HLS pour 1 chemin impacté
198 197
        Teste la valeur de retour du plugin lorsqu'un
199 198
        chemin de services de haut niveau est impacté.
200 199
        """
201
        
200

  
202 201
        # On peuple la base de données avant le test.
203 202
        DBSession.add(self.aggregate)
204 203
        add_paths(1, 2, self.aggregate.events[0].idsupitem)
205 204
        DBSession.add(self.aggregate)
206
        
205

  
207 206
        ### 1er cas : l'utilisateur n'est pas connecté.
208 207
        # On vérifie que le plugin retourne bien une erreur 401.
209 208
        resp = self.app.post(
210
            '/get_plugin_value', 
209
            '/get_plugin_value',
211 210
            {"idcorrevent" : str(self.aggregate.idcorrevent),
212 211
             "plugin_name" : "hls"},
213 212
            status = 401,)
214
        
213

  
215 214
        ### 2ème cas : l'utilisateur n'a pas les droits
216 215
        ### sur l'hôte ayant causé le correvent, on doit
217 216
        ### obtenir une erreur 404 (pas d'événement trouvé
218 217
        ### avec les informations liées à cet utilisateur).
219 218
        resp = self.app.post(
220
            '/get_plugin_value', 
219
            '/get_plugin_value',
221 220
            {"idcorrevent" : str(self.aggregate.idcorrevent),
222 221
             "plugin_name" : "hls"},
223 222
            status = 404,
224 223
            extra_environ={'REMOTE_USER': 'no_access'})
225
        
224

  
226 225
        ### 3ème cas : l'utilisateur a cette fois les droits.
227 226
        resp = self.app.post(
228
            '/get_plugin_value', 
227
            '/get_plugin_value',
229 228
            {"idcorrevent" : str(self.aggregate.idcorrevent),
230 229
             "plugin_name" : "hls"},
231 230
            extra_environ={'REMOTE_USER': 'access'})
232 231
        # On vérifie que le plugin retourne bien les 2 HLS impactés.
233 232
        assert_equal(resp.json, {"services": ['HLS12']})
234
    
233

  
235 234
    def test_2_impacted_hls_path(self):
236 235
        """
237 236
        Retour du plugin HLS pour 2 chemins impactés
238 237
        Teste la valeur de retour du plugin lorsque deux
239 238
        chemins de services de haut niveau sont impactés.
240 239
        """
241
        
240

  
242 241
        # On peuple la base de données avant le test.
243 242
        DBSession.add(self.aggregate)
244 243
        add_paths(2, 2, self.aggregate.events[0].idsupitem)
245 244
        DBSession.add(self.aggregate)
246
        
245

  
247 246
        ### 1er cas : l'utilisateur n'est pas connecté.
248 247
        # On vérifie que le plugin retourne bien une erreur 401.
249 248
        resp = self.app.post(
250
            '/get_plugin_value', 
249
            '/get_plugin_value',
251 250
            {"idcorrevent" : str(self.aggregate.idcorrevent),
252 251
             "plugin_name" : "hls"},
253 252
            status = 401,)
254
        
253

  
255 254
        ### 2ème cas : l'utilisateur n'a pas les
256 255
        ### droits sur l'hôte ayant causé le correvent.
257 256
        resp = self.app.post(
258
            '/get_plugin_value', 
257
            '/get_plugin_value',
259 258
            {"idcorrevent" : str(self.aggregate.idcorrevent),
260 259
             "plugin_name" : "hls"},
261 260
            status = 404,
262 261
            extra_environ={'REMOTE_USER': 'no_access'})
263
        
262

  
264 263
        ### 3ème cas : l'utilisateur a cette fois les droits.
265 264
        resp = self.app.post(
266
            '/get_plugin_value', 
265
            '/get_plugin_value',
267 266
            {"idcorrevent" : str(self.aggregate.idcorrevent),
268 267
             "plugin_name" : "hls"},
269 268
            extra_environ={'REMOTE_USER': 'access'})
270 269
        # On vérifie que le plugin retourne bien les 4 HLS impactés.
271 270
        assert_equal(resp.json, {"services": ['HLS12', 'HLS22']})
272

  
vigiboard/tests/functional/test_correvents_table.py
10 10

  
11 11
from vigilo.models.session import DBSession
12 12
from vigilo.models.tables import Event, CorrEvent, DataPermission, \
13
                            Permission, StateName, Host, SupItemGroup, \
13
                            Permission, StateName, Host, \
14 14
                            LowLevelService, User, UserGroup, Permission
15
from vigilo.models.demo.functions import *
15 16
from vigiboard.tests import TestController
16 17

  
17 18
def populate_DB():
18 19
    """ Peuple la base de données. """
19 20
    # On ajoute les groupes et leurs dépendances
20
    hostmanagers = SupItemGroup(name=u'managersgroup')
21
    DBSession.add(hostmanagers)
22
    hosteditors = SupItemGroup(name=u'editorsgroup', parent=hostmanagers)
23
    DBSession.add(hosteditors)
24
    DBSession.flush()
21
    hostmanagers = add_supitemgroup(name=u'managersgroup')
22
    hosteditors = add_supitemgroup(name=u'editorsgroup')
25 23

  
26 24
    usergroup = UserGroup.by_group_name(u'users_with_access')
27 25
    DBSession.add(DataPermission(
......
282 280
        rows = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr')
283 281
        print "There are %d rows in the result set" % len(rows)
284 282
        assert_equal(len(rows), 1)
285

  
vigiboard/tests/functional/test_history_table.py
12 12
from vigilo.models.session import DBSession
13 13
from vigilo.models.tables import Event, EventHistory, CorrEvent, \
14 14
                            Permission, StateName, Host, \
15
                            SupItemGroup, LowLevelService, \
16 15
                            Permission, DataPermission, User, \
17
                            UserGroup
16
                            LowLevelService, UserGroup
17
from vigilo.models.demo.functions import *
18 18
from vigiboard.tests import TestController
19 19

  
20 20
def populate_DB():
21 21
    """ Peuple la base de données. """
22 22
    # On ajoute un groupe d'hôtes et un groupe de services.
23
    supitemmanagers = SupItemGroup(name=u'managersgroup')
24
    DBSession.add(supitemmanagers)
25
    DBSession.flush()
23
    supitemmanagers = add_supitemgroup('managersgroup')
26 24

  
27 25
    usergroup = UserGroup.by_group_name(u'users_with_access')
28 26
    DBSession.add(DataPermission(
......
34 32

  
35 33
    # On crée un hôte de test, et on l'ajoute au groupe d'hôtes.
36 34
    managerhost = Host(
37
        name = u'managerhost',      
35
        name = u'managerhost',
38 36
        checkhostcmd = u'halt',
39 37
        snmpcommunity = u'public',
40 38
        hosttpl = u'/dev/null',
......
56 54
    DBSession.add(managerservice)
57 55
    supitemmanagers.supitems.append(managerservice)
58 56
    DBSession.flush()
59
    
57

  
60 58
    return (managerhost, managerservice)
61 59

  
62 60
def add_correvent_caused_by(supitem):
63 61
    """
64
    Ajoute dans la base de données un évènement corrélé causé 
62
    Ajoute dans la base de données un évènement corrélé causé
65 63
    par un incident survenu sur l'item passé en paramètre.
66 64
    Génère un historique pour les tests.
67 65
    """
68 66

  
69 67
    # Ajout d'un événement
70 68
    event = Event(
71
        supitem = supitem, 
69
        supitem = supitem,
72 70
        message = u'foo',
73 71
        current_state = StateName.statename_to_value(u"WARNING"),
74 72
        timestamp = datetime.now(),
......
79 77
    # Ajout des historiques
80 78
    DBSession.add(EventHistory(
81 79
        type_action=u'Nagios update state',
82
        idevent=event.idevent, 
80
        idevent=event.idevent,
83 81
        timestamp=datetime.now()))
84 82
    DBSession.add(EventHistory(
85 83
        type_action=u'Acknowlegement change state',
86
        idevent=event.idevent, 
84
        idevent=event.idevent,
87 85
        timestamp=datetime.now()))
88 86
    DBSession.flush()
89 87

  
90 88
    # Ajout d'un événement corrélé
91 89
    aggregate = CorrEvent(
92
        idcause = event.idevent, 
90
        idcause = event.idevent,
93 91
        timestamp_active = datetime.now(),
94 92
        priority = 1,
95 93
        status = u"None")
96 94
    aggregate.events.append(event)
97 95
    DBSession.add(aggregate)
98 96
    DBSession.flush()
99
    
97

  
100 98
    return event.idevent
101
    
99

  
102 100

  
103 101
class TestHistoryTable(TestController):
104 102
    """
......
144 142
        # On peuple la BDD avec un hôte, un service de bas niveau,
145 143
        # et un groupe d'hôtes et de services associés à ces items.
146 144
        (managerhost, managerservice) = populate_DB()
147
        
145

  
148 146
        # On ajoute un évènement corrélé causé par l'hôte
149 147
        idevent = add_correvent_caused_by(managerhost)
150 148
        transaction.commit()
......
158 156

  
159 157
        # L'utilisateur N'A PAS les bonnes permissions.
160 158
        environ = {'REMOTE_USER': 'limited_access'}
161
        
159

  
162 160
        # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
163 161
        # ce qu'un message d'erreur précise à l'utilisateur qu'il
164 162
        # n'a pas accès aux informations concernant cet évènement.
165 163
        response = self.app.get(
166 164
            '/event/%d' % idevent,
167
            status = 302, 
165
            status = 302,
168 166
            extra_environ = environ)
169 167

  
170 168
        # On suit la redirection.
......
174 172

  
175 173
        # L'utilisateur a les bonnes permissions.
176 174
        environ = {'REMOTE_USER': 'access'}
177
        
175

  
178 176
        # On s'attend à ce que le statut de la requête soit 200.
179 177
        response = self.app.get(
180 178
            '/event/%d' % idevent,
181
            status = 200, 
179
            status = 200,
182 180
            extra_environ = environ)
183 181

  
184 182
        # Il doit y avoir 2 lignes de résultats.
......
195 193
        # On peuple la BDD avec un hôte, un service de bas niveau,
196 194
        # et un groupe d'hôtes et de services associés à ces items.
197 195
        (managerhost, managerservice) = populate_DB()
198
        
196

  
199 197
        # On ajoute un évènement corrélé causé par le service
200 198
        idevent = add_correvent_caused_by(managerservice)
201
        
199

  
202 200
        transaction.commit()
203 201

  
204 202
        # L'utilisateur n'est pas authentifié.
......
210 208

  
211 209
        # L'utilisateur N'A PAS les bonnes permissions.
212 210
        environ = {'REMOTE_USER': 'limited_access'}
213
        
211

  
214 212
        # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
215 213
        # ce qu'un message d'erreur précise à l'utilisateur qu'il
216 214
        # n'a pas accès aux informations concernant cet évènement.
217 215
        response = self.app.get(
218 216
            '/event/%d' % idevent,
219
            status = 302, 
217
            status = 302,
220 218
            extra_environ = environ)
221 219

  
222 220
        # On suit la redirection.
......
226 224

  
227 225
        # L'utilisateur a les bonnes permissions.
228 226
        environ = {'REMOTE_USER': 'access'}
229
        
227

  
230 228
        # On s'attend à ce que le statut de la requête soit 200.
231 229
        response = self.app.get(
232 230
            '/event/%d' % idevent,
233
            status = 200, 
231
            status = 200,
234 232
            extra_environ = environ)
235 233

  
236 234
        # Il doit y avoir 2 lignes de résultats.
......
240 238
        rows = response.lxml.xpath(
241 239
            '//table[contains(@class,"vigitable")]/tbody/tr')
242 240
        assert_equal(len(rows), 2)
243

  
vigiboard/tests/functional/test_raw_events_table.py
12 12
from vigilo.models.tables import Event, EventHistory, CorrEvent, User, \
13 13
                            Permission, StateName, Host, UserGroup, \
14 14
                            LowLevelService, SupItemGroup, DataPermission
15
from vigilo.models.demo.functions import *
15 16
from vigiboard.tests import TestController
16 17

  
17 18
def populate_accounts():
......
49 50
def populate_DB(caused_by_service):
50 51
    """ Peuple la base de données. """
51 52
    # On ajoute un groupe d'hôtes et un groupe de services.
52
    supitemmanagers = SupItemGroup(name = u'managersgroup')
53
    DBSession.add(supitemmanagers)
54
    DBSession.flush()
53
    supitemmanagers = add_supitemgroup('managersgroup')
55 54

  
56 55
    usergroup = UserGroup.by_group_name(u'users_with_access')
57 56
    DBSession.add(DataPermission(
vigiboard/tests/functional/test_root.py
18 18
from vigilo.models.session import DBSession
19 19
from vigilo.models.tables import Event, EventHistory, CorrEvent, User, \
20 20
                            Permission, StateName, Host, UserGroup, \
21
                            SupItemGroup, LowLevelService, DataPermission
21
                            LowLevelService, DataPermission
22
from vigilo.models.demo.functions import *
22 23
from vigiboard.tests import TestController
23 24

  
24 25
def populate_DB():
25 26
    """ Peuple la base de données. """
26 27
    # On ajoute un groupe d'hôtes et un groupe de services.
27
    supitemmanagers = SupItemGroup(name = u'managersgroup')
28
    supitemmanagers = add_supitemgroup('managersgroup')
28 29
    DBSession.add(supitemmanagers)
29 30
    DBSession.flush()
30 31

  
......
38 39

  
39 40
    # On crée un 2 hôtes, et on les ajoute au groupe d'hôtes.
40 41
    host1 = Host(
41
        name = u'host1',      
42
        name = u'host1',
42 43
        checkhostcmd = u'halt',
43 44
        snmpcommunity = u'public',
44 45
        hosttpl = u'/dev/null',
......
49 50
    DBSession.add(host1)
50 51
    supitemmanagers.supitems.append(host1)
51 52
    host2 = Host(
52
        name = u'host2',      
53
        name = u'host2',
53 54
        checkhostcmd = u'halt',
54 55
        snmpcommunity = u'public',
55 56
        hosttpl = u'/dev/null',
......
79 80
    DBSession.add(service2)
80 81
    supitemmanagers.supitems.append(service2)
81 82
    DBSession.flush()
82
    
83

  
83 84
    return ([host1, host2], [service1, service2])
84 85

  
85 86
def add_correvent_caused_by(supitem, timestamp,
86 87
        correvent_status=u"None", event_status=u"WARNING"):
87 88
    """
88
    Ajoute dans la base de données un évènement corrélé causé 
89
    Ajoute dans la base de données un évènement corrélé causé
89 90
    par un incident survenu sur l'item passé en paramètre.
90 91
    Génère un historique pour les tests.
91 92
    """
92 93

  
93 94
    # Ajout d'un événement
94 95
    event = Event(
95
        supitem = supitem, 
96
        supitem = supitem,
96 97
        message = u'foo',
97 98
        current_state = StateName.statename_to_value(event_status),
98 99
        timestamp = datetime.now(),
......
102 103

  
103 104
    # Ajout d'un événement corrélé
104 105
    aggregate = CorrEvent(
105
        idcause = event.idevent, 
106
        idcause = event.idevent,
106 107
        timestamp_active = timestamp,
107 108
        priority = 1,
108 109
        status = correvent_status)
109 110
    aggregate.events.append(event)
110 111
    DBSession.add(aggregate)
111 112
    DBSession.flush()
112
    
113

  
113 114
    return aggregate.idcorrevent
114 115

  
115 116

  
......
163 164
        # On peuple la BDD avec 2 hôtes, 2 services de bas niveau,
164 165
        # et un groupe d'hôtes et de services associés à ces items.
165 166
        (hosts, services) = populate_DB()
166
        
167

  
167 168
        # On ajoute 2 évènements corrélés causés par ces hôtes
168 169
        timestamp = datetime.now()
169 170
        correvent1_id = add_correvent_caused_by(hosts[0], timestamp)
170 171
        correvent2_id = add_correvent_caused_by(hosts[1], timestamp)
171 172
        transaction.commit()
172
        
173

  
173 174
        ### 1er cas : L'utilisateur n'est pas connecté.
174 175
        # On vérifie que le plugin retourne bien une erreur 401.
175 176
        response = self.app.post(
......
179 180
                "trouble_ticket" : u"foo",
180 181
                "ack" : u'NoChange',
181 182
            }, status = 401)
182
        
183

  
183 184
        ### 2ème cas : L'utilisateur utilisé pour
184 185
        # se connecter à Vigiboard est 'limited_access'.
185 186
        environ = {'REMOTE_USER': 'limited_access'}
186
        
187

  
187 188
        # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
188 189
        # ce qu'un message d'erreur précise à l'utilisateur qu'il
189 190
        # n'a pas la permission de modifier ces évènements.
......
194 195
                "trouble_ticket" : u"foo",
195 196
                "last_modification": mktime(timestamp.timetuple()),
196 197
            }, status = 302, extra_environ = environ)
197
        
198

  
198 199
        response = response.follow(status=200, extra_environ = environ)
199 200
        assert_true(response.lxml.xpath(
200 201
            '//div[@id="flash"]/div[@class="error"]'))
......
202 203
        ### 3ème cas : L'utilisateur utilisé pour
203 204
        # se connecter à Vigiboard est 'access'.
204 205
        environ = {'REMOTE_USER': 'access'}
205
        
206

  
206 207
        # On s'attend à ce que le statut de la requête soit 302,
207 208
        # et à ce qu'un message informe l'utilisateur que les
208 209
        # évènements corrélés sélectionnées ont bien été mis à jour.
......
213 214
                "trouble_ticket" : u"foo",
214 215
                "ack" : u'NoChange',
215 216
            }, status = 302, extra_environ = environ)
216
        
217

  
217 218
        response = response.follow(status=200, extra_environ = environ)
218 219
        assert_false(response.lxml.xpath(
219 220
            '//div[@id="flash"]/div[@class="error"]'))
220 221
        assert_true(response.lxml.xpath(
221 222
            '//div[@id="flash"]/div[@class="ok"]'))
222
        
223

  
223 224
        # On s'assure que le ticket de l'évènement corrélé
224 225
        # a bien été mis à jour dans la base de données.
225 226
        correvents = DBSession.query(
226 227
            CorrEvent.trouble_ticket
227 228
            ).filter(CorrEvent.idcorrevent.in_([correvent1_id, correvent2_id])
228 229
            ).all()
229
        
230

  
230 231
        assert_equal(correvents[0].trouble_ticket, u"foo")
231 232
        assert_equal(correvents[1].trouble_ticket, u"foo")
232 233

  
......
236 237
        # On peuple la BDD avec 2 hôtes, 2 services de bas niveau,
237 238
        # et un groupe d'hôtes et de services associés à ces items.
238 239
        (hosts, services) = populate_DB()
239
        
240

  
240 241
        # On ajoute 2 évènements corrélés causés par ces hôtes
241 242
        timestamp = datetime.now()
242 243
        correvent1_id = add_correvent_caused_by(services[0], timestamp)
243 244
        correvent2_id = add_correvent_caused_by(services[1], timestamp)
244
        
245

  
245 246
        transaction.commit()
246
        
247

  
247 248
        ### 1er cas : L'utilisateur n'est pas connecté.
248 249
        # On vérifie que le plugin retourne bien une erreur 401.
249 250
        response = self.app.post(
......
253 254
                "trouble_ticket" : u"foo",
254 255
                "ack" : u'NoChange',
255 256
            }, status = 401)
256
        
257

  
257 258
        ### 2ème cas : L'utilisateur utilisé pour
258 259
        # se connecter à Vigiboard est 'limited_access'.
259 260
        environ = {'REMOTE_USER': 'limited_access'}
260
        
261

  
261 262
        # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
262 263
        # ce qu'un message d'erreur précise à l'utilisateur qu'il
263 264
        # n'a pas la permission de modifier ces évènements.
......
268 269
                "trouble_ticket" : u"foo",
269 270
                "ack" : u'NoChange',
270 271
            }, status = 302, extra_environ = environ)
271
        
272

  
272 273
        response = response.follow(status=200, extra_environ = environ)
273 274
        assert_true(response.lxml.xpath(
274 275
            '//div[@id="flash"]/div[@class="error"]'))
......
276 277
        ### 3ème cas : L'utilisateur utilisé pour
277 278
        # se connecter à Vigiboard est 'access'.
278 279
        environ = {'REMOTE_USER': 'access'}
279
        
280

  
280 281
        # On s'attend à ce que le statut de la requête soit 302,
281 282
        # et à ce qu'un message informe l'utilisateur que les
282 283
        # évènements corrélés sélectionnées ont bien été mis à jour.
......
287 288
                "trouble_ticket" : u"foo",
288 289
                "ack" : u'NoChange',
289 290
            }, status = 302, extra_environ = environ)
290
        
291

  
291 292
        response = response.follow(status=200, extra_environ = environ)
292 293
        assert_false(response.lxml.xpath(
293 294
            '//div[@id="flash"]/div[@class="error"]'))
294 295
        assert_true(response.lxml.xpath(
295 296
            '//div[@id="flash"]/div[@class="ok"]'))
296
        
297

  
297 298
        # On s'assure que le ticket de l'évènement corrélé
298 299
        # a bien été mis à jour dans la base de données.
299 300
        correvents = DBSession.query(
......
309 310
        # On peuple la BDD avec 2 hôtes, 2 services de bas niveau,
310 311
        # et un groupe d'hôtes et de services associés à ces items.
311 312
        (hosts, services) = populate_DB()
312
        
313

  
313 314
        # On ajoute 2 évènements corrélés causés par ces hôtes
314 315
        timestamp = datetime.now()
315 316
        correvent1_id = add_correvent_caused_by(hosts[0], timestamp)
316 317
        correvent2_id = add_correvent_caused_by(hosts[1], timestamp)
317 318
        transaction.commit()
318
        
319

  
319 320
        ### 1er cas : L'utilisateur n'est pas connecté.
320 321
        # On vérifie que le plugin retourne bien une erreur 401.
321 322
        response = self.app.post(
......
325 326
                "trouble_ticket" : "",
326 327
                "ack" : u'Acknowledged',
327 328
            }, status = 401)
328
        
329

  
329 330
        ### 2ème cas : L'utilisateur utilisé pour
330 331
        # se connecter à Vigiboard est 'limited_access'.
331 332
        environ = {'REMOTE_USER': 'limited_access'}
332
        
333

  
333 334
        # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
334 335
        # ce qu'un message d'erreur précise à l'utilisateur qu'il
335 336
        # n'a pas la permission de modifier ces évènements.
......
340 341
                "trouble_ticket" : "",
341 342
                "ack" : u'Acknowledged',
342 343
            }, status = 302, extra_environ = environ)
343
        
344

  
344 345
        response = response.follow(status=200, extra_environ = environ)
345 346
        assert_true(response.lxml.xpath(
346 347
            '//div[@id="flash"]/div[@class="error"]'))
......
348 349
        ### 3ème cas : L'utilisateur utilisé pour
349 350
        # se connecter à Vigiboard est 'access'.
350 351
        environ = {'REMOTE_USER': 'access'}
351
        
352

  
352 353
        # On s'attend à ce que le statut de la requête soit 302,
353 354
        # et à ce qu'un message informe l'utilisateur que les
354 355
        # évènements corrélés sélectionnées ont bien été mis à jour.
......
359 360
                "trouble_ticket" : "",
360 361
                "ack" : u'Acknowledged',
361 362
            }, status = 302, extra_environ = environ)
362
        
363

  
363 364
        response = response.follow(status=200, extra_environ = environ)
364 365
        assert_false(response.lxml.xpath(
365 366
            '//div[@id="flash"]/div[@class="error"]'))
366 367
        assert_true(response.lxml.xpath(
367 368
            '//div[@id="flash"]/div[@class="ok"]'))
368
        
369

  
369 370
        # On s'assure que le statut de l'évènement corrélé
370 371
        # a bien été mis à jour dans la base de données.
371 372
        correvents = DBSession.query(
......
382 383
        # On peuple la BDD avec 2 hôtes, 2 services de bas niveau,
383 384
        # et un groupe d'hôtes et de services associés à ces items.
384 385
        (hosts, services) = populate_DB()
385
        
386

  
386 387
        # On ajoute 2 évènements corrélés causés par ces hôtes
387 388
        timestamp = datetime.now()
388 389
        correvent1_id = add_correvent_caused_by(services[0], timestamp)
389 390
        correvent2_id = add_correvent_caused_by(services[1], timestamp)
390
        
391

  
391 392
        transaction.commit()
392
        
393

  
393 394
        ### 1er cas : L'utilisateur n'est pas connecté.
394 395
        # On vérifie que le plugin retourne bien une erreur 401.
395 396
        response = self.app.post(
......
399 400
                "trouble_ticket" : "",
400 401
                "ack" : u'Acknowledged',
401 402
            }, status = 401)
402
        
403

  
403 404
        ### 2ème cas : L'utilisateur utilisé pour
404 405
        # se connecter à Vigiboard est 'limited_access'.
405 406
        environ = {'REMOTE_USER': 'limited_access'}
406
        
407

  
407 408
        # On s'attend à ce qu'une erreur 302 soit renvoyée, et à
408 409
        # ce qu'un message d'erreur précise à l'utilisateur qu'il
409 410
        # n'a pas la permission de modifier ces évènements.
......
414 415
                "trouble_ticket" : "",
415 416
                "ack" : u'Acknowledged',
416 417
            }, status = 302, extra_environ = environ)
417
        
418

  
418 419
        response = response.follow(status=200, extra_environ = environ)
419 420
        assert_true(response.lxml.xpath(
420 421
            '//div[@id="flash"]/div[@class="error"]'))
......
422 423
        ### 3ème cas : L'utilisateur utilisé pour
423 424
        # se connecter à Vigiboard est 'access'.
424 425
        environ = {'REMOTE_USER': 'access'}
425
        
426

  
426 427
        # On s'attend à ce que le statut de la requête soit 302,
427 428
        # et à ce qu'un message informe l'utilisateur que les
428 429
        # évènements corrélés sélectionnées ont bien été mis à jour.
......
433 434
                "trouble_ticket" : "",
434 435
                "ack" : u'Acknowledged',
435 436
            }, status = 302, extra_environ = environ)
436
        
437

  
437 438
        response = response.follow(status=200, extra_environ = environ)
438 439
        assert_false(response.lxml.xpath(
439 440
            '//div[@id="flash"]/div[@class="error"]'))
440 441
        assert_true(response.lxml.xpath(
441 442
            '//div[@id="flash"]/div[@class="ok"]'))
442
        
443

  
443 444
        # On s'assure que le statut de l'évènement corrélé
444 445
        # a bien été mis à jour dans la base de données.
445 446
        correvents = DBSession.query(
......
455 456
        # On peuple la BDD avec 2 hôtes, 2 services de bas niveau,
456 457
        # et un groupe d'hôtes et de services associés à ces items.
457 458
        (hosts, services) = populate_DB()
458
        
459

  
459 460
        # On ajoute 2 évènements corrélés causés par ces hôtes
460 461
        timestamp = datetime.now()
461 462
        correvent1_id = add_correvent_caused_by(services[0], timestamp)
462 463
        correvent2_id = add_correvent_caused_by(services[1], timestamp)
463
        
464
        # Date de modification du premier évènement corrélé 
464

  
465
        # Date de modification du premier évènement corrélé
465 466
        later_date = datetime.now()
466 467
        # Date du chargement de la page
467 468
        date = mktime(later_date.timetuple()) - 42
468
        
469

  
469 470
        # On ajoute une entrée dans l'historique de l'évènement brut
470 471
        # causant le premier évènement corrélé, portant pour timestamp
471 472
        # une date postérieure à celle du chargement de la page.
......
477 478
            idevent = correvent1.idcause,
478 479
            timestamp = later_date))
479 480
        DBSession.flush()
480
        
481

  
481 482
        transaction.commit()
482
        
483

  
483 484
        # L'utilisateur utilisé pour se connecter à Vigiboard est 'access'.
484 485
        environ = {'REMOTE_USER': 'access'}
485
        
486

  
486 487
        # On s'attend à ce que le statut de la requête soit 302, et
487 488
        # à ce qu'un message d'erreur avise l'utilisateur que des
488 489
        # changements sont intervenus depuis le chargement de la page.
......
493 494
                "trouble_ticket" : "",
494 495
                "ack" : u'Acknowledged',
495 496
            }, status = 302, extra_environ = environ)
496
        
497

  
497 498
        response = response.follow(status=200, extra_environ = environ)
498 499
        assert_true(response.lxml.xpath(
499 500
            '//div[@id="flash"]/div[@class="warning"]'))
500
        
501

  
501 502
        # On s'assure que le statut de l'évènement corrélé
502 503
        # n'a pas été modifié dans la base de données.
503 504
        status = DBSession.query(
......
505 506
            ).filter(CorrEvent.idcorrevent == correvent1_id
506 507
            ).scalar()
507 508
        assert_equal(status, u'None')
508

  
vigiboard/tests/functional/test_search_form_host.py
8 8

  
9 9
from vigiboard.tests import TestController
10 10
from vigilo.models.session import DBSession
11
from vigilo.models.tables import SupItemGroup, Host, Permission, \
11
from vigilo.models.tables import Host, Permission, \
12 12
                                    Event, CorrEvent, StateName, \
13 13
                                    User, UserGroup, DataPermission
14
from vigilo.models.demo.functions import *
14 15

  
15 16
def insert_deps():
16 17
    """Insère les dépendances nécessaires aux tests."""
17 18
    timestamp = datetime.now()
18 19

  
19
    hostgroup = SupItemGroup(
20
        name=u'foo',
21
    )
22
    DBSession.add(hostgroup)
23
    DBSession.flush()
20
    hostgroup = add_supitemgroup(name=u'foo')
24 21

  
25 22
    host = Host(
26 23
        name=u'bar',
......
153 150
        cols = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr/td')
154 151
        print "There are %d columns in the result set" % len(cols)
155 152
        assert_equal(len(cols), 1)
156

  
vigiboard/tests/functional/test_search_form_misc.py
9 9

  
10 10
from vigiboard.tests import TestController
11 11
from vigilo.models.session import DBSession
12
from vigilo.models.tables import SupItemGroup, Host, Permission, \
12
from vigilo.models.tables import Host, Permission, \
13 13
                                    Event, CorrEvent, StateName, \
14 14
                                    User, UserGroup, DataPermission
15
from vigilo.models.demo.functions import *
15 16

  
16 17
def insert_deps():
17 18
    """Insère les dépendances nécessaires aux tests."""
......
31 32
    DBSession.add(host)
32 33
    DBSession.flush()
33 34

  
34
    hostgroup = SupItemGroup(name=u'foo')
35
    hostgroup = add_supitemgroup(name=u'foo')
35 36
    hostgroup.supitems.append(host)
36
    DBSession.add(hostgroup)
37
    DBSession.flush()
38 37

  
39 38
    event = Event(
40 39
        supitem=host,
......
161 160
        cols = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr/td')
162 161
        print "There are %d columns in the result set" % len(cols)
163 162
        assert_true(len(cols) > 1)
164

  
vigiboard/tests/functional/test_search_form_service.py
8 8

  
9 9
from vigiboard.tests import TestController
10 10
from vigilo.models.session import DBSession
11
from vigilo.models.tables import SupItemGroup, Host, Permission, \
11
from vigilo.models.tables import Host, Permission, \
12 12
                                    StateName, LowLevelService, \
13 13
                                    Event, CorrEvent, User, UserGroup, \
14 14
                                    DataPermission
15
from vigilo.models.demo.functions import *
15 16

  
16 17
def insert_deps():
17 18
    """Insère les dépendances nécessaires aux tests."""
18 19
    timestamp = datetime.now()
19 20

  
20
    hostgroup = SupItemGroup(name=u'foo')
21
    DBSession.add(hostgroup)
21
    hostgroup = add_supitemgroup(name=u'foo')
22 22

  
23 23
    host = Host(
24 24
        name=u'bar',
......
37 37
    hostgroup.supitems.append(host)
38 38
    DBSession.flush()
39 39

  
40
    servicegroup = SupItemGroup(name=u'bar')
40
    servicegroup = add_supitemgroup(name=u'bar')
41 41
    DBSession.add(servicegroup)
42 42
    DBSession.flush()
43 43

  
......
204 204
        cols = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr/td')
205 205
        print "There are %d columns in the result set" % len(cols)
206 206
        assert_equal(len(cols), 1)
207

  
vigiboard/tests/functional/test_search_form_supitemgroup.py
8 8

  
9 9
from vigiboard.tests import TestController
10 10
from vigilo.models.session import DBSession
11
from vigilo.models.tables import SupItemGroup, Host, Permission, StateName, \
11
from vigilo.models.tables import Host, Permission, StateName, \
12 12
                                    Event, CorrEvent, User, UserGroup, \
13 13
                                    DataPermission
14
from vigilo.models.demo.functions import *
14 15

  
15 16
def insert_deps():
16 17
    """Insère les dépendances nécessaires aux tests."""
17 18
    timestamp = datetime.now()
18 19

  
19
    supitemgroup = SupItemGroup(
20
        name=u'foo',
21
    )
22
    DBSession.add(supitemgroup)
23
    DBSession.flush()
20
    supitemgroup = add_supitemgroup(name=u'foo')
24 21

  
25 22
    host = Host(
26 23
        name=u'bar',
......
160 157
        cols = response.lxml.xpath('//table[@class="vigitable"]/tbody/tr/td')
161 158
        print "There are %d columns in the result set" % len(cols)
162 159
        assert_equal(len(cols), 1)
163

  
who.ini
19 19
[plugin:sqlauth]
20 20
use = vigilo.turbogears.repoze_plugins:auth_plugin
21 21

  
22
;[plugin:kerberos]
23
;use = repoze.who.plugins.vigilo.kerberos:VigiloKerberosAuthenticator
24
;ldap_url = ldap://ldap.example.com
25
;ldap_base = uid=%s,dc=example,dc=com
26
;filterstr = sAMAccountName=%s
27
;ldap_charset = cp1252
28
;http_charset = utf-8
29
;binddn = mybinduser
30
;bindpw = mybindpassword
31

  
22 32
[general]
23
;request_classifier = repoze.who.classifiers:default_request_classifier
24 33
request_classifier = vigilo.turbogears.repoze_plugins:vigilo_api_classifier
25 34
challenge_decider = repoze.who.classifiers:default_challenge_decider
35
;remote_user_key = ''
26 36

  
27 37
[identifiers]
28 38
plugins =

Also available in: Unified diff