0001-cartads_cs-add-endpoint-to-send-DAACT-items-36112.patch
passerelle/apps/cartads_cs/models.py | ||
---|---|---|
34 | 34 |
from django.core.signing import Signer |
35 | 35 |
from django.core.urlresolvers import reverse |
36 | 36 |
from django.db import models |
37 |
from django.db.models import Q |
|
37 | 38 |
from django.http import HttpResponse |
38 | 39 |
from django.utils.encoding import force_text |
39 | 40 |
from django.utils.timezone import now |
... | ... | |
526 | 527 |
piece['files'].append({'url': upload_url}) |
527 | 528 |
return {'data': pieces} |
528 | 529 | |
530 |
@endpoint(perm='can_access', |
|
531 |
description=_('Get list of DAACT file items'), |
|
532 |
parameters={ |
|
533 |
'tracking_code': TRACKING_CODE_PARAM, |
|
534 |
}) |
|
535 |
def daact_pieces(self, request, tracking_code): |
|
536 |
dossier = CartaDSDossier.objects.get(tracking_code=tracking_code) |
|
537 |
status = self.status(request, dossier.id) |
|
538 |
if status['status_label'] != 'Attente DAACT': |
|
539 |
raise APIError('wrong status') |
|
540 | ||
541 |
client = self.soap_client(wsdl_url=self.get_wsdl_url('ServicePiece')) |
|
542 |
resp = client.service.GetPiecesDaact(self.get_token(), dossier.cartads_id_dossier) |
|
543 | ||
544 |
signer = Signer(salt='cart@ds_cs') |
|
545 |
upload_token = signer.sign(tracking_code) |
|
546 | ||
547 |
pieces = [ |
|
548 |
{'id': 'cerfa-daact', |
|
549 |
'text': 'CERFA', |
|
550 |
'description': '', |
|
551 |
'codePiece': '', |
|
552 |
'reglementaire': True, |
|
553 |
'files': [], |
|
554 |
'max_files': 1, |
|
555 |
}, |
|
556 |
] |
|
557 | ||
558 |
pieces.extend([ |
|
559 |
{'id': 'daact-%s' % x['IdPiece'], |
|
560 |
'text': x['LibellePiece'], |
|
561 |
'description': x['Descriptif'], |
|
562 |
'codePiece': x['CodePiece'], |
|
563 |
'files': [], |
|
564 |
'max_files': 6, |
|
565 |
} for x in resp]) |
|
566 | ||
567 |
for piece in pieces: |
|
568 |
if request: |
|
569 |
upload_url = request.build_absolute_uri('%supload/%s/%s/' % ( |
|
570 |
self.get_absolute_url(), |
|
571 |
piece['id'], |
|
572 |
upload_token)) |
|
573 |
else: |
|
574 |
upload_url = None |
|
575 |
piece['files'] = [] |
|
576 |
piece['files'].append({'url': upload_url}) |
|
577 |
return {'data': pieces} |
|
578 | ||
529 | 579 |
@endpoint(methods=['post'], |
530 | 580 |
pattern='^(?P<id_piece>[\w-]+)/(?P<token>[\w:_-]+)/$', |
531 | 581 |
description=_('Upload a single document file'), |
... | ... | |
789 | 839 |
piece.sent_to_cartads = now() |
790 | 840 |
piece.save() |
791 | 841 | |
842 |
@endpoint(perm='can_access', |
|
843 |
description=_('Send DAACT file items'), |
|
844 |
parameters={ |
|
845 |
'tracking_code': TRACKING_CODE_PARAM, |
|
846 |
}) |
|
847 |
def send_daact_pieces(self, request, tracking_code): |
|
848 |
dossier = CartaDSDossier.objects.get(tracking_code=tracking_code) |
|
849 |
self.add_job('send_daact_pieces_to_cartads', dossier_id=dossier.id) |
|
850 |
return {'err': 0, 'dossier_id': dossier.id} |
|
851 | ||
852 |
def send_daact_pieces_to_cartads(self, dossier_id): |
|
853 |
dossier = CartaDSDossier.objects.get(id=dossier_id) |
|
854 |
pieces = self.daact_pieces(None, dossier.tracking_code)['data'] |
|
855 | ||
856 |
client = self.soap_client(wsdl_url=self.get_wsdl_url('ServiceDocumentation')) |
|
857 |
for piece_type in pieces: |
|
858 |
for piece in CartaDSFile.objects.filter( |
|
859 |
tracking_code=dossier.tracking_code, |
|
860 |
sent_to_cartads__isnull=True, |
|
861 |
id_piece=piece_type['id']): |
|
862 |
content = piece.uploaded_file.read() |
|
863 |
try: |
|
864 |
infos = { |
|
865 |
'renameFile': True, |
|
866 |
} |
|
867 |
if piece.id_piece == 'cerfa-daact': |
|
868 |
infos['docDaact'] = 'daact' |
|
869 |
filename = 'cerfa-daact.pdf' |
|
870 |
else: |
|
871 |
infos['docDaact'] = 'pieceDaact' |
|
872 |
infos['idPieceDaact'] = piece.id_piece.split('-', 1)[-1] |
|
873 |
filename = '%s%s' % (piece_type['codePiece'], os.path.splitext(piece.uploaded_file.name)[-1]) |
|
874 |
resp = client.service.UploadFile(FileByteStream=content, |
|
875 |
_soapheaders={ |
|
876 |
'IdDossier': dossier.cartads_id_dossier, |
|
877 |
'NomFichier': filename, |
|
878 |
'Length': piece.uploaded_file.size, |
|
879 |
'Token': self.get_token(), |
|
880 |
'InformationsComplementaires': key_value_of_stringstring(infos) |
|
881 |
}) |
|
882 |
except zeep.exceptions.Fault as e: |
|
883 |
self.logger.exception('error pushing daact file item %d (%r)', piece.id, e.message) |
|
884 |
else: |
|
885 |
assert resp is None |
|
886 |
piece.sent_to_cartads = now() |
|
887 |
piece.save() |
|
888 | ||
792 | 889 |
@endpoint(perm='can_access', |
793 | 890 |
description=_('Get status of file'), |
794 | 891 |
parameters={ |
tests/test_cartads_cs.py | ||
---|---|---|
87 | 87 |
'DateRealisation': None, |
88 | 88 |
'DateReference': '2019-03-25T00:00:00', |
89 | 89 |
'IdDossier': 471160L},] |
90 |
elif dossier and dossier.tracking_code == 'DAACTXXXX': |
|
91 |
return [{ |
|
92 |
'LibelleEtape': 'Attente DAACT', |
|
93 |
'IdEtapeDossier': 2356473L, |
|
94 |
'DateEcheance': '2022-04-01T00:00:00', |
|
95 |
'IdEtape': 12L, |
|
96 |
'DateRealisation': None, |
|
97 |
'DateReference': '2019-03-25T00:00:00', |
|
98 |
'IdDossier': 471160L},] |
|
90 | 99 | |
91 | 100 |
# default |
92 | 101 |
return [{ |
... | ... | |
123 | 132 |
(u'NbDocuments', 0L)]), |
124 | 133 |
] |
125 | 134 | |
135 |
def GetPiecesDaact(self, token, dossier_id): |
|
136 |
return [ |
|
137 |
OrderedDict([ |
|
138 |
(u'CodePiece', 'AT1'), |
|
139 |
(u'DateDemande', None), |
|
140 |
(u'DatePresentation', None), |
|
141 |
(u'DateReception', None), |
|
142 |
(u'Descriptif', u"L'attestation constatant..."), |
|
143 |
(u'IdDosPiece', 0L), |
|
144 |
(u'IdPiece', 191L), |
|
145 |
(u'LibellePiece', 'Attestation constat des travaux'), |
|
146 |
(u'NbDocuments', 0L)]), |
|
147 |
OrderedDict([ |
|
148 |
(u'CodePiece', 'AT2'), |
|
149 |
(u'DateDemande', None), |
|
150 |
(u'DatePresentation', None), |
|
151 |
(u'DateReception', None), |
|
152 |
(u'Descriptif', u"Dans les cas..."), |
|
153 |
(u'IdDosPiece', 0L), |
|
154 |
(u'IdPiece', 192L), |
|
155 |
(u'LibellePiece', u'Document du...'), |
|
156 |
(u'NbDocuments', 0L)]), |
|
157 |
] |
|
158 | ||
126 | 159 |
def UploadFile(self, FileByteStream, _soapheaders): |
127 | 160 |
assert FileByteStream |
128 | 161 |
assert _soapheaders |
... | ... | |
438 | 471 | |
439 | 472 |
assert CartaDSFile.objects.filter(tracking_code=dossier.tracking_code, |
440 | 473 |
sent_to_cartads=None).count() == 0 |
474 | ||
475 | ||
476 |
def test_daact_pieces_management(connector, app, cached_data): |
|
477 |
CartaDSDossier.objects.all().delete() |
|
478 |
test_send(connector, app, cached_data) |
|
479 |
dossier = CartaDSDossier.objects.all()[0] |
|
480 | ||
481 |
with mock.patch('passerelle.apps.cartads_cs.models.CartaDSCS.soap_client') as client: |
|
482 |
client.return_value = mock.Mock(service=FakeService()) |
|
483 |
resp = app.get('/cartads-cs/test/daact_pieces?tracking_code=%s' % dossier.tracking_code) |
|
484 |
assert resp.json['err'] |
|
485 | ||
486 |
dossier.tracking_code = 'DAACTXXXX' # to get the right status |
|
487 |
dossier.save() |
|
488 |
with mock.patch('passerelle.apps.cartads_cs.models.CartaDSCS.soap_client') as client: |
|
489 |
client.return_value = mock.Mock(service=FakeService()) |
|
490 |
resp = app.get('/cartads-cs/test/daact_pieces?tracking_code=%s' % dossier.tracking_code) |
|
491 |
data = resp.json['data'] |
|
492 |
assert len(data) == 3 |
|
493 |
assert data[0]['text'] == 'CERFA' |
|
494 |
assert data[0]['max_files'] == 1 |
|
495 |
for piece in data: |
|
496 |
assert len(piece['files']) == 1 |
|
497 |
assert piece['files'][0].keys() == ['url'] |
|
498 | ||
499 |
pdf_contents = open(os.path.join(os.path.dirname(__file__), 'data', 'pdf-form.pdf')).read() |
|
500 |
resp = app.post(data[0]['files'][0]['url'], |
|
501 |
upload_files=[('files[]', 'test.pdf', pdf_contents)]) |
|
502 |
assert resp.json[0]['token'] |
|
503 |
assert CartaDSFile.objects.filter(tracking_code=dossier.tracking_code, |
|
504 |
sent_to_cartads=None).count() == 1 |
|
505 | ||
506 |
pdf_contents = open(os.path.join(os.path.dirname(__file__), 'data', 'pdf-form.pdf')).read() |
|
507 |
resp = app.post(data[1]['files'][0]['url'], |
|
508 |
upload_files=[('files[]', 'test.pdf', pdf_contents)]) |
|
509 |
assert resp.json[0]['token'] |
|
510 |
assert CartaDSFile.objects.filter(tracking_code=dossier.tracking_code, |
|
511 |
sent_to_cartads=None).count() == 2 |
|
512 | ||
513 |
Job.objects.all().delete() |
|
514 |
resp = app.get('/cartads-cs/test/send_daact_pieces?tracking_code=%s' % dossier.tracking_code) |
|
515 |
assert Job.objects.all().count() == 1 |
|
516 | ||
517 |
with mock.patch('passerelle.apps.cartads_cs.models.CartaDSCS.soap_client') as client: |
|
518 |
client.return_value = mock.Mock(service=FakeService()) |
|
519 |
connector.jobs() |
|
520 |
assert Job.objects.filter(method_name='send_daact_pieces_to_cartads', status='completed').count() |
|
521 | ||
522 |
assert CartaDSFile.objects.filter(tracking_code=dossier.tracking_code, |
|
523 |
sent_to_cartads=None).count() == 0 |
|
441 |
- |