Browse Source

Some feincms3 helper tags.

master 0.3.13
Erik Stein 7 years ago
parent
commit
a8d7a20fcf
  1. 76
      content_plugins/templatetags/feincms3_helper_tags.py

76
content_plugins/templatetags/feincms3_helper_tags.py

@ -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…
Cancel
Save