mirror of
https://github.com/django/django.git
synced 2025-03-31 19:46:42 +00:00
Fixed #13518 -- Added FILE_UPLOAD_DIRECTORY_PERMISSIONS setting
This setting does for new directories what FILE_UPLOAD_PERMISSIONS does for new files. Thanks jacob@ for the suggestion.
This commit is contained in:
parent
ab680725bf
commit
6bdb3b1135
@ -313,6 +313,11 @@ FILE_UPLOAD_TEMP_DIR = None
|
|||||||
# you'd pass directly to os.chmod; see http://docs.python.org/lib/os-file-dir.html.
|
# you'd pass directly to os.chmod; see http://docs.python.org/lib/os-file-dir.html.
|
||||||
FILE_UPLOAD_PERMISSIONS = None
|
FILE_UPLOAD_PERMISSIONS = None
|
||||||
|
|
||||||
|
# The numeric mode to assign to newly-created directories, when uploading files.
|
||||||
|
# The value should be a mode as you'd pass to os.chmod;
|
||||||
|
# see http://docs.python.org/lib/os-file-dir.html.
|
||||||
|
FILE_UPLOAD_DIRECTORY_PERMISSIONS = None
|
||||||
|
|
||||||
# Python module path where user will place custom format definition.
|
# Python module path where user will place custom format definition.
|
||||||
# The directory where this setting is pointing should contain subdirectories
|
# The directory where this setting is pointing should contain subdirectories
|
||||||
# named as the locales, containing a formats.py file
|
# named as the locales, containing a formats.py file
|
||||||
|
@ -172,7 +172,16 @@ class FileSystemStorage(Storage):
|
|||||||
directory = os.path.dirname(full_path)
|
directory = os.path.dirname(full_path)
|
||||||
if not os.path.exists(directory):
|
if not os.path.exists(directory):
|
||||||
try:
|
try:
|
||||||
os.makedirs(directory)
|
if settings.FILE_UPLOAD_DIRECTORY_PERMISSIONS is not None:
|
||||||
|
# os.makedirs applies the global umask, so we reset it,
|
||||||
|
# for consistency with FILE_UPLOAD_PERMISSIONS behavior.
|
||||||
|
old_umask = os.umask(0)
|
||||||
|
try:
|
||||||
|
os.makedirs(directory, settings.FILE_UPLOAD_DIRECTORY_PERMISSIONS)
|
||||||
|
finally:
|
||||||
|
os.umask(old_umask)
|
||||||
|
else:
|
||||||
|
os.makedirs(directory)
|
||||||
except OSError as e:
|
except OSError as e:
|
||||||
if e.errno != errno.EEXIST:
|
if e.errno != errno.EEXIST:
|
||||||
raise
|
raise
|
||||||
|
@ -1108,6 +1108,19 @@ Default: ``2621440`` (i.e. 2.5 MB).
|
|||||||
The maximum size (in bytes) that an upload will be before it gets streamed to
|
The maximum size (in bytes) that an upload will be before it gets streamed to
|
||||||
the file system. See :doc:`/topics/files` for details.
|
the file system. See :doc:`/topics/files` for details.
|
||||||
|
|
||||||
|
.. setting:: FILE_UPLOAD_DIRECTORY_PERMISSIONS
|
||||||
|
|
||||||
|
FILE_UPLOAD_DIRECTORY_PERMISSIONS
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
.. versionadded:: 1.7
|
||||||
|
|
||||||
|
Default: ``None``
|
||||||
|
|
||||||
|
The numeric mode to apply to directories created in the process of
|
||||||
|
uploading files. This value mirrors the functionality and caveats of
|
||||||
|
the :setting:`FILE_UPLOAD_PERMISSIONS` setting.
|
||||||
|
|
||||||
.. setting:: FILE_UPLOAD_PERMISSIONS
|
.. setting:: FILE_UPLOAD_PERMISSIONS
|
||||||
|
|
||||||
FILE_UPLOAD_PERMISSIONS
|
FILE_UPLOAD_PERMISSIONS
|
||||||
|
@ -138,6 +138,10 @@ Minor features
|
|||||||
* The :func:`~django.contrib.auth.decorators.permission_required` decorator can
|
* The :func:`~django.contrib.auth.decorators.permission_required` decorator can
|
||||||
take a list of permissions as well as a single permission.
|
take a list of permissions as well as a single permission.
|
||||||
|
|
||||||
|
* The new :setting:`FILE_UPLOAD_DIRECTORY_PERMISSIONS` setting controls
|
||||||
|
the file system permissions of directories created during file upload, like
|
||||||
|
:setting:`FILE_UPLOAD_PERMISSIONS` does for the files themselves.
|
||||||
|
|
||||||
Backwards incompatible changes in 1.7
|
Backwards incompatible changes in 1.7
|
||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ upload behavior.
|
|||||||
Changing upload handler behavior
|
Changing upload handler behavior
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
|
||||||
Three settings control Django's file upload behavior:
|
There are a few settings which control Django's file upload behavior:
|
||||||
|
|
||||||
:setting:`FILE_UPLOAD_MAX_MEMORY_SIZE`
|
:setting:`FILE_UPLOAD_MAX_MEMORY_SIZE`
|
||||||
The maximum size, in bytes, for files that will be uploaded into memory.
|
The maximum size, in bytes, for files that will be uploaded into memory.
|
||||||
@ -167,6 +167,11 @@ Three settings control Django's file upload behavior:
|
|||||||
|
|
||||||
**Always prefix the mode with a 0.**
|
**Always prefix the mode with a 0.**
|
||||||
|
|
||||||
|
:setting:`FILE_UPLOAD_DIRECTORY_PERMISSIONS`
|
||||||
|
The numeric mode to apply to directories created in the process of
|
||||||
|
uploading files. This value mirrors the functionality and caveats of
|
||||||
|
the :setting:`FILE_UPLOAD_PERMISSIONS` setting.
|
||||||
|
|
||||||
:setting:`FILE_UPLOAD_HANDLERS`
|
:setting:`FILE_UPLOAD_HANDLERS`
|
||||||
The actual handlers for uploaded files. Changing this setting allows
|
The actual handlers for uploaded files. Changing this setting allows
|
||||||
complete customization -- even replacement -- of Django's upload
|
complete customization -- even replacement -- of Django's upload
|
||||||
|
@ -462,6 +462,18 @@ class FileStoragePermissions(unittest.TestCase):
|
|||||||
mode = os.stat(self.storage.path(fname))[0] & 0o777
|
mode = os.stat(self.storage.path(fname))[0] & 0o777
|
||||||
self.assertEqual(mode, 0o666 & ~self.umask)
|
self.assertEqual(mode, 0o666 & ~self.umask)
|
||||||
|
|
||||||
|
@override_settings(FILE_UPLOAD_DIRECTORY_PERMISSIONS=0o765)
|
||||||
|
def test_file_upload_directory_permissions(self):
|
||||||
|
name = self.storage.save("the_directory/the_file", ContentFile("data"))
|
||||||
|
dir_mode = os.stat(os.path.dirname(self.storage.path(name)))[0] & 0o777
|
||||||
|
self.assertEqual(dir_mode, 0o765)
|
||||||
|
|
||||||
|
@override_settings(FILE_UPLOAD_DIRECTORY_PERMISSIONS=None)
|
||||||
|
def test_file_upload_directory_default_permissions(self):
|
||||||
|
name = self.storage.save("the_directory/the_file", ContentFile("data"))
|
||||||
|
dir_mode = os.stat(os.path.dirname(self.storage.path(name)))[0] & 0o777
|
||||||
|
self.assertEqual(dir_mode, 0o777 & ~self.umask)
|
||||||
|
|
||||||
class FileStoragePathParsing(unittest.TestCase):
|
class FileStoragePathParsing(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.storage_dir = tempfile.mkdtemp()
|
self.storage_dir = tempfile.mkdtemp()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user