# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # MIT License. See license.txt from __future__ import unicode_literals import frappe import json from frappe.website.doctype.website_settings.website_settings import get_website_settings from frappe.website.router import get_page_context def get_context(path, args=None): if args and args.source: context = args else: context = get_page_context(path) if args: context.update(args) context = build_context(context) if hasattr(frappe.local, 'request'): # for (remove leading slash) # path could be overriden in render.resolve_from_map context["path"] = frappe.local.request.path[1:] else: context["path"] = path # set using frappe.respond_as_web_page if hasattr(frappe.local, 'response') and frappe.local.response.get('context'): context.update(frappe.local.response.context) # print frappe.as_json(context) return context def build_context(context): """get_context method of doc or module is supposed to render content templates and push it into context""" context = frappe._dict(context) if not "url_prefix" in context: context.url_prefix = "" if context.url_prefix and context.url_prefix[-1]!='/': context.url_prefix += '/' context.update(get_website_settings()) context.update(frappe.local.conf.get("website_context") or {}) # provide doc if context.doc: context.update(context.doc.as_dict()) context.update(context.doc.website) if hasattr(context.doc, "get_context"): ret = context.doc.get_context(context) if ret: context.update(ret) for prop in ("no_cache", "no_sitemap"): if not prop in context: context[prop] = getattr(context.doc, prop, False) elif context.controller: module = frappe.get_module(context.controller) if module: # get config fields for prop in ("base_template_path", "template", "no_cache", "no_sitemap", "condition_field"): if hasattr(module, prop): context[prop] = getattr(module, prop) if hasattr(module, "get_context"): ret = module.get_context(context) if ret: context.update(ret) if hasattr(module, "get_children"): context.children = module.get_children(context) add_metatags(context) if context.show_sidebar: add_sidebar_data(context) # determine templates to be used if not context.base_template_path: app_base = frappe.get_hooks("base_template") context.base_template_path = app_base[0] if app_base else "templates/base.html" return context def add_sidebar_data(context): from frappe.utils.user import get_fullname_and_avatar import frappe.www.list if not context.sidebar_items: sidebar_items = json.loads(frappe.cache().get_value('portal_menu_items') or '[]') if not sidebar_items: sidebar_items = frappe.get_all('Portal Menu Item', fields=['title', 'route', 'reference_doctype', 'show_always'], filters={'enabled': 1, 'parent': 'Portal Settings'}, order_by='idx asc') frappe.cache().set_value('portal_menu_items', json.dumps(sidebar_items)) context.sidebar_items = sidebar_items info = get_fullname_and_avatar(frappe.session.user) context["fullname"] = info.fullname context["user_image"] = info.avatar def add_metatags(context): tags = context.get("metatags") if tags: if not "twitter:card" in tags: tags["twitter:card"] = "summary" if not "og:type" in tags: tags["og:type"] = "article" if tags.get("name"): tags["og:title"] = tags["twitter:title"] = tags["name"] if tags.get("description"): tags["og:description"] = tags["twitter:description"] = tags["description"] if tags.get("image"): tags["og:image"] = tags["twitter:image:src"] = tags["image"]