Code

Opened 6 years ago

Closed 6 years ago

#7843 closed (fixed)

r7986 breaks uploaded files stored in date-based directories

Reported by: carljm Owned by: nobody
Component: Database layer (models, ORM) Version: master
Severity: Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation:
Needs tests: Patch needs improvement:
Easy pickings: UI/UX:

Description

After updating to a Django revision post- [7986], get_FIELD_url is broken for all FileField and ImageField uploads using an upload_to with date-based directory parts.

[7986] updates get_FIELD_url to call field.get_filename on the DB-stored path. field.get_filename only uses the basename of its argument, and calls field.get_directory_name for the directory part. field.get_directory_name uses datetime.now() for interpolating the date parts into upload_to.

From django/db/models/fields/init.py:

    def get_directory_name(self):
        return os.path.normpath(force_unicode(datetime.datetime.now().strftime(

    def get_filename(self, filename):
        from django.utils.text import get_valid_filename
        f = os.path.join(self.get_directory_name(), get_valid_filename(os.path.
        return os.path.normpath(f)

This means that instead of returning a URL with the correct path that is stored in the DB, get_FIELD_url now returns a URL that always has the current date interpolated into it. For any file uploaded before today, that will be a broken link.

This is a showstopper bug; please revert [7986] as quickly as possible.

Attachments (0)

Change History (1)

comment:1 Changed 6 years ago by mtredinnick

  • Resolution set to fixed
  • Status changed from new to closed

(In [7998]) Reverted [7986].

It turns out that we need to treat filename creation/display (in
particular, the upload_to path) differently depending upon whether the value is
out of the database or provided by other code and there's no reliable way to
determine that at the moment (although some later proposed changes might alter
that). So calling get_FIELD_filename on an unsaved model with a changed file
attribute will not necessarily return the same result as after the save().

Refs #5619. Fixed #7843.

Add Comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
as The resolution will be set. Next status will be 'closed'
The resolution will be deleted. Next status will be 'new'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.