Jinja: Autoriser le filtre de carte à récupérer plusieurs éléments

Créé le 29 févr. 2016  ·  4Commentaires  ·  Source: pallets/jinja

Pour le moment, la fonction map ne peut être utilisée que comme ceci :

[{'path':'/var/file1', 'mtime': '123', 'mode': '600',...},{'path':'/var/file2', 'mtime': '123', 'mode': 644, ...}]|map(attribute='path')

avec le retour de

['/var/file1', '/var/file2']

(Documents : http://jinja.pocoo.org/docs/dev/templates/#map)

Je veux proposer d'autoriser ceci:

[{'path':'/var/file1', 'mtime': '123', 'mode': '600',...},{'path':'/var/file2', 'mtime': '123', 'mode': 644, ...}]|map(attribute=['path', 'mtime'])

ou

[{'path':'/var/file1', 'mtime': '123', 'mode': '600',...},{'path':'/var/file2', 'mtime': '123', 'mode': 644, ...}]|map(attributes=['path', 'mtime'])

qui devrait revenir

[{'path':'/var/file1', 'mtime': '123'},{'path':'/var/file2', 'mtime': '123'}]

Vous pouvez déjà voir à quoi cela sert : manipuler une liste de dicts afin que ces dicts ne conservent qu'un ensemble limité d'attributs.

Commentaire le plus utile

Si quelqu'un en a encore besoin, vous pouvez utiliser le code suivant (mettre playbooks/filter_plugins/mapattributes.py ):

#!/usr/bin/env python
class FilterModule(object):
  def filters(self):
    return { 'mapattributes': self.mapattributes }

  def mapattributes(self, list_of_dicts, list_of_keys):
    l = []
    for di in list_of_dicts:
      newdi = { }
      for key in list_of_keys:
        newdi[key] = di[key]
      l.append(newdi)
    return l

Utilisation via :

ansible_mounts | mapattributes(['mount', 'size_total', 'size_available',])

Tous les 4 commentaires

J'adorerais cette fonctionnalité.

Je ne comprends pas pourquoi cela est nécessaire dans les modèles. Il suffit de parcourir les dictionnaires et d'utiliser les attributs dont vous avez besoin pour accomplir la même chose. Si vous avez besoin de données différentes, c'est probablement une meilleure idée de faire cette manipulation en Python avant le rendu. Je pourrais _peut-être_ voir une utilité à retourner des tuples.

Si quelqu'un en a encore besoin, vous pouvez utiliser le code suivant (mettre playbooks/filter_plugins/mapattributes.py ):

#!/usr/bin/env python
class FilterModule(object):
  def filters(self):
    return { 'mapattributes': self.mapattributes }

  def mapattributes(self, list_of_dicts, list_of_keys):
    l = []
    for di in list_of_dicts:
      newdi = { }
      for key in list_of_keys:
        newdi[key] = di[key]
      l.append(newdi)
    return l

Utilisation via :

ansible_mounts | mapattributes(['mount', 'size_total', 'size_available',])

Pourquoi ce problème est-il clos et la solution Nee6ione n'est-elle pas implémentée officiellement ? Ce serait tellement plus simple si cela était pris en charge sans plugins supplémentaires

Cette page vous a été utile?
0 / 5 - 0 notes