diff --git a/frappe/__init__.py b/frappe/__init__.py index 98a3ca7963..3b9ba03e3c 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -170,9 +170,20 @@ def connect(site=None, db_name=None): from frappe.database import Database if site: init(site) + local.db = Database(user=db_name or local.conf.db_name) set_user("Administrator") +def connect_read_only(): + from frappe.database import Database + + local.read_only_db = Database(local.conf.slave_host, local.conf.slave_db_name, + local.conf.slave_db_password) + + # swap db connections + local.master_db = local.db + local.db = local.read_only_db + def get_site_config(sites_path=None, site_path=None): """Returns `site_config.json` combined with `sites/common_site_config.json`. `site_config` is a set of site wide settings like database name, password, email etc.""" @@ -469,6 +480,21 @@ def whitelist(allow_guest=False, xss_safe=False): return innerfn +def read_only(): + def innfn(fn): + def wrapper_fn(*args, **kwargs): + if conf.use_slave_for_read_only: + connect_read_only() + + retval = fn(*args, **get_newargs(fn, kwargs)) + + if local and hasattr(local, 'master_db'): + local.db = local.master_db + + return retval + return wrapper_fn + return innfn + def only_for(roles): """Raise `frappe.PermissionError` if the user does not have any of the given **Roles**. @@ -926,6 +952,11 @@ def call(fn, *args, **kwargs): if isinstance(fn, string_types): fn = get_attr(fn) + newargs = get_newargs(fn, kwargs) + + return fn(*args, **newargs) + +def get_newargs(fn, kwargs): if hasattr(fn, 'fnargs'): fnargs = fn.fnargs else: @@ -939,7 +970,7 @@ def call(fn, *args, **kwargs): if "flags" in newargs: del newargs["flags"] - return fn(*args, **newargs) + return newargs def make_property_setter(args, ignore_validate=False, validate_fields_for_doctype=True): """Create a new **Property Setter** (for overriding DocType and DocField properties). diff --git a/frappe/desk/query_report.py b/frappe/desk/query_report.py index 843e3d5d26..7d14f25a69 100644 --- a/frappe/desk/query_report.py +++ b/frappe/desk/query_report.py @@ -148,6 +148,7 @@ def get_script(report_name): @frappe.whitelist() +@frappe.read_only() def run(report_name, filters=None, user=None): report = get_report_doc(report_name) diff --git a/frappe/desk/reportview.py b/frappe/desk/reportview.py index 6716faee22..92f7e66d34 100644 --- a/frappe/desk/reportview.py +++ b/frappe/desk/reportview.py @@ -15,6 +15,7 @@ from six import text_type, string_types, StringIO import pymysql @frappe.whitelist() +@frappe.read_only() def get(): args = get_form_params()