Projet

Général

Profil

0002-toulouse-maelis-add-id-and-q-parameters-on-referenti.patch

Nicolas Roche, 04 novembre 2022 18:16

Télécharger (12,1 ko)

Voir les différences:

Subject: [PATCH 2/5] toulouse-maelis: add id and q parameters on referentiels
 (#70982)

 passerelle/contrib/toulouse_maelis/models.py | 115 +++++++++++++++----
 tests/test_toulouse_maelis.py                |  18 +++
 2 files changed, 109 insertions(+), 24 deletions(-)
passerelle/contrib/toulouse_maelis/models.py
18 18
import zeep
19 19
from django.core.cache import cache
20 20
from django.db import models
21 21
from zeep.helpers import serialize_object
22 22
from zeep.wsse.username import UsernameToken
23 23

  
24 24
from passerelle.base.models import BaseResource, HTTPResource
25 25
from passerelle.utils.api import endpoint
26
from passerelle.utils.conversion import to_ascii
26 27
from passerelle.utils.jsonresponse import APIError
27 28

  
28 29
from . import schemas
29 30

  
30 31

  
31 32
class ToulouseMaelis(BaseResource, HTTPResource):
32 33
    # noqa pylint: disable=too-many-public-methods
33 34

  
......
97 98
                    'list': [{'id': x.id, 'text': x.code} for x in response],
98 99
                    'dict': {x.id: x.code for x in response},
99 100
                }
100 101
            else:
101 102
                data = {
102 103
                    'list': [{'id': x.code, 'text': x.libelle} for x in response],
103 104
                    'dict': {x.code: x.libelle for x in response},
104 105
                }
106
            data['search'] = {to_ascii(x['text']).lower(): x for x in data['list']}
107

  
105 108
            # put in cache for two hours
106 109
            cache.set(cache_key, data, 3600 * 2)
107 110
        return data
108 111

  
109 112
    def get_referential_value(self, referential_name, key, log_warning=False):
110 113
        try:
111 114
            return self.get_referential(referential_name)['dict'][key]
112 115
        except KeyError:
113 116
            if log_warning:
114 117
                # Maelis DB not properly configurated
115 118
                self.logger.warning("No '%s' key into Maelis '%s' referential", key, referential_name)
116 119
            return None
117 120

  
121
    def get_referential_list(self, referential_name, id=None, q=None):
122
        data = []
123

  
124
        if id:
125
            text = self.get_referential_value(referential_name, id)
126
            if text:
127
                data.append({'id': id, 'text': text})
128
        elif q is not None:
129
            key = to_ascii(q.strip()).lower()
130
            if key:
131
                items = self.get_referential(referential_name)['search'].items()
132
                data = [v for k, v in items if key in k]
133
        else:
134
            data = self.get_referential(referential_name)['list']
135
        return data
136

  
118 137
    def get_link(self, NameID):
119 138
        try:
120 139
            return self.link_set.get(name_id=NameID)
121 140
        except Link.DoesNotExist:
122 141
            raise APIError('User not linked to family', err_code='not-linked')
123 142

  
124 143
    def get_family_raw(self, family_id):
125 144
        response = self.call('Family', 'readFamily', dossierNumber=family_id)
......
361 380
            if value is None:
362 381
                dico[key] = ''
363 382

  
364 383
    @endpoint(
365 384
        display_category='Famille',
366 385
        description='Liste des catégories',
367 386
        name='read-category-list',
368 387
        perm='can_access',
388
        parameters={
389
            'id': {'description': 'Identifiant de l’enregistrement'},
390
            'q': {'description': 'Recherche en texte intégral'},
391
        },
369 392
    )
370
    def read_category_list(self, request):
371
        return {'data': self.get_referential('Category')['list']}
393
    def read_category_list(self, request, id=None, q=None):
394
        return {'data': self.get_referential_list('Category', id, q)}
372 395

  
373 396
    @endpoint(
374 397
        display_category='Famille',
375 398
        description='Liste des civilités',
376 399
        name='read-civility-list',
377 400
        perm='can_access',
401
        parameters={
402
            'id': {'description': 'Identifiant de l’enregistrement'},
403
            'q': {'description': 'Recherche en texte intégral'},
404
        },
378 405
    )
379
    def read_civility_list(self, request):
380
        return {'data': self.get_referential('Civility')['list']}
406
    def read_civility_list(self, request, id=None, q=None):
407
        return {'data': self.get_referential_list('Civility', id, q)}
381 408

  
382 409
    @endpoint(
383 410
        display_category='Famille',
384 411
        description='Liste des compléments du numéro de voie',
385 412
        name='read-complement-list',
386 413
        perm='can_access',
414
        parameters={
415
            'id': {'description': 'Identifiant de l’enregistrement'},
416
            'q': {'description': 'Recherche en texte intégral'},
417
        },
387 418
    )
388
    def read_complement_list(self, request):
389
        return {'data': self.get_referential('Complement')['list']}
419
    def read_complement_list(self, request, id=None, q=None):
420
        return {'data': self.get_referential_list('Complement', id, q)}
390 421

  
391 422
    @endpoint(
392 423
        display_category='Famille',
393 424
        description='liste des catégories socio-professionnelles',
394 425
        name='read-csp-list',
395 426
        perm='can_access',
427
        parameters={
428
            'id': {'description': 'Identifiant de l’enregistrement'},
429
            'q': {'description': 'Recherche en texte intégral'},
430
        },
396 431
    )
397
    def read_csp_list(self, request):
398
        data = self.get_referential('CSP')['list']
432
    def read_csp_list(self, request, id=None, q=None):
433
        data = self.get_referential_list('CSP', id, q)
399 434

  
400 435
        # remove redundant codes
401 436
        uniq_text = set()
402 437
        uniq_data = []
403 438
        for item in data:
404 439
            item['text'] = item['text'].strip()
405 440
            if item['text'] not in uniq_text:
406 441
                uniq_data.append(item)
407 442
                uniq_text.add(item['text'])
408 443
        return {'data': uniq_data}
409 444

  
410 445
    @endpoint(
411 446
        display_category='Famille',
412 447
        description='Liste des régimes alimentaires',
413 448
        name='read-dietcode-list',
414 449
        perm='can_access',
450
        parameters={
451
            'id': {'description': 'Identifiant de l’enregistrement'},
452
            'q': {'description': 'Recherche en texte intégral'},
453
        },
415 454
    )
416
    def read_dietcode_list(self, request):
417
        return {'data': self.get_referential('DietCode')['list']}
455
    def read_dietcode_list(self, request, id=None, q=None):
456
        return {'data': self.get_referential_list('DietCode', id, q)}
418 457

  
419 458
    @endpoint(
420 459
        display_category='Famille',
421 460
        description='Liste des organismes (CAF)',
422 461
        name='read-organ-list',
423 462
        perm='can_access',
463
        parameters={
464
            'id': {'description': 'Identifiant de l’enregistrement'},
465
            'q': {'description': 'Recherche en texte intégral'},
466
        },
424 467
    )
425
    def read_organ_list(self, request):
426
        return {'data': self.get_referential('Organ')['list']}
468
    def read_organ_list(self, request, id=None, q=None):
469
        return {'data': self.get_referential_list('Organ', id, q)}
427 470

  
428 471
    @endpoint(
429 472
        display_category='Famille',
430 473
        description="Liste des projet d'accueil individualisés",
431 474
        name='read-pai-list',
432 475
        perm='can_access',
476
        parameters={
477
            'id': {'description': 'Identifiant de l’enregistrement'},
478
            'q': {'description': 'Recherche en texte intégral'},
479
        },
433 480
    )
434
    def read_pai_list(self, request):
435
        return {'data': self.get_referential('PAI')['list']}
481
    def read_pai_list(self, request, id=None, q=None):
482
        return {'data': self.get_referential_list('PAI', id, q)}
436 483

  
437 484
    @endpoint(
438 485
        display_category='Famille',
439 486
        description='liste des qualités du référenciel',
440 487
        name='read-quality-list',
441 488
        perm='can_access',
489
        parameters={
490
            'id': {'description': 'Identifiant de l’enregistrement'},
491
            'q': {'description': 'Recherche en texte intégral'},
492
        },
442 493
    )
443
    def read_quality_list(self, request):
444
        return {'data': self.get_referential('Quality')['list']}
494
    def read_quality_list(self, request, id=None, q=None):
495
        return {'data': self.get_referential_list('Quality', id, q)}
445 496

  
446 497
    @endpoint(
447 498
        display_category='Famille',
448 499
        description='Liste des quotients',
449 500
        name='read-quotient-list',
450 501
        perm='can_access',
502
        parameters={
503
            'id': {'description': 'Identifiant de l’enregistrement'},
504
            'q': {'description': 'Recherche en texte intégral'},
505
        },
451 506
    )
452
    def read_quotient_list(self, request):
453
        return {'data': self.get_referential('Quotient')['list']}
507
    def read_quotient_list(self, request, id=None, q=None):
508
        return {'data': self.get_referential_list('Quotient', id, q)}
454 509

  
455 510
    @endpoint(
456 511
        display_category='Famille',
457 512
        description='Liste des sexes',
458 513
        name='read-sex-list',
459 514
        perm='can_access',
515
        parameters={
516
            'id': {'description': 'Identifiant de l’enregistrement'},
517
            'q': {'description': 'Recherche en texte intégral'},
518
        },
460 519
    )
461
    def read_sex_list(self, request):
462
        return {'data': self.get_referential('Sex')['list']}
520
    def read_sex_list(self, request, id=None, q=None):
521
        return {'data': self.get_referential_list('Sex', id, q)}
463 522

  
464 523
    @endpoint(
465 524
        display_category='Famille',
466 525
        description='liste des situations',
467 526
        name='read-situation-list',
468 527
        perm='can_access',
528
        parameters={
529
            'id': {'description': 'Identifiant de l’enregistrement'},
530
            'q': {'description': 'Recherche en texte intégral'},
531
        },
469 532
    )
470
    def read_situation_list(self, request):
471
        return {'data': self.get_referential('Situation')['list']}
533
    def read_situation_list(self, request, id=None, q=None):
534
        return {'data': self.get_referential_list('Situation', id, q)}
472 535

  
473 536
    @endpoint(
474 537
        display_category='Famille',
475 538
        description='Liste des vaccins',
476 539
        name='read-vaccin-list',
477 540
        perm='can_access',
541
        parameters={
542
            'id': {'description': 'Identifiant de l’enregistrement'},
543
            'q': {'description': 'Recherche en texte intégral'},
544
        },
478 545
    )
479
    def read_vaccin_list(self, request):
480
        return {'data': self.get_referential('Vaccin')['list']}
546
    def read_vaccin_list(self, request, id=None, q=None):
547
        return {'data': self.get_referential_list('Vaccin', id, q)}
481 548

  
482 549
    @endpoint(
483 550
        display_category='Famille',
484 551
        description='Lier un compte usager à une famille',
485 552
        perm='can_access',
486 553
        parameters={'NameID': {'description': 'Publik NameID'}},
487 554
        post={'request_body': {'schema': {'application/json': schemas.LINK_SCHEMA}}},
488 555
    )
tests/test_toulouse_maelis.py
518 518
        {'id': 'M', 'text': 'Marié (e)'},
519 519
        {'id': 'P', 'text': 'Pacsé (e)'},
520 520
        {'id': 'S', 'text': 'Séparé (e)'},
521 521
        {'id': 'UL', 'text': 'UNION LIBRE'},
522 522
        {'id': 'V', 'text': 'Veuf (ve)'},
523 523
        {'id': 'VM', 'text': 'Vivant maritalement'},
524 524
    ]
525 525

  
526
    resp = app.get(url + '?id=V')
527
    assert resp.json['err'] == 0
528
    assert resp.json['data'] == [
529
        {'id': 'V', 'text': 'Veuf (ve)'},
530
    ]
531

  
532
    resp = app.get(url + '?q= sÉ ')
533
    assert resp.json['err'] == 0
534
    assert resp.json['data'] == [
535
        {'id': 'CS', 'text': 'EN COURS DE SEPARATION'},
536
        {'id': 'P', 'text': 'Pacsé (e)'},
537
        {'id': 'S', 'text': 'Séparé (e)'},
538
    ]
539

  
540
    resp = app.get(url + '?q= ')
541
    assert resp.json['err'] == 0
542
    assert resp.json['data'] == []
543

  
526 544

  
527 545
@mock.patch('passerelle.utils.Request.get')
528 546
@mock.patch('passerelle.utils.Request.post')
529 547
def test_read_vaccin_list(mocked_post, mocked_get, con, app):
530 548
    mocked_get.return_value = FAMILY_SERVICE_WSDL
531 549
    mocked_post.return_value = READ_VACCIN
532 550
    url = get_endpoint('read-vaccin-list')
533 551

  
534
-