#32845: Names of uploaded files cannot be modified.
-------------------------------------+-------------------------------------
     Reporter:  Jacob Fredericksen   |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  File                 |                  Version:  3.2
  uploads/storage                    |
     Severity:  Normal               |               Resolution:
     Keywords:                       |             Triage Stage:
                                     |  Unreviewed
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Description changed by Jacob Fredericksen:

Old description:

> According to the Django docs
> (https://docs.djangoproject.com/en/3.2/topics/files/), I should be able
> to update the name of an uploaded file like so:
>
> >>> import os
> >>> from django.conf import settings
> >>> initial_path = car.photo.path
> >>> car.photo.name = 'cars/chevy_ii.jpg'
> >>> new_path = settings.MEDIA_ROOT + car.photo.name
> >>> # Move the file on the filesystem
> >>> os.rename(initial_path, new_path)
> >>> car.save()
> >>> car.photo.path
> '/media/cars/chevy_ii.jpg'
> >>> car.photo.path == new_path
> True
>
> This does not work.
>
> Here is the script I used to test:
>
> {{{
>             ...
>             new_filename = 'sources/new_filename.pdf
>             initial_filepath = model_instance.file.path
>             assert os.path.exists(initial_filepath)
>             new_filepath = os.path.join(settings.MEDIA_ROOT,
> new_filename)
>             input(
>                 f'{model_instance.file.name} ---> {new_filename}\n'
>                 f'{initial_filepath} ---> {new_filepath} '
>             )
>             if os.path.exists(new_filepath):
>                 raise Exception(f'{new_filepath} already exists.')
>             f.file.name = new_filename
>             assert os.path.exists(initial_filepath)
>             os.rename(initial_filepath, new_filepath)
>             sleep(5)
>             assert os.path.exists(new_filepath)
>             assert not os.path.exists(initial_filepath)
>             assert model_instance.file.name == new_filename
>             input('Continue? ')
>             model_instance.save()
>             model_instance.refresh_from_db()
>             assert model_instance.file.path == new_filepath,
> f'{model_instance.file.path} != {new_filepath}'
>             print()
> }}}
>

> Result:
>
> {{{
> sources/old_filename.pdf ---> sources/new_filename.pdf
> /project/media/sources/old_filename.pdf --->
> /project/media/sources/new_filename.pdf
> Continue?
> Traceback (most recent call last):
>   File "/project/my_script.py", line 108, in <module>
>     assert model_instance.file.path == new_filepath,
> f'{model_instance.file.path} != {new_filepath}'
> AssertionError: /project/media/sources/old_filename.pdf !=
> /project/media/sources/new_filename.pdf
> }}}
>
> I watched the file name (in my file browser) as the script ran. The file
> name is successfully changed (as demonstrated by the successful
> assertions above), but it is then reverted to the original file name when
> the model instance is saved. This would seem to indicate that contrary to
> the docs, in order to rename a file that is associated with a model
> instance (as an ImageField or FileField), it is not sufficient to update
> model_instance.file.name and then use the os module to rename the file.

New description:

 According to the Django docs
 (https://docs.djangoproject.com/en/3.2/topics/files/), I should be able to
 update the name of an uploaded file like so:

 {{{
 import os
 from django.conf import settings
 initial_path = car.photo.path
 car.photo.name = 'cars/chevy_ii.jpg'
 new_path = settings.MEDIA_ROOT + car.photo.name
 # Move the file on the filesystem
 os.rename(initial_path, new_path)
 car.save()
 car.photo.path
 '/media/cars/chevy_ii.jpg'
 car.photo.path == new_path
 True
 }}}


 This does not work.

 Here is the script I used to test:

 {{{
             ...
             new_filename = 'sources/new_filename.pdf
             initial_filepath = model_instance.file.path
             assert os.path.exists(initial_filepath)
             new_filepath = os.path.join(settings.MEDIA_ROOT, new_filename)
             input(
                 f'{model_instance.file.name} ---> {new_filename}\n'
                 f'{initial_filepath} ---> {new_filepath} '
             )
             if os.path.exists(new_filepath):
                 raise Exception(f'{new_filepath} already exists.')
             f.file.name = new_filename
             assert os.path.exists(initial_filepath)
             os.rename(initial_filepath, new_filepath)
             sleep(5)
             assert os.path.exists(new_filepath)
             assert not os.path.exists(initial_filepath)
             assert model_instance.file.name == new_filename
             input('Continue? ')
             model_instance.save()
             model_instance.refresh_from_db()
             assert model_instance.file.path == new_filepath,
 f'{model_instance.file.path} != {new_filepath}'
             print()
 }}}


 Result:

 {{{
 sources/old_filename.pdf ---> sources/new_filename.pdf
 /project/media/sources/old_filename.pdf --->
 /project/media/sources/new_filename.pdf
 Continue?
 Traceback (most recent call last):
   File "/project/my_script.py", line 108, in <module>
     assert model_instance.file.path == new_filepath,
 f'{model_instance.file.path} != {new_filepath}'
 AssertionError: /project/media/sources/old_filename.pdf !=
 /project/media/sources/new_filename.pdf
 }}}

 I watched the file name (in my file browser) as the script ran. The file
 name is successfully changed (as demonstrated by the successful assertions
 above), but it is then reverted to the original file name when the model
 instance is saved. This would seem to indicate that contrary to the docs,
 in order to rename a file that is associated with a model instance (as an
 ImageField or FileField), it is not sufficient to update
 model_instance.file.name and then use the os module to rename the file.

--

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32845#comment:1>
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/067.cca98252870e90f64963ea976fa11e69%40djangoproject.com.

Reply via email to