versions.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import sys
  2. import django
  3. from django.apps import apps
  4. from django.utils.translation import gettext_lazy as _
  5. from debug_toolbar.panels import Panel
  6. class VersionsPanel(Panel):
  7. """
  8. Shows versions of Python, Django, and installed apps if possible.
  9. """
  10. @property
  11. def nav_subtitle(self):
  12. return "Django %s" % django.get_version()
  13. title = _("Versions")
  14. template = "debug_toolbar/panels/versions.html"
  15. def generate_stats(self, request, response):
  16. versions = [
  17. ("Python", "", "%d.%d.%d" % sys.version_info[:3]),
  18. ("Django", "", self.get_app_version(django)),
  19. ]
  20. versions += list(self.gen_app_versions())
  21. self.record_stats(
  22. {"versions": sorted(versions, key=lambda v: v[0]), "paths": sys.path}
  23. )
  24. def gen_app_versions(self):
  25. for app_config in apps.get_app_configs():
  26. name = app_config.verbose_name
  27. app = app_config.module
  28. version = self.get_app_version(app)
  29. if version:
  30. yield app.__name__, name, version
  31. def get_app_version(self, app):
  32. version = self.get_version_from_app(app)
  33. if isinstance(version, (list, tuple)):
  34. # We strip dots from the right because we do not want to show
  35. # trailing dots if there are empty elements in the list/tuple
  36. version = ".".join(str(o) for o in version).rstrip(".")
  37. return version
  38. def get_version_from_app(self, app):
  39. if hasattr(app, "get_version"):
  40. get_version = app.get_version
  41. if callable(get_version):
  42. try:
  43. return get_version()
  44. except TypeError:
  45. pass
  46. else:
  47. return get_version
  48. if hasattr(app, "VERSION"):
  49. return app.VERSION
  50. if hasattr(app, "__version__"):
  51. return app.__version__
  52. return