refactor(plaid): move configuration from site_config to doctype (#18712)
* feat(plaid): move plaid from site_config to doctype
plaid requires accessing site_config and cloud users cannot access
site_config and hence, plaid integration doesn't work on the cloud.
Moving all the configuration from site_config to the Plaid Settings
doctype fixes this issue.
Signed-off-by: Chinmay D. Pai <chinmaydpai@gmail.com>
* feat(plaid): make changes to plaid_settings and add patch
* remove all references for get()-ing plaid variables from frappe.conf
and replace them with values from doctype
* add patch to move all existing plaid settings variable values from
frappe.conf to plaid_settings doctype
Signed-off-by: Chinmay D. Pai <chinmaydpai@gmail.com>
* fix(plaid): use get_single_value for Plaid Settings
Co-Authored-By: Himanshu <himanshuwarekar@yahoo.com>
* chore: reload plaid_settings before running patch
Signed-off-by: Chinmay D. Pai <chinmaydpai@gmail.com>
* chore: remove useless semicolon
fuck codacy
Signed-off-by: Chinmay D. Pai <chinmaydpai@gmail.com>
diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py
index fbb0ebc..532e19c 100644
--- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py
+++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_connector.py
@@ -3,30 +3,31 @@
# For license information, please see license.txt
from __future__ import unicode_literals
-import frappe
from frappe import _
-import requests
+from frappe.utils.password import get_decrypted_password
from plaid import Client
from plaid.errors import APIError, ItemError
+import frappe
+import requests
+
class PlaidConnector():
def __init__(self, access_token=None):
- if not(frappe.conf.get("plaid_client_id") and frappe.conf.get("plaid_secret") and frappe.conf.get("plaid_public_key")):
- frappe.throw(_("Please complete your Plaid API configuration before synchronizing your account"))
+ plaid_settings = frappe.get_single("Plaid Settings")
self.config = {
- "plaid_client_id": frappe.conf.get("plaid_client_id"),
- "plaid_secret": frappe.conf.get("plaid_secret"),
- "plaid_public_key": frappe.conf.get("plaid_public_key"),
- "plaid_env": frappe.conf.get("plaid_env")
+ "plaid_client_id": plaid_settings.plaid_client_id,
+ "plaid_secret": get_decrypted_password("Plaid Settings", "Plaid Settings", 'plaid_secret'),
+ "plaid_public_key": plaid_settings.plaid_public_key,
+ "plaid_env": plaid_settings.plaid_env
}
- self.client = Client(client_id=self.config["plaid_client_id"],
- secret=self.config["plaid_secret"],
- public_key=self.config["plaid_public_key"],
- environment=self.config["plaid_env"]
- )
+ self.client = Client(client_id=self.config.get("plaid_client_id"),
+ secret=self.config.get("plaid_secret"),
+ public_key=self.config.get("plaid_public_key"),
+ environment=self.config.get("plaid_env")
+ )
self.access_token = access_token
@@ -78,4 +79,4 @@
transactions.extend(response['transactions'])
return transactions
except Exception:
- frappe.log_error(frappe.get_traceback(), _("Plaid transactions sync error"))
\ No newline at end of file
+ frappe.log_error(frappe.get_traceback(), _("Plaid transactions sync error"))
diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.js b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.js
index ace4fbf..0ffbb87 100644
--- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.js
+++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.js
@@ -4,8 +4,18 @@
frappe.provide("erpnext.integrations");
frappe.ui.form.on('Plaid Settings', {
- link_new_account: function(frm) {
- new erpnext.integrations.plaidLink(frm);
+ enabled: function(frm) {
+ frm.toggle_reqd('plaid_client_id', frm.doc.enabled);
+ frm.toggle_reqd('plaid_secret', frm.doc.enabled);
+ frm.toggle_reqd('plaid_public_key', frm.doc.enabled);
+ frm.toggle_reqd('plaid_env', frm.doc.enabled);
+ },
+ refresh: function(frm) {
+ if(frm.doc.enabled) {
+ frm.add_custom_button('Link a new bank account', () => {
+ new erpnext.integrations.plaidLink(frm);
+ });
+ }
}
});
@@ -19,20 +29,10 @@
init_config() {
const me = this;
- frappe.xcall('erpnext.erpnext_integrations.doctype.plaid_settings.plaid_settings.plaid_configuration')
- .then(result => {
- if (result !== "disabled") {
- if (result.plaid_env == undefined || result.plaid_public_key == undefined) {
- frappe.throw(__("Please add valid Plaid api keys in site_config.json first"));
- }
- me.plaid_env = result.plaid_env;
- me.plaid_public_key = result.plaid_public_key;
- me.client_name = result.client_name;
- me.init_plaid();
- } else {
- frappe.throw(__("Please save your document before adding a new account"));
- }
- });
+ me.plaid_env = me.frm.doc.plaid_env;
+ me.plaid_public_key = me.frm.doc.plaid_public_key;
+ me.client_name = frappe.boot.sitename;
+ me.init_plaid();
}
init_plaid() {
@@ -104,4 +104,4 @@
});
}, __("Select a company"), __("Continue"));
}
-};
\ No newline at end of file
+};
diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.json b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.json
index ed51c4e..9903048 100644
--- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.json
+++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.json
@@ -1,161 +1,96 @@
{
- "allow_copy": 0,
- "allow_events_in_timeline": 0,
- "allow_guest_to_view": 0,
- "allow_import": 0,
- "allow_rename": 0,
- "beta": 0,
- "creation": "2018-10-25 10:02:48.656165",
- "custom": 0,
- "docstatus": 0,
- "doctype": "DocType",
- "document_type": "",
- "editable_grid": 1,
- "engine": "InnoDB",
+ "creation": "2018-10-25 10:02:48.656165",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "enabled",
+ "column_break_2",
+ "automatic_sync",
+ "section_break_4",
+ "plaid_client_id",
+ "plaid_secret",
+ "column_break_7",
+ "plaid_public_key",
+ "plaid_env"
+ ],
"fields": [
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "fieldname": "enabled",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Enabled",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
+ "default": "0",
+ "fieldname": "enabled",
+ "fieldtype": "Check",
+ "label": "Enabled"
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:doc.enabled==1",
- "fieldname": "automatic_sync",
- "fieldtype": "Check",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Synchronize all accounts every hour",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
- },
+ "default": "0",
+ "depends_on": "eval:doc.enabled==1",
+ "fieldname": "automatic_sync",
+ "fieldtype": "Check",
+ "label": "Synchronize all accounts every hour"
+ },
{
- "allow_bulk_edit": 0,
- "allow_in_quick_entry": 0,
- "allow_on_submit": 0,
- "bold": 0,
- "collapsible": 0,
- "columns": 0,
- "depends_on": "eval:(doc.enabled==1)&&(!doc.__islocal)",
- "fieldname": "link_new_account",
- "fieldtype": "Button",
- "hidden": 0,
- "ignore_user_permissions": 0,
- "ignore_xss_filter": 0,
- "in_filter": 0,
- "in_global_search": 0,
- "in_list_view": 0,
- "in_standard_filter": 0,
- "label": "Link a new bank account",
- "length": 0,
- "no_copy": 0,
- "permlevel": 0,
- "precision": "",
- "print_hide": 0,
- "print_hide_if_no_value": 0,
- "read_only": 0,
- "remember_last_selected_value": 0,
- "report_hide": 0,
- "reqd": 0,
- "search_index": 0,
- "set_only_once": 0,
- "translatable": 0,
- "unique": 0
+ "depends_on": "eval:doc.enabled==1",
+ "fieldname": "plaid_client_id",
+ "fieldtype": "Data",
+ "in_list_view": 1,
+ "label": "Plaid Client ID",
+ "reqd": 1
+ },
+ {
+ "depends_on": "eval:doc.enabled==1",
+ "fieldname": "plaid_secret",
+ "fieldtype": "Password",
+ "in_list_view": 1,
+ "label": "Plaid Secret",
+ "reqd": 1
+ },
+ {
+ "depends_on": "eval:doc.enabled==1",
+ "fieldname": "plaid_public_key",
+ "fieldtype": "Data",
+ "in_list_view": 1,
+ "label": "Plaid Public Key",
+ "reqd": 1
+ },
+ {
+ "depends_on": "eval:doc.enabled==1",
+ "fieldname": "plaid_env",
+ "fieldtype": "Data",
+ "in_list_view": 1,
+ "label": "Plaid Environment",
+ "reqd": 1
+ },
+ {
+ "fieldname": "column_break_2",
+ "fieldtype": "Column Break"
+ },
+ {
+ "fieldname": "section_break_4",
+ "fieldtype": "Section Break"
+ },
+ {
+ "fieldname": "column_break_7",
+ "fieldtype": "Column Break"
}
- ],
- "has_web_view": 0,
- "hide_heading": 0,
- "hide_toolbar": 0,
- "idx": 0,
- "image_view": 0,
- "in_create": 0,
- "is_submittable": 0,
- "issingle": 1,
- "istable": 0,
- "max_attachments": 0,
- "modified": "2018-12-14 12:51:12.331395",
- "modified_by": "Administrator",
- "module": "ERPNext Integrations",
- "name": "Plaid Settings",
- "name_case": "",
- "owner": "Administrator",
+ ],
+ "issingle": 1,
+ "modified": "2019-08-13 17:00:06.939422",
+ "modified_by": "Administrator",
+ "module": "ERPNext Integrations",
+ "name": "Plaid Settings",
+ "owner": "Administrator",
"permissions": [
{
- "amend": 0,
- "cancel": 0,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 0,
- "if_owner": 0,
- "import": 0,
- "permlevel": 0,
- "print": 1,
- "read": 1,
- "report": 0,
- "role": "System Manager",
- "set_user_permissions": 0,
- "share": 1,
- "submit": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "print": 1,
+ "read": 1,
+ "role": "System Manager",
+ "share": 1,
"write": 1
}
- ],
- "quick_entry": 0,
- "read_only": 0,
- "read_only_onload": 0,
- "show_name_in_global_search": 0,
- "sort_field": "modified",
- "sort_order": "DESC",
- "track_changes": 0,
- "track_seen": 0,
- "track_views": 0
+ ],
+ "sort_field": "modified",
+ "sort_order": "DESC"
}
\ No newline at end of file
diff --git a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py
index 8d31e24..4af1d74 100644
--- a/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py
+++ b/erpnext/erpnext_integrations/doctype/plaid_settings/plaid_settings.py
@@ -16,8 +16,13 @@
@frappe.whitelist()
def plaid_configuration():
- if frappe.db.get_value("Plaid Settings", None, "enabled") == "1":
- return {"plaid_public_key": frappe.conf.get("plaid_public_key") or None, "plaid_env": frappe.conf.get("plaid_env") or None, "client_name": frappe.local.site }
+ if frappe.db.get_single_value("Plaid Settings", "enabled"):
+ plaid_settings = frappe.get_single("Plaid Settings")
+ return {
+ "plaid_public_key": plaid_settings.plaid_public_key,
+ "plaid_env": plaid_settings.plaid_env,
+ "client_name": frappe.local.site
+ }
else:
return "disabled"
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 2f74d54..7c1d8a0 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -625,6 +625,7 @@
erpnext.patches.v12_0.update_ewaybill_field_position
erpnext.patches.v12_0.create_accounting_dimensions_in_missing_doctypes
erpnext.patches.v11_1.set_status_for_material_request_type_manufacture
+erpnext.patches.v12_0.move_plaid_settings_to_doctype
execute:frappe.reload_doc('desk', 'doctype','dashboard_chart_link')
execute:frappe.reload_doc('desk', 'doctype','dashboard')
execute:frappe.reload_doc('desk', 'doctype','dashboard_chart_source')
diff --git a/erpnext/patches/v12_0/move_plaid_settings_to_doctype.py b/erpnext/patches/v12_0/move_plaid_settings_to_doctype.py
new file mode 100644
index 0000000..8e60d33
--- /dev/null
+++ b/erpnext/patches/v12_0/move_plaid_settings_to_doctype.py
@@ -0,0 +1,22 @@
+# Copyright (c) 2017, Frappe and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import frappe
+
+def execute():
+ frappe.reload_doc("erpnext_integrations", "doctype", "plaid_settings")
+ plaid_settings = frappe.get_single("Plaid Settings")
+ if plaid_settings.enabled:
+ if not (frappe.conf.plaid_client_id and frappe.conf.plaid_env \
+ and frappe.conf.plaid_public_key and frappe.conf.plaid_secret):
+ plaid_settings.enabled = 0
+ else:
+ plaid_settings.update({
+ "plaid_client_id": frappe.conf.plaid_client_id,
+ "plaid_public_key": frappe.conf.plaid_public_key,
+ "plaid_env": frappe.conf.plaid_env,
+ "plaid_secret": frappe.conf.plaid_secret
+ })
+ plaid_settings.flags.ignore_mandatory = True
+ plaid_settings.save()