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:
parent
c8afe07c50
commit
18ffcd34b0
|
@ -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èces obligatoires", output_string, objet, id)
|
||||
output_string, id_par_objet = self.write_wcs_page(request, u"3", u"Piè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èces selon le dossier", output_string, objet, id)
|
||||
output_string, id_par_objet = self.write_wcs_page(request, u"4", u"Piè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èces pour démolition", output_string, objet, id)
|
||||
output_string, id_par_objet = self.write_wcs_page(request, u"5", u"Pièces pour dé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')
|
||||
|
|
Reference in New Issue