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={
|