diff --git a/cartads/models.py b/cartads/models.py index ee84c5c..fd392a1 100644 --- a/cartads/models.py +++ b/cartads/models.py @@ -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 = 'False\n" output_string += u" \n" output_string += u" none\n" - output_string += u" 200M\n" + output_string += u" 50M\n" output_string += u" True\n" output_string += u" "+str(id).decode('utf8')+u"\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"\n" output_string += u" \n" @@ -570,11 +575,11 @@ class CartADS(BaseResource): output_string += u" none\n" output_string += u" 50M\n" output_string += u" True\n" - output_string += u" "+str(id).decode('utf8')+u"\n" + output_string += u" "+str(id_par_piece).decode('utf8')+u"\n" output_string += u"\n" # ajoute 5 PJ supplementaires par pièce - for i in range(2): + for i in range(5): output_string += u" \n" output_string += u" \n" output_string += u" file\n" @@ -586,11 +591,9 @@ class CartADS(BaseResource): output_string += u" none\n" output_string += u" 50M\n" output_string += u" True\n" - output_string += u" "+str(id).decode('utf8')+u"_"+str(i+1)+u"\n" + output_string += u" "+str(id_par_piece).decode('utf8')+u"_"+str(i+1)+u"\n" output_string += u" \n" - id += 1 - output_string += u" \n" output_string = output_string.encode('ascii', errors='xmlcharrefreplace')