mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
53 lines
2.1 KiB
Python
53 lines
2.1 KiB
Python
"""
|
|
Tagging related views.
|
|
"""
|
|
from django.http import Http404
|
|
from django.utils.translation import ugettext as _
|
|
from django.views.generic.list_detail import object_list
|
|
|
|
from tagging.models import Tag, TaggedItem
|
|
from tagging.utils import get_tag, get_queryset_and_model
|
|
|
|
def tagged_object_list(request, queryset_or_model=None, tag=None,
|
|
related_tags=False, related_tag_counts=True, **kwargs):
|
|
"""
|
|
A thin wrapper around
|
|
``django.views.generic.list_detail.object_list`` which creates a
|
|
``QuerySet`` containing instances of the given queryset or model
|
|
tagged with the given tag.
|
|
|
|
In addition to the context variables set up by ``object_list``, a
|
|
``tag`` context variable will contain the ``Tag`` instance for the
|
|
tag.
|
|
|
|
If ``related_tags`` is ``True``, a ``related_tags`` context variable
|
|
will contain tags related to the given tag for the given model.
|
|
Additionally, if ``related_tag_counts`` is ``True``, each related
|
|
tag will have a ``count`` attribute indicating the number of items
|
|
which have it in addition to the given tag.
|
|
"""
|
|
if queryset_or_model is None:
|
|
try:
|
|
queryset_or_model = kwargs.pop('queryset_or_model')
|
|
except KeyError:
|
|
raise AttributeError(_('tagged_object_list must be called with a queryset or a model.'))
|
|
|
|
if tag is None:
|
|
try:
|
|
tag = kwargs.pop('tag')
|
|
except KeyError:
|
|
raise AttributeError(_('tagged_object_list must be called with a tag.'))
|
|
|
|
tag_instance = get_tag(tag)
|
|
if tag_instance is None:
|
|
raise Http404(_('No Tag found matching "%s".') % tag)
|
|
queryset = TaggedItem.objects.get_by_model(queryset_or_model, tag_instance)
|
|
if not kwargs.has_key('extra_context'):
|
|
kwargs['extra_context'] = {}
|
|
kwargs['extra_context']['tag'] = tag_instance
|
|
if related_tags:
|
|
kwargs['extra_context']['related_tags'] = \
|
|
Tag.objects.related_for_model(tag_instance, queryset_or_model,
|
|
counts=related_tag_counts)
|
|
return object_list(request, queryset, **kwargs)
|