Commit 7e2d61a9 authored by Vajrasky Kok's avatar Vajrasky Kok Committed by Tim Graham
Browse files

Fixed #21380 -- Added a way to set different permission for static directories.

Previously when collecting static files, the directories would receive permissions
from the global umask. Now the default permission comes from FILE_UPLOAD_DIRECTORY_PERMISSIONS
and there's an option to specify the permissions by subclassing any of the
static files storage classes and setting the directory_permissions_mode parameter.
parent 42ac1380
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -294,12 +294,6 @@ Type 'yes' to continue, or 'no' to cancel: """
            self.log("Pretending to copy '%s'" % source_path, level=1)
        else:
            self.log("Copying '%s'" % source_path, level=1)
            if self.local:
                full_path = self.storage.path(prefixed_path)
                try:
                    os.makedirs(os.path.dirname(full_path))
                except OSError:
                    pass
            with source_storage.open(path) as source_file:
                self.storage.save(prefixed_path, source_file)
        if not prefixed_path in self.copied_files:
+9 −4
Original line number Diff line number Diff line
@@ -149,7 +149,8 @@ class FileSystemStorage(Storage):
    Standard filesystem storage
    """

    def __init__(self, location=None, base_url=None, file_permissions_mode=None):
    def __init__(self, location=None, base_url=None, file_permissions_mode=None,
            directory_permissions_mode=None):
        if location is None:
            location = settings.MEDIA_ROOT
        self.base_location = location
@@ -161,6 +162,10 @@ class FileSystemStorage(Storage):
            file_permissions_mode if file_permissions_mode is not None
            else settings.FILE_UPLOAD_PERMISSIONS
        )
        self.directory_permissions_mode = (
            directory_permissions_mode if directory_permissions_mode is not None
            else settings.FILE_UPLOAD_DIRECTORY_PERMISSIONS
        )

    def _open(self, name, mode='rb'):
        return File(open(self.path(name), mode))
@@ -175,12 +180,12 @@ class FileSystemStorage(Storage):
        directory = os.path.dirname(full_path)
        if not os.path.exists(directory):
            try:
                if settings.FILE_UPLOAD_DIRECTORY_PERMISSIONS is not None:
                if self.directory_permissions_mode is not None:
                    # os.makedirs applies the global umask, so we reset it,
                    # for consistency with FILE_UPLOAD_PERMISSIONS behavior.
                    # for consistency with file_permissions_mode behavior.
                    old_umask = os.umask(0)
                    try:
                        os.makedirs(directory, settings.FILE_UPLOAD_DIRECTORY_PERMISSIONS)
                        os.makedirs(directory, self.directory_permissions_mode)
                    finally:
                        os.umask(old_umask)
                else:
+11 −7
Original line number Diff line number Diff line
@@ -60,16 +60,19 @@ by the :class:`~django.contrib.staticfiles.storage.CachedStaticFilesStorage`
by default.

By default, collected files receive permissions from
:setting:`FILE_UPLOAD_PERMISSIONS`. If you would like different permissions for
these files, you can subclass either of the :ref:`static files storage
classes <staticfiles-storages>` and specify the ``file_permissions_mode``
parameter. For example::
:setting:`FILE_UPLOAD_PERMISSIONS` and collected directories receive permissions
from :setting:`FILE_UPLOAD_DIRECTORY_PERMISSIONS`. If you would like different
permissions for these files and/or directories, you can subclass either of the
:ref:`static files storage classes <staticfiles-storages>` and specify the
``file_permissions_mode`` and/or ``directory_permissions_mode`` parameters,
respectively. For example::

    from django.contrib.staticfiles import storage

    class MyStaticFilesStorage(storage.StaticFilesStorage):
        def __init__(self, *args, **kwargs):
            kwargs['file_permissions_mode'] = 0o640
            kwargs['directory_permissions_mode'] = 0o760
            super(CustomStaticFilesStorage, self).__init__(*args, **kwargs)

Then set the :setting:`STATICFILES_STORAGE` setting to
@@ -77,9 +80,10 @@ Then set the :setting:`STATICFILES_STORAGE` setting to

.. versionadded:: 1.7

    The ability to override ``file_permissions_mode`` is new in Django 1.7.
    Previously the file permissions always used
    :setting:`FILE_UPLOAD_PERMISSIONS`.
    The ability to override ``file_permissions_mode`` and
    ``directory_permissions_mode`` is new in Django 1.7.  Previously the file
    permissions always used :setting:`FILE_UPLOAD_PERMISSIONS` and the directory
    permissions always used :setting:`FILE_UPLOAD_DIRECTORY_PERMISSIONS`.

.. highlight:: console

+12 −1
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ Django provides two convenient ways to access the current storage class:
The FileSystemStorage Class
---------------------------

.. class:: FileSystemStorage([location=None, base_url=None, file_permissions_mode=None])
.. class:: FileSystemStorage([location=None, base_url=None, file_permissions_mode=None, directory_permissions_mode=None])

    The :class:`~django.core.files.storage.FileSystemStorage` class implements
    basic file storage on a local filesystem. It inherits from
@@ -46,6 +46,17 @@ The FileSystemStorage Class
            The ``file_permissions_mode`` attribute was added. Previously files
            always received :setting:`FILE_UPLOAD_PERMISSIONS` permissions.

    .. attribute:: directory_permissions_mode

        The file system permissions that the directory will receive when it is
        saved. Defaults to :setting:`FILE_UPLOAD_DIRECTORY_PERMISSIONS`.

        .. versionadded:: 1.7

            The ``directory_permissions_mode`` attribute was added. Previously
            directories always received
            :setting:`FILE_UPLOAD_DIRECTORY_PERMISSIONS` permissions.

    .. note::

        The ``FileSystemStorage.delete()`` method will not raise
+10 −4
Original line number Diff line number Diff line
@@ -1135,9 +1135,15 @@ FILE_UPLOAD_DIRECTORY_PERMISSIONS

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.
The numeric mode to apply to directories created in the process of uploading
files.

This setting also determines the default permissions for collected static
directories when using the :djadmin:`collectstatic` management command. See
:djadmin:`collectstatic` for details on overriding it.

This value mirrors the functionality and caveats of the
:setting:`FILE_UPLOAD_PERMISSIONS` setting.

.. setting:: FILE_UPLOAD_PERMISSIONS

@@ -1157,7 +1163,7 @@ system's standard umask.

This setting also determines the default permissions for collected static files
when using the :djadmin:`collectstatic` management command. See
:djadmin:`collectstatic` for details on overridding it.
:djadmin:`collectstatic` for details on overriding it.

.. warning::

Loading