@@ -1536,7 +1536,7 @@ def make_property_setter( | |||||
.select(DocField_doctype.parent) | .select(DocField_doctype.parent) | ||||
.where(DocField_doctype.fieldname == args.fieldname) | .where(DocField_doctype.fieldname == args.fieldname) | ||||
.distinct() | .distinct() | ||||
).run(as_list=True) | |||||
).run(pluck=True) | |||||
else: | else: | ||||
doctype_list = [args.doctype] | doctype_list = [args.doctype] | ||||
@@ -1,13 +1,28 @@ | |||||
import json | import json | ||||
from typing import TYPE_CHECKING, Dict, List, Union | |||||
import redis | |||||
import frappe | import frappe | ||||
from frappe.utils import cstr | from frappe.utils import cstr | ||||
if TYPE_CHECKING: | |||||
from frappe.model.document import Document | |||||
queue_prefix = "insert_queue_for_" | queue_prefix = "insert_queue_for_" | ||||
def deferred_insert(doctype, records): | |||||
frappe.cache().rpush(queue_prefix + doctype, records) | |||||
def deferred_insert(doctype: str, records: Union[List[Union[Dict, "Document"]], str]): | |||||
if isinstance(records, (dict, list)): | |||||
_records = json.dumps(records) | |||||
else: | |||||
_records = records | |||||
try: | |||||
frappe.cache().rpush(f"{queue_prefix}{doctype}", _records) | |||||
except redis.exceptions.ConnectionError: | |||||
for record in records: | |||||
insert_record(record, doctype) | |||||
def save_to_db(): | def save_to_db(): | ||||
@@ -30,19 +45,17 @@ def save_to_db(): | |||||
frappe.db.commit() | frappe.db.commit() | ||||
def insert_record(record, doctype): | |||||
if not record.get("doctype"): | |||||
record["doctype"] = doctype | |||||
def insert_record(record: Union[Dict, "Document"], doctype: str): | |||||
setattr(record, "doctype", doctype) | |||||
try: | try: | ||||
doc = frappe.get_doc(record) | |||||
doc.insert() | |||||
frappe.get_doc(record).insert() | |||||
except Exception as e: | except Exception as e: | ||||
print(e, doctype) | |||||
frappe.logger().error(f"Error while inserting deferred {doctype} record: {e}") | |||||
def get_key_name(key): | |||||
def get_key_name(key: str) -> str: | |||||
return cstr(key).split("|")[1] | return cstr(key).split("|")[1] | ||||
def get_doctype_name(key): | |||||
def get_doctype_name(key: str) -> str: | |||||
return cstr(key).split(queue_prefix)[1] | return cstr(key).split(queue_prefix)[1] |
@@ -1,11 +1,11 @@ | |||||
# Copyright (c) 2021, Frappe Technologies and contributors | |||||
# Copyright (c) 2022, Frappe Technologies and contributors | |||||
# License: MIT. See LICENSE | # License: MIT. See LICENSE | ||||
import json | |||||
import frappe | import frappe | ||||
from frappe.deferred_insert import deferred_insert as _deferred_insert | from frappe.deferred_insert import deferred_insert as _deferred_insert | ||||
from frappe.model.document import Document | from frappe.model.document import Document | ||||
from frappe.query_builder import DocType | |||||
from frappe.query_builder.functions import Count | |||||
class RouteHistory(Document): | class RouteHistory(Document): | ||||
@@ -14,31 +14,29 @@ class RouteHistory(Document): | |||||
def flush_old_route_records(): | def flush_old_route_records(): | ||||
"""Deletes all route records except last 500 records per user""" | """Deletes all route records except last 500 records per user""" | ||||
records_to_keep_limit = 500 | records_to_keep_limit = 500 | ||||
users = frappe.db.sql( | |||||
""" | |||||
SELECT `user` | |||||
FROM `tabRoute History` | |||||
GROUP BY `user` | |||||
HAVING count(`name`) > %(limit)s | |||||
""", | |||||
{"limit": records_to_keep_limit}, | |||||
) | |||||
RouteHistory = DocType("Route History") | |||||
users = ( | |||||
frappe.qb.from_(RouteHistory) | |||||
.select(RouteHistory.user) | |||||
.groupby(RouteHistory.user) | |||||
.having(Count(RouteHistory.name) > records_to_keep_limit) | |||||
).run(pluck=True) | |||||
for user in users: | for user in users: | ||||
user = user[0] | |||||
last_record_to_keep = frappe.db.get_all( | |||||
last_record_to_keep = frappe.get_all( | |||||
"Route History", | "Route History", | ||||
filters={"user": user}, | filters={"user": user}, | ||||
limit=1, | |||||
limit_start=500, | limit_start=500, | ||||
fields=["modified"], | fields=["modified"], | ||||
order_by="modified desc", | order_by="modified desc", | ||||
limit=1, | |||||
) | ) | ||||
frappe.db.delete( | frappe.db.delete( | ||||
"Route History", {"modified": ("<=", last_record_to_keep[0].modified), "user": user} | |||||
"Route History", | |||||
{"modified": ("<=", last_record_to_keep[0].modified), "user": user}, | |||||
) | ) | ||||
@@ -53,7 +51,7 @@ def deferred_insert(routes): | |||||
for route in frappe.parse_json(routes) | for route in frappe.parse_json(routes) | ||||
] | ] | ||||
_deferred_insert("Route History", json.dumps(routes)) | |||||
_deferred_insert("Route History", routes) | |||||
@frappe.whitelist() | @frappe.whitelist() | ||||
@@ -41,3 +41,5 @@ frappe.ui.form.ControlInt = class ControlInt extends frappe.ui.form.ControlData | |||||
return cint(this.eval_expression(value), null); | return cint(this.eval_expression(value), null); | ||||
} | } | ||||
}; | }; | ||||
frappe.ui.form.ControlLongInt = frappe.ui.form.ControlInt; |