Development #36930
rajouter les slugs dans la table des formdefs
0%
Description
Pour se baser dessus dans la construction des visualisations.
Cela évite de se retrouver avec une séléction des formulaires différente de celle souhaitée.
Fichiers
Demandes liées
Révisions associées
Historique
Mis à jour par Serghei Mihai il y a plus de 4 ans
- Lié à Development #36931: utiliser les slugs des formdefs dans les visualisations ajouté
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
C'est loin d'être évident, c'est exactement le même problème que #25982 qui a été fermé sans ouvrir de ticket pour continuer (on pourrait prendre celui-ci en le renommant): si on change les valeurs de filtrage on va casser toutes les visualisations actuelles qui utilisent ces valeurs.
Donc oui mais il faut traiter le cas général: utiliser un identifiant unique stable pour les énumérations (formdef, valeur d'itemfield, etc..) et ça ne concerne pas uniquement wcs-olap mais ça nécessite une migration de donnée coté bijoe vraiment compliquée à faire en commun avec une évolution dans wcs-olap, dont je parlais dans #25982 :- faire évoluer wcs-olap pour avoir cette valeur stable et l'utiliser partout à la place des id (ça veut dire plus de dimension comme
{ 'name': 'formdef', 'label': 'formulaire', 'join': ['formdef'], 'type': 'integer', 'value': 'formdef.id', 'value_label': 'formdef.label', 'order_by': 'formdef.label', },
où on a'value'
=='<jointure>.id'
, mais plutôt :{ 'name': 'formdef', 'label': 'formulaire', 'join': ['formdef'], 'type': 'integer', 'value': 'formdef.slug', 'value_label': 'formdef.label', 'order_by': 'formdef.label', },
ça restera bancal en cas de changement de slug mais c'est quand même moins fréquent (et si on expose les visu dans l'admin Django on pourra toujours aller corriger assez simplement) - ensuite faire une migration coté bijoe qui aurait cette tête (et je ne pense pas une migration
Django
plutôt un script) :- parcourir l'ensemble des visualisations,
- trouver les valeurs des filtrages (des trucs genre @[1,2,3],
- remplacer les id (c'est forcément des entiers) par la nouvelle valeur, via :
- prendre la dimension correspondant au filtre, parser
'value'
en extraire la jointure (si pas jointure on est bon), on peut se baser surjoin
éventuellement (si y en a qu'une seule ça devrait aller sinon c'est plus compliqué) - chercher la ligne
<jointure>.id
dans la table, - calculer
'value'
pour cette ligne, ça donne la nouvelle valeur
- prendre la dimension correspondant au filtre, parser
- parcourir l'ensemble des visualisations,
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
Pour revenir au souci de Arles (je vais copier mon laïus dans un autre ticket finalement); il faut stabiliser les ids comme on l'a fait pour les items, i.e. reprendre la table précédente, et oui il faudra les slugs puisque les labels ne sont pas stables.
Ça irait bien d'avoir une nouvelle méthodecreate_ref_table
qui produirait des tables à 3 colonnes :
- id : serial
- ref : text
- label : text
ref étant le truc stable à utiliser pour récupérer les anciens id dans la table précédente, après création on poserait le curseur de séquence sur le max(id) de l'ancienne table ; à l'insertion soit on trouve la valeur dans l'ancienne table et on conserve l'id sinon on ajoute une nouvelle ligne.
Mis à jour par Serghei Mihai il y a plus de 4 ans
Benjamin Dauvergne a écrit :
C'est loin d'être évident, c'est exactement le même problème que #25982 qui a été fermé sans ouvrir de ticket pour continuer (on pourrait prendre celui-ci en le renommant): si on change les valeurs de filtrage on va casser toutes les visualisations actuelles qui utilisent ces valeurs.
Elles sont déjà cassées car elles pointent vers des mauvais formulaires.
Donc rajouter un slug ou figer les id, je pense qu'on pourra zapper les migrations côté bijoe.
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
Oui c'est peut-être cassé sur 50% des déploiements où l'ordre des formulaires a pu changer mais là ce sera cassé sur 100% des déploiements, garanti.
Mis à jour par Serghei Mihai il y a plus de 4 ans
Premier jet avec l'ajout des méthodes qui créent des tables en y ajoutant une colonne ref
et ensuite rajouter les nouvelles données.
Puis usage de ces méthodes pour stocker les categories et les formulaires. Pour les formulaires la déclaration des noms des ceux-ci et enregistrement de leurs données se font séparemment.
Mis à jour par Serghei Mihai il y a plus de 4 ans
- Fichier 0001-feeder-preseve-categories-and-form-names-order-36930.patch 0001-feeder-preseve-categories-and-form-names-order-36930.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Patch proposed changé de Non à Oui
Deuxième version avec ajout implicite de la clé primaire et de la référence. Cela facilitera la transition des relations basées sur les id à celles des références.
Mis à jour par Benjamin Dauvergne il y a plus de 4 ans
Serghei Mihai a écrit :
Deuxième version avec ajout implicite de la clé primaire et de la référence. Cela facilitera la transition des relations basées sur les id à celles des références.
- tu pourrais ajouter deux méthode do_category_table() et do_formdef_table()
- Comme update_sequence_table_number() est factorisé, l'utiliser en fin d'insertion des valeurs dans les tables (ça n'a pas de conséquence particulière de ne pas le faire pour l'instant mais je trouve ça bien de conserver les invariants que n'importe qui espère d'une base postgres normale)
ref
devrait être unique (simplement rajouterunique
après le type varchar)- il me me semble qu'avec le changement de schéma des tables category et formdef la reprise bête et méchante à base '*' ne va pas marcher comme on veut, on aura jamais de valeur
ref
pour les valeurs existantes et donc on va avoir des doublons lors de la détectionto_insert
(ref
étant nullable l'insert des vieilles valeurs dans la nouvelle table va marcher, maisref
sera nul pour toutes les lignes).if self.prev_table_exists(name): # Insert data from previous table self.ex( 'INSERT INTO {schema_temp}.{name} SELECT * FROM {schema}.{name}', ctx={'name': quote(name)} ) self.update_table_sequence_number(name)
Il va falloir prévoir de:
1. détecter que la table existante n'a pas de ref,
2. faire des update spécifique dans ce cas en fonction du name - On est en postgresql 9.6 on peut utiliser UPSERT pour se simplifier la vie (on aura automatiquement le suivi du
name
si jamais il change)INSERT INTO category (ref, name) VALUES (...) ON CONFLICT (ref) DO UPDATE SET name = EXCLUDED.name;
et laissant la base maintenir l'id toute seule (plus besoin de faire enumerate)
Mis à jour par Serghei Mihai il y a plus de 4 ans
- Fichier 0001-feeder-preseve-categories-and-form-names-order-36930.patch 0001-feeder-preseve-categories-and-form-names-order-36930.patch ajouté
Merci pour le tuyau UPSERT, j'ai appris une chose.
Nouveau patch avec tes remarques.
Mis à jour par Serghei Mihai il y a plus de 4 ans
- Fichier 0001-feeder-preseve-categories-and-form-names-order-36930.patch 0001-feeder-preseve-categories-and-form-names-order-36930.patch ajouté
Nouveau patch faisant d'abord la mise à jour des données existantes se basant sur la référence.
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- Statut changé de Solution proposée à En cours
Serghei Mihai a écrit :
Nouveau patch faisant d'abord la mise à jour des données existantes se basant sur la référence.
Ça ne va pas marcher, tu slugifies le titre du formulaire pour générer les valeurs de référence lors de la reprise de la table existante, il faut matcher sur le label, c'est la seule manière à peu près correcte de migrer l'état actuel vers l'état futur avec la colonne ref en tentant de conserver les id
.
Mis à jour par Serghei Mihai il y a environ 4 ans
Je zappe exprès l'état actuel car du côté bijoe seuls les id comptent.
Il était question de passer sur toutes les instances de bijoe pour mettre à jour les id en fonction des libellés séléctionnés, mais ils sont déjà érronnées.
Donc autant partir de zéro.
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
Ok mais alors vire complètement la récupération des données du schéma précédent et gère les items aussi; ça va effectivement péter 100% des visus (dans l'idée que ça sert à rien de péter à moitié maintenant pour péter à 100% plus tard).
Mis à jour par Serghei Mihai il y a environ 4 ans
- Fichier 0001-feeder-preseve-categories-and-form-names-order-36930.patch 0001-feeder-preseve-categories-and-form-names-order-36930.patch ajouté
- Statut changé de En cours à Solution proposée
Ok, récupération du schéma précedent viré.
Pas compris pour la gestion des items. Lequels?
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
Serghei Mihai a écrit :
Ok, récupération du schéma précedent viré.
Ok mais il manque les modifications au schéma (JSON) pour bijoe pour utiliser le slug ou le label comme valeur dans les filtres (dans dimensions[*].value
), actuellement c'est category.id
et formdef.id
.
Pas compris pour la gestion des items. Lequels?
Oublions on fera un autre ticket.
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- Statut changé de Solution proposée à En cours
Mis à jour par Serghei Mihai il y a environ 4 ans
- Fichier 0001-feeder-preseve-categories-and-form-names-order-36930.patch 0001-feeder-preseve-categories-and-form-names-order-36930.patch ajouté
- Statut changé de En cours à Solution proposée
- Assigné à mis à Serghei Mihai
Traite moi de trouillard, mais je préfère d'abord passer ce patch, valider que ça tourne et ensuite attaquer les items (statuts et itemfields).
Mis à jour par Benjamin Dauvergne il y a environ 4 ans
- Statut changé de Solution proposée à Solution validée
Ok; tu l'as fait tourner sur ton publik-devinst pour voir si bijoe te pond des <select> avec les bons identifiants désormais (tu devrais y voir les slugs des formulaires et des catégories comme <option.value>).
Mis à jour par Serghei Mihai il y a environ 4 ans
- Statut changé de Solution validée à Résolu (à déployer)
Yep, en modifiant le type
en string
car sinon il y a tentative dans bijoe de conversion en entier.
commit d11d196fa887bbc97d04a052e4e4728ccf30efaf Author: Serghei Mihai <smihai@entrouvert.com> Date: Mon Nov 25 17:16:50 2019 +0100 feeder: preseve categories and form names order (#36930)
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
feeder: preseve categories and form names order (#36930)