Projet

Général

Profil

Development #56614

|filter_value vs plusieurs champs avec le même identifiant

Ajouté par Frédéric Péters 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:
02 septembre 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

Ça fait

    def apply_filter_value(self, value, exclude=False):
        assert self.pending_attr

        field = self.get_field(self.pending_attr)

qui fait

    def get_field(self, key):
        for field in self._formdef.get_all_fields():
            if getattr(field, 'varname', None) == key:
                return field

et la recherche se trouve ainsi limitée au premier champ avec l'identifiant fourni.

Il faudrait itérer sur tous les champs et faire un critère

Or(f1 == value, f2 == value, f3 == value)

Fichiers

Révisions associées

Révision 8fca1ed0 (diff)
Ajouté par Frédéric Péters il y a plus de 2 ans

misc: extend |filter_by to work with fields with non-unique varname (#56614)

Historique

#2

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

  • Description mis à jour (diff)
#3

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

  • Description mis à jour (diff)
#4

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

Un peu plus chaotique que je n'imaginais, surtout parce qu'à tester la prise en compte correcte des colonnes NULLes est importante, ce qui a amené à remplacer un "Not(Equal(value)))" en "NotEqual(value) or Null", ce qui change le comportement actuel en présence de NULL, vers quelque chose de correct.

En pratique dans les tests, c'est

         queryset = lazy_formdata.objects.filter_by('datefield').apply_exclude_value(...)
-        assert queryset.count == 1
+        assert queryset.count == 6  # 1 + 5 null

précédemment les valeurs null étaient juste zappées, pas considérées différentes du critère.

~~

Bref il y a ça et puis la prise en compte de l'objet de ce ticket, un get_fields qui retourne tous les champs avec le varname demandé, puis la construction d'une liste de critères, Or(field1 value, field2 value, field3 == value) pour le cas basique.

Formellement pour le cas |exclude le choix est d'appliquer ça sur l'ensemble des champs, i.e. field1 != value AND field2 != value AND field2 != value (et non OR).

#5

Mis à jour par Thomas Noël il y a plus de 2 ans

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

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

Un peu plus chaotique que je n'imaginais, surtout parce qu'à tester la prise en compte correcte des colonnes NULLes est importante, ce qui a amené à remplacer un "Not(Equal(value)))" en "NotEqual(value) or Null", ce qui change le comportement actuel en présence de NULL, vers quelque chose de correct.

Impecc.

Formellement pour le cas |exclude le choix est d'appliquer ça sur l'ensemble des champs, i.e. field1 != value AND field2 != value AND field2 != value (et non OR).

Choix tout à fait logique selon moi.

Rien à redire du tout.

Peut-être qu'il faudra faire ruisseler vers la doc que dans le cas de champ avec le même identifiant, ils doivent être du même type, au risque de planter sur ça (et ailleurs, peut être... mais de fait je ne sais pas si on a quelque par dans la doc une explication du fonctionnement de w.c.s. quand plusieurs champs ont le même identifiant...)

#6

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

  • Statut changé de Solution validée à Résolu (à déployer)
commit 8fca1ed0b540fd64c694d559cab7e10259400b5a
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Tue Oct 19 15:18:42 2021 +0200

    misc: extend |filter_by to work with fields with non-unique varname (#56614)
#7

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

Formats disponibles : Atom PDF