Projet

Général

Profil

Development #59672

URL pour les fichiers posés via des champs fichier dans l'action formulaire

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

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
14 décembre 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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

Lié à w.c.s. - Development #65195: Formulaire de workflow : variable pour récupérer toutes les urls des fichiers posées via des champs fichiersFermé12 mai 2022

Actions
Lié à w.c.s. - Development #72533: URL pour les champs fichier, gérer le param thumbnailFermé16 décembre 2022

Actions
Dupliqué par w.c.s. - Development #62176: pouvoir télécharger les fichiers d'un formulaire de workflowFermé25 février 2022

Actions

Révisions associées

Révision c8519aaa (diff)
Ajouté par Frédéric Péters il y a presque 2 ans

forms: add direct download of files from workflow forms (#59672)

Historique

#1

Mis à jour par Frédéric Péters il y a environ 2 ans

  • Assigné à mis à Frédéric Péters
#2

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é
#3

Mis à jour par Frédéric Péters il y a environ 2 ans

À 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.

#7

Mis à jour par Lauréline Guérin il y a presque 2 ans

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

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)
#9

Mis à jour par Transition automatique il y a presque 2 ans

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

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é
#11

Mis à jour par Transition automatique il y a presque 2 ans

Automatic expiration

#12

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é

Formats disponibles : Atom PDF