From 011b4c8355c710f25778cff0a9a5d7678abf47ad Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Mon, 8 Oct 2018 14:17:42 +0530 Subject: [PATCH] Move deferred insert code to separate file --- frappe/deferred_insert.py | 64 +++++++++++++++++++ .../doctype/route_history/route_history.py | 24 ------- frappe/hooks.py | 2 +- frappe/public/js/frappe/router.js | 9 +-- 4 files changed, 70 insertions(+), 29 deletions(-) create mode 100644 frappe/deferred_insert.py diff --git a/frappe/deferred_insert.py b/frappe/deferred_insert.py new file mode 100644 index 0000000000..cf48fbb891 --- /dev/null +++ b/frappe/deferred_insert.py @@ -0,0 +1,64 @@ +import frappe +import json + +queue_prefix = 'insert_queue_for_' + +@frappe.whitelist() +def deferred_insert(doctype, records): + frappe.cache().rpush(queue_prefix + doctype, records) + +def save_to_db(): + queue_keys = frappe.cache().get_keys(queue_prefix) + for key in queue_keys: + record_count = 0 + queue_key = get_key_name(key) + doctype = get_doctype_name(key) + while frappe.cache().llen(queue_key) > 0 and record_count <= 500: + records = frappe.cache().lpop(queue_key) + records = json.loads(records) + if isinstance(records, dict): + insert_record(records, doctype) + continue + for record in records: + record_count += 1 + insert_record(record, doctype) + +def insert_record(record, doctype): + if not record['doctype']: + record['doctype'] = doctype + try: + doc = frappe.get_doc(record) + doc.insert() + except Exception as e: + print(e, doctype) + +def get_key_name(key): + return key.split('|')[1] + +def get_doctype_name(key): + return key.split(queue_prefix)[1] + + +# def save_to_db(doctype): +# values=[] +# queue_key = 'deferred_insert_queue_for' + doctype +# value_key = '' +# while frappe.cache().llen(queue_key) > 0: +# records = frappe.cache().lpop(queue_key) +# records = json.loads(records) +# if not value_key: value_key = list(records[0].keys()) +# value_template = "('{" + "}', '{".join(value_key) + "}')" +# for record in records: +# if value_key != list(record.keys()): +# print('Keys should match for all records', value_key, list(record.keys())) +# continue +# values.append(value_template.format(**record)) + +# if not values: return + +# frappe.db.sql(''' +# INSERT INTO `tab{doctype}` (`{keys}`) +# VALUES {values} +# '''.format(doctype=doctype, keys="`, `".join(value_key), values=", ".join(values)), debug=1) + +# frappe.db.commit() \ No newline at end of file diff --git a/frappe/desk/doctype/route_history/route_history.py b/frappe/desk/doctype/route_history/route_history.py index fd2305e875..66db5a41c9 100644 --- a/frappe/desk/doctype/route_history/route_history.py +++ b/frappe/desk/doctype/route_history/route_history.py @@ -10,30 +10,6 @@ import json class RouteHistory(Document): pass -@frappe.whitelist() -def save_route_history(routes): - frappe.cache().rpush('route_history', routes) - -def save_route_history_to_db(): - values = [] - while frappe.cache().llen('route_history') > 0: - routes = frappe.cache().lpop('route_history') - routes = json.loads(routes) - for route_obj in routes: - route_obj['name'] = frappe.generate_hash('Route History', 10) - route_obj['modified'] = frappe.utils.now() - values.append("('{user}', '{name}', '{route}', '{creation}', '{modified}')" - .format(**route_obj)) - - if not values: return - - frappe.db.sql(''' - INSERT INTO `tabRoute History` (`user`, `name`, `route`, `creation`, `modified`) - VALUES {0} - '''.format(", ".join(values)), debug=1) - - frappe.db.commit() - def flush_old_route_records(): """Deletes all route records except last 500 records per user""" diff --git a/frappe/hooks.py b/frappe/hooks.py index c29015425b..fedd45e9f5 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -158,7 +158,7 @@ scheduler_events = { "frappe.desk.page.backups.backups.delete_downloadable_backups", "frappe.limits.update_space_usage", "frappe.desk.doctype.auto_repeat.auto_repeat.make_auto_repeat_entry", - "frappe.desk.doctype.route_history.route_history.save_route_history_to_db" + "frappe.deferred_insert.save_to_db" ], "daily": [ "frappe.email.queue.clear_outbox", diff --git a/frappe/public/js/frappe/router.js b/frappe/public/js/frappe/router.js index 263870f947..07e0e18e26 100644 --- a/frappe/public/js/frappe/router.js +++ b/frappe/public/js/frappe/router.js @@ -17,14 +17,15 @@ const routes_to_skip = ['Form']; const save_routes = frappe.utils.debounce(() => { const routes = frappe.route_history_queue; frappe.route_history_queue = []; - frappe.xcall('frappe.desk.doctype.route_history.route_history.save_route_history', { - routes: routes + frappe.xcall('frappe.deferred_insert.deferred_insert', { + 'doctype': 'Route History', + 'records': routes }).then(() => { - console.log('routes saved!'); + console.log('Routes saved!'); }).catch(() => { frappe.route_history_queue.concat(routes); }); -}, 5000); +}, 10000); frappe.route = function() {