diff --git a/app/scodoc/sco_photos.py b/app/scodoc/sco_photos.py index 4863eaf7e..6145c718c 100644 --- a/app/scodoc/sco_photos.py +++ b/app/scodoc/sco_photos.py @@ -360,7 +360,7 @@ def find_new_dir(): return d + "/" -def copy_portal_photo_to_fs(etud): +def copy_portal_photo_to_fs(etud: dict): """Copy the photo from portal (distant website) to local fs. Returns rel. path or None if copy failed, with a diagnostic message """ @@ -368,26 +368,40 @@ def copy_portal_photo_to_fs(etud): sco_etud.format_etud_ident(etud) url = photo_portal_url(etud) if not url: - return None, "%(nomprenom)s: pas de code NIP" % etud + return None, f"""{etud['nomprenom']}: pas de code NIP""" portal_timeout = sco_preferences.get_preference("portal_timeout") - f = None + error_message = None try: log(f"copy_portal_photo_to_fs: getting {url}") r = requests.get(url, timeout=portal_timeout) - except Exception: + except requests.ConnectionError: + log("copy_portal_photo_to_fs: ConnectionError.") + error_message = "ConnectionError" + except requests.Timeout: + log("copy_portal_photo_to_fs: Timeout.") + error_message = "Timeout" + except requests.TooManyRedirects: + log("copy_portal_photo_to_fs: TooManyRedirects.") + error_message = "TooManyRedirects" + except requests.RequestException: # log("download failed: exception:\n%s" % traceback.format_exc()) # log("called from:\n" + "".join(traceback.format_stack())) - log("copy_portal_photo_to_fs: error.") - return None, "%s: erreur chargement de %s" % (etud["nomprenom"], url) + log("copy_portal_photo_to_fs: unknown requests error.") + if error_message is not None: + return ( + None, + f"""{etud["nomprenom"]}: erreur chargement de {url}\n{error_message}""", + ) if r.status_code != 200: log(f"copy_portal_photo_to_fs: download failed {r.status_code }") - return None, "%s: erreur chargement de %s" % (etud["nomprenom"], url) + return None, f"""{etud["nomprenom"]}: erreur chargement de {url}""" + data = r.content # image bytes try: - status, err_msg = store_photo(etud, data, "(inconnue)") + status, error_message = store_photo(etud, data, "(inconnue)") except Exception: status = False - err_msg = "Erreur chargement photo du portail" + error_message = "Erreur chargement photo du portail" log("copy_portal_photo_to_fs: failure (exception in store_photo)!") if status: log(f"copy_portal_photo_to_fs: copied {url}") @@ -396,4 +410,4 @@ def copy_portal_photo_to_fs(etud): f"{etud['nomprenom']}: photo chargée", ) else: - return None, "%s: %s" % (etud["nomprenom"], err_msg) + return None, f"{etud['nomprenom']}: {error_message}" diff --git a/app/scodoc/sco_utils.py b/app/scodoc/sco_utils.py index c3d189a96..b7304c1e9 100644 --- a/app/scodoc/sco_utils.py +++ b/app/scodoc/sco_utils.py @@ -1042,15 +1042,23 @@ def query_portal(req, msg="Portail Apogee", timeout=3): returns a string, "" on error """ log("query_portal: %s" % req) - + error_message = None try: r = requests.get(req, timeout=timeout) # seconds / request - except: - log("query_portal: can't connect to %s" % msg) + except requests.ConnectionError: + error_message = "ConnectionError" + except requests.Timeout: + error_message = "Timeout" + except requests.TooManyRedirects: + error_message = "TooManyRedirects" + except requests.RequestException: + error_message = "can't connect to {msg}" + if error_message is not None: + log(f"query_portal: {error_message}") return "" if r.status_code != 200: log(f"query_portal: http error {r.status_code}") - return "" # XXX ou raise exception ? + return "" return r.text