mirror of
https://github.com/jazzband/django-categories.git
synced 2026-03-16 22:30:24 +00:00
Added a get_latest_objects_by_category template tag. Might be useful.
This commit is contained in:
parent
e257bd6db8
commit
d3cbb62b5d
1 changed files with 94 additions and 0 deletions
|
|
@ -1,4 +1,6 @@
|
|||
from django import template
|
||||
from django.template import Library, Node, TemplateSyntaxError, \
|
||||
Variable, resolve_variable, VariableDoesNotExist, Context
|
||||
from categories.models import Category
|
||||
from mptt.utils import drilldown_tree_for_node
|
||||
from mptt.templatetags.mptt_tags import tree_path, tree_info
|
||||
|
|
@ -206,3 +208,95 @@ def get_top_level_categories(parser, token):
|
|||
"Usage: {%% %s as <variable> %%}" % bits[0]
|
||||
)
|
||||
return TopLevelCategoriesNode(bits[2])
|
||||
|
||||
def resolve(var, context):
|
||||
try:
|
||||
return var.resolve(context)
|
||||
except VariableDoesNotExist:
|
||||
try:
|
||||
return var.var
|
||||
except AttributeError:
|
||||
return var
|
||||
|
||||
def get_latest_objects_by_category(category, app_label, model_name, set_name,
|
||||
date_field='pub_date', num=15):
|
||||
m = get_model(app_label, model_name)
|
||||
if not isinstance(category, Category):
|
||||
category = Category.objects.get(slug=str(category))
|
||||
children = Category.objects.filter(parent=category)
|
||||
ids = []
|
||||
for cat in list(children) + [category]:
|
||||
if hasattr(cat, '%s_set' % set_name):
|
||||
ids.extend([x.pk for x in getattr(cat, '%s_set' % set_name).all()[:num]])
|
||||
|
||||
return m.objects.filter(pk__in=ids).order_by('-%s' % date_field)[:num]
|
||||
|
||||
class LatestObjectsNode(Node):
|
||||
def __init__(self, var_name, category, app_label, model_name, set_name,
|
||||
date_field='pub_date', num=15):
|
||||
"""Get latest objects of app_label.model_name"""
|
||||
self.category = Variable(category)
|
||||
self.app_label = Variable(app_label)
|
||||
self.model_name = Variable(model_name)
|
||||
self.set_name = Variable(set_name)
|
||||
self.date_field = Variable(date_field)
|
||||
self.num = Variable(num)
|
||||
self.var_name = var_name
|
||||
|
||||
def get_cache_key(self, category, app_label, model_name, set_name,
|
||||
date_field, num):
|
||||
"""Get the cache key"""
|
||||
key = 'latest_objects.%s' % '.'.join([category, app_label, model_name,
|
||||
set_name, date_field, num])
|
||||
|
||||
def render(self, context):
|
||||
"""Render this sucker"""
|
||||
category = resolve(self.category, context)
|
||||
app_label = resolve(self.app_label, context)
|
||||
model_name = resolve(self.model_name, context)
|
||||
set_name = resolve(self.set_name, context)
|
||||
date_field = resolve(self.date_field, context)
|
||||
num = resolve(self.num, context)
|
||||
|
||||
cache_key = self.get_cache_key(category, app_label, model_name, set_name,
|
||||
date_field, num)
|
||||
result = cache.get(cache_key)
|
||||
if not result:
|
||||
result = get_latest_objects_by_category(category, app_label, model_name,
|
||||
set_name, date_field, num)
|
||||
|
||||
cache.set(key, result, 300)
|
||||
context[self.var_name] = result
|
||||
|
||||
return ''
|
||||
|
||||
def do_get_latest_objects_by_category(parser, token):
|
||||
"""
|
||||
Get the latest objects by category
|
||||
|
||||
{% get_latest_objects_by_category category app_name model_name set_name [date_field] [number] as [var_name] %}
|
||||
"""
|
||||
proper_form = "{% get_latest_objects_by_category category app_name model_name set_name [date_field] [number] as [var_name] %}"
|
||||
bits = token.split_contents()
|
||||
|
||||
if bits[-2] != 'as':
|
||||
raise TemplateSyntaxError("%s tag shoud be in the form: %s" % (bits[0], proper_form))
|
||||
if len(bits) < 7:
|
||||
raise TemplateSyntaxError("%s tag shoud be in the form: %s" % (bits[0], proper_form))
|
||||
if len(bits) > 9:
|
||||
raise TemplateSyntaxError("%s tag shoud be in the form: %s" % (bits[0], proper_form))
|
||||
category = bits[1]
|
||||
app_label = bits[2]
|
||||
model_name = bits[3]
|
||||
set_name = bits[4]
|
||||
var_name = bits[-1]
|
||||
if bits[5] != 'as':
|
||||
date_field = bits[5]
|
||||
else:
|
||||
date_field = None
|
||||
if bits[6] != 'as':
|
||||
num = bits[6]
|
||||
else:
|
||||
num = None
|
||||
return LatestObjectsNode(var_name, category, app_label, model_name, set_name,
|
||||
date_field, num)
|
||||
Loading…
Reference in a new issue