Project

General

Profile

Revision cfed65e0

IDcfed65e03385e9d129d030e8595b345124f84b6f
Parent 24589c11
Child de06ff86

Added by Francois POIROTTE almost 13 years ago

Meilleure gestion des encodages dans VigiGraph

- Utilisation de caractères accentués dans plusieurs tests pour mettre
en évidence les éventuels problèmes liés à des conversions explicites
ou implicites de/vers Unicode.
- Correction des templates de VigiGraph pour gérer correctement les
caractères accentués.
- Ajout d'un pseudo-décorateur de pagination utilisant la même API que
pour les autres (pseudo-)décorateurs de !TurboGears (nécessaire à
cause d'un conflit entre le (vrai) décorateur "paginate" de
!TurboGears et le pseudo-décorateur "validate".
Voir ticket 2302 dans le trac de !TurboGears.
- Utilisation de ce décorateur pour valider correctement les paramètres
passés à la méthode searchHost du contrôleur rpc de VigiGraph.

Change-Id: I209700c586943ba6b60a4f4f68940b33617c77ba
Reviewed-on: https://vigilo-dev.si.c-s.fr/review/272
Tested-by: Build system <>
Reviewed-by: Aurelien BOMPARD <>

View differences:

vigigraph/controllers/rpc.py
17 17
from webob.exc import HTTPPreconditionFailed
18 18
from tg import expose, request, redirect, tmpl_context, \
19 19
    config, validate, flash, exceptions as http_exc
20
from tg.decorators import paginate
21 20

  
22 21
from repoze.what.predicates import not_anonymous, has_permission, \
23 22
                                    in_group, Any, All
24
from formencode import validators, schema
23
from formencode import schema
24
from tw.forms import validators
25 25
from sqlalchemy import or_
26 26
from sqlalchemy.sql.expression import literal_column
27 27
from sqlalchemy.orm import aliased, lazyload
......
29 29
from vigilo.turbogears.controllers import BaseController
30 30
from vigilo.turbogears.helpers import get_current_user
31 31
from vigilo.turbogears.controllers.proxy import get_through_proxy
32
from vigilo.turbogears.decorators import paginate
32 33

  
33 34
from vigilo.models.session import DBSession
34 35
from vigilo.models.tables import Host, SupItemGroup, PerfDataSource
......
87 88

  
88 89
    class SearchHostAndGraphSchema(schema.Schema):
89 90
        """Schéma de validation pour la méthode L{searchHostAndGraph}."""
90
        search_form_host = validators.String(if_missing=None)
91
        search_form_graph = validators.String(if_missing=None)
91
        search_form_host = validators.UnicodeString(if_missing=None)
92
        search_form_graph = validators.UnicodeString(if_missing=None)
92 93

  
93 94
    # @TODO définir un error_handler différent pour remonter l'erreur via JS.
94 95
    @validate(
......
260 261

  
261 262
    class GetIndicatorsSchema(schema.Schema):
262 263
        """Schéma de validation pour la méthode L{getIndicators}."""
263
        host = validators.String(not_empty=True)
264
        graph = validators.String(not_empty=True)
265
        nocache = validators.String(if_missing=None)
264
        host = validators.UnicodeString(not_empty=True)
265
        graph = validators.UnicodeString(not_empty=True)
266
        nocache = validators.UnicodeString(if_missing=None)
266 267

  
267 268
    # @TODO définir un error_handler différent pour remonter l'erreur via JS.
268 269
    @validate(
......
286 287

  
287 288
    class StartTimeSchema(schema.Schema):
288 289
        """Schéma de validation pour la méthode L{getIndicators}."""
289
        host = validators.String(not_empty=True)
290
        nocache = validators.String(if_missing=None)
290
        host = validators.UnicodeString(not_empty=True)
291
        nocache = validators.UnicodeString(if_missing=None)
291 292

  
292 293
    # @TODO définir un error_handler différent pour remonter l'erreur via JS.
293 294
    @validate(
......
306 307

  
307 308
    class FullHostPageSchema(schema.Schema):
308 309
        """Schéma de validation pour la méthode L{fullHostPage}."""
309
        host = validators.String(not_empty=True)
310
        host = validators.UnicodeString(not_empty=True)
310 311
        start = validators.Int(if_missing=None)
311 312
        duration = validators.Int(if_missing=86400)
312 313

  
......
335 336
        @return: page avec les images des graphes et boutons de deplacement dans le temps
336 337
        @rtype: page html
337 338
        """
338

  
339 339
        if start is None:
340 340
            start = int(time.time()) - int(duration)
341 341
        else:
......
352 352
        if not is_manager:
353 353
            # Récupération des groupes auxquels l'utilisateur a accès.
354 354
            supitemgroups = [sig[0] for sig in user.supitemgroups() if sig[1]]
355

  
356
            # On vérifie que l'hôte en question existe bel et bien.
357
            host_obj = Host.by_host_name(host)
358
            if not host_obj:
359
                message = _('No such host "%s"') % host
360
                LOGGER.warning(message)
361
                raise http_exc.HTTPNotFound(message)
362

  
355 363
            # Récupération des groupes dont l'hôte fait partie
356
            hostgroups = [g.idgroup for g in Host.by_host_name(host).groups]
364
            hostgroups = [g.idgroup for g in host_obj.groups]
357 365
            # Si aucun des groupes de l'hôte ne fait partie des groupes
358 366
            # auxquels l'utilisateur a accès, on affiche une erreur 403.
359 367
            if len(set(hostgroups).intersection(set(supitemgroups))) < 1:
......
374 382
            ).filter(Host.name == host)
375 383

  
376 384
        graphs = graphs.all()
377

  
378 385
        return dict(host=host, start=start, duration=duration,
379 386
                    presets=self.presets, graphs=graphs)
380 387

  
381 388

  
389
    class SearchHostSchema(schema.Schema):
390
        """Schéma de validation pour la méthode L{getIndicators}."""
391
        allow_extra_fields = True
392
        filter_extra_fields = True
393
        query = validators.UnicodeString(not_empty=True)
394

  
382 395
    @expose('searchhost.html')
396
    @validate(
397
        validators = SearchHostSchema(),
398
        error_handler = process_form_errors)
383 399
    @paginate('hosts', items_per_page=10)
384
    def searchHost(self, *args, **kwargs):
400
    def searchHost(self, query):
385 401
        """
386 402
        Affiche les résultats de la recherche par nom d'hôte.
387 403
        La requête de recherche (C{query}) correspond à un préfixe
......
392 408
        @keyword query: Prefixe de recherche sur les noms d'hôtes
393 409
        @type    query: C{unicode}
394 410
        """
395
        query = kwargs.get('query')
396 411
        if not query:
397 412
            redirect("searchHostForm")
413
            return
398 414

  
399 415
        query = sql_escape_like(query.strip())
400 416
        user = get_current_user()
......
409 425
                (SUPITEM_GROUP_TABLE, SUPITEM_GROUP_TABLE.c.idsupitem == \
410 426
                    Host.idhost),
411 427
            ).filter(Host.name.like(query + u'%')
412
            ).order_by(
413
                Host.name.asc(),
414
            )
428
            ).order_by(Host.name.asc(),)
415 429

  
416 430
        # Les managers ont accès à tout.
417 431
        # Les autres ont un accès restreint.
......
423 437
                        SUPITEM_GROUP_TABLE.c.idgroup)
424 438
                ).filter(GroupHierarchy.idparent.in_(supitemgroups))
425 439

  
426
        return dict(hosts=hosts)
440
        return dict(hosts=[h.name for h in hosts])
427 441

  
428 442
    # VIGILO_EXIG_VIGILO_PERF_0030:Moteur de recherche des graphes
429 443
    @expose('getopensearch.xml', content_type='text/xml')
vigigraph/tests/functional/helpers.py
57 57
    hostgroup2 = add_supitemgroup(u'hg2', mainhostgroup)
58 58

  
59 59
    # Ajout de trois hôtes
60
    host1 = add_host(u'host1')
61
    host2 = add_host(u'host2')
62
    host3 = add_host(u'host3')
60
    # On ajoute des caractères spéciaux pour détecter les
61
    # conversions implicites Unicode <-> ASCII (et leurs erreurs).
62
    host1 = add_host(u'host1 éà')
63
    host2 = add_host(u'host2 éà')
64
    host3 = add_host(u'host3 éà')
63 65

  
64 66
    # Ajout du premier hôte dans le groupe d'hôtes principal.
65 67
    add_host2group(host1, mainhostgroup)
......
119 121
    add_application(u"vigirrd")
120 122

  
121 123
    # Ajout de trois graphes
122
    graph1 = add_graph("graph1")
123
    graph2 = add_graph("graph2")
124
    graph3 = add_graph("graph3")
124
    # On ajoute des caractères spéciaux pour détecter les
125
    # conversions implicites Unicode <-> ASCII (et leurs erreurs).
126
    graph1 = add_graph(u"graph1 éà")
127
    graph2 = add_graph(u"graph2 éà")
128
    graph3 = add_graph(u"graph3 éà")
125 129

  
126 130
    # Ajout d'une perfdatasource pour chaque hôte
127 131
    datasource1 = add_perfdatasource(
vigigraph/tests/functional/test_fullhostpage.py
7 7
permettant d'afficher tous les graphes
8 8
associés à un hôte.
9 9
"""
10
import transaction
10
import transaction, urllib2
11 11

  
12 12
from vigigraph.tests import TestController
13 13
from vigilo.models.session import DBSession
14 14
from vigilo.models.tables import Host, SupItemGroup, Graph, GraphGroup
15

  
16
from vigigraph.tests.functional.test_host_selection_form import populateDB
17
from vigigraph.tests.functional.test_graph_selection_form import addGraphs
15
from helpers import populateDB, addGraphs
18 16

  
19 17

  
20 18
class TestFullHostPage(TestController):
......
42 40
        for host in hosts:
43 41
            if hosts[host]:
44 42
                response = self.app.get(
45
                    '/rpc/fullHostPage?host=%s' % host,
43
                    '/rpc/fullHostPage?host=%s' %
44
                        urllib2.quote(host.encode('utf-8')),
46 45
                    extra_environ={"REMOTE_USER": user}
47 46
                )
48
                index = int(host[-1:])
47
                index = int(host[4])
49 48
                self.assertTrue(
50
                    '/vigirrd/host%d/index?'
51
                    'graphtemplate=graph%d' % (index, index)
52
                    in response.body
49
                    '/vigirrd/%s/index?graphtemplate=%s' % (
50
                        urllib2.quote((u'host%d éà' % index).encode('utf-8')),
51
                        urllib2.quote((u'graph%d éà' % index).encode('utf-8')),
52
                    ) in response.unicode_body
53 53
                )
54 54
            else:
55 55
                response = self.app.get(
56
                    '/rpc/fullHostPage?host=%s' % host,
56
                    '/rpc/fullHostPage?host=%s' %
57
                        urllib2.quote(host.encode('utf-8')),
57 58
                    extra_environ={"REMOTE_USER": user},
58 59
                    status = 403
59 60
                )
......
61 62
    def test_direct_permission(self):
62 63
        """Accès à rpc/fullHostPage avec permission sur le groupe"""
63 64
        hosts = {
64
            'host1': False,
65
            'host2': True,
66
            'host3': False,
65
            u'host1 éà': False,
66
            u'host2 éà': True,
67
            u'host3 éà': False,
67 68
        }
68 69
        self._check_results('user', hosts)
69 70

  
70 71
    def test_permission_on_parent(self):
71 72
        """Accès à rpc/fullHostPage avec permission sur le parent du groupe"""
72 73
        hosts = {
73
            'host1': True,
74
            'host2': True,
75
            'host3': True,
74
            u'host1 éà': True,
75
            u'host2 éà': True,
76
            u'host3 éà': True,
76 77
        }
77 78
        self._check_results('poweruser', hosts)
78 79

  
79 80
    def test_no_permission(self):
80 81
        """Accès à rpc/fullHostPage sans permissions"""
81 82
        hosts = {
82
            'host1': False,
83
            'host2': False,
84
            'host3': False,
83
            u'host1 éà': False,
84
            u'host2 éà': False,
85
            u'host3 éà': False,
85 86
        }
86 87
        self._check_results('visitor', hosts)
87 88

  
88 89
    def test_anonymous(self):
89 90
        """Accès à rpc/fullHostPage en anonyme"""
90
        for host in ('host1', 'host2', 'host3'):
91
        for host in (u'host1 éà', u'host2 éà', u'host3 éà'):
91 92
            response = self.app.get(
92
                '/rpc/fullHostPage?host=%s' % host,
93
                '/rpc/fullHostPage?host=%s' %
94
                    urllib2.quote(host.encode('utf-8'), ''),
93 95
                status=401
94 96
            )
95 97

  
96 98
    def test_managers(self):
97 99
        """Accès à rpc/fullHostPage depuis le compte manager"""
98 100
        hosts = {
99
            'host1': True,
100
            'host2': True,
101
            'host3': True,
101
            u'host1 éà': True,
102
            u'host2 éà': True,
103
            u'host3 éà': True,
102 104
        }
103 105
        self._check_results('manager', hosts)
vigigraph/tests/functional/test_graph_selection_form.py
44 44

  
45 45
        # Récupération de l'hôte 'host1' dans la base de données
46 46
        host1 = DBSession.query(Host).filter(
47
            Host.name == u'host1').first()
47
            Host.name == u'host1 éà').first()
48 48

  
49 49
        # Récupération de l'hôte 'host2' dans la base de données
50 50
        host2 = DBSession.query(Host).filter(
51
            Host.name == u'host2').first()
51
            Host.name == u'host2 éà').first()
52 52

  
53 53
        # Récupération de l'hôte 'host3' dans la base de données
54 54
        host3 = DBSession.query(Host).filter(
55
            Host.name == u'host3').first()
55
            Host.name == u'host3 éà').first()
56 56

  
57 57
        # Récupération du groupe de graphes
58 58
        # 'graphgroup1' dans la base de données
......
184 184

  
185 185
        # Récupération de l'hôte 'host1' dans la base de données
186 186
        host1 = DBSession.query(Host).filter(
187
            Host.name == u'host1').first()
187
            Host.name == u'host1 éà').first()
188 188

  
189 189
        # Récupération de l'hôte 'host3' dans la base de données
190 190
        host3 = DBSession.query(Host).filter(
191
            Host.name == u'host3').first()
191
            Host.name == u'host3 éà').first()
192 192

  
193 193
        # Récupération des groupes de graphes de l'hôte
194 194
        # host1 accessibles à l'utilisateur 'user'
......
245 245

  
246 246
        # Récupération de l'hôte 'host1' dans la base de données
247 247
        host1 = DBSession.query(Host).filter(
248
            Host.name == u'host1').first()
248
            Host.name == u'host1 éà').first()
249 249

  
250 250
        # Récupération des groupes de graphes de l'hôte
251 251
        # 'host1' par un utilisateur anonyme : le contrôleur
......
284 284

  
285 285
        # Récupération de l'hôte 'host1' dans la base de données
286 286
        host1 = DBSession.query(Host).filter(
287
            Host.name == u'host1').first()
287
            Host.name == u'host1 éà').first()
288 288

  
289 289
        # Récupération de l'hôte 'host2' dans la base de données
290 290
        host2 = DBSession.query(Host).filter(
291
            Host.name == u'host2').first()
291
            Host.name == u'host2 éà').first()
292 292

  
293 293
        # Récupération de l'hôte 'host3' dans la base de données
294 294
        host3 = DBSession.query(Host).filter(
295
            Host.name == u'host3').first()
295
            Host.name == u'host3 éà').first()
296 296

  
297 297
        # Récupération du groupe de graphes
298 298
        # 'graphgroup1' dans la base de données
......
312 312
        # Récupération du graphe 'graph1'
313 313
        # dans la base de données
314 314
        graph1 = DBSession.query(Graph).filter(
315
            Graph.name == u'graph1').first()
315
            Graph.name == u'graph1 éà').first()
316 316

  
317 317
        # Récupération du graphe 'graph2'
318 318
        # dans la base de données
319 319
        graph2 = DBSession.query(Graph).filter(
320
            Graph.name == u'graph2').first()
320
            Graph.name == u'graph2 éà').first()
321 321

  
322 322
        # Récupération du graphe 'graph3'
323 323
        # dans la base de données
324 324
        graph3 = DBSession.query(Graph).filter(
325
            Graph.name == u'graph3').first()
325
            Graph.name == u'graph3 éà').first()
326 326

  
327 327
        # Récupération des graphes du groupe de graphes
328 328
        # 'graphgroup1' accessibles à l'utilisateur 'manager'
......
445 445

  
446 446
        # Récupération de l'hôte 'host1' dans la base de données
447 447
        host1 = DBSession.query(Host).filter(
448
            Host.name == u'host1').first()
448
            Host.name == u'host1 éà').first()
449 449

  
450 450
        # Récupération de l'hôte 'host3' dans la base de données
451 451
        host3 = DBSession.query(Host).filter(
452
            Host.name == u'host3').first()
452
            Host.name == u'host3 éà').first()
453 453

  
454 454
        # Récupération du groupe de graphes
455 455
        # 'graphgroup1' dans la base de données
......
519 519

  
520 520
        # Récupération de l'hôte 'host1' dans la base de données
521 521
        host1 = DBSession.query(Host).filter(
522
            Host.name == u'host1').first()
522
            Host.name == u'host1 éà').first()
523 523

  
524 524
        # Récupération du groupe de graphes
525 525
        # 'graphgroup1' dans la base de données
vigigraph/tests/functional/test_host_selection_form.py
178 178

  
179 179
        # Récupération de l'hôte 'host1' dans la base de données
180 180
        host1 = DBSession.query(Host).filter(
181
            Host.name == u'host1').first()
181
            Host.name == u'host1 éà').first()
182 182

  
183 183
        # Récupération des groupes d'hôtes
184 184
        # accessibles à l'utilisateur 'manager'
......
333 333

  
334 334
        # Récupération de l'hôte 'host1' dans la base de données
335 335
        host1 = DBSession.query(Host).filter(
336
            Host.name == u'host1').first()
336
            Host.name == u'host1 éà').first()
337 337

  
338 338
        # Récupération de l'hôte 'host2' dans la base de données
339 339
        host2 = DBSession.query(Host).filter(
340
            Host.name == u'host2').first()
340
            Host.name == u'host2 éà').first()
341 341

  
342 342
        # Récupération des hôtes du groupe 'mhg'
343 343
        # accessibles à l'utilisateur 'manager'
vigigraph/tests/functional/test_opensearch.py
6 6
Teste l'utilisation du module de recherche
7 7
OpenSearch intégré au navigateur.
8 8
"""
9
import transaction
9
import transaction, urllib2
10 10

  
11 11
from vigigraph.tests import TestController
12 12
from vigilo.models.session import DBSession
13 13
from vigilo.models.tables import Host, SupItemGroup, Graph, GraphGroup
14

  
15
from vigigraph.tests.functional.test_host_selection_form import populateDB
16
from vigigraph.tests.functional.test_graph_selection_form import addGraphs
14
from helpers import populateDB, addGraphs
17 15

  
18 16

  
19 17
class TestOpenSearch(TestController):
......
42 40
            '/rpc/searchHost?query=host*',
43 41
            extra_environ={"REMOTE_USER": user}
44 42
        )
43
        print repr(response.body)
45 44
        for host in hosts:
46 45
            if hosts[host]:
47 46
                self.assertTrue(
48
                    '/rpc/fullHostPage?host=%s' % host
49
                    in response.body
47
                    u'/rpc/fullHostPage?host=%s' %
48
                        urllib2.quote(host.encode('utf-8'))
49
                    in response.unicode_body
50 50
                )
51 51
            else:
52 52
                self.assertTrue(
53
                    '/rpc/fullHostPage?host=%s' % host
54
                    not in response.body
53
                    u'/rpc/fullHostPage?host=%s' %
54
                        urllib2.quote(host.encode('utf-8'))
55
                    not in response.unicode_body
55 56
                )
56 57

  
57 58
    def test_direct_permission(self):
58 59
        """OpenSearch avec permission sur le groupe"""
59 60
        hosts = {
60
            'host1': False,
61
            'host2': True,
62
            'host3': False,
61
            u'host1 éà': False,
62
            u'host2 éà': True,
63
            u'host3 éà': False,
63 64
        }
64 65
        self._check_results('user', hosts)
65 66

  
66 67
    def test_permission_on_parent(self):
67 68
        """OpenSearch avec permission sur le parent du groupe"""
68 69
        hosts = {
69
            'host1': True,
70
            'host2': True,
71
            'host3': True,
70
            u'host1 éà': True,
71
            u'host2 éà': True,
72
            u'host3 éà': True,
72 73
        }
73 74
        self._check_results('poweruser', hosts)
74 75

  
75 76
    def test_no_permission(self):
76 77
        """OpenSearch sans permissions"""
77 78
        hosts = {
78
            'host1': False,
79
            'host2': False,
80
            'host3': False,
79
            u'host1 éà': False,
80
            u'host2 éà': False,
81
            u'host3 éà': False,
81 82
        }
82 83
        self._check_results('visitor', hosts)
83 84

  
84 85
    def test_anonymous(self):
85 86
        """OpenSearch en anonyme"""
86
        for host in ('host1', 'host2', 'host3'):
87
        for host in (u'host1 éà', u'host2 éà', u'host3 éà'):
87 88
            response = self.app.get(
88
                '/rpc/fullHostPage?host=%s' % host,
89
                '/rpc/fullHostPage?host=%s' %
90
                    urllib2.quote(host.encode('utf-8'), ''),
89 91
                status=401
90 92
            )
91 93

  
92 94
    def test_managers(self):
93 95
        """OpenSearch avec le compte manager"""
94 96
        hosts = {
95
            'host1': True,
96
            'host2': True,
97
            'host3': True,
97
            u'host1 éà': True,
98
            u'host2 éà': True,
99
            u'host3 éà': True,
98 100
        }
99 101
        self._check_results('manager', hosts)
vigigraph/tests/functional/test_search_form.py
5 5
"""
6 6
Suite de tests du formulaire de recherche de VigiGraph.
7 7
"""
8
import transaction
8
import transaction, urllib2
9 9

  
10 10
from vigigraph.tests import TestController
11 11
from vigilo.models.session import DBSession
......
50 50

  
51 51
        # Récupération de l'hôte 'host1' dans la base de données
52 52
        host1 = DBSession.query(Host).filter(
53
            Host.name == u'host1').first()
53
            Host.name == u'host1 éà').first()
54 54

  
55 55
        # Récupération de l'hôte 'host2' dans la base de données
56 56
        host2 = DBSession.query(Host).filter(
57
            Host.name == u'host2').first()
57
            Host.name == u'host2 éà').first()
58 58

  
59 59
        # Récupération des résultats obtenus après une recherche
60 60
        # sur l'hôte 'host1' pour l'utilisateur 'manager'
61 61
        response = self.app.post(
62
        '/rpc/searchHostAndGraph?search_form_host=%s' % (str(host1.name), ), {
63
            }, extra_environ={'REMOTE_USER': 'manager'})
62
            '/rpc/searchHostAndGraph?search_form_host=%s' %
63
                urllib2.quote(host1.name.encode('utf-8'), ''),
64
            {},
65
            extra_environ={'REMOTE_USER': 'manager'}
66
        )
64 67
        json = response.json
65 68

  
66 69
        # On s'assure que les deux listes retournées contiennent
67 70
        # respectivement le nom de l'hôte et son identifiant
68 71
        self.assertEqual(
69 72
            json, {
70
                'labels': [['host1', None]],
73
                'labels': [[u'host1 éà', None]],
71 74
                'ids': [[1, None]],
72 75
                'more': False,
73 76
            }
......
76 79
        # Récupération des résultats obtenus après une recherche
77 80
        # sur l'hôte 'host1' pour l'utilisateur 'poweruser'
78 81
        response = self.app.post(
79
        '/rpc/searchHostAndGraph?search_form_host=%s' % (str(host1.name), ), {
80
            }, extra_environ={'REMOTE_USER': 'poweruser'})
82
            '/rpc/searchHostAndGraph?search_form_host=%s' %
83
                urllib2.quote(host1.name.encode('utf-8'), ''),
84
            {},
85
            extra_environ={'REMOTE_USER': 'poweruser'}
86
        )
81 87
        json = response.json
82 88

  
83 89
        # On s'assure que les deux listes retournées contiennent
......
93 99
        # Récupération des résultats obtenus après une recherche
94 100
        # sur l'hôte 'host2' pour l'utilisateur 'poweruser'
95 101
        response = self.app.post(
96
        '/rpc/searchHostAndGraph?search_form_host=%s' % (str(host2.name), ), {
97
            }, extra_environ={'REMOTE_USER': 'poweruser'})
102
            '/rpc/searchHostAndGraph?search_form_host=%s' %
103
                urllib2.quote(host2.name.encode('utf-8'), ''),
104
            {},
105
            extra_environ={'REMOTE_USER': 'poweruser'}
106
        )
98 107
        json = response.json
99 108

  
100 109
        # On s'assure que les deux listes retournées contiennent
......
110 119
        # Récupération des résultats obtenus après une recherche
111 120
        # sur l'hôte 'host2' pour l'utilisateur 'user'
112 121
        response = self.app.post(
113
        '/rpc/searchHostAndGraph?search_form_host=%s' % (str(host2.name), ), {
114
            }, extra_environ={'REMOTE_USER': 'user'})
122
            '/rpc/searchHostAndGraph?search_form_host=%s' %
123
                urllib2.quote(host2.name.encode('utf-8'), ''),
124
            {},
125
            extra_environ={'REMOTE_USER': 'user'}
126
        )
115 127
        json = response.json
116 128

  
117 129
        # On s'assure que les deux listes retournées contiennent
......
131 143

  
132 144
        # Récupération de l'hôte 'host1' dans la base de données
133 145
        host1 = DBSession.query(Host).filter(
134
            Host.name == u'host1').first()
146
            Host.name == u'host1 éà').first()
135 147

  
136 148
        # Récupération de l'hôte 'host3' dans la base de données
137 149
        host3 = DBSession.query(Host).filter(
138
            Host.name == u'host3').first()
150
            Host.name == u'host3 éà').first()
139 151

  
140 152
        # Récupération des résultats obtenus après une recherche
141 153
        # sur l'hôte 'host1' pour l'utilisateur 'user'
142 154
        response = self.app.post(
143
        '/rpc/searchHostAndGraph?search_form_host=%s' % (str(host1.name), ), {
144
            }, extra_environ={'REMOTE_USER': 'user'})
155
            '/rpc/searchHostAndGraph?search_form_host=%s' %
156
                urllib2.quote(host1.name.encode('utf-8'), ''),
157
            {},
158
            extra_environ={'REMOTE_USER': 'user'}
159
        )
145 160
        json = response.json
146 161

  
147 162
        # On s'assure que la liste retournée est vide
......
156 171
        # Récupération des résultats obtenus après une recherche
157 172
        # sur l'hôte 'host3' pour l'utilisateur 'user'
158 173
        response = self.app.post(
159
        '/rpc/searchHostAndGraph?search_form_host=%s' % (str(host3.name), ), {
160
            }, extra_environ={'REMOTE_USER': 'user'})
174
            '/rpc/searchHostAndGraph?search_form_host=%s' %
175
                urllib2.quote(host3.name.encode('utf-8'), ''),
176
            {},
177
            extra_environ={'REMOTE_USER': 'user'}
178
        )
161 179
        json = response.json
162 180

  
163 181
        # On s'assure que la liste
......
173 191
        # Récupération des résultats obtenus après une recherche
174 192
        # sur l'hôte 'host1' pour l'utilisateur 'visitor'
175 193
        response = self.app.post(
176
        '/rpc/searchHostAndGraph?search_form_host=%s' % (str(host1.name), ), {
177
            }, extra_environ={'REMOTE_USER': 'visitor'})
194
            '/rpc/searchHostAndGraph?search_form_host=%s' %
195
                urllib2.quote(host1.name.encode('utf-8'), ''),
196
            {},
197
            extra_environ={'REMOTE_USER': 'visitor'}
198
        )
178 199
        json = response.json
179 200

  
180 201
        # On s'assure que la liste
......
190 211
        # Récupération des résultats obtenus après une recherche
191 212
        # sur l'hôte 'host3' pour l'utilisateur 'visitor'
192 213
        response = self.app.post(
193
        '/rpc/searchHostAndGraph?search_form_host=%s' % (str(host3.name), ), {
194
            }, extra_environ={'REMOTE_USER': 'visitor'})
214
            '/rpc/searchHostAndGraph?search_form_host=%s' %
215
                urllib2.quote(host3.name.encode('utf-8'), ''),
216
            {},
217
            extra_environ={'REMOTE_USER': 'visitor'}
218
        )
195 219
        json = response.json
196 220

  
197 221
        # On s'assure que la liste
......
211 235

  
212 236
        # Récupération de l'hôte 'host1' dans la base de données
213 237
        host1 = DBSession.query(Host).filter(
214
            Host.name == u'host1').first()
238
            Host.name == u'host1 éà').first()
215 239

  
216 240
        # Récupération des résultats obtenus après une recherche
217 241
        # sur l'hôte 'host1' pour un utilisateur anonyme :
218 242
        # le contrôleur doit retourner une erreur 401.
219 243
        self.app.post(
220
            '/rpc/searchHostAndGraph?'
221
            'search_form_host=%s' % (str(host1.name), ), {
222
            }, status=401)
244
            '/rpc/searchHostAndGraph?search_form_host=%s' %
245
                urllib2.quote(host1.name.encode('utf-8'), ''),
246
            {},
247
            status=401
248
        )
223 249

  
224 250
    def test_select_inexisting_host(self):
225 251
        """
......
249 275

  
250 276
        # Récupération de l'hôte 'host1' dans la base de données
251 277
        host1 = DBSession.query(Host).filter(
252
            Host.name == u'host1').first()
278
            Host.name == u'host1 éà').first()
253 279

  
254 280
        # Récupération du graphe 'graph1' dans la base de données
255 281
        graph1 = DBSession.query(Graph).filter(
256
            Graph.name == u'graph1').first()
282
            Graph.name == u'graph1 éà').first()
257 283

  
258 284
        # Récupération des résultats obtenus après une recherche sur
259 285
        # un graphe sans préciser d'hôte par l'utilisateur 'manager'.
260 286
        response = self.app.post(
261
        '/rpc/searchHostAndGraph?search_form_graph=%s' % (str(graph1.name), ), {
262
            }, extra_environ={'REMOTE_USER': 'manager'})
287
            '/rpc/searchHostAndGraph?search_form_graph=%s' %
288
                urllib2.quote(graph1.name.encode('utf-8'), ''),
289
            {},
290
            extra_environ={'REMOTE_USER': 'manager'}
291
        )
263 292
        json = response.json
264 293

  
265 294
        # On s'assure que la liste retournée est conforme à celle attendue
266 295
        self.assertEqual(
267 296
            json, {
268
                'labels': [[str(host1.name), str(graph1.name)]],
297
                'labels': [[host1.name, graph1.name]],
269 298
                'ids': [[host1.idhost, graph1.idgraph]],
270 299
                'more': False,
271 300
            }
......
278 307

  
279 308
        # Récupération du graphe 'graph1' dans la base de données
280 309
        graph1 = DBSession.query(Graph).filter(
281
            Graph.name == u'graph1').first()
310
            Graph.name == u'graph1 éà').first()
282 311

  
283 312
        # On s'assure qu'une liste vide est retournée lorsque
284 313
        # l'on recherche un graphe en précisant un hôte erroné.
285 314
        response = self.app.post(
286
        '/rpc/searchHostAndGraph?search_form_host=%s' % (str(graph1.name), ), {
287
            }, extra_environ={'REMOTE_USER': 'manager'})
315
            '/rpc/searchHostAndGraph?search_form_host=%s' %
316
                urllib2.quote(graph1.name.encode('utf-8'), ''),
317
            {},
318
            extra_environ={'REMOTE_USER': 'manager'}
319
        )
288 320
        json = response.json
289 321

  
290 322
        # On s'assure que la liste retournée est vide
......
311 343

  
312 344
        # Récupération de l'hôte 'host1' dans la base de données
313 345
        host1 = DBSession.query(Host).filter(
314
            Host.name == u'host1').first()
346
            Host.name == u'host1 éà').first()
315 347

  
316 348
        # Récupération de l'hôte 'host2' dans la base de données
317 349
        host2 = DBSession.query(Host).filter(
318
            Host.name == u'host2').first()
350
            Host.name == u'host2 éà').first()
319 351

  
320 352
        # Récupération du groupe de graphes
321 353
        # 'graphgroup1' dans la base de données
......
329 361

  
330 362
        # Récupération du graphe 'graph1' dans la base de données
331 363
        graph1 = DBSession.query(Graph).filter(
332
            Graph.name == u'graph1').first()
364
            Graph.name == u'graph1 éà').first()
333 365

  
334 366
        # Récupération du graphe 'graph2' dans la base de données
335 367
        graph2 = DBSession.query(Graph).filter(
336
            Graph.name == u'graph2').first()
368
            Graph.name == u'graph2 éà').first()
337 369

  
338 370
        # Récupération des résultats obtenus après une recherche
339 371
        # sur le graphe 'graph1' pour l'utilisateur 'manager'
340 372
        response = self.app.post(
341
        '/rpc/searchHostAndGraph?search_form_host=%s&search_form_graph=%s' %
342
            (str(host1.name), str(graph1.name)), {
343
            }, extra_environ={'REMOTE_USER': 'manager'})
373
        '/rpc/searchHostAndGraph?search_form_host=%s&search_form_graph=%s' % (
374
                urllib2.quote(host1.name.encode('utf-8'), ''),
375
                urllib2.quote(graph1.name.encode('utf-8'), ''),
376
            ), {}, extra_environ={'REMOTE_USER': 'manager'})
344 377
        json = response.json
345 378

  
346 379
        # On s'assure que la liste retournée
......
356 389
        # Récupération des résultats obtenus après une recherche
357 390
        # sur le graphe 'graph1' pour l'utilisateur 'poweruser'
358 391
        response = self.app.post(
359
        '/rpc/searchHostAndGraph?search_form_host=%s&search_form_graph=%s' %
360
            (str(host1.name), str(graph1.name)), {
361
            }, extra_environ={'REMOTE_USER': 'poweruser'})
392
            '/rpc/searchHostAndGraph?search_form_host=%s&' \
393
            'search_form_graph=%s' % (
394
                urllib2.quote(host1.name.encode('utf-8'), ''),
395
                urllib2.quote(graph1.name.encode('utf-8'), ''),
396
            ), {}, extra_environ={'REMOTE_USER': 'poweruser'})
362 397
        json = response.json
363 398

  
364 399
        # On s'assure que la liste retournée est conforme à celle attendue
......
373 408
        # Récupération des résultats obtenus après une recherche
374 409
        # sur le graphe 'graph2' pour l'utilisateur 'poweruser'
375 410
        response = self.app.post(
376
        '/rpc/searchHostAndGraph?search_form_host=%s&search_form_graph=%s' %
377
            (str(host2.name), str(graph2.name)), {
378
            }, extra_environ={'REMOTE_USER': 'poweruser'})
411
            '/rpc/searchHostAndGraph?search_form_host=%s&' \
412
            'search_form_graph=%s' % (
413
                urllib2.quote(host2.name.encode('utf-8'), ''),
414
                urllib2.quote(graph2.name.encode('utf-8'), ''),
415
            ), {}, extra_environ={'REMOTE_USER': 'poweruser'})
379 416
        json = response.json
380 417

  
381 418
        # On s'assure que la liste retournée
......
391 428
        # Récupération des résultats obtenus après une recherche
392 429
        # sur le graphe 'graph2' pour l'utilisateur 'user'
393 430
        response = self.app.post(
394
        '/rpc/searchHostAndGraph?search_form_host=%s&search_form_graph=%s' %
395
            (str(host2.name), str(graph2.name)), {
396
            }, extra_environ={'REMOTE_USER': 'user'})
431
            '/rpc/searchHostAndGraph?search_form_host=%s&' \
432
            'search_form_graph=%s' % (
433
                urllib2.quote(host2.name.encode('utf-8'), ''),
434
                urllib2.quote(graph2.name.encode('utf-8'), ''),
435
            ), {}, extra_environ={'REMOTE_USER': 'user'})
397 436
        json = response.json
398 437

  
399 438
        # On s'assure que la liste retournée
......
413 452

  
414 453
        # Récupération de l'hôte 'host1' dans la base de données
415 454
        host1 = DBSession.query(Host).filter(
416
            Host.name == u'host1').first()
455
            Host.name == u'host1 éà').first()
417 456

  
418 457
        # Récupération de l'hôte 'host3' dans la base de données
419 458
        host3 = DBSession.query(Host).filter(
420
            Host.name == u'host3').first()
459
            Host.name == u'host3 éà').first()
421 460

  
422 461
        # Récupération du graphe 'graph1' dans la base de données
423 462
        graph1 = DBSession.query(Graph).filter(
424
            Graph.name == u'graph1').first()
463
            Graph.name == u'graph1 éà').first()
425 464

  
426 465
        # Récupération du graphe 'graph3' dans la base de données
427 466
        graph3 = DBSession.query(Graph).filter(
428
            Graph.name == u'graph1').first()
467
            Graph.name == u'graph3 éà').first()
429 468

  
430 469
        # Récupération des résultats obtenus après une recherche
431 470
        # sur le graphe 'graph1' pour l'utilisateur 'user'
432 471
        response = self.app.post(
433
        '/rpc/searchHostAndGraph?search_form_host=%s&search_form_graph=%s' %
434
            (str(host1.name), str(graph1.name)), {
435
            }, extra_environ={'REMOTE_USER': 'user'})
472
            '/rpc/searchHostAndGraph?search_form_host=%s&' \
473
            'search_form_graph=%s' % (
474
                urllib2.quote(host1.name.encode('utf-8'), ''),
475
                urllib2.quote(graph1.name.encode('utf-8'), ''),
476
            ), {}, extra_environ={'REMOTE_USER': 'user'})
436 477
        json = response.json
437 478

  
438 479
        # On s'assure que la liste retournée est vide
......
447 488
        # Récupération des résultats obtenus après une recherche
448 489
        # sur le graphe 'graph3' pour l'utilisateur 'user'
449 490
        response = self.app.post(
450
        '/rpc/searchHostAndGraph?search_form_host=%s&search_form_graph=%s' %
451
            (str(host3.name), str(graph3.name)), {
452
            }, extra_environ={'REMOTE_USER': 'user'})
491
            '/rpc/searchHostAndGraph?search_form_host=%s&' \
492
            'search_form_graph=%s' % (
493
                urllib2.quote(host3.name.encode('utf-8'), ''),
494
                urllib2.quote(graph3.name.encode('utf-8'), ''),
495
            ), {}, extra_environ={'REMOTE_USER': 'user'})
453 496
        json = response.json
454 497

  
455 498
        # On s'assure que la liste retournée est vide
......
464 507
        # Récupération des résultats obtenus après une recherche
465 508
        # sur le graphe 'graph1' pour l'utilisateur 'visitor'
466 509
        response = self.app.post(
467
        '/rpc/searchHostAndGraph?search_form_host=%s&search_form_graph=%s' %
468
            (str(host1.name), str(graph1.name)), {
469
            }, extra_environ={'REMOTE_USER': 'visitor'})
510
            '/rpc/searchHostAndGraph?search_form_host=%s&' \
511
            'search_form_graph=%s' % (
512
                urllib2.quote(host1.name.encode('utf-8'), ''),
513
                urllib2.quote(graph1.name.encode('utf-8'), ''),
514
            ), {}, extra_environ={'REMOTE_USER': 'visitor'})
470 515
        json = response.json
471 516

  
472 517
        # On s'assure que la liste retournée est vide
......
481 526
        # Récupération des résultats obtenus après une recherche
482 527
        # sur le graphe 'graph3' pour l'utilisateur 'visitor'
483 528
        response = self.app.post(
484
        '/rpc/searchHostAndGraph?search_form_host=%s&search_form_graph=%s' %
485
            (str(host3.name), str(graph3.name)), {
486
            }, extra_environ={'REMOTE_USER': 'visitor'})
529
            '/rpc/searchHostAndGraph?search_form_host=%s&' \
530
            'search_form_graph=%s' % (
531
                urllib2.quote(host3.name.encode('utf-8'), ''),
532
                urllib2.quote(graph3.name.encode('utf-8'), ''),
533
            ), {}, extra_environ={'REMOTE_USER': 'visitor'})
487 534
        json = response.json
488 535

  
489 536
        # On s'assure que la liste retournée est vide
......
502 549

  
503 550
        # Récupération de l'hôte 'host1' dans la base de données
504 551
        host1 = DBSession.query(Host).filter(
505
            Host.name == u'host1').first()
552
            Host.name == u'host1 éà').first()
506 553

  
507 554
        # Récupération du graphe 'graph1' dans la base de données
508 555
        graph1 = DBSession.query(Graph).filter(
509
            Graph.name == u'graph1').first()
556
            Graph.name == u'graph1 éà').first()
510 557

  
511 558
        # Récupération des résultats obtenus après une recherche
512 559
        # sur le graphe 'graph1' pour un utilisateur anonyme :
513 560
        # le contrôleur doit retourner une erreur 401
514 561
        self.app.post(
515
            '/rpc/searchHostAndGraph?search_form_host=%s&search_form_graph=%s' %
516
            (str(host1.name), str(graph1.name)), {
517
            }, status=401)
562
            '/rpc/searchHostAndGraph?search_form_host=%s&' \
563
            'search_form_graph=%s' % (
564
                urllib2.quote(host1.name.encode('utf-8'), ''),
565
                urllib2.quote(graph1.name.encode('utf-8'), ''),
566
            ), {}, status=401)
518 567

  
519 568
    def test_select_inexisting_graph(self):
520 569
        """
......
523 572

  
524 573
        # Récupération de l'hôte 'host1' dans la base de données
525 574
        host1 = DBSession.query(Host).filter(
526
            Host.name == u'host1').first()
575
            Host.name == u'host1 éà').first()
527 576

  
528 577
        # Récupération des résultats obtenus après une recherche
529 578
        # sur un graphe inexistant pour l'utilisateur 'manager'
530 579
        response = self.app.post(
531
        '/rpc/searchHostAndGraph?search_form_host=%s&search_form_graph=%s' %
532
            (str(host1.name), 'graphe_totalement_inexistant'), {
533
            }, extra_environ={'REMOTE_USER': 'manager'})
580
           '/rpc/searchHostAndGraph?search_form_host=%s&' \
581
           'search_form_graph=%s' % (
582
                urllib2.quote(host1.name.encode('utf-8'), ''),
583
                'graphe_totalement_inexistant',
584
            ), {}, extra_environ={'REMOTE_USER': 'manager'}
585
        )
534 586
        json = response.json
535 587

  
536 588
        # On s'assure que la liste retournée est vide

Also available in: Unified diff