Projet

Général

Profil

Development #67266

api, permettre un filtre sur statut en passant le libellé d'un statut

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

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
11 juillet 2022
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

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

Révision 7bfcbcdd (diff)
Ajouté par A. Berriot il y a plus d'un an

api: support filtering form using status label (#67266)

Historique

#2

Mis à jour par A. Berriot il y a presque 2 ans

  • Assigné à mis à A. Berriot

Je vais tenter de regarder aujourd'hui

#3

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

#4

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 :)

#5

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.

#6

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

#7

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)

#8

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?

#9

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)

#10

Mis à jour par A. Berriot il y a presque 2 ans

#11

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'),
            ],
#13

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

#14

Mis à jour par Frédéric Péters il y a plus d'un an

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

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

Mis à jour par Transition automatique il y a plus d'un an

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

Mis à jour par Transition automatique il y a plus d'un an

Automatic expiration

Formats disponibles : Atom PDF