From 76d485319c3e844c6b57ce99a0cb4d90f17f44dc Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 6 Apr 2015 21:05:08 +0530 Subject: [PATCH] refactored create_new and disabled create_new caching --- frappe/model/create_new.py | 153 ++++++++++++++++++++++--------------- 1 file changed, 92 insertions(+), 61 deletions(-) diff --git a/frappe/model/create_new.py b/frappe/model/create_new.py index afaec6780c..3d1894a432 100644 --- a/frappe/model/create_new.py +++ b/frappe/model/create_new.py @@ -13,66 +13,71 @@ from frappe.model.db_schema import type_map import copy def get_new_doc(doctype, parent_doc = None, parentfield = None, as_dict=False): - if not doctype in frappe.local.new_doc_templates: - # cache a copy of new doc as it is called - # frequently for inserts - doc = frappe.get_doc({ - "doctype": doctype, - "__islocal": 1, - "owner": frappe.session.user, - "docstatus": 0 - }) + # if doctype not in frappe.local.new_doc_templates: + # # cache a copy of new doc as it is called + # # frequently for inserts + # frappe.local.new_doc_templates[doctype] = make_new_doc(doctype) + # + # doc = copy.deepcopy(frappe.local.new_doc_templates[doctype]) - user_permissions = frappe.defaults.get_user_permissions() + doc = make_new_doc(doctype) - defaults = frappe.defaults.get_defaults() - - for df in doc.meta.get("fields"): - if df.fieldtype in type_map: - default_value = get_default_value(df, defaults, user_permissions, parent_doc) - doc.set(df.fieldname, default_value) - - doc._fix_numeric_types() - doc = doc.get_valid_dict() - doc["doctype"] = doctype - doc["__islocal"] = 1 - - frappe.local.new_doc_templates[doctype] = doc - - doc = copy.deepcopy(frappe.local.new_doc_templates[doctype]) - - if parent_doc: - doc["parent"] = parent_doc.name - doc["parenttype"] = parent_doc.doctype - - if parentfield: - doc["parentfield"] = parentfield + set_dynamic_default_values(doc, parent_doc, parentfield) if as_dict: return doc else: return frappe.get_doc(doc) -def get_default_value(df, defaults, user_permissions, parent_doc): - user_permissions_exist = (df.fieldtype=="Link" - and not getattr(df, "ignore_user_permissions", False) - and df.options in (user_permissions or [])) +def make_new_doc(doctype): + doc = frappe.get_doc({ + "doctype": doctype, + "__islocal": 1, + "owner": frappe.session.user, + "docstatus": 0 + }) + set_user_and_static_default_values(doc) + + doc._fix_numeric_types() + doc = doc.get_valid_dict() + doc["doctype"] = doctype + doc["__islocal"] = 1 + + return doc + +def set_user_and_static_default_values(doc): + user_permissions = frappe.defaults.get_user_permissions() + defaults = frappe.defaults.get_defaults() + + for df in doc.meta.get("fields"): + if df.fieldtype in type_map: + user_default_value = get_user_default_value(df, defaults, user_permissions) + if user_default_value is not None: + doc.set(df.fieldname, user_default_value) + + else: + static_default_value = get_static_default_value(df, user_permissions) + if static_default_value is not None: + doc.set(df.fieldname, static_default_value) + +def get_user_default_value(df, defaults, user_permissions): # don't set defaults for "User" link field using User Permissions! if df.fieldtype == "Link" and df.options != "User": # 1 - look in user permissions - if user_permissions_exist and len(user_permissions[df.options])==1: + if user_permissions_exist(df, user_permissions) and len(user_permissions[df.options])==1: return user_permissions[df.options][0] # 2 - Look in user defaults user_default = defaults.get(df.fieldname) - is_allowed_user_default = user_default and (not user_permissions_exist + is_allowed_user_default = user_default and (not user_permissions_exist(df, user_permissions) or (user_default in user_permissions.get(df.options, []))) # is this user default also allowed as per user permissions? if is_allowed_user_default: return user_default +def get_static_default_value(df, user_permissions): # 3 - look in default of docfield if df.get("default"): if df.default == "__user": @@ -81,30 +86,56 @@ def get_default_value(df, defaults, user_permissions, parent_doc): elif df.default == "Today": return nowdate() - elif (df.default or "").lower() == "now": - return now_datetime() + elif not df.default.startswith(":"): + # a simple default value + is_allowed_default_value = (not user_permissions_exist(df, user_permissions) + or (df.default in user_permissions.get(df.options, []))) - elif df.default.startswith(":"): - # default value based on another document - ref_doctype = df.default[1:] - ref_fieldname = ref_doctype.lower().replace(" ", "_") - reference_name = parent_doc.get(ref_fieldname) if parent_doc else frappe.db.get_default(ref_fieldname) - - default_value = frappe.db.get_value(ref_doctype, reference_name, df.fieldname) - is_allowed_default_value = (not user_permissions_exist or - (default_value in user_permissions.get(df.options, []))) - - # is this allowed as per user permissions - if is_allowed_default_value: - return default_value - - # a static default value - is_allowed_default_value = (not user_permissions_exist or (df.default in user_permissions.get(df.options, []))) - if df.fieldtype!="Link" or df.options=="User" or is_allowed_default_value: - return df.default - - elif df.fieldtype == "Time": - return nowtime() + if df.fieldtype!="Link" or df.options=="User" or is_allowed_default_value: + return df.default elif (df.fieldtype == "Select" and df.options and df.options not in ("[Select]", "Loading...")): return df.options.split("\n")[0] + +def set_dynamic_default_values(doc, parent_doc, parentfield): + # these values should not be cached + user_permissions = frappe.defaults.get_user_permissions() + + for df in frappe.get_meta(doc["doctype"]).get("fields"): + if df.get("default"): + if df.default.startswith(":"): + default_value = get_default_based_on_another_field(df, user_permissions, parent_doc) + if default_value is not None: + doc[df.fieldname] = default_value + + elif df.fieldtype == "Datetime" and df.default.lower() == "now": + doc[df.fieldname] = now_datetime() + + if df.fieldtype == "Time": + doc[df.fieldname] = nowtime() + + if parent_doc: + doc["parent"] = parent_doc.name + doc["parenttype"] = parent_doc.doctype + + if parentfield: + doc["parentfield"] = parentfield + +def user_permissions_exist(df, user_permissions): + return (df.fieldtype=="Link" + and not getattr(df, "ignore_user_permissions", False) + and df.options in (user_permissions or [])) + +def get_default_based_on_another_field(df, user_permissions, parent_doc): + # default value based on another document + ref_doctype = df.default[1:] + ref_fieldname = ref_doctype.lower().replace(" ", "_") + reference_name = parent_doc.get(ref_fieldname) if parent_doc else frappe.db.get_default(ref_fieldname) + + default_value = frappe.db.get_value(ref_doctype, reference_name, df.fieldname) + is_allowed_default_value = (not user_permissions_exist(df, user_permissions) or + (default_value in user_permissions.get(df.options, []))) + + # is this allowed as per user permissions + if is_allowed_default_value: + return default_value