Projet

Général

Profil

0001-cartads_cs-add-endpoint-and-job-to-send-additional-f.patch

Frédéric Péters, 13 septembre 2019 09:20

Télécharger (7,17 ko)

Voir les différences:

Subject: [PATCH] cartads_cs: add endpoint and job to send additional files to
 cartads (#36025)

 .../0005_cartadsfile_sent_to_cartads.py       | 20 +++++++
 passerelle/apps/cartads_cs/models.py          | 60 +++++++++++++++++++
 tests/test_cartads_cs.py                      | 19 ++++++
 3 files changed, 99 insertions(+)
 create mode 100644 passerelle/apps/cartads_cs/migrations/0005_cartadsfile_sent_to_cartads.py
passerelle/apps/cartads_cs/migrations/0005_cartadsfile_sent_to_cartads.py
1
# -*- coding: utf-8 -*-
2
# Generated by Django 1.11.12 on 2019-09-13 06:50
3
from __future__ import unicode_literals
4

  
5
from django.db import migrations, models
6

  
7

  
8
class Migration(migrations.Migration):
9

  
10
    dependencies = [
11
        ('cartads_cs', '0004_cartadsdossier_cartads_steps_cache'),
12
    ]
13

  
14
    operations = [
15
        migrations.AddField(
16
            model_name='cartadsfile',
17
            name='sent_to_cartads',
18
            field=models.DateTimeField(null=True),
19
        ),
20
    ]
passerelle/apps/cartads_cs/models.py
36 36
from django.db import models
37 37
from django.http import HttpResponse
38 38
from django.utils.encoding import force_text
39
from django.utils.timezone import now
39 40
from django.utils.translation import ugettext_lazy as _
40 41
from django.utils.six.moves.urllib import parse as urlparse
41 42

  
42 43
from jsonfield import JSONField
44
import zeep.exceptions
43 45
import zeep.helpers as zeep_helpers
44 46

  
45 47
from passerelle.base.models import BaseResource
......
61 63
    tracking_code = models.CharField(max_length=20)
62 64
    id_piece = models.CharField(max_length=20)
63 65
    uploaded_file = models.FileField(upload_to=cartads_file_location)
66
    sent_to_cartads = models.DateTimeField(null=True)
64 67
    last_update_datetime = models.DateTimeField(auto_now=True)
65 68

  
66 69

  
......
630 633
        dossier.zip_sent = True
631 634
        dossier.zip_ack_response = str(resp)
632 635
        dossier.save()
636
        CartaDSFile.objects.filter(tracking_code=dossier.tracking_code).update(sent_to_cartads=now())
633 637

  
634 638
    @endpoint(pattern='^(?P<signed_dossier_id>[\w:_-]+)/$',
635 639
            methods=['post'],
......
651 655
        dossier.save()
652 656
        return HttpResponse('ok', content_type='text/plain')
653 657

  
658
    @endpoint(perm='can_access',
659
              description=_('Send requested additional file items'),
660
              parameters={
661
                  'tracking_code': TRACKING_CODE_PARAM,
662
              })
663
    def send_additional_pieces(self, request, tracking_code):
664
        dossier = CartaDSDossier.objects.get(tracking_code=tracking_code)
665
        self.add_job('send_additional_pieces_to_cartads', dossier_id=dossier.id)
666
        return {'err': 0, 'dossier_id': dossier.id}
667

  
668
    def send_additional_pieces_to_cartads(self, dossier_id):
669
        dossier = CartaDSDossier.objects.get(id=dossier_id)
670
        client = self.soap_client(wsdl_url=self.get_wsdl_url('ServicePiece'))
671
        resp = client.service.GetPiecesDossierACompleter(self.get_token(), dossier.cartads_id_dossier)
672
        pieces = [
673
            {'id': 'comp-%s-%s' % (x['IdDosPiece'], x['IdPiece']),
674
             'idPiece': x['IdPiece'],
675
             'codePiece': x['CodePiece'],
676
            } for x in resp]
677

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

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

  
683
        for piece_type in pieces:
684
            for i, piece in enumerate(
685
                    CartaDSFile.objects.filter(
686
                        tracking_code=dossier.tracking_code,
687
                        id_piece=piece_type['id'],
688
                        sent_to_cartads__isnull=True)):
689
                id_dos_piece = piece.id_piece.split('-')[1]
690
                filename = '%s-%s%s%s' % (
691
                    piece_type['idPiece'],
692
                    piece_type['codePiece'],
693
                    '%03d' % (i+1),
694
                    os.path.splitext(piece.uploaded_file.name)[-1])
695
                content = piece.uploaded_file.read()
696
                try:
697
                    resp = client.service.UploadFile(FileByteStream=content,
698
                            _soapheaders={
699
                                'IdDossier': dossier.cartads_id_dossier,
700
                                'NomFichier': filename,
701
                                'Length': piece.uploaded_file.size,
702
                                'Token': self.get_token(),
703
                                'InformationsComplementaires': key_value_of_stringstring(
704
                                    {'idDosPiece': id_dos_piece}),
705
                            })
706
                except zeep.exceptions.Fault as e:
707
                    self.logger.exception('error pushing file item %d (%r)', piece.id, e.message)
708
                    continue
709
                else:
710
                    assert resp is None
711
                    piece.sent_to_cartads = now()
712
                    piece.save()
713

  
654 714
    @endpoint(perm='can_access',
655 715
              description=_('Get status of file'),
656 716
              parameters={
tests/test_cartads_cs.py
108 108
                (u'NbDocuments', 0L)]),
109 109
        ]
110 110

  
111
    def UploadFile(self, FileByteStream, _soapheaders):
112
        assert FileByteStream
113
        assert _soapheaders
114
        return None
115

  
111 116

  
112 117
def pdf_mock(url, request):
113 118
    return {'content': '%PDF...', 'status_code': 200}
......
362 367
    resp = app.post(data[0]['files'][0]['url'],
363 368
                    upload_files=[('files[]', 'test.pdf', '%PDF...')])
364 369
    assert resp.json[0]['token']
370
    assert CartaDSFile.objects.filter(tracking_code=dossier.tracking_code,
371
            sent_to_cartads=None).count() == 1
372

  
373
    Job.objects.all().delete()
374
    resp = app.get('/cartads-cs/test/send_additional_pieces?tracking_code=%s' % dossier.tracking_code)
375
    assert Job.objects.all().count() == 1
376

  
377
    with mock.patch('passerelle.apps.cartads_cs.models.CartaDSCS.soap_client') as client:
378
        client.return_value = mock.Mock(service=FakeService())
379
        connector.jobs()
380
        assert Job.objects.filter(method_name='send_additional_pieces_to_cartads', status='completed').count()
381

  
382
    assert CartaDSFile.objects.filter(tracking_code=dossier.tracking_code,
383
            sent_to_cartads=None).count() == 0
365
-