Projet

Général

Profil

0001-cartads_cs-add-endpoint-to-send-DAACT-items-36112.patch

Frédéric Péters, 13 septembre 2019 14:59

Télécharger (10,1 ko)

Voir les différences:

Subject: [PATCH] cartads_cs: add endpoint to send DAACT items (#36112)

 passerelle/apps/cartads_cs/models.py | 97 ++++++++++++++++++++++++++++
 tests/test_cartads_cs.py             | 83 ++++++++++++++++++++++++
 2 files changed, 180 insertions(+)
passerelle/apps/cartads_cs/models.py
34 34
from django.core.signing import Signer
35 35
from django.core.urlresolvers import reverse
36 36
from django.db import models
37
from django.db.models import Q
37 38
from django.http import HttpResponse
38 39
from django.utils.encoding import force_text
39 40
from django.utils.timezone import now
......
526 527
            piece['files'].append({'url': upload_url})
527 528
        return {'data': pieces}
528 529

  
530
    @endpoint(perm='can_access',
531
              description=_('Get list of DAACT file items'),
532
              parameters={
533
                  'tracking_code': TRACKING_CODE_PARAM,
534
              })
535
    def daact_pieces(self, request, tracking_code):
536
        dossier = CartaDSDossier.objects.get(tracking_code=tracking_code)
537
        status = self.status(request, dossier.id)
538
        if status['status_label'] != 'Attente DAACT':
539
            raise APIError('wrong status')
540

  
541
        client = self.soap_client(wsdl_url=self.get_wsdl_url('ServicePiece'))
542
        resp = client.service.GetPiecesDaact(self.get_token(), dossier.cartads_id_dossier)
543

  
544
        signer = Signer(salt='cart@ds_cs')
545
        upload_token = signer.sign(tracking_code)
546

  
547
        pieces = [
548
            {'id': 'cerfa-daact',
549
             'text': 'CERFA',
550
             'description': '',
551
             'codePiece': '',
552
             'reglementaire': True,
553
             'files': [],
554
             'max_files': 1,
555
            },
556
        ]
557

  
558
        pieces.extend([
559
            {'id': 'daact-%s' % x['IdPiece'],
560
             'text': x['LibellePiece'],
561
             'description': x['Descriptif'],
562
             'codePiece': x['CodePiece'],
563
             'files': [],
564
             'max_files': 6,
565
             } for x in resp])
566

  
567
        for piece in pieces:
568
            if request:
569
                upload_url = request.build_absolute_uri('%supload/%s/%s/' % (
570
                    self.get_absolute_url(),
571
                    piece['id'],
572
                    upload_token))
573
            else:
574
                upload_url = None
575
            piece['files'] = []
576
            piece['files'].append({'url': upload_url})
577
        return {'data': pieces}
578

  
529 579
    @endpoint(methods=['post'],
530 580
              pattern='^(?P<id_piece>[\w-]+)/(?P<token>[\w:_-]+)/$',
531 581
              description=_('Upload a single document file'),
......
789 839
            piece.sent_to_cartads = now()
790 840
            piece.save()
791 841

  
842
    @endpoint(perm='can_access',
843
              description=_('Send DAACT file items'),
844
              parameters={
845
                  'tracking_code': TRACKING_CODE_PARAM,
846
              })
847
    def send_daact_pieces(self, request, tracking_code):
848
        dossier = CartaDSDossier.objects.get(tracking_code=tracking_code)
849
        self.add_job('send_daact_pieces_to_cartads', dossier_id=dossier.id)
850
        return {'err': 0, 'dossier_id': dossier.id}
851

  
852
    def send_daact_pieces_to_cartads(self, dossier_id):
853
        dossier = CartaDSDossier.objects.get(id=dossier_id)
854
        pieces = self.daact_pieces(None, dossier.tracking_code)['data']
855

  
856
        client = self.soap_client(wsdl_url=self.get_wsdl_url('ServiceDocumentation'))
857
        for piece_type in pieces:
858
            for piece in CartaDSFile.objects.filter(
859
                    tracking_code=dossier.tracking_code,
860
                    sent_to_cartads__isnull=True,
861
                    id_piece=piece_type['id']):
862
                content = piece.uploaded_file.read()
863
                try:
864
                    infos = {
865
                        'renameFile': True,
866
                    }
867
                    if piece.id_piece == 'cerfa-daact':
868
                        infos['docDaact'] = 'daact'
869
                        filename = 'cerfa-daact.pdf'
870
                    else:
871
                        infos['docDaact'] = 'pieceDaact'
872
                        infos['idPieceDaact'] = piece.id_piece.split('-', 1)[-1]
873
                        filename = '%s%s' % (piece_type['codePiece'], os.path.splitext(piece.uploaded_file.name)[-1])
874
                    resp = client.service.UploadFile(FileByteStream=content,
875
                            _soapheaders={
876
                                'IdDossier': dossier.cartads_id_dossier,
877
                                'NomFichier': filename,
878
                                'Length': piece.uploaded_file.size,
879
                                'Token': self.get_token(),
880
                                'InformationsComplementaires': key_value_of_stringstring(infos)
881
                    })
882
                except zeep.exceptions.Fault as e:
883
                    self.logger.exception('error pushing daact file item %d (%r)', piece.id, e.message)
884
                else:
885
                    assert resp is None
886
                    piece.sent_to_cartads = now()
887
                    piece.save()
888

  
792 889
    @endpoint(perm='can_access',
793 890
              description=_('Get status of file'),
794 891
              parameters={
tests/test_cartads_cs.py
87 87
                'DateRealisation': None,
88 88
                'DateReference': '2019-03-25T00:00:00',
89 89
                'IdDossier': 471160L},]
90
        elif dossier and dossier.tracking_code == 'DAACTXXXX':
91
            return [{
92
                'LibelleEtape': 'Attente DAACT',
93
                'IdEtapeDossier': 2356473L,
94
                'DateEcheance': '2022-04-01T00:00:00',
95
                'IdEtape': 12L,
96
                'DateRealisation': None,
97
                'DateReference': '2019-03-25T00:00:00',
98
                'IdDossier': 471160L},]
90 99

  
91 100
        # default
92 101
        return [{
......
123 132
                (u'NbDocuments', 0L)]),
124 133
        ]
125 134

  
135
    def GetPiecesDaact(self, token, dossier_id):
136
        return [
137
            OrderedDict([
138
                (u'CodePiece', 'AT1'),
139
                (u'DateDemande', None),
140
                (u'DatePresentation', None),
141
                (u'DateReception', None),
142
                (u'Descriptif', u"L'attestation constatant..."),
143
                (u'IdDosPiece', 0L),
144
                (u'IdPiece', 191L),
145
                (u'LibellePiece', 'Attestation constat des travaux'),
146
                (u'NbDocuments', 0L)]),
147
            OrderedDict([
148
                (u'CodePiece', 'AT2'),
149
                (u'DateDemande', None),
150
                (u'DatePresentation', None),
151
                (u'DateReception', None),
152
                (u'Descriptif', u"Dans les cas..."),
153
                (u'IdDosPiece', 0L),
154
                (u'IdPiece', 192L),
155
                (u'LibellePiece', u'Document du...'),
156
                (u'NbDocuments', 0L)]),
157
        ]
158

  
126 159
    def UploadFile(self, FileByteStream, _soapheaders):
127 160
        assert FileByteStream
128 161
        assert _soapheaders
......
438 471

  
439 472
    assert CartaDSFile.objects.filter(tracking_code=dossier.tracking_code,
440 473
            sent_to_cartads=None).count() == 0
474

  
475

  
476
def test_daact_pieces_management(connector, app, cached_data):
477
    CartaDSDossier.objects.all().delete()
478
    test_send(connector, app, cached_data)
479
    dossier = CartaDSDossier.objects.all()[0]
480

  
481
    with mock.patch('passerelle.apps.cartads_cs.models.CartaDSCS.soap_client') as client:
482
        client.return_value = mock.Mock(service=FakeService())
483
        resp = app.get('/cartads-cs/test/daact_pieces?tracking_code=%s' % dossier.tracking_code)
484
        assert resp.json['err']
485

  
486
    dossier.tracking_code = 'DAACTXXXX'  # to get the right status
487
    dossier.save()
488
    with mock.patch('passerelle.apps.cartads_cs.models.CartaDSCS.soap_client') as client:
489
        client.return_value = mock.Mock(service=FakeService())
490
        resp = app.get('/cartads-cs/test/daact_pieces?tracking_code=%s' % dossier.tracking_code)
491
    data = resp.json['data']
492
    assert len(data) == 3
493
    assert data[0]['text'] == 'CERFA'
494
    assert data[0]['max_files'] == 1
495
    for piece in data:
496
        assert len(piece['files']) == 1
497
        assert piece['files'][0].keys() == ['url']
498

  
499
    pdf_contents = open(os.path.join(os.path.dirname(__file__), 'data', 'pdf-form.pdf')).read()
500
    resp = app.post(data[0]['files'][0]['url'],
501
                    upload_files=[('files[]', 'test.pdf', pdf_contents)])
502
    assert resp.json[0]['token']
503
    assert CartaDSFile.objects.filter(tracking_code=dossier.tracking_code,
504
            sent_to_cartads=None).count() == 1
505

  
506
    pdf_contents = open(os.path.join(os.path.dirname(__file__), 'data', 'pdf-form.pdf')).read()
507
    resp = app.post(data[1]['files'][0]['url'],
508
                    upload_files=[('files[]', 'test.pdf', pdf_contents)])
509
    assert resp.json[0]['token']
510
    assert CartaDSFile.objects.filter(tracking_code=dossier.tracking_code,
511
            sent_to_cartads=None).count() == 2
512

  
513
    Job.objects.all().delete()
514
    resp = app.get('/cartads-cs/test/send_daact_pieces?tracking_code=%s' % dossier.tracking_code)
515
    assert Job.objects.all().count() == 1
516

  
517
    with mock.patch('passerelle.apps.cartads_cs.models.CartaDSCS.soap_client') as client:
518
        client.return_value = mock.Mock(service=FakeService())
519
        connector.jobs()
520
        assert Job.objects.filter(method_name='send_daact_pieces_to_cartads', status='completed').count()
521

  
522
    assert CartaDSFile.objects.filter(tracking_code=dossier.tracking_code,
523
            sent_to_cartads=None).count() == 0
441
-