Id invariant pour le form

Pour le zip, ajout tempfile.gettempdir() et finally pour etre sur de le supprimer a la fin
This commit is contained in:
Etienne Loupias 2018-06-05 10:58:22 +02:00
parent c8afe07c50
commit 18ffcd34b0
1 changed files with 75 additions and 72 deletions

View File

@ -23,6 +23,7 @@ import zipfile
import StringIO
import HTMLParser
import os # TODO: inutile si on genere le zip in-memory
import tempfile # TODO: inutile si on genere le zip in-memory
from email import encoders
from email.mime.audio import MIMEAudio
@ -166,93 +167,94 @@ class CartADS(BaseResource):
#b64_fileContent = base64.b64encode(self.in_memory_zip.read())
# TODO : temp : on genere fichier physique parce que in_memory_zip genere un zip vide pour l'instant
localFileName = '/home/grandlyon/temp/'+zipFileName
localFileName = tempfile.gettempdir() + '/' + zipFileName
zf = zipfile.ZipFile(localFileName,
mode='w',
compression=zipfile.ZIP_DEFLATED,
)
# get creation fields from payload
try:
formdata = FormData(json.loads(request.body), CREATION_SCHEMA)
except ValueError as e:
raise ParameterTypeError(e.message)
#print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "commune_raw=", formdata.values['commune_raw']
#return
# get creation fields from payload
try:
formdata = FormData(json.loads(request.body), CREATION_SCHEMA)
except ValueError as e:
raise ParameterTypeError(e.message)
#print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "commune_raw=", formdata.values['commune_raw']
#return
if 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
content = base64.b64decode(attachment.get('content') or '')
if 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
content = base64.b64decode(attachment.get('content') or '')
#b64_fileContent = attachment.get('content')
#print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "b64_fileContent: ", b64_fileContent
try:
#zf.writestr("Pieces/"+filename, content)
# pour l'instant test en dur avec nom du cerfa pour le CU
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']
filenameInZip = formdata.values['cerfa_nom'] + ".pdf"
else:
if len(key.split("_")) == 4:
obj, idPiece, codePiece, noPiece = key.split("_")
filenameInZip = "Pieces/"+ idPiece + "-" + codePiece + "-" + noPiece
#b64_fileContent = attachment.get('content')
#print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "b64_fileContent: ", b64_fileContent
try:
#zf.writestr("Pieces/"+filename, content)
# pour l'instant test en dur avec nom du cerfa pour le CU
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']
filenameInZip = formdata.values['cerfa_nom'] + ".pdf"
else:
obj, idPiece, codePiece = key.split("_")
filenameInZip = "Pieces/"+ idPiece + "-" + codePiece
if "." in filename:
filenameInZip += filename[filename.rfind("."):]
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "filenameInZip: ", filenameInZip
zf.writestr(filenameInZip, content)
if len(key.split("_")) == 4:
obj, idPiece, codePiece, noPiece = key.split("_")
filenameInZip = "Pieces/"+ idPiece + "-" + codePiece + "-" + noPiece
else:
obj, idPiece, codePiece = key.split("_")
filenameInZip = "Pieces/"+ idPiece + "-" + codePiece
if "." in filename:
filenameInZip += filename[filename.rfind("."):]
print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "filenameInZip: ", filenameInZip
zf.writestr(filenameInZip, content)
except ValueError as e:
raise ParameterTypeError(e.message)
except ValueError as e:
raise ParameterTypeError(e.message)
zf.close()
zf.close()
'''
os.remove(localFileName)
return
'''
'''
os.remove(localFileName)
return
'''
with open(localFileName, "rb") as image_file:
b64_fileContent = base64.b64encode(image_file.read())
with open(localFileName, "rb") as image_file:
b64_fileContent = base64.b64encode(image_file.read())
#print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "test apres:", b64_fileContent
#print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "test apres:", b64_fileContent
# test base64
#b64_fileContent = "UEsDBBQAAAAAAMqEQUzI2HQpGgAAABoAAAAKAAAAdGVzdDAxLnR4dHRlc3QgYmFzZTY0IG1pbmkgdG90byB0YXRhUEsBAhQAFAAAAAAAyoRBTMjYdCkaAAAAGgAAAAoAAAAAAAAAAQAgAAAAAAAAAHRlc3QwMS50eHRQSwUGAAAAAAEAAQA4AAAAQgAAAAAA"
# test base64
#b64_fileContent = "UEsDBBQAAAAAAMqEQUzI2HQpGgAAABoAAAAKAAAAdGVzdDAxLnR4dHRlc3QgYmFzZTY0IG1pbmkgdG90byB0YXRhUEsBAhQAFAAAAAAAyoRBTMjYdCkaAAAAGgAAAAoAAAAAAAAAAQAgAAAAAAAAAHRlc3QwMS50eHRQSwUGAAAAAAEAAQA4AAAAQgAAAAAA"
# 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
# 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"
# TODO : mettre en parametre l'url du ws 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',
respHttp = self.requests.post(self.sendfile_ws_url,
data={'fileName': self.dirname+zipFileName,
'b64_fileContent': b64_fileContent[x*size_max:(x+1)*size_max],
'part': str(x),
'total': int(len(b64_fileContent)/size_max)}
) #.json()
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',
respHttp = self.requests.post(self.sendfile_ws_url,
data={'fileName': self.dirname+zipFileName,
'b64_fileContent': b64_fileContent[x*size_max:(x+1)*size_max],
'part': str(x),
'total': int(len(b64_fileContent)/size_max)}
) #.json()
os.remove(localFileName)
finally:
os.remove(localFileName)
message = '<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:ns0="http://tempuri.org/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays" '
message += 'xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><ns1:Body><ns0:NotifierDepotDossier>'
@ -503,7 +505,7 @@ class CartADS(BaseResource):
output_string += u" <in_listing>False</in_listing>\n"
output_string += u" <prefill>\n"
output_string += u" <type>none</type>\n"
output_string += u" </prefill><max_file_size>200M</max_file_size>\n"
output_string += u" </prefill><max_file_size>50M</max_file_size>\n"
output_string += u" <allow_portfolio_picking>True</allow_portfolio_picking>\n"
output_string += u" <id>"+str(id).decode('utf8')+u"</id>\n"
id += 1
@ -530,14 +532,13 @@ class CartADS(BaseResource):
#print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "dict_resp: ", dict_resp
date_file = datetime.datetime.now()
#TODO: faire un id unique et invariant si on reimporte le form (si ajout de champs dans le BO cartads)
#(par exemple : 1000*objet["id"]+10*no du champ+no de la piece si elle est envoyee 6 fois)
# Attention l'id ne doit pas contenir de - sinon provoque Internal Server error a l'import dans wcs
id = 100*objet["id"]
#id de field par objet pour essayer d'avoir un id invariant pour quand on reimporte le formulaire
id_par_objet = 100*objet["id"]
# page en cours de construction : 0 = pieces obligatoires
current_page = 0
output_string, id = self.write_wcs_page(request, u"3", u"Pi&#232;ces obligatoires", output_string, objet, id)
output_string, id_par_objet = self.write_wcs_page(request, u"3", u"Pi&#232;ces obligatoires", output_string, objet, id_par_objet)
for piece in dict_resp['Piece']:
@ -549,12 +550,16 @@ class CartADS(BaseResource):
if piece["Reglementaire"] == False and current_page == 0:
# page en cours de construction : 1 = pieces selon le dossier
current_page = 1
output_string, id = self.write_wcs_page(request, u"4", u"Pi&#232;ces selon le dossier", output_string, objet, id)
output_string, id_par_objet = self.write_wcs_page(request, u"4", u"Pi&#232;ces selon le dossier", output_string, objet, id_par_objet)
if str(piece["CodePiece"]).startswith("PCA") and current_page == 1:
# page en cours de construction : 2 = pieces pour demolition
current_page = 2
output_string, id = self.write_wcs_page(request, u"5", u"Pi&#232;ces pour d&#233;molition", output_string, objet, id)
output_string, id_par_objet = self.write_wcs_page(request, u"5", u"Pi&#232;ces pour d&#233;molition", output_string, objet, id_par_objet)
#id de field par objet et piece pour essayer d'avoir un id invariant pour quand on reimporte le formulaire
# Attention l'id ne doit pas contenir de - sinon provoque Internal Server error a l'import dans wcs
id_par_piece = str(objet["id"]) + '_' + str(piece["IdPiece"])
output_string += u"<field>\n"
output_string += u" <label>"+str(piece["CodePiece"]).decode('utf8')+u" - "+h.unescape(piece["Libelle"])+u"</label>\n"
@ -570,11 +575,11 @@ class CartADS(BaseResource):
output_string += u" <type>none</type>\n"
output_string += u" </prefill><max_file_size>50M</max_file_size>\n"
output_string += u" <allow_portfolio_picking>True</allow_portfolio_picking>\n"
output_string += u" <id>"+str(id).decode('utf8')+u"</id>\n"
output_string += u" <id>"+str(id_par_piece).decode('utf8')+u"</id>\n"
output_string += u"</field>\n"
# ajoute 5 PJ supplementaires par pièce
for i in range(2):
for i in range(5):
output_string += u" <field>\n"
output_string += u" <label>"+str(piece["CodePiece"]).decode('utf8')+u" - "+h.unescape(piece["Libelle"])+u" "+str(i+1)+u"</label>\n"
output_string += u" <type>file</type>\n"
@ -586,11 +591,9 @@ class CartADS(BaseResource):
output_string += u" <type>none</type>\n"
output_string += u" </prefill><max_file_size>50M</max_file_size>\n"
output_string += u" <allow_portfolio_picking>True</allow_portfolio_picking>\n"
output_string += u" <id>"+str(id).decode('utf8')+u"_"+str(i+1)+u"</id>\n"
output_string += u" <id>"+str(id_par_piece).decode('utf8')+u"_"+str(i+1)+u"</id>\n"
output_string += u" </field>\n"
id += 1
output_string += u" </fields>\n"
output_string = output_string.encode('ascii', errors='xmlcharrefreplace')