Development #33959
crash sur vignettage d'un fichier inexistant
0%
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
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
Mis à jour par Lauréline Guérin il y a plus de 4 ans
- Fichier 0001-assets-fix-asset_url-templatetag-when-file-does-not-.patch 0001-assets-fix-asset_url-templatetag-when-file-does-not-.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
asset.file.* => lecture du fichier
pour éviter les IOError, checker asset.name ou asset.path
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.)
Mis à jour par Lauréline Guérin il y a plus de 4 ans
- Fichier 0002-assets-use-asset.name-instead-of-asset.file.name-339.patch 0002-assets-use-asset.name-instead-of-asset.file.name-339.patch ajouté
- Fichier 0001-assets-fix-asset_url-templatetag-when-file-does-not-.patch 0001-assets-fix-asset_url-templatetag-when-file-does-not-.patch ajouté
ok je modifie un poil le code et le test du coup
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.
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)
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
assets: fix asset_url templatetag when file does not exist (#33959)