Ajout pour suivi de dossier

(avant separation en 3 pages : obligatoires, autres pieces, demolition)
This commit is contained in:
Etienne Loupias 2018-05-17 17:10:04 +02:00
parent ac85e680ab
commit f9dd47502b
1 changed files with 129 additions and 42 deletions

View File

@ -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 "<ns0:informationsComplementaires></ns0:informationsComplementaires>" in request.message:
'''
if u"<ns0:informationsComplementaires></ns0:informationsComplementaires>" 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("<ns0:informationsComplementaires></ns0:informationsComplementaires>",
"<ns0:informationsComplementaires><arr:KeyValueOfstringstring><arr:Key>traitementImmediat</arr:Key><arr:Value>1</arr:Value></arr:KeyValueOfstringstring></ns0:informationsComplementaires>")
request.message = request.message.replace(u"<ns0:informationsComplementaires></ns0:informationsComplementaires>",
u"<ns0:informationsComplementaires><arr:KeyValueOfstringstring><arr:Key>traitementImmediat</arr:Key><arr:Value>1</arr:Value></arr:KeyValueOfstringstring></ns0:informationsComplementaires>")
'''
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 = '<?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>'
message += '<ns0:token>'+self.get_token_cartads()+'</ns0:token>'
message += '<ns0:nCommune>'+formdata.values['commune_raw'].encode('ascii', errors='xmlcharrefreplace')+'</ns0:nCommune>'
message += '<ns0:coTypeDossier>'+formdata.values['type_dossier'].encode('ascii', errors='xmlcharrefreplace')+'</ns0:coTypeDossier>'
message += '<ns0:nomArchive>'+zipFileName+'</ns0:nomArchive>'
message += '<ns0:emailDemandeur>'+formdata.values['email'].encode('ascii', errors='xmlcharrefreplace')+'</ns0:emailDemandeur>'
message += '<ns0:typeCompteUtilisateur>'+self.get_type_compte_utilisateur()+'</ns0:typeCompteUtilisateur>'
message += '<ns0:informationsComplementaires>'
message += '<arr:KeyValueOfstringstring><arr:Key>traitementImmediat</arr:Key><arr:Value>1</arr:Value></arr:KeyValueOfstringstring>'
message += '<arr:KeyValueOfstringstring><arr:Key>idDossierExterne</arr:Key><arr:Value>'+formdata.values['tracking_code']+'</arr:Value></arr:KeyValueOfstringstring>'
message += '</ns0:informationsComplementaires>'
message += '</ns0:NotifierDepotDossier></ns1:Body></SOAP-ENV:Envelope>'
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 ? : <ns0:NotifierDepotDossier><ns0:token>...</ns0:token></ns0:NotifierDepotDossier>
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" <type>file</type>\n"
output_string += u" <extra_css_class>plus plus"+str(i+1)+u"</extra_css_class>\n"
output_string += u" <required>False</required>\n"
output_string += u" <varname>objet"+str(objet["id"]).decode('utf8')+u"_"+str(piece["IdPiece"]).decode('utf8')+u"_"+str(piece["CodePiece"]).decode('utf8')+u"_"+str(i+1)+u"</varname>\n"
output_string += u" <varname>objet"+str(objet["id"]).decode('utf8')+u"_"+str(piece["IdPiece"]).decode('utf8')+u"_"+str(piece["CodePiece"]).decode('utf8')+u"-"+str(i+1)+u"</varname>\n"
output_string += u" <in_listing>False</in_listing>\n"
output_string += u" <prefill>\n"
output_string += u" <type>none</type>\n"