Projet

Général

Profil

Bug #40502

comparaison sur None

Ajouté par Nicolas Roche il y a environ 4 ans. Mis à jour il y a environ 4 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Catégorie:
-
Version cible:
-
Début:
06 mars 2020
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

En testant authentic en python 3 :

File "/home/nroche/src/hobo/hobo/multitenant/settings_loaders.py", line 333, in update_settings_from_path
    fields.sort(key=lambda x: x.get('order'))
TypeError: '<' not supported between instances of 'NoneType' and 'NoneType'


Fichiers


Demandes liées

Lié à Publik Installation Développeur - Development #40403: Tourner authentic2 en python3Fermé04 mars 2020

Actions

Révisions associées

Révision cc0677c7 (diff)
Ajouté par Nicolas Roche il y a environ 4 ans

python3: remove sort try on already sorted profile fields (#40502)

Historique

#1

Mis à jour par Nicolas Roche il y a environ 4 ans

(sans test)

#2

Mis à jour par Nicolas Roche il y a environ 4 ans

#3

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

J'ai pas la situation : si order existe et est bien à None, ça va continuer de planter. Sans fatigue tu peux faire un « x.get('order') or 0 »

#4

Mis à jour par Nicolas Roche il y a environ 4 ans

(nouveau patch du coup)
Le tri sur le champ "ordre" date du début de la prise en charge du profil (#7185),
mais depuis ce champs n'est plus exporté (#7269).

#5

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

Faut que ça reste trié sinon les champs ne vont plus apparaitre dans le bon ordre dans authentic.

#6

Mis à jour par Nicolas Roche il y a environ 4 ans

En fait c'est préalablement trié en base (ici on ne modifie/modifiait pas l'ordre des champs), cf hobo/profile/models.py :

class AttributeDefinition(models.Model):
...
    class Meta:
        ordering = ['order']

Je réalise que je n'ai pas été assez clair et essaye de le préciser dans le test mis à jour.

#7

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

Mais on n'est pas du tout "en base" ici : « fields = hobo_json.get('profile', {}).get('fields') »

#8

Mis à jour par Nicolas Roche il y a environ 4 ans

Désolé, je ne suis décidément pas clair. Voici ce que je teste :
le tri à posteriori est inutile/impossible comme on peut aussi le voir ici.

$ tox -e py2-coverage-hobo -- tests/test_settings_loaders.py
(Pdb) l
330      
331              fields = hobo_json.get('profile', {}).get('fields')
332              if fields:
333                  import pdb; pdb.set_trace()
334                  fields = [x for x in fields if not x['disabled']]
335  ->                ...

## bien, que l'attribut 'order' ne soit pas disponible pour faire le tri,
(Pdb) [x.get('order', 'undef') for x in fields]                          
['undef', 'undef', 'undef', 'undef', 'undef', 'undef', 'undef', 'undef', 'undef']

## c'est quand même déjà trié
(Pdb) [x.get('name') for x in fields]
[u'title', u'first_name', u'last_name', u'email', u'address', u'zipcode', u'city', u'phone', u'mobile']

#9

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

Faut pas venir avec des undef dans les tests qui ne font qu'amener de nouvelles questions, surtout précédés d'un "integer field are not exported to hobo.json".

Le truc qui est bel et bien à tester c'est que les champs fournis dans le hobo.json sont bien dans l'ordre défini dans Hobo, dans la db.

Et oui ça terminera en "dans l'hobo.json les champs du profil sont dans une liste déjà correctement triée", ce qui était déjà le propos de #7269 que tu as trouvé, qui a "juste" oublié de retirer la référence à order à cet endroit. Vu la description de #7269 et du commit associé, j'imagine qu'il y a déjà eu à l'époque grande confusion entre l'ordre dans la liste et les attributs order. (peut-être en faisant #7253)

Bref, #7269 n'a pas nettoyé totalement, ce patch nettoie totalement, c'est mieux, mais il ne faudrait pas que l'ajout d'un test bizarre assure à son tour des difficultés de compréhension.

→, je dirais :

  • commencer par vérifier l'ordre
env = get_hobo_json()
fields = env['profile']['fields']
assert [x['name'] for x in fields] == ['first_name', 'last_name', etc.]
  • retirer la partie qui amène que confusion :
- # order is managed on database
- assert [x.get('name') for x in fields][0:11:10] == [u'title', u'mobile']
  • expliciter qu'on intervertit deux champs
+    # swap title and mobile fields
+    title = AttributeDefinition.objects.get(name='title')
+    mobile = AttributeDefinition.objects.get(name='mobile')
+    (title.order, mobile.order) = (mobile.order, title.order)
+    title.save()
+    mobile.save()
  • refaire le hobo.json, revérifier l'ordre.
  • dégager une autre partie de confusion,
-    # integer field are not exported to hobo.json
-    assert [x.get('order', 'undef') for x in env['profile']['fields']] == ['undef',] * 11
  • continuer et vérifier aussi les contenus de A2_*_FIELDS, comme tu as là.
#11

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

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

Mis à jour par Nicolas Roche il y a environ 4 ans

  • Statut changé de Solution validée à Résolu (à déployer)
commit cc0677c7e9ac4319bbdd1671292d427494dc9f50
Author: Nicolas ROCHE <nroche@entrouvert.com>
Date:   Sat Mar 7 18:29:34 2020 +0100

    python3: remove sort try on already sorted profile fields (#40502)

#13

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

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

Formats disponibles : Atom PDF