old_contents: # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  # License: MIT. See LICENSE
  no_cache = 1
  
  import json
  import os
  import re
  
  import frappe
  import frappe.sessions
  from frappe import _
  from frappe.utils.jinja_globals import is_rtl
  
  SCRIPT_TAG_PATTERN = re.compile(r"\<script[^<]*\</script\>")
  CLOSING_SCRIPT_TAG_PATTERN = re.compile(r"</script\>")
  
  
  def get_context(context):
  	if frappe.session.user == "Guest":
  		frappe.throw(_("Log in to access this page."), frappe.PermissionError)
  	elif (
  		frappe.db.get_value("User", frappe.session.user, "user_type", order_by=None) == "Website User"
  	):
  		frappe.throw(_("You are not permitted to access this page."), frappe.PermissionError)
  
  	hooks = frappe.get_hooks()
  	try:
  		boot = frappe.sessions.get()
  	except Exception as e:
  		boot = frappe._dict(status="failed", error=str(e))
  		print(frappe.get_traceback())
  
  	# this needs commit
  	csrf_token = frappe.sessions.get_csrf_token()
  
  	frappe.db.commit()
  
  	boot_json = frappe.as_json(boot, indent=None, separators=(",", ":"))
  
  	# remove script tags from boot
  	boot_json = SCRIPT_TAG_PATTERN.sub("", boot_json)
  
  	# TODO: Find better fix
  	boot_json = CLOSING_SCRIPT_TAG_PATTERN.sub("", boot_json)
  	boot_json = json.dumps(boot_json)
  
  	context.update(
  		{
  			"no_cache": 1,
  			"build_version": frappe.utils.get_build_version(),
  			"include_js": hooks["app_include_js"],
  			"include_css": hooks["app_include_css"],
  			"layout_direction": "rtl" if is_rtl() else "ltr",
  			"lang": frappe.local.lang,
  			"sounds": hooks["sounds"],
  			"boot": boot if context.get("for_mobile") else boot_json,
  			"desk_theme": boot.get("desk_theme") or "Light",
  			"csrf_token": csrf_token,
  			"google_analytics_id": frappe.conf.get("google_analytics_id"),
  			"google_analytics_anonymize_ip": frappe.conf.get("google_analytics_anonymize_ip"),
  			"mixpanel_id": frappe.conf.get("mixpanel_id"),
  		}
  	)
  
  	return context
  
new_contents: # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  # License: MIT. See LICENSE
  no_cache = 1
  
  import json
  import os
  import re
  
  import frappe
  import frappe.sessions
  from frappe import _
  from frappe.utils.jinja_globals import is_rtl
  
  SCRIPT_TAG_PATTERN = re.compile(r"\<script[^<]*\</script\>")
  CLOSING_SCRIPT_TAG_PATTERN = re.compile(r"</script\>")
  
  
  def get_context(context):
  	if frappe.session.user == "Guest":
  		frappe.throw(_("Log in to access this page."), frappe.PermissionError)
  	elif (
  		frappe.db.get_value("User", frappe.session.user, "user_type", order_by=None) == "Website User"
  	):
  		frappe.throw(_("You are not permitted to access this page."), frappe.PermissionError)
  
  	hooks = frappe.get_hooks()
  	try:
  		boot = frappe.sessions.get()
  	except Exception as e:
  		boot = frappe._dict(status="failed", error=str(e))
  		print(frappe.get_traceback())
  
  	# this needs commit
  	csrf_token = frappe.sessions.get_csrf_token()
  
  	frappe.db.commit()
  
  	boot_json = frappe.as_json(boot, indent=None, separators=(",", ":"))
  
  	# remove script tags from boot
  	boot_json = SCRIPT_TAG_PATTERN.sub("", boot_json)
  
  	# TODO: Find better fix
  	boot_json = CLOSING_SCRIPT_TAG_PATTERN.sub("", boot_json)
  	boot_json = json.dumps(boot_json)
  
  	include_js = hooks.get("app_include_js", []) + frappe.conf.get("app_include_js", [])
  	include_css = hooks.get("app_include_css", []) + frappe.conf.get("app_include_css", [])
  
  	context.update(
  		{
  			"no_cache": 1,
  			"build_version": frappe.utils.get_build_version(),
  			"include_js": include_js,
  			"include_css": include_css,
  			"layout_direction": "rtl" if is_rtl() else "ltr",
  			"lang": frappe.local.lang,
  			"sounds": hooks["sounds"],
  			"boot": boot if context.get("for_mobile") else boot_json,
  			"desk_theme": boot.get("desk_theme") or "Light",
  			"csrf_token": csrf_token,
  			"google_analytics_id": frappe.conf.get("google_analytics_id"),
  			"google_analytics_anonymize_ip": frappe.conf.get("google_analytics_anonymize_ip"),
  			"mixpanel_id": frappe.conf.get("mixpanel_id"),
  		}
  	)
  
  	return context
  
subject: Allow app_include_js and app_include_css via site config