digitalfabrik/integreat-cms

View on GitHub
integreat_cms/core/management/log_command.py

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
from __future__ import annotations

import logging
from typing import TYPE_CHECKING

from django.core.management.base import BaseCommand

if TYPE_CHECKING:
    from typing import Any


logger = logging.getLogger("integreat_cms.core.management.commands")


class LogCommand(BaseCommand):
    """
    Base class for management commands to set the stream handler of the logger to the command's stdout wrapper
    """

    def handle(self, *args: Any, **options: Any) -> None:
        """
        The actual logic of the command. Subclasses must implement this method.
        """
        raise NotImplementedError(
            "subclasses of BaseCommand must provide a handle() method"
        )

    def set_logging_stream(self) -> None:
        """
        Set the output stream to the command's stdout/stderr wrapper.
        Has to be called as part of the command's handle() function.
        """
        for handler in logger.handlers:
            if isinstance(handler, logging.StreamHandler):
                if handler.get_name() == "management-command-stdout":
                    handler.setStream(self.stdout)
                elif handler.get_name() == "management-command-stderr":
                    handler.setStream(self.stderr)