Projet

Général

Profil

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

Lauréline Guérin, 26 mars 2020 16:26

Télécharger (9,97 ko)

Voir les différences:

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

 passerelle/contrib/toulouse_axel/models.py | 34 +++++++++---
 tests/test_toulouse_axel.py                | 60 +++++++++++++++++++---
 2 files changed, 78 insertions(+), 16 deletions(-)
passerelle/contrib/toulouse_axel/models.py
17 17
import base64
18 18
import copy
19 19
import datetime
20
import hashlib
20 21
import logging
21 22
import os
22 23
import re
23 24
import xml.etree.ElementTree as ET
24 25
from collections import namedtuple
25 26

  
26

  
27
from django.core.cache import cache
27 28
from django.db import models
28 29
from django.http import HttpResponse
29 30
from django.utils.encoding import force_text
31
from django.utils.encoding import force_bytes
30 32
from django.utils.translation import ugettext_lazy as _
31 33

  
32 34
import xmlschema
......
388 390
        except Lock.DoesNotExist:
389 391
            return {'key': key, 'locked': False}
390 392

  
391
    @endpoint(
392
        description=_("Get dates of the update management"),
393
        perm='can_access')
394
    def management_dates(self, request):
393
    def get_management_dates(self):
394
        cache_key = hashlib.md5(force_bytes(repr(self.slug) + 'management_dates')).hexdigest()
395
        result = cache.get(cache_key)
396
        if result is not None:
397
            return result
398

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

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

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

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

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

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

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

  
549 567
    @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
-