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 += ''+self.get_token_cartads()+''
+ 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"