1 changed files with 76 additions and 0 deletions
@ -0,0 +1,76 @@
|
||||
# TODO This file should be part of feincms3 |
||||
|
||||
from collections import defaultdict |
||||
|
||||
from django import template |
||||
from django.apps import registry |
||||
from django.conf import settings |
||||
from django.core.exceptions import FieldDoesNotExist |
||||
from django.db.models import Q |
||||
|
||||
|
||||
register = template.Library() |
||||
|
||||
|
||||
MENUMIXIN_MODELS = getattr(settings, 'MENUMIXIN_MODELS', {}) |
||||
|
||||
|
||||
@register.simple_tag |
||||
def menus(): |
||||
menus = defaultdict(list) |
||||
|
||||
def add_menus_from_model(model, depth_from=1, depth_to=1, q_filters=None): |
||||
if not q_filters: |
||||
q_filters = [] |
||||
try: |
||||
model._meta.get_field('level') |
||||
# MPTT Model |
||||
pages = model.objects.filter( |
||||
~Q(menu=''), |
||||
*q_filters, |
||||
).extra( |
||||
where=['level BETWEEN {} AND {}'.format(depth_from, depth_to)], |
||||
) |
||||
except FieldDoesNotExist: |
||||
pages = model.objects.with_tree_fields().filter( |
||||
~Q(menu=''), |
||||
*q_filters, |
||||
).extra( |
||||
where=['tree_depth BETWEEN {} AND {}'.format(depth_from, depth_to)], |
||||
) |
||||
for content in pages: |
||||
menus[content.menu].append(content) |
||||
|
||||
for k, v in MENUMIXIN_MODELS.items(): |
||||
add_menus_from_model( |
||||
registry.apps.get_model(k), |
||||
v[0], v[1], v[2]) |
||||
|
||||
return menus |
||||
|
||||
|
||||
@register.filter |
||||
def group_by_tree(iterable): |
||||
""" |
||||
Given a list of pages in tree order, generate pairs consisting of the |
||||
parents and their descendants in a list. |
||||
""" |
||||
|
||||
parent = None |
||||
children = [] |
||||
depth = -1 |
||||
|
||||
for element in iterable: |
||||
if parent is None or element.depth == depth: |
||||
if parent: |
||||
yield parent, children |
||||
parent = None |
||||
children = [] |
||||
|
||||
parent = element |
||||
depth = element.depth |
||||
else: |
||||
children.append(element) |
||||
|
||||
if parent: |
||||
yield parent, children |
Loading…
Reference in new issue