Source code for djangocms_page_meta.utils

from django.template.loader import render_to_string
from django.utils.safestring import mark_safe
from django.utils.translation import get_language_from_request
from meta import settings as meta_settings


[docs]def get_cache_key(page, language): """ Create the cache key for the current page and language """ from cms.cache import _get_cache_key try: site_id = page.node.site_id except AttributeError: # CMS_3_4 site_id = page.site_id return _get_cache_key("page_meta", page, language, site_id)
[docs]def get_page_meta(page, language): """ Retrieves all the meta information for the page in the given language :param page: a Page instance :param lang: a language code :return: Meta instance :type: object """ from django.core.cache import cache from meta.views import Meta from .models import DefaultMetaImage, PageMeta, TitleMeta try: meta_key = get_cache_key(page, language) except AttributeError: return None meta = cache.get(meta_key) if not meta: meta = Meta() title = page.get_title_obj(language) default_meta_image = DefaultMetaImage.objects.first().image meta.extra_custom_props = [] meta.title = page.get_page_title(language) if not meta.title: meta.title = page.get_title(language) if title.meta_description: meta.description = title.meta_description.strip() try: titlemeta = title.titlemeta if titlemeta.description: meta.description = titlemeta.description.strip() if titlemeta.keywords: meta.keywords = titlemeta.keywords.strip().split(",") meta.locale = titlemeta.locale meta.og_description = titlemeta.og_description.strip() if not meta.og_description: meta.og_description = meta.description meta.twitter_description = titlemeta.twitter_description.strip() if not meta.twitter_description: meta.twitter_description = meta.description if titlemeta.image: meta.image = title.titlemeta.image.canonical_url or title.titlemeta.image.url meta.schemaorg_description = titlemeta.schemaorg_description.strip() if not meta.schemaorg_description: meta.schemaorg_description = meta.description meta.schemaorg_name = titlemeta.schemaorg_name if not meta.schemaorg_name: meta.schemaorg_name = meta.title for item in titlemeta.extra.all(): attribute = item.attribute if not attribute: attribute = item.DEFAULT_ATTRIBUTE meta.extra_custom_props.append((attribute, item.name, item.value)) except (TitleMeta.DoesNotExist, AttributeError): # Skipping title-level metas if meta.description: meta.og_description = meta.description meta.schemaorg_description = meta.description meta.twitter_description = meta.description defaults = { "object_type": meta_settings.get_setting("FB_TYPE"), "og_type": meta_settings.get_setting("FB_TYPE"), "og_app_id": meta_settings.get_setting("FB_APPID"), "fb_pages": meta_settings.get_setting("FB_PAGES"), "og_profile_id": meta_settings.get_setting("FB_PROFILE_ID"), "og_publisher": meta_settings.get_setting("FB_PUBLISHER"), "og_author_url": meta_settings.get_setting("FB_AUTHOR_URL"), "twitter_type": meta_settings.get_setting("TWITTER_TYPE"), "twitter_site": meta_settings.get_setting("TWITTER_SITE"), "twitter_author": meta_settings.get_setting("TWITTER_AUTHOR"), "schemaorg_type": meta_settings.get_setting("SCHEMAORG_TYPE"), "schemaorg_datePublished": page.publication_date.isoformat() if page.publication_date else None, "schemaorg_dateModified": page.changed_date.isoformat() if page.changed_date else None, } try: pagemeta = page.pagemeta meta.object_type = pagemeta.og_type meta.og_type = pagemeta.og_type meta.og_app_id = pagemeta.og_app_id meta.fb_pages = pagemeta.fb_pages meta.og_profile_id = pagemeta.og_author_fbid meta.twitter_type = pagemeta.twitter_type meta.twitter_site = pagemeta.twitter_site meta.twitter_author = pagemeta.twitter_author meta.schemaorg_type = pagemeta.schemaorg_type meta.robots = pagemeta.robots_list if page.publication_date: meta.published_time = page.publication_date.isoformat() if page.changed_date: meta.modified_time = page.changed_date.isoformat() if page.publication_end_date: meta.expiration_time = page.publication_end_date.isoformat() if meta.og_type == "article": meta.og_publisher = pagemeta.og_publisher meta.og_author_url = pagemeta.og_author_url try: from djangocms_page_tags.utils import get_page_tags, get_title_tags tags = list(get_title_tags(page, language)) tags += list(get_page_tags(page)) meta.tag = ",".join([tag.name for tag in tags]) except ImportError: # djangocms-page-tags not available pass if not meta.image and pagemeta.image: meta.image = pagemeta.image.canonical_url or pagemeta.image.url for item in pagemeta.extra.all(): attribute = item.attribute if not attribute: attribute = item.DEFAULT_ATTRIBUTE meta.extra_custom_props.append((attribute, item.name, item.value)) except PageMeta.DoesNotExist: pass for attr, val in defaults.items(): if not getattr(meta, attr, "") and val: setattr(meta, attr, val) if not meta.image and default_meta_image: meta.image = default_meta_image.canonical_url or default_meta_image.url meta.url = page.get_absolute_url(language) meta.schemaorg_url = meta.url meta.schemaorg_image = meta.image cache.set(meta_key, meta) return meta
def get_metatags(request): language = get_language_from_request(request, check_path=True) meta = get_page_meta(request.current_page, language) return mark_safe( render_to_string(request=request, template_name="djangocms_page_meta/meta.html", context={"meta": meta}) )