Projet

Général

Profil

Development #9596

Cellule paramétrage "cube"

Ajouté par Benjamin Dauvergne il y a plus de 8 ans. Mis à jour il y a presque 8 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Version cible:
-
Début:
12 janvier 2016
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:

Description

L'idée est d'avoir une cellule qui affiche une simple liste à choix, par exemple:
  • Tous
  • Pôle agglo
  • Pôle x
  • Pôle y
  • Commune 1
  • Commune 2

Dans la configuration de la cellule on configure chaque intitulé, une liste de groupes (=rôles, si aucun choix, c'est visible à tous) et un champ texte libre contenant du JSON du même style que le champs autre_paramètres des autres cellules cubes.

Lors du rendu des cellules cube de la même page le choix en cours est assemblé avec la valeur de other_parameters pour la cellule.

Ainsi il est possible de définir plusieurs coupe du cube.

On pourra instancier plusieurs fois la cellule pour par exemple définir un filtrage sur les pôles et villes et un autre sur le temps, la fonction d'assemblage devra savoir comment par exemple assembler les valeurs "cut":

{'cut': 'commune:CLAPIERS'} + {'cut': 'receipt_time:3monthago-'} → {'cut': 'commune:CLAPIERS|receipt_time:3monthago-'}


Fichiers

0001-add-context-parameter-to-get_cell_extra_context.patch (9,06 ko) 0001-add-context-parameter-to-get_cell_extra_context.patch Benjamin Dauvergne, 13 janvier 2016 10:58
0002-add-a-modify_global_context-to-CellBase-9596.patch (1,48 ko) 0002-add-a-modify_global_context-to-CellBase-9596.patch Benjamin Dauvergne, 13 janvier 2016 10:58
0003-add-ParametersCell-9596.patch (9,76 ko) 0003-add-ParametersCell-9596.patch Benjamin Dauvergne, 13 janvier 2016 10:58
0004-dataviz-allow-setting-extra-cuts-in-parameters-9596.patch (2,62 ko) 0004-dataviz-allow-setting-extra-cuts-in-parameters-9596.patch Benjamin Dauvergne, 13 janvier 2016 10:58
0002-add-a-modify_global_context-to-CellBase-9596.patch (2,14 ko) 0002-add-a-modify_global_context-to-CellBase-9596.patch Benjamin Dauvergne, 15 janvier 2016 09:24
0001-add-context-parameter-to-get_cell_extra_context-9596.patch (6,25 ko) 0001-add-context-parameter-to-get_cell_extra_context-9596.patch Benjamin Dauvergne, 15 janvier 2016 09:24
0003-pass-querystring-when-loading-cells-through-ajax-959.patch (788 octets) 0003-pass-querystring-when-loading-cells-through-ajax-959.patch Benjamin Dauvergne, 15 janvier 2016 09:24
0005-dataviz-allow-setting-extra-cuts-in-parameters-9596.patch (2,68 ko) 0005-dataviz-allow-setting-extra-cuts-in-parameters-9596.patch Benjamin Dauvergne, 15 janvier 2016 09:24
0004-add-ParametersCell-9596.patch (13,9 ko) 0004-add-ParametersCell-9596.patch Benjamin Dauvergne, 15 janvier 2016 09:24
0001-add-cell-class-parameter-vary_on_parameters-9629.patch (3,09 ko) 0001-add-cell-class-parameter-vary_on_parameters-9629.patch Benjamin Dauvergne, 15 janvier 2016 13:53
0001-add-cell-class-parameter-vary_on_parameters-9629.patch (2,73 ko) 0001-add-cell-class-parameter-vary_on_parameters-9629.patch Benjamin Dauvergne, 15 janvier 2016 14:56
0001-general-remove-cell-content-only-once-new-content-ha.patch (2,12 ko) 0001-general-remove-cell-content-only-once-new-content-ha.patch Frédéric Péters, 17 janvier 2016 14:40
0002-add-a-modify_global_context-to-CellBase-9596.patch (2,17 ko) 0002-add-a-modify_global_context-to-CellBase-9596.patch Benjamin Dauvergne, 17 janvier 2016 23:52
0001-add-context-parameter-to-get_cell_extra_context-9596.patch (6,25 ko) 0001-add-context-parameter-to-get_cell_extra_context-9596.patch Benjamin Dauvergne, 17 janvier 2016 23:52
0003-pass-querystring-when-loading-cells-through-ajax-959.patch (788 octets) 0003-pass-querystring-when-loading-cells-through-ajax-959.patch Benjamin Dauvergne, 17 janvier 2016 23:52
0005-dataviz-allow-setting-extra-cuts-in-parameters-9596.patch (2,69 ko) 0005-dataviz-allow-setting-extra-cuts-in-parameters-9596.patch Benjamin Dauvergne, 17 janvier 2016 23:52
0004-add-ParametersCell-9596.patch (14,3 ko) 0004-add-ParametersCell-9596.patch Benjamin Dauvergne, 17 janvier 2016 23:52
0006-remove-obsolete-template-9596.patch (1,04 ko) 0006-remove-obsolete-template-9596.patch Benjamin Dauvergne, 17 janvier 2016 23:52

Demandes liées

Lié à Combo - Development #9681: envoyer la query string dans les cellules ajaxéesRejeté16 janvier 2016

Actions

Révisions associées

Révision bc1d9d15 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 8 ans

general: pass querystring when loading cells through ajax (#9596)

Révision 9966a437 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 8 ans

add context parameter to get_cell_extra_context (#9596)

Révision 0ef0fa3e (diff)
Ajouté par Benjamin Dauvergne il y a plus de 8 ans

add a modify_global_context to CellBase (#9596)

This new method is called by publish_page to modify the global context before
rendering is started, it takes the context and the request object.

Révision e5e1ca37 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 8 ans

add ParametersCell (#9596)

The parameter cell create a combox box which update a context variable named,
parameters. Any change to the combobox modify the query string of the current
URL, which modifies the parameters dictionnary in the context. This dictionnary
can be looked up by other celle for parameters. For example the cubes cells
could look for any key with prefix cubes-cut-, for example
cubes-cut-comune=CLAPIERS and produces a cut filter from it.

Révision 7ce34451 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 8 ans

dataviz: allow setting extra cuts in parameters (#9596)

Révision 9909a354 (diff)
Ajouté par Benjamin Dauvergne il y a plus de 8 ans

remove obsolete template (#9596)

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

general: remove cell content only once new content has arrived (#9596)

Historique

#1

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

  • Description mis à jour (diff)
#2

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

Si fonctionnellement c'est ok, il restera à voir comment faire communiquer les cellules entre elles.

#3

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

Bon pour la communication j'ai 1 approche et 2 implémentations.

L'approche c'est de faire placer par publish_page() dans le contexte de rendu un variable common contenant un dictionnaire, dictionnaire qui pourra être mis à jour par les cellules au fur et à mesure du rendu, donc une cellule plus haut dans une page pourra communiquer avec une cellule plus bas.

Pour l'implémenter j'ai deux façons plus ou moins intrusives:
  • ajouter partout un paramètre context à get_extra_cell_context() (avec pour certains appels, context=Context() car il n'y en a pas à cet endroit, dans les calculs de feed et de menu il me semble),
  • ajouter une nouvelle méthode modify_context(Context) -> Context à CellBase appelé sur l'objet context dans le template tag render_cell
#4

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

On pourrait vouloir cette cellule dans une barre latérale et les graphiques dans la zone centrale et du coup on ne serait pas dans une situation avec "une cellule plus haut dans une page".

#5

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

Dans ce cas le seul moyen que je vois c'est de faire une première passe sur toutes les cellules de la page en appelant une méthode modify_context() (plus besoin d'initialiser le common dans publish_page, puisque qu'on a plus le problème du context.push() fait implicitement dans template.render_to_stirng), puis ensuite de faire le render final.

#6

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

Bon finalement j'ai vraiment besoin de passer context à tous les get_cell_extra_context; voilà une première ébauche avec une nouvelle cellule "paramétrage" très générique, elle pourra servir à d'autres buts, et une modification aux cellules cubes pour récupérer des filtres supplémentaires depuis le dictionnaire parameters défini par cette nouvelle cellule.

Les 3 premiers patchs sont testés, le dernier sur dataviz est juste pour donner une idée, il faudra que je le copie en dév pour tester en vrai.

#7

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

Il faudrait passer aussi avoir les appels aux cell.modify_global_context() quand on fait le rendu d'une cellule unique dans ajax_page_cell, il me semble.

Et à profiter de ça, plutôt qu'un rechargement global de la page, les différentes cellules pourraient être rechargées.

Le combo.parameters-cell.js pourrait aller directement dans le combo.public.js, et vu le point précédent, ça pourrait juste être la création de la query string et puis les appels à combo_load_cell avec l'url + la query string.

Le modify_global_context il est appelé sur toutes les cellules, même celles qui ne sont pas visibles à l'usager. Comme de mon côté j'imaginais plusieurs ParametersCell sur la page, avec un contenu différent matchant la visibilité (i.e. une cellule "Paramètres Clapiers" avec juste le choix Clapiers, et limitée aux agents Clapiers), je me disais qu'il faudrait passer uniquement sur les ParametersCell visibles. (mais peut-être ton plan est-il différent sur cet aspect).

(en passant, à ce compte, la cellule "Paramètres Clapiers", ayant une seule option, n'aurait même pas besoin d'être affichée).

Je ne suis jamais bien fan de champs json pour paramétrer, on pourrait avoir un widget qui fasse tableau deux colonnes, ligne/valeur ? (ça peut être galère et on peut mettre de côté ça, en échange d'un XXX dans le code)

#8

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

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

Il faudrait passer aussi avoir les appels aux cell.modify_global_context() quand on fait le rendu d'une cellule unique dans ajax_page_cell, il me semble.

Ouaip.

Et à profiter de ça, plutôt qu'un rechargement global de la page, les différentes cellules pourraient être rechargées.

D'ac je vais regarde à ça.

Le combo.parameters-cell.js pourrait aller directement dans le combo.public.js, et vu le point précédent, ça pourrait juste être la création de la query string et puis les appels à combo_load_cell avec l'url + la query string.

Je ne sais pas si c'est déjà fait mais effectivement il faut que je prévois de passe la qs dans le code de mise à jour/chargement des cellules ajax lors des appels à combo-load_cell dans tous les cas (je ne vais pas essayer de savoir si il y a une cellule paramètre ou pas dans la page je pense, le JS sera le même pour tous les chargements).

Le modify_global_context il est appelé sur toutes les cellules, même celles qui ne sont pas visibles à l'usager. Comme de mon côté j'imaginais plusieurs ParametersCell sur la page, avec un contenu différent matchant la visibilité (i.e. une cellule "Paramètres Clapiers" avec juste le choix Clapiers, et limitée aux agents Clapiers), je me disais qu'il faudrait passer uniquement sur les ParametersCell visibles. (mais peut-être ton plan est-il différent sur cet aspect).

Oui mon plan c'est d'utiliser le champs "roles" du paramétrage JSON pour limiter la visibilité de certains choix, ça me semble plus simple à configurer que d'avoir 1 cellule paramètre par commune, pour Clapiers on aurait visible les choix "rien", "Pôle de clapier", "Clapiers", pour un admin du pôle on aurait "rien", "Pôle x", toutes les villes du pôle X (j'imagine), ça donne un truc comme:

[
   { "name": "Pole X",
     "roles": ["Pole X", "Clapiers", "Cournonteral", ..],
     "value": ...
   },
   {
     "name": "Clapiers",
     "roles": ["Pole X", "Clapiers"],
     "value": ...
   },
  {
     "name": "Cournonteral",
     "roles": ["Pole X", "Cournonteral"],
     "value": ...
   },
   etc..
]

(en passant, à ce compte, la cellule "Paramètres Clapiers", ayant une seule option, n'aurait même pas besoin d'être affichée).

Si parce que j'ajoute toujours une option "rien" en plus, coté cubes dans ce cas c'est le filtre par défaut de la cellule cube qui est utilisé (pour Montpellier ce serait statistiques gloables tous pôles dans ce cas).

Je ne suis jamais bien fan de champs json pour paramétrer, on pourrait avoir un widget qui fasse tableau deux colonnes, ligne/valeur ? (ça peut être galère et on peut mettre de côté ça, en échange d'un XXX dans le code)

Oui c'est galère, je préfère fortement borné le schéma JSON avec de la validation pour permettre une migration plus facile vers des formulaires ensuites.

#9

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

Voilà j'ai intégré toutes les remarques, le seul point que je n'aime pas c'est que ça recharge vraiment toutes les cellules même la cellule paramétrage qui n'en a pas besoin, mais je n'ai eu vraiment d'idée sur comment générique déterminé les bonnes ou mauvaises cellules à recharger, j'ai deux idées:
  • mettre en dur que les cellules "parameterscell" ne doivent pas être rechargé, bof
  • ajouter un champ à CellBase "ajax_cell = True" qui indiquerait à placeholder.html de mettre ou pas l'URL ajax sur la cellule

Tout est testé en local.

#10

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

Ça m'irait bien d'avoir un attribut vary_on_parameters = False sur les cellules, voire même quelque chose de plus spécifique, genre vary_on_parameters = ['cube-'].

#11

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

J'ai essayé d'implémenter le vary_on_parameters=['cubes-'] malheureusement je me suis vite aperçu que dans la page je ne disposais pas de l'information sur les valeurs du paramétrage, en attendant d'exposer toute le paramétrage dans la page ça le fera.

#12

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

Je ne suis pas sûr de capter ce qu'on n'a pas encore; mais déjà, là, même si c'est juste booléen dans le template, au niveau de la définition des cellules, ça pourrait être une liste vide pour le CellBase et une liste ['cube-] pour les cellules Cube, me semble-t-il. (et retirer le .startswith js en attendant qu'il serve).

#13

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

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

Je ne suis pas sûr de capter ce qu'on n'a pas encore; mais déjà, là, même si c'est juste booléen dans le template, au niveau de la définition des cellules, ça pourrait être une liste vide pour le CellBase et une liste ['cube-] pour les cellules Cube, me semble-t-il. (et retirer le .startswith js en attendant qu'il serve).

Je n'ai pas l'information qu'un paramètre nommé cubes-kelkechose va changer quand je suis dans le code javascript.

Patch mise à jour avec les autres remarques.

#14

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

Je n'arrive toujours pas à comprendre quel morceau coince.

D'un côté, tu remplis la query string avec des cube-xxx, de l'autre on a maintenant un vary = ['cube-']; en mettant cette info dans un data-whatever, on a ce qu'il faut. (mais donc je passe sans doute à côté d'un truc, faudrait que je relise attentivement les patchs)

#15

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

Et non justement je ne met rien dans la querystring, je met juste parameters-cell-1-choice=Clapiers et c'est la cellule dans modify_global_context() qui convertit cela en 'cubes-cut-commune': 'CLAPIERS', je ne permet pas de passer librement les filtres sinon on pourrait les forger.

#16

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

ok, merci pour l'explication.

Dans 0002-add-a-modify_global_context-to-CellBase-9596, pourquoi la complication pour le "Cell can pass data through its own dict", ça correspond à quelle situation ?

J'essaie d'appliquer et de tester tout ça rapidement.

#17

Mis à jour par Benjamin Dauvergne il y a plus de 8 ans

Je n'avais pas envie de recréer le formulaire une deuxième fois dans get_extra_cell_context() en plus de la construction qui est déjà faite dans modify_globale_context() car en plus il aurait fallu que j'extrais la requête depuis le contexte qui des fois n'y est pas, alors j'ai préféré le stocker dans une variable temporaire dans self._form. Mais ça suppose que l'objet cellule passé à modify_global_context() soit toujours le même que celui passé à get_extra_cell_context(), donc dans ajax_page_cell quand j'ai du implémenter la même chose j'ai eu le problème que l'objet cellule est récupéré deux fois, une fois pour les appels à modify_global_context() et une autre fois pour le rendu.

#18

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

Il y a une tabulation dans 0005.

Dans 0002-add-a-modify_global_context-to-CellBase-9596, la comparaison se fait sur cell.pk, ça devrait être sur cell.get_reference() (pour prendre en compte le type de cellule aussi).

-        if other_cell.pk != cell.pk:
+        if other_cell.get_reference() != cell.get_reference():

Il y a dans data/themes/gadjo/templates/combo/placeholder.html qui ne me semble plus nécessaire. (et s'il est laissé en place il faut le modifier pour prendre en compte le vary_on_parameters.

Dans le json (ou un vrai champ), pourrait-on ajouter la possibilité de définir le libellé de l'absence d'option, pour permettre "Métropole" plutôt que "---" ?

#19

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

  • Lié à Development #9681: envoyer la query string dans les cellules ajaxées ajouté
#20

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

Patch supplémentaire pour attendre l'arrivée d'un nouveau contenu avant de supprimer l'actuel contenu.

#21

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

Si c'est possible (et ça me semble l'être), on peut pousser 0003-pass-querystring-when-loading-cells-through-ajax-959.patch de façon isolée, dès maintenant ? (pour #9681).

#22

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

Voilà, je viens de pousser ce commit particulier.

#24

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

  • Statut changé de En cours à Résolu (à déployer)

Je viens d'apporter une mini correction (un seul "n" à dictionary, et un Falsea à la place d'un False), et j'ai poussé tous les patchs.

#25

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

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF