seitime-frappe/frappe/www/website_script.py
2025-01-24 19:08:04 +05:30

54 lines
1.9 KiB
Python

# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: MIT. See LICENSE
import frappe
from frappe.utils import strip
from frappe.utils.data import add_to_date, get_datetime
from frappe.website.doctype.website_theme.website_theme import get_active_theme
base_template_path = "www/website_script.js"
# NOTE: This is misleading.
# We want to avoid Redis cache and instead use proxy cache as website_script.js gets loaded on
# every website page and never really changes.
no_cache = True
# 5 minutes public cache, SWR after that to avoid hard "misses".
cache_headers = {"Cache-Control": "public,max-age=300,stale-while-revalidate=10800"}
def get_context(context):
should_cache = not_modified_recently(frappe.get_website_settings("modified"))
website_script = frappe.get_cached_doc("Website Script")
context.javascript = website_script.javascript or ""
should_cache &= not_modified_recently(website_script.modified)
if theme := get_active_theme():
js = strip(theme.js or "")
if js:
context.javascript += "\n" + js
should_cache &= not_modified_recently(theme.modified)
if not frappe.conf.developer_mode:
context["google_analytics_id"] = get_setting("google_analytics_id")
context["google_analytics_anonymize_ip"] = get_setting("google_analytics_anonymize_ip")
# Heuristics/DX:
# If none of the documents are being modified right now then we can cache this page.
# Ref: https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching#heuristic_caching
if should_cache:
frappe.local.response_headers.update(cache_headers)
def not_modified_recently(timestamp):
ten_minutes_ago = add_to_date(minutes=-10, as_datetime=True, as_string=False)
return ten_minutes_ago > get_datetime(timestamp)
def get_setting(field_name):
"""Return value of field_name frok Website Settings or Site Config."""
website_settings = frappe.get_website_settings(field_name)
conf = frappe.conf.get(field_name)
return website_settings or conf