Projet

Général

Profil

0001-toulouse_axel-add-management-dates-in-family-info-41.patch

Lauréline Guérin, 27 mars 2020 09:47

Télécharger (9,76 ko)

Voir les différences:

Subject: [PATCH] toulouse_axel: add management dates in family info (#41033)

 passerelle/contrib/toulouse_axel/models.py | 33 +++++++++---
 tests/test_toulouse_axel.py                | 60 +++++++++++++++++++---
 2 files changed, 77 insertions(+), 16 deletions(-)
passerelle/contrib/toulouse_axel/models.py
23 23
import xml.etree.ElementTree as ET
24 24
from collections import namedtuple
25 25

  
26

  
26
from django.core.cache import cache
27 27
from django.db import models
28 28
from django.http import HttpResponse
29 29
from django.utils.encoding import force_text
......
388 388
        except Lock.DoesNotExist:
389 389
            return {'key': key, 'locked': False}
390 390

  
391
    @endpoint(
392
        description=_("Get dates of the update management"),
393
        perm='can_access')
394
    def management_dates(self, request):
391
    def get_management_dates(self):
392
        cache_key = 'toulouse-axel-%s-management-dates' % self.pk
393
        result = cache.get(cache_key)
394
        if result is not None:
395
            return result
396

  
395 397
        try:
396 398
            result = ref_date_gestion_dui(self)
397 399
        except AxelError as e:
......
400 402
                err_code='error',
401 403
                data={'xml_request': e.xml_request,
402 404
                      'xml_response': e.xml_response})
403
        return {'data': result.json_response['DATA']['PORTAIL']['DUIDATEGESTION']}
405
        management_dates = {}
406
        for key, value in result.json_response['DATA']['PORTAIL']['DUIDATEGESTION'].items():
407
            management_dates[key] = value
408
            management_dates[key.lower().replace('-', '_')] = value
409

  
410
        cache.set(cache_key, management_dates, 3600)  # 1 hour
411
        return management_dates
412

  
413
    @endpoint(
414
        description=_("Get dates of the update management"),
415
        perm='can_access')
416
    def management_dates(self, request):
417
        return {'data': self.get_management_dates()}
404 418

  
405 419
    @endpoint(
406 420
        description=_('Create link between user and Toulouse Axel'),
......
487 501
            raise APIError('Referential not found', err_code='not-found', http_status=404)
488 502
        return {'data': [{'id': key, 'text': val} for key, val in references.items()]}
489 503

  
490
    def get_family_data(self, dui, check_registrations=False):
504
    def get_family_data(self, dui, check_registrations=False, with_management_dates=False):
491 505
        try:
492 506
            result = ref_famille_dui(self, {'PORTAIL': {'DUI': {'IDDUI': dui}}})
493 507
        except AxelError as e:
......
515 529
                child['clae_cantine_current'] = children_registred_for_current_year.get(child['IDPERSONNE'])
516 530
                child['clae_cantine_next'] = children_registred_for_next_year.get(child['IDPERSONNE'])
517 531

  
532
        if with_management_dates:
533
            family_data['management_dates'] = self.get_management_dates()
534

  
518 535
        family_data['SITUATIONFAMILIALE_label'] = utils.get_label(utils.situation_familiale_mapping, family_data['SITUATIONFAMILIALE'])
519 536
        for key in ['RL1', 'RL2']:
520 537
            if key not in family_data:
......
543 560
        })
544 561
    def family_info(self, request, NameID):
545 562
        link = self.get_link(NameID)
546
        family_data = self.get_family_data(link.dui, check_registrations=True)
563
        family_data = self.get_family_data(link.dui, check_registrations=True, with_management_dates=True)
547 564
        return {'data': family_data}
548 565

  
549 566
    @endpoint(
tests/test_toulouse_axel.py
477 477
        resp = app.get('/toulouse-axel/test/management_dates')
478 478
    assert set(resp.json.keys()) == set(['err', 'data'])
479 479
    assert resp.json['err'] == 0
480
    assert set(resp.json['data'].keys()) == set(['REPORT-REVENUS', 'EXTRACTION-FAMILLES', 'EXTRACTION-CAFPRO'])
480
    assert set(resp.json['data'].keys()) == set([
481
        'REPORT-REVENUS',
482
        'report_revenus',
483
        'EXTRACTION-FAMILLES',
484
        'extraction_familles',
485
        'EXTRACTION-CAFPRO',
486
        'extraction_cafpro'
487
    ])
488

  
489
    # again - data are in cache
490
    resp = app.get('/toulouse-axel/test/management_dates')
491
    assert set(resp.json.keys()) == set(['err', 'data'])
492
    assert resp.json['err'] == 0
493
    assert set(resp.json['data'].keys()) == set([
494
        'REPORT-REVENUS',
495
        'report_revenus',
496
        'EXTRACTION-FAMILLES',
497
        'extraction_familles',
498
        'EXTRACTION-CAFPRO',
499
        'extraction_cafpro'
500
    ])
501

  
502
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_management_dates') as management_dates:
503
        management_dates.return_value = {'foo': 'bar'}
504
        resp = app.get('/toulouse-axel/test/management_dates')
505
    assert set(resp.json.keys()) == set(['err', 'data'])
506
    assert resp.json['err'] == 0
507
    assert resp.json['data'] == {'foo': 'bar'}
481 508

  
482 509

  
483 510
def test_link_endpoint_nameid_empty(app, resource, link_params):
......
679 706
    assert resp.json['data'] == expected
680 707

  
681 708

  
682
def test_family_info_endpoint_axel_error(app, resource):
709
def test_family_info_endpoint_axel_error(app, resource, family_data):
683 710
    Link.objects.create(resource=resource, name_id='yyy', dui='XXX', person_id='42')
684 711
    with mock.patch('passerelle.contrib.toulouse_axel.models.ref_famille_dui') as operation:
685 712
        operation.side_effect = AxelError('FooBar')
......
687 714
    assert resp.json['err_desc'] == "Axel error: FooBar"
688 715
    assert resp.json['err'] == 'error'
689 716

  
717
    filepath = os.path.join(os.path.dirname(__file__), 'data/toulouse_axel/family_info.xml')
718
    with open(filepath) as xml:
719
        content = xml.read()
720
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_management_dates') as management_dates:
721
        management_dates.side_effect = APIError('Axel error: FooBar')
722
        with mock_getdata(content, 'RefFamilleDui'):
723
            resp = app.get('/toulouse-axel/test/family_info?NameID=yyy')
724
    assert resp.json['err_desc'] == "Axel error: FooBar"
725

  
690 726

  
691 727
def test_family_info_endpoint_no_result(app, resource):
692 728
    resp = app.get('/toulouse-axel/test/family_info?NameID=yyy')
......
699 735
    filepath = os.path.join(os.path.dirname(__file__), 'data/toulouse_axel/family_info.xml')
700 736
    with open(filepath) as xml:
701 737
        content = xml.read()
702
    with mock_getdata(content, 'RefFamilleDui'):
703
        resp = app.get('/toulouse-axel/test/family_info?NameID=yyy')
738
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_management_dates') as management_dates:
739
        management_dates.return_value = {'foo': 'bar'}
740
        with mock_getdata(content, 'RefFamilleDui'):
741
            resp = app.get('/toulouse-axel/test/family_info?NameID=yyy')
704 742
    assert resp.json['err'] == 0
705 743
    assert set(resp.json['data'].keys()) == set([
706 744
        'ADRESSE',
......
717 755
        'SITUATIONFAMILIALE',
718 756
        'SITUATIONFAMILIALE_label',
719 757
        'TELFIXE',
758
        'management_dates',
720 759
    ])
721 760
    assert resp.json['data']['ENFANT'][0]['id'] == '4242'
722 761
    assert resp.json['data']['ENFANT'][0]['text'] == 'foo foo'
......
728 767
    assert resp.json['data']['ENFANT'][0]['CONTACT'][2]['text'] == 'foo foo'
729 768
    assert resp.json['data']['ENFANT'][1]['id'] == '3535'
730 769
    assert resp.json['data']['ENFANT'][1]['text'] == 'foo foo'
770
    assert resp.json['data']['management_dates'] == {'foo': 'bar'}
731 771

  
732 772
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.are_children_registered') as registered:
733 773
        registered.side_effect = [{'4242': True}, {}]
734
        with mock_getdata(content, 'RefFamilleDui'):
735
            resp = app.get('/toulouse-axel/test/family_info?NameID=yyy')
774
        with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_management_dates') as management_dates:
775
            management_dates.return_value = {'foo': 'bar'}
776
            with mock_getdata(content, 'RefFamilleDui'):
777
                resp = app.get('/toulouse-axel/test/family_info?NameID=yyy')
736 778
    assert resp.json['err'] == 0
737 779
    assert resp.json['data']['ENFANT'][0]['clae_cantine_current'] is True
738 780
    assert resp.json['data']['ENFANT'][0]['clae_cantine_next'] is None
......
741 783

  
742 784
    with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.are_children_registered') as registered:
743 785
        registered.side_effect = [{}, {'4242': False, '3535': True}]
744
        with mock_getdata(content, 'RefFamilleDui'):
745
            resp = app.get('/toulouse-axel/test/family_info?NameID=yyy')
786
        with mock.patch('passerelle.contrib.toulouse_axel.models.ToulouseAxel.get_management_dates') as management_dates:
787
            management_dates.return_value = {'foo': 'bar'}
788
            with mock_getdata(content, 'RefFamilleDui'):
789
                resp = app.get('/toulouse-axel/test/family_info?NameID=yyy')
746 790
    assert resp.json['err'] == 0
747 791
    assert resp.json['data']['ENFANT'][0]['clae_cantine_current'] is None
748 792
    assert resp.json['data']['ENFANT'][0]['clae_cantine_next'] is False
749
-