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 13:24

Télécharger (7,45 ko)

Voir les différences:

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

 .../0005_cartadsfile_sent_to_cartads.py       | 24 +++++++
 passerelle/apps/cartads_cs/models.py          | 64 +++++++++++++++++++
 tests/test_cartads_cs.py                      | 19 ++++++
 3 files changed, 107 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.AlterModelOptions(
16
            name='cartadsfile',
17
            options={'ordering': ['id']},
18
        ),
19
        migrations.AddField(
20
            model_name='cartadsfile',
21
            name='sent_to_cartads',
22
            field=models.DateTimeField(null=True),
23
        ),
24
    ]
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

  
69
    class Meta:
70
        ordering = ['id']
71

  
66 72

  
67 73
class CartaDSDossier(models.Model):
68 74
    email = models.CharField(max_length=256)
......
630 636
        dossier.zip_sent = True
631 637
        dossier.zip_ack_response = str(resp)
632 638
        dossier.save()
639
        CartaDSFile.objects.filter(tracking_code=dossier.tracking_code).update(sent_to_cartads=now())
633 640

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

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

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

  
681
        def key_value_of_stringstring(d):
682
            return {'KeyValueOfstringstring': [{'Key': x, 'Value': y} for x, y in d.items()]}
683

  
684
        client = self.soap_client(wsdl_url=self.get_wsdl_url('ServiceDocumentation'))
685

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

  
654 718
    @endpoint(perm='can_access',
655 719
              description=_('Get status of file'),
656 720
              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
-