from django.views.generic import ListView

class SimpleFilteringListView(ListView):
    """
    List view with extra filtering and grouping in context data.

    ``filters`` dict is created as follows: {'context_variable_name', 'filtering_object_method_name'}

    It calls filtering method on each object in object_list and if it returns True - this object is added
    to proper context variable.

    """
    filters = {}

    def get_filtered_data(self):
        filtered_data = {}

        if self.filters:
            for obj in self.object_list:
                for filter_name in self.filters:
                    filter_func = getattr(obj, self.filters[filter_name])
                    filter_list = filtered_data.get(filter_name, [])
                    if filter_func():
                        filter_list.append(obj)
                        filtered_data[filter_name] = filter_list

        return filtered_data

    def get_context_data(self, **kwargs):
        context = super(SimpleFilteringListView, self).get_context_data(**kwargs)
        context.update(self.get_filtered_data())
        return context