#28144: Add allow_overwrite kwarg to FileSystemStorage._save
-------------------------------------+-------------------------------------
Reporter: Jon | Owner: nobody
Prindiville |
Type: New | Status: new
feature |
Component: File | Version: 1.11
uploads/storage | Keywords: file storage
Severity: Normal | overwrite
Triage Stage: | Has patch: 0
Unreviewed |
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-------------------------------------+-------------------------------------
I want to be able to construct a filesystem storage backend that will let
me overwrite files while still leveraging `FileSystemStorage`.
This set of changes
(https://github.com/django/django/compare/master...jonprindiville
:filesystemstorage-allow-overwrite) would enable that without changing any
of the default behaviour of `FileSystemStorage`. In addition to the new
kwarg, this adds a test for the existing ''no-overwriting'' behaviour, and
a test for the newly enabled ''overwriting'' behaviour.
I'm not sure about what I should enter here for "Version" (could go in
anywhere, really) and "Has patch" (I don't have a patch, but I do have a
PR-able branch, linked above. I am assuming that I should wait for review
here before actually submitting a PR, though)
=== HOW?
Just add an `allow_overwrite` kwarg to `FileSystemStorage._save` that a
subclasser can optionally take advantage of.
=== WHY?
You can't do this in a good way today.
A piece of advice I've seen in several places (see [#refs Refs]) for
creating an overwriting storage backend is to create a subclass of
`FileSystemStorage` where the `get_available_name` deletes an existing
file of the same name. This, in my opinion, is a sneaky use of this
function, based on the name. I guess it works, but that function is not
called `get_available_name_and_maybe_delete_some_stuff_also`
A less sneaky (but more race-conditiony) implementation I have seen is to
have `_save` delete the existing file before calling
`FileSystemStorage._save`.
One of these is deceptive and one loops forever if you're unlucky.
=== [=#refs Refs]:
Various incarnations of this "ovewriting" implementation:
- django-storages, marked as deprecated (https://github.com/jschneier
/django-storages/blob/1.5.2/storages/backends/overwrite.py)
- djangosnippets (https://djangosnippets.org/snippets/976/)
- someone's gist (https://gist.github.com/fabiomontefuscolo/1584462)
- django-overwrite-storage (https://github.com/ckot/django-overwrite-
storage/blob/master/overwrite_storage/storage.py)
--
Ticket URL: <https://code.djangoproject.com/ticket/28144>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/057.4ab611fdda396330de968b5b74b00c9f%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.