From 355fc4b49e7838de555c0a46f49108676504e9b6 Mon Sep 17 00:00:00 2001 From: Rohan Date: Sun, 8 Sep 2019 02:29:43 +0530 Subject: [PATCH] feat: allow extending doctype dashboards via hooks (develop) (#8336) * feat: allow overriding dasboards via hooks * fix: allow extending dashboard data in hooks * fix: move logic to generic function * format: added description to hook --- frappe/desk/form/meta.py | 1 - frappe/model/meta.py | 9 +++++++-- frappe/utils/boilerplate.py | 9 ++++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/frappe/desk/form/meta.py b/frappe/desk/form/meta.py index a00d5b4220..26fc6037fd 100644 --- a/frappe/desk/form/meta.py +++ b/frappe/desk/form/meta.py @@ -233,4 +233,3 @@ def get_js(path): js = frappe.read_file(path) if js: return render_include(js) - diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 96814984f8..fe6483a3ea 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -408,8 +408,10 @@ class Meta(Document): def get_dashboard_data(self): '''Returns dashboard setup related to this doctype. - This method will return the `data` property in the - `[doctype]_dashboard.py` file in the doctype folder''' + This method will return the `data` property in the `[doctype]_dashboard.py` + file in the doctype's folder, along with any overrides or extensions + implemented in other Frappe applications via hooks. + ''' data = frappe._dict() try: module = load_doctype_module(self.name, suffix='_dashboard') @@ -418,6 +420,9 @@ class Meta(Document): except ImportError: pass + for hook in frappe.get_hooks("override_doctype_dashboards", {}).get(self.name, []): + data = frappe.get_attr(hook)(data=data) + return data def get_row_template(self): diff --git a/frappe/utils/boilerplate.py b/frappe/utils/boilerplate.py index 2de5e1143d..4a7b93751a 100755 --- a/frappe/utils/boilerplate.py +++ b/frappe/utils/boilerplate.py @@ -242,12 +242,19 @@ app_license = "{app_license}" # before_tests = "{app_name}.install.before_tests" -# Overriding Whitelisted Methods +# Overriding Methods # ------------------------------ # # override_whitelisted_methods = {{ # "frappe.desk.doctype.event.event.get_events": "{app_name}.event.get_events" # }} +# +# each overriding function accepts a `data` argument; +# generated from the base implementation of the doctype dashboard, +# along with any modifications made in other Frappe apps +# override_doctype_dashboards = {{ +# "Task": "{app_name}.task.get_dashboard_data" +# }} """