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 |
)
|