diff --git a/beat/web/utils/drf.py b/beat/web/utils/drf.py new file mode 100644 index 0000000000000000000000000000000000000000..4a6f63d2dd275d91772c0b3801efeec3c271a109 --- /dev/null +++ b/beat/web/utils/drf.py @@ -0,0 +1,59 @@ +# vim: set fileencoding=utf-8 : + +############################################################################### +# # +# Copyright (c) 2020 Idiap Research Institute, http://www.idiap.ch/ # +# Contact: beat.support@idiap.ch # +# # +# This file is part of the beat.web module of the BEAT platform. # +# # +# Commercial License Usage # +# Licensees holding valid commercial BEAT licenses may use this file in # +# accordance with the terms contained in a written agreement between you # +# and Idiap. For further information contact tto@idiap.ch # +# # +# Alternatively, this file may be used under the terms of the GNU Affero # +# Public License version 3 as published by the Free Software and appearing # +# in the file LICENSE.AGPL included in the packaging of this file. # +# The BEAT platform is distributed in the hope that it will be useful, but # +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY # +# or FITNESS FOR A PARTICULAR PURPOSE. # +# # +# You should have received a copy of the GNU Affero Public License along # +# with the BEAT platform. If not, see http://www.gnu.org/licenses/. # +# # +############################################################################### + +""" +Django REST framework helpers +""" + +import logging + +from rest_framework.views import exception_handler +from rest_framework.exceptions import APIException +from rest_framework.status import is_client_error + +logger = logging.getLogger("beat.drf_exceptions") + + +def custom_exception_handler(exc, context): + # Call REST framework's default exception handler first, + # to get the standard error response. + response = exception_handler(exc, context) + + # check that a ValidationError exception is raised + if isinstance(exc, APIException): + # Log all client errors + if is_client_error(exc.status_code): + view = context["view"] + request = context["request"] + detail = { + "user": request.user.username, + "view": view.__class__.__name__, + "kwargs": view.kwargs, + "error": exc.detail, + } + logger.warning("Error occured: {}".format(detail)) + + return response