From f1585c54d0242d71cdc63421f751528472b1c9c2 Mon Sep 17 00:00:00 2001 From: MinchinWeb Date: Wed, 11 Nov 2020 06:27:10 -0700 Subject: [PATCH] Fixed #31216 -- Added support for colorama terminal colors on Windows. Modern setups on Windows support terminal colors. The colorama library may also be used, as an alternative to the ANSICON library. --- django/core/management/color.py | 39 +++++++++++++++- docs/howto/windows.txt | 18 ++++++++ .../contributing/writing-code/unit-tests.txt | 2 + docs/ref/django-admin.txt | 44 ++++++++++++++++--- docs/releases/3.2.txt | 5 +++ docs/spelling_wordlist | 1 + tests/requirements/py3.txt | 1 + 7 files changed, 102 insertions(+), 8 deletions(-) diff --git a/django/core/management/color.py b/django/core/management/color.py index c626f10034..3227809303 100644 --- a/django/core/management/color.py +++ b/django/core/management/color.py @@ -8,17 +8,52 @@ import sys from django.utils import termcolors +try: + import colorama +except ImportError: + HAS_COLORAMA = False +else: + colorama.init() + HAS_COLORAMA = True + def supports_color(): """ Return True if the running system's terminal supports color, and False otherwise. """ - supported_platform = sys.platform != 'win32' or 'ANSICON' in os.environ + def vt_codes_enabled_in_windows_registry(): + """ + Check the Windows Registry to see if VT code handling has been enabled + by default, see https://superuser.com/a/1300251/447564. + """ + try: + # winreg is only available on Windows. + import winreg + except ImportError: + return False + else: + reg_key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, 'Console') + try: + reg_key_value, _ = winreg.QueryValueEx(reg_key, 'VirtualTerminalLevel') + except FileNotFoundError: + return False + else: + return reg_key_value == 1 # isatty is not always implemented, #6223. is_a_tty = hasattr(sys.stdout, 'isatty') and sys.stdout.isatty() - return supported_platform and is_a_tty + + return is_a_tty and ( + sys.platform != 'win32' or + HAS_COLORAMA or + 'ANSICON' in os.environ or + # Windows Terminal supports VT codes. + 'WT_SESSION' in os.environ or + # Microsoft Visual Studio Code's built-in terminal supports colors. + os.environ.get('TERM_PROGRAM') == 'vscode' or + vt_codes_enabled_in_windows_registry() + ) class Style: diff --git a/docs/howto/windows.txt b/docs/howto/windows.txt index 9149509604..f670293a1c 100644 --- a/docs/howto/windows.txt +++ b/docs/howto/windows.txt @@ -91,6 +91,24 @@ by executing ``django-admin --version`` in the command prompt. See :ref:`database-installation` for information on database installation with Django. +Colored terminal output +======================= + +.. versionadded: 3.2 + +A quality-of-life feature is to output colored (rather than monochrome) output +on the terminal. This should work both on CMD and PowerShell. If for some +reason this needs to be disabled, set the environmental variable +:envvar:`DJANGO_COLORS` to ``nocolor``. + +To enable this, colorama_ must be installed:: + + ...\> py -m pip install colorama + +See :ref:`syntax-coloring` for more information on color settings. + +.. _colorama: https://pypi.org/project/colorama/ + Common pitfalls =============== diff --git a/docs/internals/contributing/writing-code/unit-tests.txt b/docs/internals/contributing/writing-code/unit-tests.txt index 467f4ded70..fef10b2db4 100644 --- a/docs/internals/contributing/writing-code/unit-tests.txt +++ b/docs/internals/contributing/writing-code/unit-tests.txt @@ -273,6 +273,7 @@ dependencies: * argon2-cffi_ 19.1.0+ * asgiref_ 3.2.10+ (required) * bcrypt_ +* colorama_ * docutils_ * geoip2_ * jinja2_ 2.7+ @@ -319,6 +320,7 @@ service. .. _argon2-cffi: https://pypi.org/project/argon2_cffi/ .. _asgiref: https://pypi.org/project/asgiref/ .. _bcrypt: https://pypi.org/project/bcrypt/ +.. _colorama: https://pypi.org/project/colorama/ .. _docutils: https://pypi.org/project/docutils/ .. _geoip2: https://pypi.org/project/geoip2/ .. _jinja2: https://pypi.org/project/jinja2/ diff --git a/docs/ref/django-admin.txt b/docs/ref/django-admin.txt index b5ffcfede8..d45851e88f 100644 --- a/docs/ref/django-admin.txt +++ b/docs/ref/django-admin.txt @@ -1863,10 +1863,44 @@ color-coded output if your terminal supports ANSI-colored output. It won't use the color codes if you're piping the command's output to another program unless the :option:`--force-color` option is used. -Under Windows, the native console doesn't support ANSI escape sequences so by -default there is no color output. But you can install the `ANSICON`_ -third-party tool, the Django commands will detect its presence and will make -use of its services to color output just like on Unix-based platforms. +Windows support +~~~~~~~~~~~~~~~ + +On Windows 10, the `Windows Terminal`_ application, `VS Code`_, and PowerShell +(where virtual terminal processing is enabled) allow colored output, and are +supported by default. + +Under Windows, the legacy ``cmd.exe`` native console doesn't support ANSI +escape sequences so by default there is no color output. In this case either of +two third-party libraries are needed: + +* Install colorama_, a Python package that translates ANSI color codes into + Windows API calls. Django commands will detect its presence and will make use + of its services to color output just like on Unix-based platforms. + ``colorama`` can be installed via pip:: + + ...\> py -m pip install colorama + +* Install `ANSICON`_, a third-party tool that allows ``cmd.exe`` to process + ANSI color codes. Django commands will detect its presence and will make use + of its services to color output just like on Unix-based platforms. + +Other modern terminal environments on Windows, that support terminal colors, +but which are not automatically detected as supported by Django, may "fake" the +installation of ``ANSICON`` by setting the appropriate environmental variable, +``ANSICON="on"``. + +.. versionchanged:: 3.2 + + Updated support for syntax coloring on Windows. + +.. _`Windows Terminal`: https://www.microsoft.com/en-us/p/windows-terminal-preview/9n0dx20hk701 +.. _`VS Code`: https://code.visualstudio.com +.. _ANSICON: http://adoxa.altervista.org/ansicon/ +.. _colorama: https://pypi.org/project/colorama/ + +Custom colors +~~~~~~~~~~~~~ The colors used for syntax highlighting can be customized. Django ships with three color palettes: @@ -1956,8 +1990,6 @@ would specify the use of all the colors in the light color palette, *except* for the colors for errors and notices which would be overridden as specified. -.. _ANSICON: http://adoxa.altervista.org/ansicon/ - Bash completion --------------- diff --git a/docs/releases/3.2.txt b/docs/releases/3.2.txt index f542a4fee9..0a12e2168c 100644 --- a/docs/releases/3.2.txt +++ b/docs/releases/3.2.txt @@ -272,6 +272,11 @@ Management Commands prior to executing the command. In previous versions, either all or none of the system checks were performed. +* Support for colored terminal output on Windows is updated. Various modern + terminal environments are automatically detected, and the options for + enabling support in other cases are improved. See :ref:`syntax-coloring` for + more details. + Migrations ~~~~~~~~~~ diff --git a/docs/spelling_wordlist b/docs/spelling_wordlist index 727d9cf66e..4c9ffc876c 100644 --- a/docs/spelling_wordlist +++ b/docs/spelling_wordlist @@ -476,6 +476,7 @@ postfix postgis postgres postgresql +PowerShell pq pre precisions diff --git a/tests/requirements/py3.txt b/tests/requirements/py3.txt index d5c59b4e30..a51bda55ad 100644 --- a/tests/requirements/py3.txt +++ b/tests/requirements/py3.txt @@ -16,3 +16,4 @@ PyYAML selenium sqlparse >= 0.2.2 tblib >= 1.5.0 +colorama; sys.platform == 'win32'