Projet

Général

Profil

Development #33959

crash sur vignettage d'un fichier inexistant

Ajouté par Frédéric Péters il y a presque 5 ans. Mis à jour il y a plus de 4 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
13 juin 2019
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

File "/usr/lib/python2.7/dist-packages/combo/apps/assets/templatetags/assets.py" in asset_url
  55.     if not geometry_string or asset.file.name.endswith('svg'):

File "/usr/lib/python2.7/dist-packages/django/db/models/fields/files.py" in _get_file
  51.             self._file = self.storage.open(self.name, 'rb')

File "/usr/lib/python2.7/dist-packages/django/core/files/storage.py" in open
  38.         return self._open(name, mode)

File "/usr/lib/python2.7/dist-packages/django/core/files/storage.py" in _open
  300.         return File(open(self.path(name), mode))

Exception Type: IOError at /
Exception Value: [Errno 2] No such file or directory: u'/var/lib/combo/tenants/.../media/assets/station-839208_640.jpg'

Dans ce cas retourner asset.url (qui donnera une 404 derrière). (alternativement produire dans ce cas une image "placeholder" (genre fond gris, bordure et diagonales, qui visuellement montrera bien qu'il manque un truc).


Fichiers

Révisions associées

Révision 08a739e0 (diff)
Ajouté par Lauréline Guérin il y a plus de 4 ans

assets: fix asset_url templatetag when file does not exist (#33959)

Révision 457c40d6 (diff)
Ajouté par Lauréline Guérin il y a plus de 4 ans

assets: use asset.name instead of asset.file.name (#33959)

when accessing asset.file, the file is opened, and this can lead to an
IOError

Historique

#1

Mis à jour par Lauréline Guérin il y a plus de 4 ans

  • Assigné à mis à Lauréline Guérin
#2

Mis à jour par Lauréline Guérin il y a plus de 4 ans

asset.file.* => lecture du fichier
pour éviter les IOError, checker asset.name ou asset.path

#3

Mis à jour par Frédéric Péters il y a plus de 4 ans

Ok pour le patch, pour la modification aux tests je la monterais au-dessus de "# unless it's in SVG", tapé sans avoir testé, je pense à ça :

--- a/tests/test_public_templatetags.py
+++ b/tests/test_public_templatetags.py
@@ -181,6 +181,12 @@ def test_asset_template_tags():
         t = Template('''{% load assets %}{% asset_url page.picture "collectivity:banner" size="200x200" %}''')
         assert t.render(Context()).startswith('/media/cache/')

+        # unless image file is missing
+        os.remove(page.picture.path)
+        del page.picture.file
+        t = Template('''{% load assets %}{% asset_url page.picture "collectivity:banner" size="200x200" %}''')
+        assert t.render(Context({'page': page})) == '/media/page-pictures/test2.png'
+
         # unless it's in SVG
         page.picture = File(StringIO('test'), 'test2.svg')
         page.save()

(par ailleurs, ça vaut sans doute la peine aussi de faire un tour de combo pour voir s'il n'y a pas d'autres appels à asset.file.path qu'on pourrait remplacer par asset.path.)

#5

Mis à jour par Frédéric Péters il y a plus de 4 ans

  • Statut changé de Solution proposée à Solution validée

Ok, c'est clair.

#6

Mis à jour par Lauréline Guérin il y a plus de 4 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 457c40d612b3735168fdb26345faf0eab467041d
Author: Lauréline Guérin <zebuline@entrouvert.com>
Date:   Mon Oct 14 15:02:24 2019 +0200

    assets: use asset.name instead of asset.file.name (#33959)

    when accessing asset.file, the file is opened, and this can lead to an
    IOError

commit 08a739e0d8c3aba7ae02c4b9e99ec03ab91f9b16
Author: Lauréline Guérin <zebuline@entrouvert.com>
Date:   Mon Oct 14 11:54:33 2019 +0200

    assets: fix asset_url templatetag when file does not exist (#33959)
#7

Mis à jour par Frédéric Péters il y a plus de 4 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF