1from django.http import Http404
2from django.urls import resolve
3from django.utils.translation import gettext_lazy as _
4
5from debug_toolbar.panels import Panel
6from debug_toolbar.utils import get_name_from_obj, get_sorted_request_variable
7
8
9class RequestPanel(Panel):
10    """
11    A panel to display request variables (POST/GET, session, cookies).
12    """
13
14    template = "debug_toolbar/panels/request.html"
15
16    title = _("Request")
17
18    @property
19    def nav_subtitle(self):
20        """
21        Show abbreviated name of view function as subtitle
22        """
23        view_func = self.get_stats().get("view_func", "")
24        return view_func.rsplit(".", 1)[-1]
25
26    def generate_stats(self, request, response):
27        self.record_stats(
28            {
29                "get": get_sorted_request_variable(request.GET),
30                "post": get_sorted_request_variable(request.POST),
31                "cookies": get_sorted_request_variable(request.COOKIES),
32            }
33        )
34
35        view_info = {
36            "view_func": _("<no view>"),
37            "view_args": "None",
38            "view_kwargs": "None",
39            "view_urlname": "None",
40        }
41        try:
42            match = resolve(request.path)
43            func, args, kwargs = match
44            view_info["view_func"] = get_name_from_obj(func)
45            view_info["view_args"] = args
46            view_info["view_kwargs"] = kwargs
47
48            if getattr(match, "url_name", False):
49                url_name = match.url_name
50                if match.namespaces:
51                    url_name = ":".join([*match.namespaces, url_name])
52            else:
53                url_name = _("<unavailable>")
54
55            view_info["view_urlname"] = url_name
56
57        except Http404:
58            pass
59        self.record_stats(view_info)
60
61        if hasattr(request, "session"):
62            self.record_stats(
63                {
64                    "session": [
65                        (k, request.session.get(k))
66                        for k in sorted(request.session.keys())
67                    ]
68                }
69            )
70