64 lines
1.9 KiB
Python
64 lines
1.9 KiB
Python
|
import sys
|
||
|
|
||
|
import django
|
||
|
from django.apps import apps
|
||
|
from django.utils.translation import gettext_lazy as _
|
||
|
|
||
|
from debug_toolbar.panels import Panel
|
||
|
|
||
|
|
||
|
class VersionsPanel(Panel):
|
||
|
"""
|
||
|
Shows versions of Python, Django, and installed apps if possible.
|
||
|
"""
|
||
|
|
||
|
@property
|
||
|
def nav_subtitle(self):
|
||
|
return "Django %s" % django.get_version()
|
||
|
|
||
|
title = _("Versions")
|
||
|
|
||
|
template = "debug_toolbar/panels/versions.html"
|
||
|
|
||
|
def generate_stats(self, request, response):
|
||
|
versions = [
|
||
|
("Python", "", "%d.%d.%d" % sys.version_info[:3]),
|
||
|
("Django", "", self.get_app_version(django)),
|
||
|
]
|
||
|
versions += list(self.gen_app_versions())
|
||
|
self.record_stats(
|
||
|
{"versions": sorted(versions, key=lambda v: v[0]), "paths": sys.path}
|
||
|
)
|
||
|
|
||
|
def gen_app_versions(self):
|
||
|
for app_config in apps.get_app_configs():
|
||
|
name = app_config.verbose_name
|
||
|
app = app_config.module
|
||
|
version = self.get_app_version(app)
|
||
|
if version:
|
||
|
yield app.__name__, name, version
|
||
|
|
||
|
def get_app_version(self, app):
|
||
|
version = self.get_version_from_app(app)
|
||
|
if isinstance(version, (list, tuple)):
|
||
|
# We strip dots from the right because we do not want to show
|
||
|
# trailing dots if there are empty elements in the list/tuple
|
||
|
version = ".".join(str(o) for o in version).rstrip(".")
|
||
|
return version
|
||
|
|
||
|
def get_version_from_app(self, app):
|
||
|
if hasattr(app, "get_version"):
|
||
|
get_version = app.get_version
|
||
|
if callable(get_version):
|
||
|
try:
|
||
|
return get_version()
|
||
|
except TypeError:
|
||
|
pass
|
||
|
else:
|
||
|
return get_version
|
||
|
if hasattr(app, "VERSION"):
|
||
|
return app.VERSION
|
||
|
if hasattr(app, "__version__"):
|
||
|
return app.__version__
|
||
|
return
|