from django import template
import json

register = template.Library()

def objects_to_dictionaries(iterable, fields):
    """
    Convert an iterable into a list of dictionaries; fields should be set
    to a comma-separated string of properties for each item included in the
    resulting list; e.g. for a queryset:

        {{ queryset | objects_to_dictionaries:"id,name" }}

    will return a list like

        [{'id': 1, 'name': 'foo'}, ...]

    providing queryset has id and name fields

    This is mostly to support serialising querysets or lists of model objects
    to JSON
    """
    objects = []

    if fields:
        fields_list = [field.strip() for field in fields.split(',')]
        for item in iterable:
            out = {}
            for field in fields_list:
                out[field] = getattr(item, field)
            objects.append(out)

    return objects

register.filter('objects_to_dictionaries', objects_to_dictionaries)
