Projet

Général

Profil

Development #54236

répéter la même cellule sur une page (par exemple N enfants)

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

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

0%

Temps estimé:
Patch proposed:
Oui
Planning:
Non

Description

On voudrait afficher une page avec les infos des différents enfants de la famille; on aurait une cellule "famille" qui permet d'obtenir des infos basiques, puis une cellule par enfant.

Étape 1, ajouter un paramètre "make_global" sur la cellule famille, qui taperait dans le contexte global d'évaluation des cellules les infos obtenues par cette cellule,

--- a/combo/data/models.py
+++ b/combo/data/models.py
@@ -1671,6 +1671,7 @@ class JsonCellBase(CellBase):
     force_async = False
     log_errors = True
     timeout = None
+    make_global = False
     actions = {}
     additional_data = None
     # [
@@ -1827,6 +1828,16 @@ class JsonCellBase(CellBase):

         return extra_context

+    def modify_global_context(self, context, request):
+        if self.make_global:
+            synchronous = context.get('synchronous')
+            context['synchronous'] = True
+            try:
+                preloaded_data = self.get_cell_extra_context(context)
+                context[self.make_global] = preloaded_data.get(self.first_data_key)
+            finally:
+                context['synchronous'] = synchronous
+
     @property
...
@@ -1979,6 +1990,13 @@ class ConfigJsonCell(JsonCellBase):
     def ajax_refresh(self):
         return settings.JSON_CELL_TYPES[self.key].get('auto_refresh', None)

+    @property
+    def make_global(self):
+        return settings.JSON_CELL_TYPES[self.key].get('make_global', False)

Étape 2, exploiter l'info précédente pour répéter la cellule,

@@ -1979,6 +1990,13 @@ class ConfigJsonCell(JsonCellBase):
+    def get_repeat(self):
+        return settings.JSON_CELL_TYPES[self.key].get('repeat')
+
+++ b/combo/public/templates/combo/placeholder.html
@@ -10,7 +10,9 @@
      data-ajax-cell-loading-message="{{ cell.loading_message }}" 
      data-ajax-cell-error-message="{% trans "Loading error" %}" 
      {% if cell.ajax_refresh %}data-ajax-cell-refresh="{{ cell.ajax_refresh }}"{% endif %}
-     {% if request.extra_context_data %}data-extra-context="{{ request.extra_context_data|signed|urlencode }}"{% endif %}
+     {% with cell|extra_context:request as extra_context %}
+     {% if extra_context %}data-extra-context="{{ extra_context|signed|urlencode }}"{% endif %}
+     {% endwith %}
      ><div>{% render_cell cell %}</div></div>
 {% endfor %}
 {% endif %}
+++ b/combo/public/templatetags/combo.py
...
+    if not context.get('placeholder_search_mode'):
+        for cell in [x for x in context['cells'] if hasattr(x, 'get_repeat')]:
+            repeat_template = cell.get_repeat()
+            if not repeat_template:
+                continue
+            from django.template import Template
+            repeat = int(Template(repeat_template).render(context))
+            cell_idx = context['cells'].index(cell)
+            context['cells'].remove(cell)
+            if repeat == 0:
+                continue
+            repeated_cells = []
+            for i in range(repeat):
+                new_cell = copy.copy(cell)
+                new_cell.repeat_index = i
+                repeated_cells.append(new_cell)
+            context['cells'][cell_idx:cell_idx] = repeated_cells
...
+@register.filter
+def extra_context(cell, request):
+    ctx = copy.copy(request.extra_context_data or {})
+    if hasattr(cell, 'repeat_index'):
+        ctx['repeat_index'] = cell.repeat_index
+    return ctx

Résultat,

    "la-famille": {
      "name": "La famille",
      "url": "https://.../",
      "make_global": "la_famille" 
    },
    "un-enfant": {
      "name": "Un enfant",
      "url": "https://.../...?child_id={{la_famille.enfants|get:repeat_index|get:'id'}}/,
      "force_async": true,
      "repeat": "{{la_famille.enfants|length}}" 
    } 

Je tape ce code brouillon dans une branche; testée localement l'idée me semble fonctionner et ne pas être trop sale.


Fichiers


Demandes liées

Lié à Intégrations graphiques Publik - Development #54254: Caluire: cellules enfantFermé25 mai 2021

Actions

Révisions associées

Révision 07a81ad8 (diff)
Ajouté par Frédéric Péters il y a presque 3 ans

cells: json cell params (repeat, make_global, template_string) (#54236)

Historique

#1

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

wip/54236-repeat-cells, posée avec ces mécaniques.

#4

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

#5

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

#6

Mis à jour par Nicolas Roche il y a presque 3 ans

Testé: on définie les 2 cellule "caluire-liste-enfants" et "caluire-enfant" sur la même page et seule la seconde est affichée.
(pour moi ça fonctionne bien)

Le gain est donc que l'on peut à présent utiliser le mécanisme des "additional-data" afin de faire plusieurs appels webservice au sein de la cellule imbriquée.

ex avec #54252: templates/variants/toodego/combo/json/caluire-enfant.html

<pre>{{ json|pprint }}</pre>
<pre>{{ schooling|pprint }}</pre>
<pre>{{ activities|pprint }}</pre>

#7

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

cellule imbriquée

Juste pour être clair, il n'y a pas de notion de cellule imbriquée ici; on est sur :

  • liste des enfants
  • enfant 1
  • enfant 2
  • enfant 3

pas sur :

  • liste des enfants
    • enfant 1
    • enfant 2
    • enfant 3
#8

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

(Je sais que c'était dans ma version initiale, mais) je ferais de get_repeat une property repeat, comme c'est le cas pour les autres paramètres de la cellule.

#10

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

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

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

  • Statut changé de Solution validée à Résolu (à déployer)
commit 07a81ad81d843328f61187ee3d6673673f2a5534
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Mon May 24 10:33:30 2021 +0200

    cells: json cell params (repeat, make_global, template_string) (#54236)
#12

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

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

Formats disponibles : Atom PDF