Projet

Général

Profil

Development #43328

accès général / requêtes sur les fiches

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

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
26 mai 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Dans une démarche de réservation il y a une série de champs, quantité de chaises, quantité de tables, etc.

Il y a un total à calculer, form_var_nb_chaises * 2 + form_var_nb_tables * 5, etc.

Plutôt que maintenir ces tarifs dans le workflow de réservation, on pourrait vouloir ça dans des fiches, genre une fiche nom: Chaises, tarif: 2; ça pourrait aussi se retrouver exploité dans un champ commentaire dans la démarche, pour afficher le détail des tarifs, et ne pas demander ainsi à maintenir ceux-ci à différentes endroits.

Bref, de là, j'en suis venu à dire que ce qu'il faut, c'est un accès requêtage/générique, qui permettrait

{{cards.materiel.objects.filter_by_nom|filter_value:"Chaises"|first|get:"tarif"}}

(et c'est un peu moche, quand même).

Bref, draft à réfléchir.


Fichiers

Révisions associées

Révision 7087f4a0 (diff)
Ajouté par Frédéric Péters il y a presque 4 ans

general: add filtering methods to lazy querysets (#43328)

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

general: add template access to cards and forms (#43328)

Révision 9ebb81bd (diff)
Ajouté par Frédéric Péters il y a presque 4 ans

general: allow slicing querysets (#43328)

Révision 1e83b2b6 (diff)
Ajouté par Frédéric Péters il y a presque 4 ans

general: add same_user queryset "filter" (#43328)

Historique

#2

Mis à jour par Pierre Cros il y a presque 4 ans

Perso ça me plairait beaucoup de pouvoir faire ça.

#3

Mis à jour par Benjamin Dauvergne il y a presque 4 ans

Si on se limite à ne requêter que par des champs de type "slug" (conforme à un identifiant python) ou entier, on pourrait se passer de filtres de template.

class QuerySet(object):
    def __init__(self, formdef, query):
        self.formdef = data_class
        self.query = query

    def __iter__(self):
        return self.formdef.data_class().select(self.query, iterator=True)

    def __getattr__(self, name):
        for field in self.formdef.fields:
            if field.varname == name:
                return FieldQueryset(self, field)
        raise AttributeError(name)

    def first(self):
        for formdata in self:
            return formdata
        return None

class FieldQueryset(object):
    def __init__(self, qs, field):
        self.qs = qs
        self.field = field

    def __getattr__(self, name):
        return QuerySet(self.qs.formdef, And(self.query, Equal(field.varname, name)))

    def __iter__(self):
        for formdata in self.qs:
            yield formdata.data.get(self.field.id)

Avec ça on peut écrire directement {{ cards.material.objects.nom.Chaise.first.tarif }} mais aussi {% for nom in cards.materiel.objects.nom %}<li>{% nom %}</li>{% endfor %}.

Mais franchement je trouverai plus simple d'inventer un langage de requête et de faire :

{% object-query "SELECT ONE tarif FROM materiel WHERE name = 'Chaise'" as tarif %}

ou
{% object-query "SELECT * FROM materiel WHERE int(tarif) > 0" as materiels_payants %}

avec une grammaire PEG (via par exemple https://github.com/erikrose/parsimonious) ça irait assez vite de définir un tel langage et ce sera toujours plus joli à lire que des filtres.

#4

Mis à jour par Frédéric Péters il y a presque 4 ans

Non.

#5

Mis à jour par Frédéric Péters il y a presque 4 ans

  • Description mis à jour (diff)

(j'ai corrigé la description)

#6

Mis à jour par Pierre Cros il y a presque 4 ans

Ce n'est pas plus simple pour un admin fonctionnel d'apprendre un nouveau langage de requête, c'est même vraiment à éviter au moment où on essaye d'homogénéiser en se débarrassant de Python. Encore une fois on ne s'adresse pas à des développeurs, la mécanique des filtres ils ont du l'apprendre (un peu), restons avec ça.

Peut-être que c'est pas très esthétique ou performant, mais en ce qui me concerne j'ai compris immédiatement ce qui était fait avec les filtres.

#7

Mis à jour par Benjamin Dauvergne il y a presque 4 ans

Je pensais que c'était un ticket pour discuter, très bien que ce ne soit pas le cas.

#8

Mis à jour par Pierre Cros il y a presque 4 ans

Quelqu'un pour relire le patch du coup ?

#9

Mis à jour par Frédéric Péters il y a presque 4 ans

  • Patch proposed changé de Oui à Non

Malgré la case à cocher, c'est le statut qui compte, il n'y a pas de patch proposé (le fichier attaché ne contient pas de tests, il faudra passer par jenkins, etc.).

#11

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

notes de l'EO day: pas de solution, pas d'idée pour le moment.
A rediscuter.

#12

Mis à jour par Frédéric Péters il y a presque 4 ans

(pour info je compte bien reprendre le patch attaché, le continuer avec des tests, et avancer peut-être jusqu'au nécessaire pour gérer le cas d'usage "pas de doublon").

#15

Mis à jour par Frédéric Péters il y a presque 4 ans

L'intitulé du ticket l'annonçait déjà, deux sujets :

  • accès général, c'est 0002, c'est ajouter au contexte global une source "forms" et une source "cards", comme il y avait déjà un accès aux webservices et aux sources de données;
  • requêtes sur les fiches, c'est 0001, c'est en fait continuer LazyFormDefObjectsManager en lui ajoutant quelques méthodes.
#16

Mis à jour par Frédéric Péters il y a presque 4 ans

Dans la branche désormais également,

  • 0003, pour autoriser les slices sur les queryset, (tombé dessus en faisant le test pour le 0004),
  • 0004, pour ajouter un filtre "same_user" (qui est un truc fait dans le script externe de #44561).
#17

Mis à jour par Thomas Noël il y a presque 4 ans

0001 : il manque un peu de "unlazy" dans les filtres, ça sera nécessaire dans la gestion anti-doublon quand il faudra faire du « ...|filter_value:form_var_siren ». Ci-joint une proposition pour gérer ça, à merger ou pas avec 0001.

Aussi dans le test on voit que {{form_objects|filter_by:"foo_foo"|filter_value:"bar"|count}} renvoie y compris les objets avec le statut "draft"... Allez, disons que le filtrage par statut fera l'objet d'un futur ticket/patch.

0002 : ok mais...

Viendra vite le besoin d'un templatetags tel que « cards|objects:form_option_foo » pour pouvoir récupérer une queryset sur les fiches du slug nommé par form_option_foo. Et alors on préférera documenter la syntaxe générale {{ cards|objects:"foo"|... }} au lieu de {{ cards.foo.objects|... }}

Peut-être que ça pourrait faire partie de ce 0002 ?

0003 : ok

0004 : ok mais... on imaginerait donc ici un {{ cards.foo.objects.same_user|... }} ? Là encore je serai pour une version filtre {{ cards|objects:"foo"|same_user|... }}

#18

Mis à jour par Frédéric Péters il y a presque 4 ans

Aussi dans le test on voit que {{form_objects|filter_by:"foo_foo"|filter_value:"bar"|count}} renvoie y compris les objets avec le statut "draft"... Allez, disons que le filtrage par statut fera l'objet d'un futur ticket/patch.

Non les brouillons sont bien exclus; on est à 7 parce que en plus du for i in range(6): il y a la fixture variable_test_data.

Branche poussée avec les modifications suggérées.

#19

Mis à jour par Thomas Noël il y a presque 4 ans

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

Frédéric Péters a écrit :

Aussi dans le test on voit que {{form_objects|filter_by:"foo_foo"|filter_value:"bar"|count}} renvoie y compris les objets avec le statut "draft"... Allez, disons que le filtrage par statut fera l'objet d'un futur ticket/patch.

Non les brouillons sont bien exclus; on est à 7 parce que en plus du for i in range(6): il y a la fixture variable_test_data.

J'avais raté cette fixture, désolé.

Branche poussée avec les modifications suggérées.

Et tout me parait plutôt assez chouette ainsi.

#20

Mis à jour par Frédéric Péters il y a presque 4 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit 1e83b2b6293615ad9f1198f092f89a79870409b1
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Mon Jun 29 16:49:01 2020 +0200

    general: add same_user queryset "filter" (#43328)

commit 9ebb81bd093baa8e5f1014a5d4f2ce7f32ce1670
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Mon Jun 29 16:48:38 2020 +0200

    general: allow slicing querysets (#43328)

commit ba0f3a4bb037c2c11ccfc7caade3a7268b4e463e
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Sun Jun 28 09:07:05 2020 +0200

    general: add template access to cards and forms (#43328)

commit 7087f4a0610cbfe5d5f75846396d889986f4e773
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Sun Jun 28 08:51:38 2020 +0200

    general: add filtering methods to lazy querysets (#43328)

#21

Mis à jour par Frédéric Péters il y a presque 4 ans

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

Formats disponibles : Atom PDF