Source code for djangocms_page_tags.utils
[docs]
def get_cache_key(request, page, lang, site_id, title):
"""
Create the cache key for the current page and tag type
"""
from cms.cache import _get_cache_key
from cms.models import Page
from cms.templatetags.cms_tags import _get_page_by_untyped_arg
if not isinstance(page, Page):
page = _get_page_by_untyped_arg(page, request, site_id)
if not site_id:
site_id = page.node.site_id
if not title:
return _get_cache_key("page_tags", page, "", site_id) + "_type:tags_list"
else:
return _get_cache_key("title_tags", page, lang, site_id) + "_type:tags_list"
[docs]
def get_page_tags(page):
"""
Retrieves all the tags for a Page instance.
:param page: a Page instance
:return: list or queryset of attached tags
:type: List
"""
from .models import PageTags
try:
return page.pagetags.tags.all()
except PageTags.DoesNotExist:
return []
[docs]
def page_has_tag(page, tag):
"""
Check if a Page object is associated with the given tag.
:param page: a Page instance
:param tag: a Tag instance or a slug string.
:return: whether the Page instance has the given tag attached (False if no Page or no
attached PageTags exists)
:type: Boolean
"""
from .models import PageTags
if hasattr(tag, "slug"):
slug = tag.slug
else:
slug = tag
try:
return page.pagetags.tags.filter(slug=slug).exists()
except PageTags.DoesNotExist:
return False
[docs]
def title_has_tag(page, lang, tag):
"""
Check if a Title object is associated with the given tag.
This function does not use fallbacks to retrieve title object.
:param page: a Page instance
:param lang: a language code
:param tag: a Tag instance or a slug string.
:return: whether the Title instance has the given tag attached (False if no Title or no
attached TitleTags exists)
:type: Boolean
"""
from .models import TitleTags
if hasattr(tag, "slug"):
slug = tag.slug
else:
slug = tag
try:
return page.get_title_obj(language=lang, fallback=False).titletags.tags.filter(slug=slug).exists()
except TitleTags.DoesNotExist:
return False
[docs]
def get_page_tags_from_request(request, page_lookup, lang, site, title=False):
"""
Get the list of tags attached to a Page or a Title from a request from usual
`page_lookup` parameters.
:param request: request object
:param page_lookup: a valid page_lookup argument
:param lang: a language code
:param site: a site id
:param title: a boolean to extract the Page (if False) or Title instance
:return: list of tags
:type: List
"""
from cms.templatetags.cms_tags import _get_page_by_untyped_arg
from cms.utils import get_language_from_request, get_site_id
from cms.utils.conf import get_cms_setting
from django.core.cache import cache
site_id = get_site_id(site)
if lang is None:
lang = get_language_from_request(request)
cache_key = get_cache_key(request, page_lookup, lang, site, title)
tags_list = cache.get(cache_key)
if not tags_list:
page = _get_page_by_untyped_arg(page_lookup, request, site_id)
if page:
if title:
tags_list = get_title_tags(page, lang)
else:
tags_list = get_page_tags(page)
cache.set(cache_key, tags_list, timeout=get_cms_setting("CACHE_DURATIONS")["content"])
if not tags_list:
tags_list = ()
return tags_list