Projet

Général

Profil

Development #58451

Form/Carddata listing & api - filtrer sur un champ d'un block de champs

Ajouté par Lauréline Guérin il y a plus de 2 ans. Mis à jour il y a plus de 2 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
08 novembre 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Exemple publik-famille: un model de fiche "Enfant"
qui contient un field block de champs "Responsables légaux"
configuré sur un BlockDef "Responsable légal" qui contient un champ "Adulte" et un champ "Lien de parenté"

Pouvoir dans la page de listing des fiches Enfant, filtrer sur un champ du block Responsables légaux.
Exemple: lister tous les enfants de tel adulte; lister tous les enfants qui ont un RL avec comme lien de parenté "foobar"

Du coup, retrouver cette possibilité de filtrage dans l'API de récupération des fiches


Fichiers


Demandes liées

Lié à w.c.s. - Development #58452: Lazy form/carddata - filtrer sur un champ d'un block de champsFermé08 novembre 2021

Actions
Lié à w.c.s. - Bug #60451: Form/Carddata listing - filtrer sur un champ d'un block de champs configuré en autocompleteFermé10 janvier 2022

Actions

Révisions associées

Révision 7331b812 (diff)
Ajouté par Lauréline Guérin il y a plus de 2 ans

api: formdata filtering by block field (#58451)

Révision ababab88 (diff)
Ajouté par Lauréline Guérin il y a plus de 2 ans

backoffice: formdata filtering by block field (#58451)

Historique

#1

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

  • Sujet changé de Form/Carddata listing & api à Form/Carddata listing & api - filtrer sur un champ d'un block de champs
#2

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

  • Lié à Development #58452: Lazy form/carddata - filtrer sur un champ d'un block de champs ajouté
#4

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

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

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

Quelques notes:
  • 0002: j'ai pas trouvé comment ajouter proprement un attribut "block parent" au unpickle d'un blockfield, alors je l'ai setté à la main là où j'en ai besoin (field.block_field dans iter_fields)
  • 0002: dans Criteria, j'ai ajouté un kwarg parent_field, au lieu de réutiliser le kwarg existant field (car on travaille sur field, mais on a besoin du blockfield pour construire le critère de la forme f7->'data' @> '[{"bf13e4d8a8-fb08-4808-b5ae-02d6247949b9": "3"}]')
  • 0003: dans get_item_filter_options, j'ai l'impression qu'on n'a pas besoin du NotNull de la requête classique, en tout cas je n'ai pas réussi à écrire un test qui prouverait qu'on en ait besoin. Tant mieux, la requête serait beaucoup plus compliquée à construire avec un NotNull
  • 0003: select_distinct, j'ai ajouté de quoi mettre un alias sur le premier champ, pour pouvoir trier dessus
#6

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

+            elif filter_field.type == 'bool':
+                filter_field_value = filter_field_value == 'true'

Je serais pour zapper le filtre si jamais la valeur n'est ni 'true' ni 'false', comme on fait déjà ici :

            elif filter_field.type == 'bool' and filter_field_value is not None:
                if filter_field_value == 'true':
                    criterias.append(Equal('f%s' % filter_field.id, True))
                elif filter_field_value == 'false':
                    criterias.append(Equal('f%s' % filter_field.id, False))

Peut-être même, à penser à #59224 ("filtre qui n'existe pas"), faire que si ni 'true' ni 'false' on retourne une erreur ?

+        if getattr(filter_field, 'block_field', None):
+            field1 = "jsonb_array_elements(%s->'data')->> '%s'" % (
+                sql.get_field_id(filter_field.block_field),
+                filter_field.id,
+            )

Je serais assez pour l'ajout d'un commentaire qui explique en début du bloc if ce qu'on fait là, en inversant la condition pour avoir le cas "non bloc" en premier, je pense à quelque chose comme :

        # for item/items fields, get actual option values from database
        if not getattr(filter_field, 'block_field', None):
            criterias.append(NotNull(sql.get_field_id(filter_field)))
            options = self.formdef.data_class().select_distinct(
                [sql.get_field_id(filter_field), '%s_display' % sql.get_field_id(filter_field)], clause=criterias
            )
        else:
            # in case of blocks, this requires digging into the jsonb columns,
            # jsonb_array_elements(BLOCK->'data')->> 'FOOBAR' will return all
            # values used in repeated blocks, ex:
            # {"data": [{"FOOBAR": "value1"}, {"FOOBAR": "value2}]}
            # → ["value1", "value2"}
            ...

Plus loin, j'ai un autre commentaire "ajouter un commentaire", pour

+            is_in_block_field = getattr(field, 'block_field', None)
+            field.contextual_id = field.id
+            field.contextual_varname = None
+            ...

Ajouter quelques mots avant, de l'ordre de "# add contextual_id/contextual_varname attributes, they are id/varname for normal fields, and they are concatenation of block id/varname + field id/varname in case of blocks".

~~

Voilà, c'est déjà lisible comme c'est mais je pense qu'on sera aidé par ces commentaires plus tard.

#8

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

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

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

  • Statut changé de Solution validée à Résolu (à déployer)
commit ababab88e01e852b273a3336fae38a24cb416e9a
Author: Lauréline Guérin <zebuline@entrouvert.com>
Date:   Fri Dec 3 18:23:30 2021 +0100

    backoffice: formdata filtering by block field (#58451)

commit 7331b81263069dfaa5796afa7f8a7acfb285d2f9
Author: Lauréline Guérin <zebuline@entrouvert.com>
Date:   Fri Dec 3 15:55:10 2021 +0100

    api: formdata filtering by block field (#58451)

commit 34ac123c4365601fbd43a2ecf9fdc6fe3300d6df
Author: Lauréline Guérin <zebuline@entrouvert.com>
Date:   Fri Dec 3 14:18:42 2021 +0100

    misc: split backoffice tests
#10

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

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

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

  • Lié à Bug #60451: Form/Carddata listing - filtrer sur un champ d'un block de champs configuré en autocomplete ajouté
#12

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

Automatic expiration

Formats disponibles : Atom PDF