"""Views for plugin app."""

import logging

from django.conf import settings

from InvenTree.exceptions import log_error
from plugin.registry import registry

logger = logging.getLogger('inventree')


class InvenTreePluginViewMixin:
    """Custom view mixin which adds context data to the view, based on loaded plugins.

    This allows rendered pages to be augmented by loaded plugins.
    """

    def get_plugin_panels(self, ctx):
        """Return a list of extra 'plugin panels' associated with this view."""
        panels = []

        for plug in registry.with_mixin('panel', active=True):
            try:
                panels += plug.render_panels(self, self.request, ctx)
            except Exception:
                # Log the error to the database
                log_error(self.request.path)
                logger.exception(
                    "Plugin '%s' could not render custom panels at '%s'",
                    plug.slug,
                    self.request.path,
                )

        return panels

    def get_context_data(self, **kwargs):
        """Add plugin context data to the view."""
        ctx = super().get_context_data(**kwargs)

        if settings.PLUGINS_ENABLED:
            ctx['plugin_panels'] = self.get_plugin_panels(ctx.copy())

        return ctx
