diff --git a/cartads/models.py b/cartads/models.py index f907016..a19536c 100644 --- a/cartads/models.py +++ b/cartads/models.py @@ -84,7 +84,8 @@ def sudsobject_to_dict(sudsobject): class CartADS(BaseResource): token_url = models.URLField(_('Token URL'), max_length=256) token_authorization = models.CharField(_('Token Authorization'), max_length=128) - wsdl_url = models.CharField(_('WSDL URL'), max_length=256) # not URLField, it can be file:// + wsdl_url_portail = models.CharField(_('WSDL URL Portail'), max_length=256) # not URLField, it can be file:// + wsdl_url_etapedossier = models.CharField(_('WSDL URL EtapeDossier'), max_length=256) # not URLField, it can be file:// verify_cert = models.BooleanField(default=True, verbose_name=_('Check HTTPS Certificate validity')) # TODO : a mettre en param du connecteur @@ -112,7 +113,7 @@ class CartADS(BaseResource): self.logger.debug('new token: %s (timeout %ss)', token, timeout) return token - def get_client(self, attachments=[]): + def get_client(self, wsdl_file, attachments=[]): class Transport(HttpAuthenticated): def __init__(self, instance, attachments): self.instance = instance @@ -123,16 +124,18 @@ class CartADS(BaseResource): request.message = request.message.replace("contentType", "xm:contentType") request.headers['Authorization'] = self.instance.get_token() - ''' inutile pour test avec traitement dans la minute toujours active en dev et rec + #inutile pour test avec traitement dans la minute toujours active en dev et rec #print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "message: ", request.message - if "" in request.message: + ''' + if u"" in request.message: # fait planter #request.message = request.message.replace('xmlns:ns0="http://tempuri.org/"', #'xmlns:ns0="http://tempuri.org/" xmlns:arr="http://schemas.microsoft.com/2003/10/Serialization/Arrays') - request.message = request.message.replace("", - "traitementImmediat1") + request.message = request.message.replace(u"", + u"traitementImmediat1") ''' + resp = self.instance.requests.post(request.url, data=request.message, headers=request.headers, verify=self.instance.verify_cert) @@ -145,7 +148,7 @@ class CartADS(BaseResource): return Reply(resp.status_code, resp.headers, resp.content) - return Client(url=self.wsdl_url, transport=Transport(self, attachments)) + return Client(url=self.wsdl_url_portail+wsdl_file, transport=Transport(self, attachments)) @endpoint(perm='can_access', methods=['get','post']) @@ -195,11 +198,17 @@ class CartADS(BaseResource): #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 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 @@ -230,6 +239,8 @@ 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" + # 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', @@ -242,12 +253,39 @@ class CartADS(BaseResource): os.remove(localFileName) - infos = {"traitementImmediat" : 1} - #infos = dict(traitementImmediat='1') + message = '' + message += ''+formdata.values['commune_raw'].encode('ascii', errors='xmlcharrefreplace')+'' + message += ''+formdata.values['type_dossier'].encode('ascii', errors='xmlcharrefreplace')+'' + message += ''+zipFileName+'' + message += ''+formdata.values['email'].encode('ascii', errors='xmlcharrefreplace')+'' + message += ''+self.get_type_compte_utilisateur()+'' + message += '' + message += 'traitementImmediat1' + message += 'idDossierExterne'+formdata.values['tracking_code']+'' + message += '' + message += '' + headers = {'Authorization': self.get_token(), + 'SOAPAction':'"http://tempuri.org/IServicePortail/NotifierDepotDossier"', + 'Content-Type': 'text/xml; charset=utf-8'} - #TODO : a voir si on met traitementImmediat a 1 - resp = self.get_client().service.NotifierDepotDossier(self.get_token_cartads(), + #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" + + #TODO: faire en soap comme les autres ou adapter url pour prod + resp = self.requests.post('https://api-rec.grandlyon.com/ads-rec-portail/', + data=message, + headers=headers) + + #TODO : a voir comment on passe info complementaires avec suds (traitementImmediat a 1, id dossier externe, ...) + # fonctionne mais on sait pas comment passer info complementaires + ''' + client = self.get_client('cartads-rec-portail.wsdl') + resp = client.service.NotifierDepotDossier(self.get_token_cartads(), formdata.values['commune_raw'], formdata.values['type_dossier'], zipFileName, @@ -255,9 +293,26 @@ class CartADS(BaseResource): self.get_type_compte_utilisateur(), '' ) + ''' + + ''' + # en utilisant factory.create de suds, mais fonctionne pas du tout : + #rajoute un ns0:token autour de tous les param... manque un element regroupant le type complexe dans le wsdl ? : ... + notifierDepotDossier = client.factory.create('NotifierDepotDossier') + notifierDepotDossier.token = self.get_token_cartads() + notifierDepotDossier.nCommune = formdata.values['commune_raw'] + notifierDepotDossier.coTypeDossier = formdata.values['type_dossier'] + notifierDepotDossier.nomArchive = zipFileName + notifierDepotDossier.emailDemandeur = formdata.values['email'] + notifierDepotDossier.typeCompteUtilisateur = self.get_type_compte_utilisateur() + #notifierDepotDossier.informationsComplementaires + resp = client.service.NotifierDepotDossier(notifierDepotDossier) + ''' + + 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)} + return {'respHttp': respHttp.content, 'length': len(b64_fileContent), 'err': 0} @classmethod @@ -267,20 +322,28 @@ class CartADS(BaseResource): def get_token_cartads(self): #TODO : a encoder d'apres les exemples php et c# fournis par GFI + + #07/05/2018, avec "cle-secrete-gfi!", "!gf1-cl3-s3cr3t3", utilisée dans CartADS de REC : + #{'date':'23/01/2028 15:10:00','login':'gnm','password':'Gu!che7'} return 'ieTluf0q6vwjitxope55YZ2ud0CEtuO9BBHr2hQaxySeDrz66mntHl83Wqj7oadMSyZqwSkzVdZJrQ92Zg2p3bwkAuv5yUzwmpBfdtAYYLE=' + #07/05/2018, avec "cle-secrete-gly!", "!gl1-cl3-s3cr3t3", utilisée dans CartADS de DEV : + #{'date':'23/01/2028 15:10:00','login':'gnm','password':'Gu!che7'} + # return "HQgzlNovC9eyesEH5Fl6P8aBDYkgtVDq/GiOxLL3XfhcsiRecO3IJyqXro6Z3wekk08QwXvVx9tqeqzk81MS8b4LYBhUkj2bFeiDGBsLHFc=" + + def get_type_compte_utilisateur(self): #TODO : a encoder d'apres les exemples php et c# fournis par GFI return 'ContactService' @endpoint(perm='can_access') def get_communes(self, request): - resp = self.get_client().service.GetCommunes(self.get_token_cartads(), + resp = self.get_client('cartads-rec-portail.wsdl').service.GetCommunes(self.get_token_cartads(), self.get_type_compte_utilisateur() ) ''' #TODO: Ca serait mieux mais ca marche pas... - resp = self.get_client().service.GetCommunes({ + resp = self.get_client('cartads-rec-portail.wsdl').service.GetCommunes({ 'token': self.get_token_cartads(), 'typeCompteUtilisateur': self.get_type_compte_utilisateur(), })''' @@ -291,9 +354,10 @@ class CartADS(BaseResource): if len(type_dossier) != 2: raise ParameterTypeError("invalid type_dossier parameter") - resp = self.get_client().service.GetObjetsDemande(self.get_token_cartads(), type_dossier) + resp = self.get_client('cartads-rec-portail.wsdl').service.GetObjetsDemande(self.get_token_cartads(), type_dossier) dict_resp = sudsobject_to_dict(resp) + # 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['KeyValueOfintstring']: out_item = {} @@ -301,33 +365,13 @@ class CartADS(BaseResource): out_item['text'] = objet["Value"] out.append(out_item) - def getKey(objet): - return objet['id'] - + def getKey(objet): + return objet['id'] return {'data': sorted(out, key=getKey)} - - # TODO : parcourir la liste en json devrait etre plus simple qu'en suds, mais j'ai pas reussi pour l'instant - # On parcourt la liste pour la mettre sous la forme id, text, pour l'utiliser comme source de donnees dans le formulaire - out = {} - for key, value in suds.sudsobject.asdict(resp).iteritems(): - out[key] = [] - for item in value: - if hasattr(item, '__keylist__'): - out_item = {} - for key_item, value_item in suds.sudsobject.asdict(item).iteritems(): - out_item['id'] = item.Key - out_item['text'] = item.Value - out[key].append(out_item) - else: - item.id = item.Key - item.text = item.Value - out[key].append(item) - return {'data': out['KeyValueOfintstring']} - @endpoint(perm='can_access') def get_liste_pdf(self, request, type_dossier): - resp = self.get_client().service.GetListePdf(self.get_token_cartads(), + resp = self.get_client('cartads-rec-portail.wsdl').service.GetListePdf(self.get_token_cartads(), type_dossier, self.get_type_compte_utilisateur() ) @@ -335,12 +379,55 @@ class CartADS(BaseResource): @endpoint(perm='can_access') def get_pieces(self, request, type_dossier, objet_demande): - resp = self.get_client().service.GetPieces(self.get_token_cartads(), + resp = self.get_client('cartads-rec-portail.wsdl').service.GetPieces(self.get_token_cartads(), type_dossier, objet_demande ) return {'data': sudsobject_to_dict(resp)} + @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 + # 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 + resp = self.get_client('cartads-rec-recherchedossier.wsdl').service.GetDossiersSelonDerniereEtape( + 'client1', + date_dossier, + date_dossier + ) + dict_resp = sudsobject_to_dict(resp) + + def getOrder(objet): + return objet['IdDossier']* -1 + + # On parcourt la liste a partir de la fin pour chercher le bon dossier + idDossierOut = '' + nomDossierOut = '' + for objet in sorted(dict_resp['DossierEtape'], key=getOrder): + resp_dossier = self.get_client('cartads-rec-dossier.wsdl').service.GetInfosDossier(self.get_token_cartads(), objet["IdDossier"]) + dict_resp_dossier = sudsobject_to_dict(resp_dossier) + if dict_resp_dossier["IdDossierExterne"] == tracking_code: + #print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "IdDossier: ", dict_resp_dossier["IdDossier"] + idDossierOut = dict_resp_dossier["IdDossier"] + nomDossierOut = dict_resp_dossier["NomDossier"] + break; + + print >> open('/home/grandlyon/log/cartads.debug', 'a+'), datetime.datetime.now(), "idDossierOut: ", idDossierOut + return {'data': {'IdDossier': idDossierOut, 'NomDossier': nomDossierOut} } + + @endpoint(perm='can_access') + def get_etape(self, request, id_dossier): + resp = self.get_client('cartads-rec-etapedossier.wsdl').service.GetEtapesDossier(self.get_token_cartads(), id_dossier, '') + # sort by IdEtapeDossier descending to get the last stage + def getKey(objet): + return -1 * objet['IdEtapeDossier'] + return {'data': sorted(sudsobject_to_dict(resp)['EtapeDossier'], key=getKey)} + + @endpoint(perm='can_access') + def get_infos_dossier(self, request, id_dossier): + resp = self.get_client('cartads-rec-dossier.wsdl').service.GetInfosDossier(self.get_token_cartads(), id_dossier) + return {'data': sudsobject_to_dict(resp)} @endpoint(perm='can_access') def write_wcs_files(self, request, type_dossier): @@ -453,7 +540,7 @@ class CartADS(BaseResource): output_string += u" file\n" output_string += u" plus plus"+str(i+1)+u"\n" output_string += u" False\n" - output_string += u" objet"+str(objet["id"]).decode('utf8')+u"_"+str(piece["IdPiece"]).decode('utf8')+u"_"+str(piece["CodePiece"]).decode('utf8')+u"_"+str(i+1)+u"\n" + output_string += u" objet"+str(objet["id"]).decode('utf8')+u"_"+str(piece["IdPiece"]).decode('utf8')+u"_"+str(piece["CodePiece"]).decode('utf8')+u"-"+str(i+1)+u"\n" output_string += u" False\n" output_string += u" \n" output_string += u" none\n"