|
- import json
- import frappe
-
- from frappe.utils import cstr
-
- 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.decode('utf-8'))
- if isinstance(records, dict):
- record_count += 1
- insert_record(records, doctype)
- continue
- for record in records:
- record_count += 1
- insert_record(record, doctype)
-
- frappe.db.commit()
-
- def insert_record(record, doctype):
- if not record.get('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 cstr(key).split('|')[1]
-
- def get_doctype_name(key):
- return cstr(key).split(queue_prefix)[1]
|