Development #58451
Form/Carddata listing & api - filtrer sur un champ d'un block de champs
0%
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
Révisions associées
backoffice: formdata filtering by block field (#58451)
Historique
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
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é
Mis à jour par Lauréline Guérin il y a plus de 2 ans
- Fichier 0003-backoffice-formdata-filtering-by-block-field-58451.patch 0003-backoffice-formdata-filtering-by-block-field-58451.patch ajouté
- Fichier 0002-api-formdata-filtering-by-block-field-58451.patch 0002-api-formdata-filtering-by-block-field-58451.patch ajouté
- Fichier 0001-misc-split-backoffice-tests.patch 0001-misc-split-backoffice-tests.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
- 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
dansiter_fields
) - 0002: dans
Criteria
, j'ai ajouté un kwargparent_field
, au lieu de réutiliser le kwarg existantfield
(car on travaille surfield
, 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
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.
Mis à jour par Lauréline Guérin il y a plus de 2 ans
- Fichier 0003-backoffice-formdata-filtering-by-block-field-58451.patch 0003-backoffice-formdata-filtering-by-block-field-58451.patch ajouté
- Fichier 0002-api-formdata-filtering-by-block-field-58451.patch 0002-api-formdata-filtering-by-block-field-58451.patch ajouté
0002: pas d'autre valeur possible que true/false pour les booleans
0003: ajout de commentaires
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Statut changé de Solution proposée à Solution validée
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
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
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é
api: formdata filtering by block field (#58451)