Development #54236
répéter la même cellule sur une page (par exemple N enfants)
0%
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
Révisions associées
Historique
Mis à jour par Frédéric Péters il y a presque 3 ans
wip/54236-repeat-cells, posée avec ces mécaniques.
Mis à jour par Lauréline Guérin il y a presque 3 ans
- Fichier Capture d’écran de 2021-05-25 09-24-46.png Capture d’écran de 2021-05-25 09-24-46.png ajouté
nice !
Mis à jour par Lauréline Guérin il y a presque 3 ans
- Lié à Development #54254: Caluire: cellules enfant ajouté
Mis à jour par Lauréline Guérin il y a presque 3 ans
- Fichier 0001-cells-json-cell-params-repeat-make_global-template_s.patch 0001-cells-json-cell-params-repeat-make_global-template_s.patch ajouté
- Statut changé de Nouveau à Solution proposée
- Assigné à mis à Lauréline Guérin
- Patch proposed changé de Non à Oui
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>
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
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.
Mis à jour par Lauréline Guérin il y a presque 3 ans
Mis à jour par Frédéric Péters il y a presque 3 ans
- Statut changé de Solution proposée à Solution validée
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)
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
cells: json cell params (repeat, make_global, template_string) (#54236)