Development #59672
URL pour les fichiers posés via des champs fichier dans l'action formulaire
0%
Description
Je découvre qu'on a des URL qui fonctionnent via l'enregistrement ans workflow_data,
def lookup_wf_form_file(self, filename): # supports for URLs such as /$formdata/$id/files/form-$formvar-$fieldvar/test.txt ...
(#8031).
On continue à enregistrer en vrac dans workflow_data mais on voudrait arrêter et #50795 a été fait pour stocker les données de manière structurée. Mais sans URL d'accès aux fichiers. Il faudrait.
À réfléchir à différentes possibilités, je serais pour .../$formdata/$id/files/part-$uuid-$ref
Pour $uuid on taperait un attribut uuid sur EvolutionPart, ça me semble utile de manière générique.
Pour $ref, ça serait la même forme que ce qu'on a dans les demandes/fiches elles-mêmes, pour gérer les blocs etc. (lookup_file_field dans wcs/forms/common.py), (soit id du champ, soit les différentes parties d'accès au champ dans le bloc).
if '$' in self.reference: # path to block field contents fn2, idx, sub = self.reference.split('$', 2) return self.formdata.data[fn2]['data'][int(idx)][sub] else: return self.formdata.data[self.reference]
(ça demandera aussi a priori à jouer autour de LazyFieldVarFile pour annoncer la bonne URL).
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Frédéric Péters il y a environ 2 ans
- Dupliqué par Development #62176: pouvoir télécharger les fichiers d'un formulaire de workflow ajouté
Mis à jour par Frédéric Péters il y a environ 2 ans
- Fichier 0001-forms-add-direct-download-of-files-from-workflow-for.patch 0001-forms-add-direct-download-of-files-from-workflow-for.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
À réfléchir à différentes possibilités, je serais pour .../$formdata/$id/files/part-$uuid-$ref
C'est sans fin inventer des constructions toujours un peu uniques; je m'y suis remis avec une nouvelle approche "toute simple" : ?hash=<le hash du fichier>, en réexploitant le parcours des fichiers d'une demande qu'on a déjà pour la suppression des fichiers inutilisés.
Patch attaché, à part du déplacement de code, les deux trucs sont :
- 1/ ajouter un "base_formdata" aux class LazyFieldVar, pour permettre de garder un accès à la demande (et donc à son URL) depuis le fond d'un fichier d'un bloc d'un formulaire de workflow,
- 2/ d'utiliser ça pour fournir la valeur du champ pour en obtenir l'URL,
+ if self._base_formdata: + return self._field.get_download_url(formdata=self._base_formdata, file_value=self.raw)
et plus loin l'exploitation,
+ if kwargs.get('file_value'): + return 'hash=%s' % kwargs.get('file_value').file_digest()
et le file_digest() ça tire la valeur du nom du fichier stocké sur le disque (qui est créé sur base d'un réel hash du fichier au moment du stockage).
Une fois qu'on a ça il reste juste à servir le fichier,
+ if get_request().form and get_request().form.get('hash'): + # look in all known formdata files for file with given hash + file_digest = get_request().form.get('hash') + for field_data in self.filled.get_all_file_data(): + if not hasattr(field_data, 'file_digest'): + continue + if field_data.file_digest() == file_digest: + return FileDirectory.serve_file(field_data)
Dans l'absolu on pourrait exploiter le même code pour servir les fichiers venant directement de champs de celle-ci mais c'est un exercice supplémentaire (gérer les URL existantes et des détails comme les vignettes), j'ai préféré ne pas mêler.
Mis à jour par Lauréline Guérin il y a presque 2 ans
- Statut changé de Solution proposée à Solution validée
Mis à jour par Frédéric Péters il y a presque 2 ans
- Statut changé de Solution validée à Résolu (à déployer)
commit 1d0b7bc30fb75231b998942ce42d4a01dd698dc8 Author: Frédéric Péters <fpeters@entrouvert.com> Date: Thu Mar 31 17:26:47 2022 +0200 forms: add direct download of files from workflow forms (#59672)
Mis à jour par Transition automatique il y a presque 2 ans
- Statut changé de Résolu (à déployer) à Solution déployée
Mis à jour par Anaïs Ecuvillon → en congés, retour le 30/04 il y a presque 2 ans
- Lié à Development #65195: Formulaire de workflow : variable pour récupérer toutes les urls des fichiers posées via des champs fichiers ajouté
Mis à jour par Lauréline Guérin il y a plus d'un an
- Lié à Development #72533: URL pour les champs fichier, gérer le param thumbnail ajouté
forms: add direct download of files from workflow forms (#59672)