Source code for swh.deposit.exception

# Copyright (C) 2020-2021 The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information

from typing import Dict, Optional

from django.db.utils import OperationalError
from django.http import HttpResponse
from rest_framework.exceptions import APIException


[docs] def custom_exception_handler( exc: APIException, context: Dict ) -> Optional[HttpResponse]: """Custom deposit exception handler to ensure consistent xml output""" from rest_framework.views import exception_handler # drf's default exception handler first, to get the standard error response response = exception_handler(exc, context) if isinstance(exc, OperationalError): status = "Database backend maintenance" detail = "Service temporarily unavailable, try again later." data = f"""<?xml version="1.0" encoding="utf-8"?> <sword:error xmlns="http://www.w3.org/2005/Atom" xmlns:sword="http://purl.org/net/sword/"> <summary>{status}</summary> <sword:verboseDescription>{detail}</sword:verboseDescription> </sword:error> """.encode( "utf-8" ) return HttpResponse(data, status=503, content_type="application/xml") return response