mirror of
https://github.com/django/django.git
synced 2025-06-14 07:59:12 +00:00
Merge branch 'main' into ticket_27587
This commit is contained in:
commit
3315497633
@ -84,7 +84,6 @@ class TemplateCommand(BaseCommand):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def handle(self, app_or_project, name, target=None, **options):
|
def handle(self, app_or_project, name, target=None, **options):
|
||||||
self.written_files = []
|
|
||||||
self.app_or_project = app_or_project
|
self.app_or_project = app_or_project
|
||||||
self.a_or_an = "an" if app_or_project == "app" else "a"
|
self.a_or_an = "an" if app_or_project == "app" else "a"
|
||||||
self.paths_to_remove = []
|
self.paths_to_remove = []
|
||||||
@ -209,7 +208,6 @@ class TemplateCommand(BaseCommand):
|
|||||||
else:
|
else:
|
||||||
shutil.copyfile(old_path, new_path)
|
shutil.copyfile(old_path, new_path)
|
||||||
|
|
||||||
self.written_files.append(new_path)
|
|
||||||
if self.verbosity >= 2:
|
if self.verbosity >= 2:
|
||||||
self.stdout.write("Creating %s" % new_path)
|
self.stdout.write("Creating %s" % new_path)
|
||||||
try:
|
try:
|
||||||
@ -232,7 +230,7 @@ class TemplateCommand(BaseCommand):
|
|||||||
else:
|
else:
|
||||||
shutil.rmtree(path_to_remove)
|
shutil.rmtree(path_to_remove)
|
||||||
|
|
||||||
run_formatters(self.written_files, **formatter_paths)
|
run_formatters([top_dir], **formatter_paths)
|
||||||
|
|
||||||
def handle_template(self, template, subdir):
|
def handle_template(self, template, subdir):
|
||||||
"""
|
"""
|
||||||
|
@ -255,7 +255,7 @@ patches. Those patches will typically exist as pull requests on GitHub and
|
|||||||
can be easily integrated into your local repository::
|
can be easily integrated into your local repository::
|
||||||
|
|
||||||
git checkout -b pull_xxxxx upstream/main
|
git checkout -b pull_xxxxx upstream/main
|
||||||
curl https://github.com/django/django/pull/xxxxx.patch | git am
|
curl -L https://github.com/django/django/pull/xxxxx.patch | git am
|
||||||
|
|
||||||
This will create a new branch and then apply the changes from the pull request
|
This will create a new branch and then apply the changes from the pull request
|
||||||
to it. At this point you can run the tests or do anything else you need to
|
to it. At this point you can run the tests or do anything else you need to
|
||||||
|
@ -407,7 +407,7 @@ Once you're in the shell, explore the :doc:`database API </topics/db/queries>`::
|
|||||||
>>> q.question_text
|
>>> q.question_text
|
||||||
"What's new?"
|
"What's new?"
|
||||||
>>> q.pub_date
|
>>> q.pub_date
|
||||||
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
|
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc)
|
||||||
|
|
||||||
# Change values by changing the attributes, then calling save().
|
# Change values by changing the attributes, then calling save().
|
||||||
>>> q.question_text = "What's up?"
|
>>> q.question_text = "What's up?"
|
||||||
|
@ -721,8 +721,8 @@ Usage example::
|
|||||||
{'date': datetime.date(2014, 6, 15),
|
{'date': datetime.date(2014, 6, 15),
|
||||||
'day': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=zoneinfo.ZoneInfo('Australia/Melbourne')),
|
'day': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=zoneinfo.ZoneInfo('Australia/Melbourne')),
|
||||||
'hour': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=zoneinfo.ZoneInfo('Australia/Melbourne')),
|
'hour': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=zoneinfo.ZoneInfo('Australia/Melbourne')),
|
||||||
'minute': 'minute': datetime.datetime(2014, 6, 15, 14, 30, tzinfo=zoneinfo.ZoneInfo('UTC')),
|
'minute': 'minute': datetime.datetime(2014, 6, 15, 14, 30, tzinfo=timezone.utc),
|
||||||
'second': datetime.datetime(2014, 6, 15, 14, 30, 50, tzinfo=zoneinfo.ZoneInfo('UTC'))
|
'second': datetime.datetime(2014, 6, 15, 14, 30, 50, tzinfo=timezone.utc)
|
||||||
}
|
}
|
||||||
|
|
||||||
``TimeField`` truncation
|
``TimeField`` truncation
|
||||||
|
@ -1659,8 +1659,8 @@ one, doing so will result in an error.
|
|||||||
have measured that the difference between returning the fields you need and
|
have measured that the difference between returning the fields you need and
|
||||||
the full set of fields for the model will be significant.
|
the full set of fields for the model will be significant.
|
||||||
|
|
||||||
Even if you think you are in the advanced use-case situation, **only use
|
Even if you think you are in the advanced use-case situation, **only use**
|
||||||
``defer()`` when you cannot, at queryset load time, determine if you will
|
``defer()`` **when you cannot, at queryset load time, determine if you will
|
||||||
need the extra fields or not**. If you are frequently loading and using a
|
need the extra fields or not**. If you are frequently loading and using a
|
||||||
particular subset of your data, the best choice you can make is to
|
particular subset of your data, the best choice you can make is to
|
||||||
normalize your models and put the non-loaded data into a separate model
|
normalize your models and put the non-loaded data into a separate model
|
||||||
|
@ -80,7 +80,7 @@ Argument Value
|
|||||||
arguments passed to ``__init__()``)
|
arguments passed to ``__init__()``)
|
||||||
|
|
||||||
``kwargs`` ``{'question_text': "What's new?",``
|
``kwargs`` ``{'question_text': "What's new?",``
|
||||||
``'pub_date': datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)}``
|
``'pub_date': datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=datetime.timezone.utc)}``
|
||||||
========== ===============================================================
|
========== ===============================================================
|
||||||
|
|
||||||
``post_init``
|
``post_init``
|
||||||
|
@ -9,4 +9,6 @@ Django 4.1.3 fixes several bugs in 4.1.2.
|
|||||||
Bugfixes
|
Bugfixes
|
||||||
========
|
========
|
||||||
|
|
||||||
* ...
|
* Fixed a bug in Django 4.1 that caused non-Python files created by
|
||||||
|
``startproject`` and ``startapp`` management commands from custom templates
|
||||||
|
to be incorrectly formatted using the ``black`` command (:ticket:`34085`).
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
# Should not be processed by `black`.
|
||||||
|
Django<4.2
|
||||||
|
environs[django]
|
||||||
|
psycopg2-binary
|
||||||
|
django-extensions
|
@ -2483,6 +2483,23 @@ class StartProject(LiveServerTestCase, AdminScriptTestCase):
|
|||||||
self.assertTrue(os.path.isdir(testproject_dir))
|
self.assertTrue(os.path.isdir(testproject_dir))
|
||||||
self.assertTrue(os.path.exists(os.path.join(testproject_dir, "additional_dir")))
|
self.assertTrue(os.path.exists(os.path.join(testproject_dir, "additional_dir")))
|
||||||
|
|
||||||
|
def test_custom_project_template_non_python_files_not_formatted(self):
|
||||||
|
template_path = os.path.join(custom_templates_dir, "project_template")
|
||||||
|
args = ["startproject", "--template", template_path, "customtestproject"]
|
||||||
|
testproject_dir = os.path.join(self.test_dir, "customtestproject")
|
||||||
|
|
||||||
|
_, err = self.run_django_admin(args)
|
||||||
|
self.assertNoOutput(err)
|
||||||
|
with open(
|
||||||
|
os.path.join(template_path, "additional_dir", "requirements.in")
|
||||||
|
) as f:
|
||||||
|
expected = f.read()
|
||||||
|
with open(
|
||||||
|
os.path.join(testproject_dir, "additional_dir", "requirements.in")
|
||||||
|
) as f:
|
||||||
|
result = f.read()
|
||||||
|
self.assertEqual(expected, result)
|
||||||
|
|
||||||
def test_template_dir_with_trailing_slash(self):
|
def test_template_dir_with_trailing_slash(self):
|
||||||
"Ticket 17475: Template dir passed has a trailing path separator"
|
"Ticket 17475: Template dir passed has a trailing path separator"
|
||||||
template_path = os.path.join(custom_templates_dir, "project_template" + os.sep)
|
template_path = os.path.join(custom_templates_dir, "project_template" + os.sep)
|
||||||
|
@ -41,6 +41,14 @@ try:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
argon2 = None
|
argon2 = None
|
||||||
|
|
||||||
|
# scrypt requires OpenSSL 1.1+
|
||||||
|
try:
|
||||||
|
import hashlib
|
||||||
|
|
||||||
|
scrypt = hashlib.scrypt
|
||||||
|
except ImportError:
|
||||||
|
scrypt = None
|
||||||
|
|
||||||
|
|
||||||
class PBKDF2SingleIterationHasher(PBKDF2PasswordHasher):
|
class PBKDF2SingleIterationHasher(PBKDF2PasswordHasher):
|
||||||
iterations = 1
|
iterations = 1
|
||||||
@ -797,6 +805,7 @@ class TestUtilsHashPassArgon2(SimpleTestCase):
|
|||||||
setattr(hasher, attr, old_value)
|
setattr(hasher, attr, old_value)
|
||||||
|
|
||||||
|
|
||||||
|
@skipUnless(scrypt, "scrypt not available")
|
||||||
@override_settings(PASSWORD_HASHERS=PASSWORD_HASHERS)
|
@override_settings(PASSWORD_HASHERS=PASSWORD_HASHERS)
|
||||||
class TestUtilsHashPassScrypt(SimpleTestCase):
|
class TestUtilsHashPassScrypt(SimpleTestCase):
|
||||||
def test_scrypt(self):
|
def test_scrypt(self):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user