Ajout pieces complementaire, DOC, DAACT

This commit is contained in:
Etienne Loupias 2018-06-26 15:45:57 +02:00
parent e1ee93e23f
commit 707900705e
2 changed files with 129 additions and 71 deletions

View File

@ -188,10 +188,10 @@ class CartADS(BaseResource):
if formdata.attachments:
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "nb attach: ", len(formdata.attachments)
###print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "nb attach: ", len(formdata.attachments)
for key, attachment in formdata.attachments.items():
filename = attachment.get('filename') or 'file%s.bin' % num
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "key: ", key, " ; filename: ", filename
###print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "key: ", key, " ; filename: ", filename
content = base64.b64decode(attachment.get('content') or '')
@ -203,8 +203,10 @@ class CartADS(BaseResource):
if "cerfa" in key:
if (not formdata.values['cerfa_nom']) or formdata.values['cerfa_nom'] == '':
return {'err': 1, 'message': 'Unknown cerfa_nom'}
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "cerfa_nom: ", formdata.values['cerfa_nom']
###print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "cerfa_nom: ", formdata.values['cerfa_nom']
filenameInZip = formdata.values['cerfa_nom'] + ".pdf"
elif "autres_demandeurs" in key:
filenameInZip = "Fiches_complementaires/cerfa_"+ key + ".pdf"
else:
if len(key.split("_")) == 4:
obj, idPiece, codePiece, noPiece = key.split("_")
@ -214,7 +216,7 @@ class CartADS(BaseResource):
filenameInZip = "Pieces/"+ idPiece + "-" + codePiece
if "." in filename:
filenameInZip += filename[filename.rfind("."):]
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "filenameInZip: ", filenameInZip
###print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "filenameInZip: ", filenameInZip
zf.writestr(filenameInZip, content)
except ValueError as e:
@ -242,7 +244,7 @@ class CartADS(BaseResource):
# size_max doit etre un multiple de 4 pour avoir un nb de caracteres valide en base 64 (car 3 octets y sont encodes sur 4 caracteres)
size_max = 16777216 # 16 mo, choisi arbitrairement pour ne pas envoyer trop d'un coup en http post
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "test avant le sendfile"
###print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "test avant le sendfile"
for x in range(0, len(b64_fileContent)/size_max + 1):
#respHttp = self.requests.post('https://api-rec.grandlyon.com/ads-sendfile-dev/sendfile.aspx',
@ -280,7 +282,7 @@ class CartADS(BaseResource):
#headers = u'Content-Length: 844 | Accept-Encoding: gzip, deflate | SOAPAction: "http://tempuri.org/IServicePortail/NotifierDepotDossier" | Accept: */* | User-Agent: python-requests/2.4.3 CPython/2.7.9 Linux/3.16.0-4-amd64 | Connection: keep-alive | Content-Type: text/xml; charset=utf-8 | '
#headers += u'Authorization: Bearer 458931e2-fbac-3087-875c-e0833d66f620' # + self.get_token()
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "test avant le NotifierDepotDossier"
###print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "test avant le NotifierDepotDossier"
#TODO: faire en soap comme les autres ou adapter url pour prod
resp = self.requests.post('https://api-rec.grandlyon.com/ads-rec-portail/',
@ -315,7 +317,7 @@ class CartADS(BaseResource):
resp = client.service.NotifierDepotDossier(notifierDepotDossier)
'''
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "test avant le return"
###print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "test avant le return"
#return {'data': sudsobject_to_dict(resp), 'respHttp': respHttp.content, 'length': len(b64_fileContent)}
return {'respHttp': respHttp.content, 'length': len(b64_fileContent), 'err': 0}
@ -400,7 +402,7 @@ class CartADS(BaseResource):
@endpoint(perm='can_access')
def get_id_dossier(self, request, tracking_code, date_dossier):
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "date_dossier: ", date_dossier
###print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "date_dossier: ", date_dossier
# TODO: faire plus simple si gfi explique comment obtenir l'IdDossier a partir de l'IdDossierExterne en pull (et pas qu'en push dans leur notif qui marche pas)
# Renvoie les dossiers a la date demandee
#TODO: faire param pour client1
@ -426,7 +428,7 @@ class CartADS(BaseResource):
nomDossierOut = dict_resp_dossier["NomDossier"]
break;
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "idDossierOut: ", idDossierOut
###print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "idDossierOut: ", idDossierOut
return {'data': {'IdDossier': idDossierOut, 'NomDossier': nomDossierOut} }
@endpoint(perm='can_access')
@ -446,7 +448,6 @@ class CartADS(BaseResource):
def get_pieces_dossier_a_completer(self, request, id_dossier):
resp = self.get_client('cartads-piece.wsdl').service.GetPiecesDossierACompleter(self.get_token_cartads(), id_dossier)
dict_resp = sudsobject_to_dict(resp)
#return {'data': sudsobject_to_dict(resp)}
if not 'PieceDossier' in dict_resp:
return {'data': None, 'err': 0}
@ -460,6 +461,30 @@ class CartADS(BaseResource):
out_item['Descriptif'] = objet["Descriptif"]
out_item['IdDosPiece'] = objet["IdDosPiece"]
out_item['CodePiece'] = objet["CodePiece"]
out_item['IdPiece'] = objet["IdPiece"]
out.append(out_item)
def getKey(objet):
return objet['CodePiece']
return {'data': sorted(out, key=getKey)}
@endpoint(perm='can_access')
def get_pieces_daact(self, request, id_dossier):
resp = self.get_client('cartads-piece.wsdl').service.GetPiecesDaact(self.get_token_cartads(), id_dossier)
dict_resp = sudsobject_to_dict(resp)
if not 'PieceDossier' in dict_resp:
return {'data': None, 'err': 0}
# On parcourt la liste pour la mettre sous la forme id, text, pour l'utiliser comme source de donnees dans le formulaire
out = []
for objet in dict_resp['PieceDossier']:
out_item = {}
out_item['id'] = objet["IdPiece"]
out_item['text'] = objet["CodePiece"] + " - " + objet["LibellePiece"]
out_item['Descriptif'] = objet["Descriptif"]
out_item['CodePiece'] = objet["CodePiece"]
out_item['IdPiece'] = objet["IdPiece"]
out.append(out_item)
def getKey(objet):
@ -474,47 +499,81 @@ class CartADS(BaseResource):
except ValueError as e:
raise ParameterTypeError(e.message)
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "piece_compl_var_fichier: ", formdata.values['piece_compl_var_fichier']
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "piece_compl_var_fichier_raw: ", formdata.values['piece_compl_var_fichier_raw']
if not formdata.values['id_dossier']:
return {'data': 'no id_dossier', 'err': 1}
###print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "id_dossier: ", formdata.values['id_dossier']
# si c'est une piece complementaire (pas doc ni daact)
if formdata.values['docDaact'] == '':
###print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "piece_compl_var_fichier: ", formdata.values['piece_compl_var_fichier']
fichier_raw = formdata.values['piece_compl_var_fichier_raw']
filename_in = formdata.values['piece_compl_var_fichier']
filename_out = formdata.values['piece_compl_var_infos_IdPiece'] + "-" + formdata.values['piece_compl_var_infos_CodePiece'] + "-" + datetime.datetime.now().strftime('%Y%m%d%H%M%S')
if "." in filename_in:
filename_out += filename_in[filename_in.rfind("."):]
elif formdata.values['docDaact'] == 'doc':
fichier_raw = formdata.values['piece_doc_var_fichier_raw']
filename_out = "cerfa.pdf"
elif formdata.values['docDaact'] == 'daact':
fichier_raw = formdata.values['piece_daact_var_fichier_raw']
filename_out = "cerfa.pdf"
elif formdata.values['docDaact'] == 'pieceDaact':
fichier_raw = formdata.values['piece_pieceDaact_var_fichier_raw']
filename_in = formdata.values['piece_pieceDaact_var_fichier']
filename_out = formdata.values['piece_pieceDaact_var_infos_IdPiece'] + "-" + formdata.values['piece_pieceDaact_var_infos_CodePiece'] + "-" + datetime.datetime.now().strftime('%Y%m%d%H%M%S')
if "." in filename_in:
filename_out += filename_in[filename_in.rfind("."):]
else:
return {'data': 'unknown docDaact: ' + formdata.values['docDaact'], 'err': 1}
#TODO: faire un get de https://demarches.guichet-dev.grandlyon.com/permis-de-construire/21/files/form-piece_compl_depose-fichier/plan-situation.txt
fichier_content_base64 = fichier_raw['content']
message = u'<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:tem="http://tempuri.org/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays">'
message += u'<soapenv:Header>'
message += u'<tem:Token>'+str(self.get_token_cartads()).decode('utf8')+'</tem:Token>'
message += u'<tem:NomFichier>'+filename_out+'</tem:NomFichier>'
#TODO: voir s'il faut passer la longueur du fichier source ou encode en base64
message += u'<tem:Length>'+str(len(fichier_content_base64))+'</tem:Length>'
message += u'<tem:InformationsComplementaires>'
if formdata.values['docDaact'] == '':
#piece complementaire
message += u'<arr:KeyValueOfstringstring><arr:Key>idDosPiece</arr:Key><arr:Value>'+str(formdata.values['piece_compl_var_infos_IdDosPiece']).decode('utf8')+u'</arr:Value></arr:KeyValueOfstringstring>'
else:
#piece ouverture chantier (doc) ou achevement (daact) ou piece achevement (pieceDaact)
message += u'<arr:KeyValueOfstringstring><arr:Key>docDaact</arr:Key><arr:Value>'+str(formdata.values['docDaact']).decode('utf8')+u'</arr:Value></arr:KeyValueOfstringstring>'
if formdata.values['docDaact'] == 'pieceDaact':
#piece daact
message += u'<arr:KeyValueOfstringstring><arr:Key>idPieceDaact</arr:Key><arr:Value>'+str(formdata.values['piece_pieceDaact_var_infos_IdPiece']).decode('utf8')+u'</arr:Value></arr:KeyValueOfstringstring>'
message += u'<arr:KeyValueOfstringstring><arr:Key>renameFile</arr:Key><arr:Value>true</arr:Value></arr:KeyValueOfstringstring>'
message += u'</tem:InformationsComplementaires>'
message += u'<tem:IdDossier>'+str(formdata.values['id_dossier']).decode('utf8')+u'</tem:IdDossier>'
message += u'</soapenv:Header>'
message += u'<soapenv:Body><tem:RemoteFileInfoUploadRequest>'
message += u'<tem:FileByteStream>'+str(fichier_content_base64).decode('utf8')+u'</tem:FileByteStream>'
#message += '<tem:FileByteStream>dGVzdA==</tem:FileByteStream>'
message += u'</tem:RemoteFileInfoUploadRequest></soapenv:Body></soapenv:Envelope>'
if not formdata.values['piece_compl_var_fichier']:
return {'data': 'no piece_compl_var_fichier', 'err': 1}
message = '<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:tem="http://tempuri.org/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays">'
message += '<soapenv:Header>'
message += '<tem:Token>'+self.get_token_cartads()+'</tem:Token>'
message += '<tem:NomFichier>'+formdata.values['piece_compl_var_fichier']+'</tem:NomFichier>'
message += '<tem:Length>'+length(formdata.values['piece_compl_var_fichier_raw'])+'</tem:Length>'
message += '<tem:InformationsComplementaires>'
message += '<arr:KeyValueOfstringstring><arr:Key>docDaact</arr:Key><arr:Value>doc</arr:Value></arr:KeyValueOfstringstring>'
message += '</tem:InformationsComplementaires>'
message += '<tem:IdDossier>'+'436205'+'</tem:IdDossier>'
message += '</soapenv:Header>'
message += '<soapenv:Body><tem:RemoteFileInfoUploadRequest>'
message += '<tem:FileByteStream>'+formdata.values['piece_compl_var_fichier_raw']+'</tem:FileByteStream>'
message += '</tem:RemoteFileInfoUploadRequest></soapenv:Body></soapenv:Envelope>'
headers = {'Authorization': self.get_token(),
'SOAPAction':'"http://tempuri.org/IServiceDocumentation/UploadFile"',
'Content-Type': 'text/xml; charset=UTF-8'}
#headers and message must be str and not unicode to avoid SSL3_WRITE_PENDING : bad write retry error (cf. https://github.com/urllib3/urllib3/issues/855)
headers = {'Authorization': self.get_token().encode('utf-8'),
'SOAPAction':'"http://tempuri.org/IServiceDocumentation/UploadFile"'.encode('utf-8'),
'Content-Type': 'text/xml; charset=UTF-8'.encode('utf-8')}
#headers = u'Content-Length: 844 | Accept-Encoding: gzip, deflate | SOAPAction: "http://tempuri.org/IServicePortail/NotifierDepotDossier" | Accept: */* | User-Agent: python-requests/2.4.3 CPython/2.7.9 Linux/3.16.0-4-amd64 | Connection: keep-alive | Content-Type: text/xml; charset=utf-8 | '
#headers += u'Authorization: Bearer 458931e2-fbac-3087-875c-e0833d66f620' # + self.get_token()
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "test avant le UploadFile"
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "message: " + message
###print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "test avant le UploadFile"
#print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "message: " + message
#TODO: faire en soap comme les autres ou adapter url pour prod
resp = self.requests.post('https://api-rec.grandlyon.com/ads-rec-documentation/',
data=message,
data=message.encode('utf-8'),
headers=headers)
###print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "resp.content: " + resp.content
return {'data': resp.content, 'err': 0}
@ -596,7 +655,7 @@ class CartADS(BaseResource):
@endpoint(perm='can_access')
def write_wcs_files(self, request, type_dossier):
h = HTMLParser.HTMLParser() # h.unescape(string) decode le html qui vient du web service en unicode : http://fredericiana.com/2010/10/08/decoding-html-entities-to-text-in-python/
output_string = u"<!--#### A inserer a partir du field 'Pi&#232;ces obligatoires' jusqu'a la fin des </fields> -->\n"
output_string = u"<!--#### A inserer a partir du field 'Pi&#232;ces obligatoires' jusqu'au field <label>Autres demandeurs</label> ou sinon la fin des </fields> -->\n"
# page en cours de construction : 0 = pieces obligatoires
current_page = 0
@ -677,6 +736,6 @@ class CartADS(BaseResource):
output_string += u" </fields>\n"
output_string = output_string.encode('ascii', errors='xmlcharrefreplace')
print >> open('/home/grandlyon/log/'+type_dossier+'_'+date_file.strftime('%Y%m%d%H%M%S')+'.wcs', 'a+'), output_string
###print >> open('/home/grandlyon/log/'+type_dossier+'_'+date_file.strftime('%Y%m%d%H%M%S')+'.wcs', 'a+'), output_string
return {'data': output_string}

View File

@ -1,7 +1,6 @@
/* img commune */
@media screen and (min-width: 1000px) {
.formdef-permis-de-construire .imgCommune img,
.formdef-certificat-d-urbanisme .imgCommune img {
.formdef-category-logement .imgCommune img {
position: absolute;
top: 132px;
left: 500px;
@ -10,59 +9,59 @@
}
/* File upload styling for permis de construire */
.formdef-permis-de-construire .FileWithPreviewWidget {
.formdef-category-logement .FileWithPreviewWidget {
display: flow-root;
border-bottom: 0.1em solid #80808052;
background-color: #d3d3d333;
}
.formdef-permis-de-construire .FileWithPreviewWidget .title,
.formdef-permis-de-construire .FileWithPreviewWidget .content,
.formdef-permis-de-construire .FileWidget {
.formdef-category-logement .FileWithPreviewWidget .title,
.formdef-category-logement .FileWithPreviewWidget .content,
.formdef-category-logement .FileWidget {
display: inline-block;
}
.formdef-permis-de-construire .widget .title {
.formdef-category-logement .widget .title {
padding: 10px;
}
.formdef-permis-de-construire form.quixote div.widget {
.formdef-category-logement form.quixote div.widget {
margin-bottom: 5px;
}
.formdef-permis-de-construire .FileWithPreviewWidget .content {
.formdef-category-logement .FileWithPreviewWidget .content {
position: relative;
float: right;
max-width: 258px;
height: 35px;
}
.formdef-permis-de-construire .FileWithPreviewWidget.widget-required.has-no-file {
.formdef-category-logement .FileWithPreviewWidget.widget-required.has-no-file {
background-color: #ff000030;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-file {
.formdef-category-logement .FileWithPreviewWidget.has-file {
background-color: #b9d4b9;
}
.formdef-permis-de-construire .FileWithPreviewWidget .fileprogress,
.formdef-permis-de-construire .FileWithPreviewWidget .fileinfo {
.formdef-category-logement .FileWithPreviewWidget .fileprogress,
.formdef-category-logement .FileWithPreviewWidget .fileinfo {
position: relative;
top: -35px;
}
.formdef-permis-de-construire .FileWithPreviewWidget.widget-readonly .fileinfo {
.formdef-category-logement .FileWithPreviewWidget.widget-readonly .fileinfo {
top: 10px;
padding-right: 10px;
}
.formdef-permis-de-construire .FileWithPreviewWidget .hint {
.formdef-category-logement .FileWithPreviewWidget .hint {
position: relative;
color:#ffffff00;
padding: 3px 8px 5px 8px;
top: -10px;
left: -270px;
}
/*.formdef-permis-de-construire .FileWithPreviewWidget .hint:hover,*/
.formdef-permis-de-construire .FileWithPreviewWidget .hint:active {
/*.formdef-category-logement .FileWithPreviewWidget .hint:hover,*/
.formdef-category-logement .FileWithPreviewWidget .hint:active {
position: relative;
background-color: #d0e3ff;
border: 0.01em solid #4e4e4e;
color: #000;
z-index: 99999;
}
.formdef-permis-de-construire .FileWithPreviewWidget .hint:before {
.formdef-category-logement .FileWithPreviewWidget .hint:before {
position: relative;
content: "ⓘ";
font-size: 1.3em;
@ -71,35 +70,35 @@
top: -20px;
cursor: help;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus label,
.formdef-permis-de-construire .FileWithPreviewWidget.has-file .error,
.formdef-permis-de-construire .FileWithPreviewWidget.has-file .hint,
.formdef-permis-de-construire .FileWithPreviewWidget.plus {
.formdef-category-logement .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus label,
.formdef-category-logement .FileWithPreviewWidget.has-file .error,
.formdef-category-logement .FileWithPreviewWidget.has-file .hint,
.formdef-category-logement .FileWithPreviewWidget.plus {
display: none;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus {
.formdef-category-logement .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus {
display: flow-root;
position: relative;
top: -7px;
background-color: #b9d4b9;
height: 43px;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus2 {
.formdef-category-logement .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus2 {
top: -14px;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus3 {
.formdef-category-logement .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus3 {
top: -21px;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus4 {
.formdef-category-logement .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus4 {
top: -28px;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus5 {
.formdef-category-logement .FileWithPreviewWidget.has-file + .FileWithPreviewWidget.plus5 {
top: -35px;
}
.formdef-permis-de-construire .FileWithPreviewWidget.plus.widget-readonly.has-no-file {
.formdef-category-logement .FileWithPreviewWidget.plus.widget-readonly.has-no-file {
display: none;
}
.formdef-permis-de-construire .FileWithPreviewWidget.has-no-file .error {
.formdef-category-logement .FileWithPreviewWidget.has-no-file .error {
left: -180px;
position: relative;
line-height: 0px;
@ -109,10 +108,10 @@
}
/* case à cocher */
.formdef-permis-de-construire .checkbox-cerfa .content,
.formdef-permis-de-construire .checkbox-cerfa .title {
.formdef-category-logement .checkbox-cerfa .content,
.formdef-category-logement .checkbox-cerfa .title {
display: inline;
}
.formdef-permis-de-construire .checkbox-cerfa .content {
.formdef-category-logement .checkbox-cerfa .content {
float: left;
}