0001-cartads-cs-add-endpoint-to-send-a-DOC-36102.patch
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 |
- |