\chapter{Context Processors}

Mise en pratique: un \emph{context processor} sert \emph{grosso-modo} à
peupler l'ensemble des données transmises des vues aux templates avec
des données communes. Un context processor est un peu l'équivalent d'un
middleware, mais entre les données et les templates, là où le middleware
va s'occuper des données relatives aux réponses et requêtes elles-mêmes.

\begin{minted}{python}
# core/context_processors.py

import subprocess


def git_describe(request) -> str:
    return {
        "git_describe": subprocess.check_output(
            ["git", "describe", "--always"]
        ).strip(),
        "git_date": subprocess.check_output(
            ["git", "show", "-s", r"--format=%cd", r"--date=format:%d-%m-%Y"]
        ),
    }
\end{minted}


Ceci aura pour effet d'ajouter les deux variables \texttt{git\_describe} et \texttt{git\_date} dans tous les contextes de tous les templates de l'application.

\begin{minted}{python}
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, "templates"),],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                    "core.context_processors.git_describe"
                ],
            },
        },
    ]
\end{minted}
