Projet

Général

Profil

0001-cartads-cs-add-endpoint-to-send-a-DOC-36102.patch

Frédéric Péters, 13 septembre 2019 11:43

Télécharger (8,78 ko)

Voir les différences:

Subject: [PATCH] cartads cs: add endpoint to send a "DOC" (#36102)

 passerelle/apps/cartads_cs/models.py | 86 ++++++++++++++++++++++++++--
 tests/test_cartads_cs.py             | 57 ++++++++++++++++++
 2 files changed, 137 insertions(+), 6 deletions(-)
passerelle/apps/cartads_cs/models.py
46 46

  
47 47
from passerelle.base.models import BaseResource
48 48
from passerelle.utils.api import endpoint
49
from passerelle.utils.jsonresponse import APIError
49 50

  
50 51

  
51 52
def cartads_file_location(instance, filename):
52 53
    return 'cartads_cs/%s/%s' % (instance.tracking_code, filename)
53 54

  
54 55

  
56
def key_value_of_stringstring(d):
57
    return {'KeyValueOfstringstring': [{'Key': x, 'Value': y} for x, y in d.items()]}
58

  
59

  
55 60
class CartaDSDataCache(models.Model):
56 61
    data_type = models.CharField(max_length=50)
57 62
    data_parameters = JSONField(default={})
......
484 489
            piece['files'].append({'url': upload_url})
485 490
        return {'data': pieces}
486 491

  
492
    @endpoint(perm='can_access',
493
              description=_('Get list of DOC file items'),
494
              parameters={
495
                  'tracking_code': TRACKING_CODE_PARAM,
496
              })
497
    def doc_pieces(self, request, tracking_code):
498
        dossier = CartaDSDossier.objects.get(tracking_code=tracking_code)
499
        status = self.status(request, dossier.id)
500
        if status['status_label'] != 'Attente DOC':
501
            raise APIError('wrong status')
502

  
503
        signer = Signer(salt='cart@ds_cs')
504
        upload_token = signer.sign(tracking_code)
505
        pieces = [
506
            {'id': 'cerfa-doc',
507
             'text': 'CERFA',
508
             'description': '',
509
             'codePiece': '',
510
             'reglementaire': True,
511
             'files': [],
512
             'max_files': 1,
513
            },
514
        ]
515
        for piece in pieces:
516
            if request:
517
                upload_url = request.build_absolute_uri('%supload/%s/%s/' % (
518
                    self.get_absolute_url(),
519
                    piece['id'],
520
                    upload_token))
521
            else:
522
                upload_url = None
523
            piece['files'].append({'url': upload_url})
524
        return {'data': pieces}
525

  
487 526
    @endpoint(methods=['post'],
488 527
              pattern='^(?P<id_piece>[\w-]+)/(?P<token>[\w:_-]+)/$',
489 528
              description=_('Upload a single document file'),
......
615 654
        zip_filename = os.path.join(default_storage.path('cartads_cs'), '%s.zip' % dossier.tracking_code)
616 655
        self.upload_zip(zip_filename)
617 656

  
618
        def key_value_of_stringstring(d):
619
            return {'KeyValueOfstringstring': [{'Key': x, 'Value': y} for x, y in d.items()]}
620

  
621 657
        client = self.soap_client()
622 658
        resp = client.service.NotifierDepotDossier(
623 659
                self.get_token(),
......
675 711
             'codePiece': x['CodePiece'],
676 712
            } for x in resp]
677 713

  
678
        def key_value_of_stringstring(d):
679
            return {'KeyValueOfstringstring': [{'Key': x, 'Value': y} for x, y in d.items()]}
680

  
681 714
        client = self.soap_client(wsdl_url=self.get_wsdl_url('ServiceDocumentation'))
682 715

  
683 716
        for piece_type in pieces:
......
711 744
                    piece.sent_to_cartads = now()
712 745
                    piece.save()
713 746

  
747
    @endpoint(perm='can_access',
748
              description=_('Send DOC file items'),
749
              parameters={
750
                  'tracking_code': TRACKING_CODE_PARAM,
751
              })
752
    def send_doc_pieces(self, request, tracking_code):
753
        dossier = CartaDSDossier.objects.get(tracking_code=tracking_code)
754
        self.add_job('send_doc_pieces_to_cartads', dossier_id=dossier.id)
755
        return {'err': 0, 'dossier_id': dossier.id}
756

  
757
    def send_doc_pieces_to_cartads(self, dossier_id):
758
        dossier = CartaDSDossier.objects.get(id=dossier_id)
759
        client = self.soap_client(wsdl_url=self.get_wsdl_url('ServiceDocumentation'))
760
        pieces = CartaDSFile.objects.filter(
761
                    tracking_code=dossier.tracking_code,
762
                    id_piece='cerfa-doc',
763
                    sent_to_cartads__isnull=True)
764
        assert pieces.count() == 1
765
        piece = pieces[0]
766

  
767
        content = piece.uploaded_file.read()
768
        try:
769
            resp = client.service.UploadFile(FileByteStream=content,
770
                    _soapheaders={
771
                        'IdDossier': dossier.cartads_id_dossier,
772
                        'NomFichier': 'cerfa-doc.pdf',
773
                        'Length': piece.uploaded_file.size,
774
                        'Token': self.get_token(),
775
                        'InformationsComplementaires': key_value_of_stringstring(
776
                            {'docDaact': 'doc',
777
                             'renameFile': True
778
                            },
779
                        ),
780
            })
781
        except zeep.exceptions.Fault as e:
782
            self.logger.exception('error pushing file item %d (%r)', piece.id, e.message)
783
        else:
784
            assert resp is None
785
            piece.sent_to_cartads = now()
786
            piece.save()
787

  
714 788
    @endpoint(perm='can_access',
715 789
              description=_('Get status of file'),
716 790
              parameters={
tests/test_cartads_cs.py
74 74
        return 'True'
75 75

  
76 76
    def GetEtapesDossier(self, token, dossier_id, infos):
77
        try:
78
            dossier = CartaDSDossier.objects.get(cartads_id_dossier=dossier_id)
79
        except CartaDSDossier.DoesNotExist:
80
            dossier = None
81
        if dossier and dossier.tracking_code == 'DOCXXXX':
82
            return [{
83
                'LibelleEtape': 'Attente DOC',
84
                'IdEtapeDossier': 2356473L,
85
                'DateEcheance': '2022-04-01T00:00:00',
86
                'IdEtape': 12L,
87
                'DateRealisation': None,
88
                'DateReference': '2019-03-25T00:00:00',
89
                'IdDossier': 471160L},]
90

  
91
        # default
77 92
        return [{
78 93
            'DateEcheance': datetime.datetime(2019, 3, 1, 0, 0),
79 94
            'DateRealisation': None,
......
381 396

  
382 397
    assert CartaDSFile.objects.filter(tracking_code=dossier.tracking_code,
383 398
            sent_to_cartads=None).count() == 0
399

  
400

  
401
def test_doc_pieces_management(connector, app, cached_data):
402
    CartaDSDossier.objects.all().delete()
403
    test_send(connector, app, cached_data)
404
    dossier = CartaDSDossier.objects.all()[0]
405

  
406
    with mock.patch('passerelle.apps.cartads_cs.models.CartaDSCS.soap_client') as client:
407
        client.return_value = mock.Mock(service=FakeService())
408
        resp = app.get('/cartads-cs/test/doc_pieces?tracking_code=%s' % dossier.tracking_code)
409
        assert resp.json['err']
410

  
411
    dossier.tracking_code = 'DOCXXXX'  # to get the right status
412
    dossier.save()
413
    with mock.patch('passerelle.apps.cartads_cs.models.CartaDSCS.soap_client') as client:
414
        client.return_value = mock.Mock(service=FakeService())
415
        resp = app.get('/cartads-cs/test/doc_pieces?tracking_code=%s' % dossier.tracking_code)
416
    data = resp.json['data']
417
    assert len(data) == 1
418
    assert data[0]['text'] == 'CERFA'
419
    assert data[0]['max_files'] == 1
420
    assert len(data[0]['files']) == 1
421
    assert data[0]['files'][0].keys() == ['url']
422

  
423
    pdf_contents = open(os.path.join(os.path.dirname(__file__), 'data', 'pdf-form.pdf')).read()
424
    resp = app.post(data[0]['files'][0]['url'],
425
                    upload_files=[('files[]', 'test.pdf', pdf_contents)])
426
    assert resp.json[0]['token']
427
    assert CartaDSFile.objects.filter(tracking_code=dossier.tracking_code,
428
            sent_to_cartads=None).count() == 1
429

  
430
    Job.objects.all().delete()
431
    resp = app.get('/cartads-cs/test/send_doc_pieces?tracking_code=%s' % dossier.tracking_code)
432
    assert Job.objects.all().count() == 1
433

  
434
    with mock.patch('passerelle.apps.cartads_cs.models.CartaDSCS.soap_client') as client:
435
        client.return_value = mock.Mock(service=FakeService())
436
        connector.jobs()
437
        assert Job.objects.filter(method_name='send_doc_pieces_to_cartads', status='completed').count()
438

  
439
    assert CartaDSFile.objects.filter(tracking_code=dossier.tracking_code,
440
            sent_to_cartads=None).count() == 0
384
-