Development #67266
api, permettre un filtre sur statut en passant le libellé d'un statut
0%
Description
À propos de l'utilisation de |filter_by_status dans combo,
je n'arrivais pas à faire fonctionner le filter_by_status:"
alors j'ai tenté des trucs qui ont fait une 500
puis j'ai compris que le filter_by_status fonctionnait avec l'identifiant du statut, et pas son nom
Fichiers
Révisions associées
Historique
Mis à jour par A. Berriot il y a presque 2 ans
- Assigné à mis à A. Berriot
Je vais tenter de regarder aujourd'hui
Mis à jour par A. Berriot il y a presque 2 ans
D'après ce que je vois dans le code et https://dev.entrouvert.org/issues/48181 (ticket d'implémentation initial), on filtre bien sur le nom (mais pas sur l'id par contre):
def filter_by_status(self, status): for wfs in self._formdef.workflow.possible_status: if wfs.name == status: wf_status = 'wf-%s' % wfs.id return self._clone(self._criterias + [Equal('status', wf_status)]) return self.none()
Et le test:
# test |filter_by_status context = pub.substitutions.get_context_variables(mode='lazy') tmpl = Template('{{form_objects|filter_by_status:"Just Submitted"|count}}') assert tmpl.render(context) == '7' tmpl = Template( '{{form_objects|filter_by_status:"Just Submitted"|filter_by:"foo_foo"|filter_value:"foo"|count}}' ) assert tmpl.render(context) == '0' assert LazyFormData(formdata).objects.filter_by_status('Just Submitted').count == 7
Il s'agit possiblement d'un autre bug, je creuse
Mis à jour par Lauréline Guérin il y a presque 2 ans
Le ticket que tu pointes concerne les filtres de requête, pas l'API :)
Mis à jour par Frédéric Péters il y a presque 2 ans
Pour le contexte, on a la possibilité des ~mêmes filtres depuis chrono/combo, pour faire ...|filter_by_status:"...", l'implémentation étant dans https://git.entrouvert.org/publik-django-templatetags.git/tree/publik_django_templatetags/wcs/context_processors.py#n114
Elle passe ?filter=une-valeur dans la requête à l'API de w.c.s. Et cette valeur on n'y autorise actuellement pas le libellé de statut.
Mis à jour par A. Berriot il y a presque 2 ans
Lauréline Guerin a écrit :
Le ticket que tu pointes concerne les filtres de requête, pas l'API :)
ah oui effectivement, le souci à l'air de se trouver dans publik-django-templatetags, j'avais naturellement cherché dans wcs.
Merci pour le contexte, je creuse
Merci à vous deux
Mis à jour par Lauréline Guérin il y a presque 2 ans
Pour moi, ça serait bien dans wcs, quelque part dans wcs/forms/backoffice.py, très probablement dans la méthode get_listing_item_ids
:
else: # build selected status list applied_filters = [] if selected_filter == 'pending': applied_filters = ['wf-%s' % x.id for x in self.formdef.workflow.get_not_endpoint_status()] elif selected_filter == 'done': applied_filters = ['wf-%s' % x.id for x in self.formdef.workflow.get_endpoint_status()] else: applied_filters = ['wf-%s' % selected_filter] # <- ici
Je chercherais par là.
(combo n'a pas connaissance des libellés des statuts wcs, il ne fait que passer ce qu'on lui demande à l'api via le templatefilter défini dans publik-django-templatetags)
Mis à jour par A. Berriot il y a presque 2 ans
Lauréline Guerin a écrit :
Pour moi, ça serait bien dans wcs, quelque part dans wcs/forms/backoffice.py, très probablement dans la méthode
get_listing_item_ids
:[...]
Je chercherais par là.
(combo n'a pas connaissance des libellés des statuts wcs, il ne fait que passer ce qu'on lui demande à l'api via le templatefilter défini dans publik-django-templatetags)
j'ai surtout du mal à comprendre quel endpoint d'API / view est appelée dans WCS et du coup à trouver comment placer mon test / reproduire. Tu aurais un pointeur là dessus?
Mis à jour par Lauréline Guérin il y a presque 2 ans
Pour les tests, ça va se trouver dans tests/api/test_formdata.py
Il y a quelques tests sur le status dans test_api_list_formdata
, avec des opérateurs, mais avec les status de base (pending, all, done, ...).
Ca serait pas mal d'ajouter un nouveau test spécifique au filtrage sur le status.
Pour le code appelé:
C'est dans wcs/api.py (ApiFormPage/ApiCardPage), mais en fait ça appelle le code des vues BO de listing des demandes/fiches, et ça se situe dans wcs/backoffice/management.py (FormPage), la vue json
, qui appelle FormDefUI.get_listing_items
Note: Peut-être qu'au lieu de gérer le mapping libellé/status-id dans get_listing_item_ids
/get_listing_item_ids_sql
(une de ces méthodes disparaît dans #67190), on pourrait le faire dans la vue json
? (pas d'avis tranché sur la question)
Mis à jour par A. Berriot il y a presque 2 ans
- Fichier 0001-api-support-filtering-form-using-status-label-67266.patch 0001-api-support-filtering-form-using-status-label-67266.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Mis à jour par Frédéric Péters il y a presque 2 ans
Comme tu gères particulièrement le cas 'all' tu peux aussi ignorer les valeurs 'open' et 'pending' et 'done' qui ont aussi une signification particulière, qu'on ne voudrait pas perdre face à un statut qui s'appellerait "open". Pour info la liste est tirée de :
options=[ ('waiting', _('Waiting for an action'), 'waiting'), ('open', C_('formdata|Open'), 'open'), ('done', _('Done'), 'done'), ('all', _('All'), 'all'), ],
Mis à jour par A. Berriot il y a presque 2 ans
Mis à jour par A. Berriot il y a presque 2 ans
Frédéric Péters a écrit :
Comme tu gères particulièrement le cas 'all' tu peux aussi ignorer les valeurs 'open' et 'pending' et 'done' qui ont aussi une signification particulière, qu'on ne voudrait pas perdre face à un statut qui s'appellerait "open". Pour info la liste est tirée de :
[...]
ah merci ! Je viens d'intégrer ça dans mon dernier patch
Mis à jour par Frédéric Péters il y a plus d'un an
- Statut changé de Solution proposée à Solution validée
Mis à jour par A. Berriot il y a plus d'un an
- Statut changé de Solution validée à Résolu (à déployer)
commit bc2f38355137101ca1212be4e58176cfc6faedab Author: Agate <aberriot@entrouvert.com> Date: Tue Jul 12 12:10:44 2022 +0200 api: support filtering form using status label (#67266)
Mis à jour par Transition automatique il y a plus d'un an
- Statut changé de Résolu (à déployer) à Solution déployée
api: support filtering form using status label (#67266)