from django.contrib.auth.models import User
from django.db import models
from django.db.models import permalink
+from django.db.models.query import Prefetch
from django.dispatch import Signal
from django.utils.translation import ugettext_lazy as _
has_description.boolean = True
@staticmethod
- def get_tag_list(tags):
- if isinstance(tags, basestring):
- if not tags:
+ def get_tag_list(tag_str):
+ if isinstance(tag_str, basestring):
+ if not tag_str:
return []
- real_tags = []
+ tags = []
ambiguous_slugs = []
category = None
deprecated = False
- tags_splitted = tags.split('/')
+ tags_splitted = tag_str.split('/')
for name in tags_splitted:
if category:
- real_tags.append(Tag.objects.get(slug=name, category=category))
+ tags.append(Tag.objects.get(slug=name, category=category))
category = None
elif name in Tag.categories_rev:
category = Tag.categories_rev[name]
else:
try:
- real_tags.append(Tag.objects.get(slug=name))
+ tags.append(Tag.objects.get(slug=name))
deprecated = True
except Tag.MultipleObjectsReturned:
ambiguous_slugs.append(name)
if ambiguous_slugs:
# some tags should be qualified
e = Tag.MultipleObjectsReturned()
- e.tags = real_tags
+ e.tags = tags
e.ambiguous_slugs = ambiguous_slugs
raise e
if deprecated:
- raise Tag.UrlDeprecationWarning(tags=real_tags)
- return real_tags
+ raise Tag.UrlDeprecationWarning(tags=tags)
+ return tags
else:
- return TagBase.get_tag_list(tags)
+ return TagBase.get_tag_list(tag_str)
@property
def url_chunk(self):
# Pickle complains about not having this.
TagRelation = Tag.intermediary_table_model
+
+
+def prefetch_relations(objects, category, only_name=True):
+ queryset = TagRelation.objects.filter(tag__category=category).select_related('tag')
+ if only_name:
+ queryset = queryset.only('tag__name_pl', 'object_id')
+ return objects.prefetch_related(
+ Prefetch('tag_relations', queryset=queryset, to_attr='%s_relations' % category))
+
+
+def prefetched_relations(obj, category):
+ if hasattr(obj, '%s_relations' % category):
+ return getattr(obj, '%s_relations' % category)
+ else:
+ return None