Ajout pour suivi de dossier
(avant separation en 3 pages : obligatoires, autres pieces, demolition)
This commit is contained in:
parent
ac85e680ab
commit
f9dd47502b
|
@ -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"
|
||||
|
|
Reference in New Issue