nanterre: améliore la gestion d'erreur sur implicit

* mieux vérifier les appels HTTPs pour récupérer les cartes familles
* ajouter des logs en warning dans tous les WS de QF
* améliorer tous les messages d'erreur dans qf.py
This commit is contained in:
Benjamin Dauvergne 2017-09-14 13:09:18 +02:00
parent 7dafbc6382
commit c94cfa85d0
2 changed files with 35 additions and 20 deletions

View File

@ -43,6 +43,9 @@ from zoo.zoo_data.models import Entity, Relation, Transaction, Log
from . import utils, fragments, saga, qf, models
logger = logging.getLogger(__name__)
def flatten_errors(serializer_errors):
errors = []
for k, v in serializer_errors.items():
@ -1663,6 +1666,7 @@ class QFLireQuotientsValide(APIView):
ws = qf.QF()
response, error = ws.lire_quotients_valides(now())
if error:
logger.warning(u'lire-quotients-valide %s', error)
return Response({
'err': 1,
'errors': [error],
@ -1705,6 +1709,7 @@ class QFSimuler(APIView):
d = serializer.validated_data
result, error = ws.simuler_qf(**d)
if error:
logger.warning('qf-simuler %s', error)
return Response({
'err': 1,
'errors': [error],
@ -1732,6 +1737,8 @@ class QFCalculer(IndividuViewMixin, TransactionalView):
result, error = qf.CalculQF.calcul_qf(meta=serializer.journal_meta,
transaction=self.transaction, **d)
if error:
logger.warning(u'qf-calculer identifier: %s request: %s erreur: %s', identifier,
serializer.validated_data, error)
return Response({
'err': 1,
'errors': [error],
@ -1751,6 +1758,7 @@ class QFCalculer(IndividuViewMixin, TransactionalView):
else:
result, error = ws.lire_quotient_familial(individu, now())
if error:
logger.warning(u'lire-quotients-valides identifier: %s erreur: %s', identifier, error)
return Response({
'err': 1,
'errors': [error],
@ -1769,6 +1777,8 @@ class QFEditerCarte(IndividuViewMixin, APIView):
ws = qf.QF()
result, error = ws.editer_carte(individu, int(id_qf))
if error:
logger.warning(u'editer-carte identifier: %s id-qf: %s erreur: %s', identifier, id_qf,
error)
return Response({
'err': 1,
'errors': [error],

View File

@ -7,6 +7,7 @@ import json
from zoo.models import Job
import requests
from django.utils.timezone import now
from django.conf import settings
@ -40,16 +41,14 @@ class QF(object):
'Content-Type': 'application/json'
})
except requests.RequestException as e:
logging.getLogger(__name__).warning(u'Erreur connexion Implicit/QF : %s', unicode(e))
return None, unicode(e)
return None, u'Implicit connexion impossible: %r' % e
if response.status_code != 200:
return None, u'Implicit réponse non 200: %s %r' % (
response.status_code, response.content[:1024])
try:
data = response.json()
except ValueError as e:
logging.getLogger(__name__).warning(u'JSON invalide rendu par Implicit/QF : %r',
response.content[:512])
return None, unicode(e)
if response.status_code != 200:
return None, data
return None, u'Implicit contenu non JSON: %s %r' % (e, response.content[:1024])
return data, None
def lire_quotients_valides(self, date_de_reference):
@ -147,7 +146,7 @@ class QF(object):
else:
return response[0], None
else:
return None, response
return None, u'Implicit calcul-qf réponse invalide: %r' % unicode(response)[:1024]
def lire_quotient_familial(self, individu, date_de_reference):
federation = individu.content['cles_de_federation'].get('implicit')
@ -167,12 +166,13 @@ class QF(object):
if isinstance(response, list):
return response, None
else:
return None, response
return None, (u'Implicit lire-quotient-familial réponse invalide: %r'
% unicode(response)[:1024])
def editer_carte(self, individu, id_qf):
federation = individu.content['cles_de_federation'].get('implicit')
if not federation:
return None, 'pas de clé métier'
return None, u'Implicit editer-carte: pas de clé métier'
fragment = {
self.ID_FRAGMENT: 1,
'type': 'donnees-carte-quotient-familial',
@ -184,16 +184,21 @@ class QF(object):
response, error = self.request('editer-carte-quotient-familial', [fragment])
if error:
return None, error
if isinstance(response, dict) and 'lien' in response:
response = requests.get(response['lien'])
if response.status_code == 200:
return response.content, None
return None, {
'status_code': 'erreur-de-recuperation-du-lien',
'lien': response['lien']
}
else:
return None, response
if not isinstance(response, dict) or 'lien' not in response:
return None, u'Implicit editer-carte réponse invalide: %s' % response
try:
url = str(response['lien'])
except Exception as e:
return None, u'Implicit editer-carte impossible de convertir le lien: %r' % response
try:
response = requests.get(url)
except requests.RequestException as e:
return None, (u'Implicit editer-carte connexion impossible pour récupérer le lien: '
'%s %r' % (url, e))
if response.status_code != 200:
return None, (u'Implicit editer-carte code non 200 sur récupération du lien: '
'%s %s %r' % (url, response.status_code, response.content[:1024]))
return response.content, None
class CalculQF(fragments.FragmentBuilder):