[WIP][Enhancement] Provision to pull reports from slave systems (#5844)

* [Enhancement] Provision to pull reports from slave systems

* [fix] check if master_db exists

* Pull list view from slave system
This commit is contained in:
Saurabh 2018-07-24 17:42:21 +05:30 committed by Rushabh Mehta
parent aef1046b1f
commit d46fd09b44
3 changed files with 34 additions and 1 deletions

View file

@ -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).

View file

@ -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)

View file

@ -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()