Fixed #23433 -- Deprecated django-admin.py entry point in favor of django-admin.
Unify on the entry point created by setuptools entry_points feature.
This commit is contained in:
parent
8eb0f73eed
commit
5708327c37
|
@ -1,5 +1,21 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
# When the django-admin.py deprecation ends, remove this script.
|
||||||
|
import warnings
|
||||||
|
|
||||||
from django.core import management
|
from django.core import management
|
||||||
|
|
||||||
|
try:
|
||||||
|
from django.utils.deprecation import RemovedInDjango40Warning
|
||||||
|
except ImportError:
|
||||||
|
raise ImportError(
|
||||||
|
'django-admin.py was deprecated in Django 3.1 and removed in Django '
|
||||||
|
'4.0. Please manually remove this script from your virtual environment '
|
||||||
|
'and use django-admin instead.'
|
||||||
|
)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
warnings.warn(
|
||||||
|
'django-admin.py is deprecated in favor of django-admin.',
|
||||||
|
RemovedInDjango40Warning,
|
||||||
|
)
|
||||||
management.execute_from_command_line()
|
management.execute_from_command_line()
|
||||||
|
|
|
@ -14,15 +14,9 @@ Problems running ``django-admin``
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
:doc:`django-admin </ref/django-admin>` should be on your system path if you
|
:doc:`django-admin </ref/django-admin>` should be on your system path if you
|
||||||
installed Django via ``pip``. If it's not on your path, you can find it in
|
installed Django via ``pip``. If it's not in your path, ensure you have your
|
||||||
``site-packages/django/bin``, where ``site-packages`` is a directory within
|
virtual environment activated and you can try running the equivalent command
|
||||||
your Python installation. Consider symlinking to :doc:`django-admin
|
``python -m django``.
|
||||||
</ref/django-admin>` from some place on your path, such as
|
|
||||||
:file:`/usr/local/bin`.
|
|
||||||
|
|
||||||
If ``django-admin`` doesn't work but ``django-admin.py`` does, you're probably
|
|
||||||
using a version of Django that doesn't match the version of this documentation.
|
|
||||||
``django-admin`` is new in Django 1.7.
|
|
||||||
|
|
||||||
macOS permissions
|
macOS permissions
|
||||||
-----------------
|
-----------------
|
||||||
|
|
|
@ -287,7 +287,7 @@ define some extra description units:
|
||||||
:ticket:`12345`
|
:ticket:`12345`
|
||||||
|
|
||||||
Django's documentation uses a custom ``console`` directive for documenting
|
Django's documentation uses a custom ``console`` directive for documenting
|
||||||
command-line examples involving ``django-admin.py``, ``manage.py``, ``python``,
|
command-line examples involving ``django-admin``, ``manage.py``, ``python``,
|
||||||
etc.). In the HTML documentation, it renders a two-tab UI, with one tab showing
|
etc.). In the HTML documentation, it renders a two-tab UI, with one tab showing
|
||||||
a Unix-style command prompt and a second tab showing a Windows prompt.
|
a Unix-style command prompt and a second tab showing a Windows prompt.
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,8 @@ details on these changes.
|
||||||
* The ``django.db.models.query_utils.InvalidQuery`` exception class will be
|
* The ``django.db.models.query_utils.InvalidQuery`` exception class will be
|
||||||
removed.
|
removed.
|
||||||
|
|
||||||
|
* The ``django-admin.py`` entry point will be removed.
|
||||||
|
|
||||||
See the :ref:`Django 3.1 release notes <deprecated-features-3.1>` for more
|
See the :ref:`Django 3.1 release notes <deprecated-features-3.1>` for more
|
||||||
details on these changes.
|
details on these changes.
|
||||||
|
|
||||||
|
|
|
@ -11,14 +11,8 @@ does the same thing as ``django-admin`` but also sets the
|
||||||
project's ``settings.py`` file.
|
project's ``settings.py`` file.
|
||||||
|
|
||||||
The ``django-admin`` script should be on your system path if you installed
|
The ``django-admin`` script should be on your system path if you installed
|
||||||
Django via ``pip``. If it's not on your path, you can find it in
|
Django via ``pip``. If it's not in your path, ensure you have your virtual
|
||||||
``site-packages/django/bin`` within your Python installation. Consider
|
environment activated.
|
||||||
symlinking it from some place on your path, such as ``/usr/local/bin``.
|
|
||||||
|
|
||||||
For Windows users, who do not have symlinking functionality available, you can
|
|
||||||
copy ``django-admin.exe`` to a location on your existing path or edit the
|
|
||||||
``PATH`` settings (under ``Settings - Control Panel - System - Advanced -
|
|
||||||
Environment...``) to point to its installed location.
|
|
||||||
|
|
||||||
Generally, when working on a single Django project, it's easier to use
|
Generally, when working on a single Django project, it's easier to use
|
||||||
``manage.py`` than ``django-admin``. If you need to switch between multiple
|
``manage.py`` than ``django-admin``. If you need to switch between multiple
|
||||||
|
|
|
@ -384,6 +384,9 @@ Miscellaneous
|
||||||
:class:`~django.core.exceptions.FieldDoesNotExist` and
|
:class:`~django.core.exceptions.FieldDoesNotExist` and
|
||||||
:class:`~django.core.exceptions.FieldError`.
|
:class:`~django.core.exceptions.FieldError`.
|
||||||
|
|
||||||
|
* The ``django-admin.py`` entry point is deprecated in favor of
|
||||||
|
``django-admin``.
|
||||||
|
|
||||||
.. _removed-features-3.1:
|
.. _removed-features-3.1:
|
||||||
|
|
||||||
Features removed in 3.1
|
Features removed in 3.1
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
# #########################################################################
|
# #############################################################################
|
||||||
# This bash script adds tab-completion feature to django-admin.py and
|
# This bash script adds tab-completion feature to django-admin and manage.py.
|
||||||
# manage.py.
|
|
||||||
#
|
#
|
||||||
# Testing it out without installing
|
# Testing it out without installing
|
||||||
# =================================
|
# =================================
|
||||||
|
@ -37,6 +36,7 @@ _django_completion()
|
||||||
COMP_CWORD=$COMP_CWORD \
|
COMP_CWORD=$COMP_CWORD \
|
||||||
DJANGO_AUTO_COMPLETE=1 $1 ) )
|
DJANGO_AUTO_COMPLETE=1 $1 ) )
|
||||||
}
|
}
|
||||||
|
# When the django-admin.py deprecation ends, remove django-admin.py.
|
||||||
complete -F _django_completion -o default django-admin.py manage.py django-admin
|
complete -F _django_completion -o default django-admin.py manage.py django-admin
|
||||||
|
|
||||||
_python_django_completion()
|
_python_django_completion()
|
||||||
|
|
|
@ -34,6 +34,7 @@ project_urls =
|
||||||
[options]
|
[options]
|
||||||
python_requires = >=3.6
|
python_requires = >=3.6
|
||||||
packages = find:
|
packages = find:
|
||||||
|
# When the django-admin.py deprecation ends, remove "scripts".
|
||||||
scripts = django/bin/django-admin.py
|
scripts = django/bin/django-admin.py
|
||||||
include_package_data = true
|
include_package_data = true
|
||||||
zip_safe = false
|
zip_safe = false
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import django
|
||||||
|
from django.test import SimpleTestCase
|
||||||
|
|
||||||
|
|
||||||
|
class DeprecationTests(SimpleTestCase):
|
||||||
|
DEPRECATION_MESSAGE = (
|
||||||
|
b'RemovedInDjango40Warning: django-admin.py is deprecated in favor of '
|
||||||
|
b'django-admin.'
|
||||||
|
)
|
||||||
|
|
||||||
|
def _run_test(self, args):
|
||||||
|
p = subprocess.run(
|
||||||
|
[sys.executable, *args],
|
||||||
|
stdout=subprocess.PIPE,
|
||||||
|
stderr=subprocess.PIPE,
|
||||||
|
check=True,
|
||||||
|
)
|
||||||
|
return p.stdout, p.stderr
|
||||||
|
|
||||||
|
def test_django_admin_py_deprecated(self):
|
||||||
|
django_admin_py = Path(django.__file__).parent / 'bin' / 'django-admin.py'
|
||||||
|
_, err = self._run_test(['-Wd', django_admin_py, '--version'])
|
||||||
|
self.assertIn(self.DEPRECATION_MESSAGE, err)
|
||||||
|
|
||||||
|
def test_main_not_deprecated(self):
|
||||||
|
_, err = self._run_test(['-Wd', '-m', 'django', '--version'])
|
||||||
|
self.assertNotIn(self.DEPRECATION_MESSAGE, err)
|
||||||
|
|
||||||
|
def test_django_admin_py_equivalent_main(self):
|
||||||
|
django_admin_py = Path(django.__file__).parent / 'bin' / 'django-admin.py'
|
||||||
|
django_admin_py_out, _ = self._run_test([django_admin_py, '--version'])
|
||||||
|
django_out, _ = self._run_test(['-m', 'django', '--version'])
|
||||||
|
self.assertEqual(django_admin_py_out, django_out)
|
|
@ -14,7 +14,6 @@ import unittest
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
import django
|
|
||||||
from django import conf, get_version
|
from django import conf, get_version
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.management import (
|
from django.core.management import (
|
||||||
|
@ -125,8 +124,7 @@ class AdminScriptTestCase(SimpleTestCase):
|
||||||
return p.stdout, p.stderr
|
return p.stdout, p.stderr
|
||||||
|
|
||||||
def run_django_admin(self, args, settings_file=None):
|
def run_django_admin(self, args, settings_file=None):
|
||||||
script_dir = os.path.abspath(os.path.join(os.path.dirname(django.__file__), 'bin'))
|
return self.run_test(['-m', 'django', *args], settings_file)
|
||||||
return self.run_test([os.path.join(script_dir, 'django-admin.py'), *args], settings_file)
|
|
||||||
|
|
||||||
def run_manage(self, args, settings_file=None, manage_py=None):
|
def run_manage(self, args, settings_file=None, manage_py=None):
|
||||||
template_manage_py = (
|
template_manage_py = (
|
||||||
|
@ -1898,7 +1896,12 @@ class StartProject(LiveServerTestCase, AdminScriptTestCase):
|
||||||
# running again..
|
# running again..
|
||||||
out, err = self.run_django_admin(args)
|
out, err = self.run_django_admin(args)
|
||||||
self.assertNoOutput(out)
|
self.assertNoOutput(out)
|
||||||
self.assertOutput(err, "already exists")
|
self.assertOutput(
|
||||||
|
err,
|
||||||
|
"CommandError: 'testproject' conflicts with the name of an "
|
||||||
|
"existing Python module and cannot be used as a project name. "
|
||||||
|
"Please try another name.",
|
||||||
|
)
|
||||||
|
|
||||||
def test_invalid_project_name(self):
|
def test_invalid_project_name(self):
|
||||||
"Make sure the startproject management command validates a project name"
|
"Make sure the startproject management command validates a project name"
|
||||||
|
@ -2160,8 +2163,10 @@ class StartApp(AdminScriptTestCase):
|
||||||
)
|
)
|
||||||
|
|
||||||
def test_overlaying_app(self):
|
def test_overlaying_app(self):
|
||||||
self.run_django_admin(['startapp', 'app1'])
|
# Use a subdirectory so it is outside the PYTHONPATH.
|
||||||
out, err = self.run_django_admin(['startapp', 'app2', 'app1'])
|
os.makedirs(os.path.join(self.test_dir, 'apps/app1'))
|
||||||
|
self.run_django_admin(['startapp', 'app1', 'apps/app1'])
|
||||||
|
out, err = self.run_django_admin(['startapp', 'app2', 'apps/app1'])
|
||||||
self.assertOutput(
|
self.assertOutput(
|
||||||
err,
|
err,
|
||||||
"already exists. Overlaying an app into an existing directory "
|
"already exists. Overlaying an app into an existing directory "
|
||||||
|
@ -2261,11 +2266,6 @@ class Dumpdata(AdminScriptTestCase):
|
||||||
class MainModule(AdminScriptTestCase):
|
class MainModule(AdminScriptTestCase):
|
||||||
"""python -m django works like django-admin."""
|
"""python -m django works like django-admin."""
|
||||||
|
|
||||||
def test_runs_django_admin(self):
|
|
||||||
cmd_out, _ = self.run_django_admin(['--version'])
|
|
||||||
mod_out, _ = self.run_test(['-m', 'django', '--version'])
|
|
||||||
self.assertEqual(mod_out, cmd_out)
|
|
||||||
|
|
||||||
def test_program_name_in_help(self):
|
def test_program_name_in_help(self):
|
||||||
out, err = self.run_test(['-m', 'django', 'help'])
|
out, err = self.run_test(['-m', 'django', 'help'])
|
||||||
self.assertOutput(out, "Type 'python -m django help <subcommand>' for help on a specific subcommand.")
|
self.assertOutput(out, "Type 'python -m django help <subcommand>' for help on a specific subcommand.")
|
||||||
|
|
Loading…
Reference in New Issue