"""
Author: Michel Peltriaux
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 11.12.23

"""
from django.views.debug import ExceptionReporter


class KonovaExceptionReporter(ExceptionReporter):
    """ Custom exception reporter class

    Adapts the base functionality of ExceptionReporter but adds whitelist filtering to prevent sensitive data
    to be exploitable via mail delivery.

    References:
    https://docs.djangoproject.com/en/4.2/ref/logging/#handlers

    """

    def _filter_traceback_data(self, tb_data: dict):
        """ Filters given traceback data according to whitelist

        Args:
            tb_data (dict): Aggregates traceback data

        Returns:
            clean_data (dict): Whitelist based filtered traceback data
        """
        whitelist = [
            "is_email",
            "unicdoe_hint",
            "frames",
            "request",
            "user_str",
            "sys_executable",
            "sys_version_info",
            "raising_view_name",
            "exception_type",
            "exception_value",
        ]
        clean_data = dict()
        for entry in whitelist:
            try:
                clean_data[entry] = tb_data[entry]
            except KeyError:
                continue
        return clean_data

    def get_traceback_data(self):
        """ Custom traceback data aggregation

        Returns:
            tb_data (dict): The traceback data
        """
        tb_data = super().get_traceback_data()

        if self.is_email:
            tb_data = self._filter_traceback_data(tb_data)

        return tb_data
