@@ -95,7 +95,7 @@ def init(site, sites_path=None, new_site=False): | |||||
local.realtime_log = [] | local.realtime_log = [] | ||||
local.flags = _dict({ | local.flags = _dict({ | ||||
"ran_schedulers": [], | "ran_schedulers": [], | ||||
"currenty_saving": _dict(), | |||||
"currently_saving": [], | |||||
"redirect_location": "", | "redirect_location": "", | ||||
"in_install_db": False, | "in_install_db": False, | ||||
"in_install_app": False, | "in_install_app": False, | ||||
@@ -148,10 +148,10 @@ def update_parent_status(doc): | |||||
status_field = parent.meta.get_field("status") | status_field = parent.meta.get_field("status") | ||||
if status_field and "Open" in (status_field.options or "").split("\n"): | |||||
if status_field: | |||||
to_status = "Open" if doc.sent_or_received=="Received" else "Replied" | to_status = "Open" if doc.sent_or_received=="Received" else "Replied" | ||||
if to_status in status_field.options.splitlines(): | |||||
if to_status in (status_field.options or '').splitlines(): | |||||
parent.db_set("status", to_status) | parent.db_set("status", to_status) | ||||
update_mins_to_first_communication(parent, doc) | update_mins_to_first_communication(parent, doc) | ||||
@@ -12,8 +12,6 @@ def savedocs(doc, action): | |||||
doc = frappe.get_doc(json.loads(doc)) | doc = frappe.get_doc(json.loads(doc)) | ||||
set_local_name(doc) | set_local_name(doc) | ||||
frappe.local.flags.currently_saving = frappe._dict(doctype=doc.doctype, name=doc.name) | |||||
# action | # action | ||||
doc.docstatus = {"Save":0, "Submit": 1, "Update": 1, "Cancel": 2}[action] | doc.docstatus = {"Save":0, "Submit": 1, "Update": 1, "Cancel": 2}[action] | ||||
@@ -31,9 +29,6 @@ def savedocs(doc, action): | |||||
run_onload(doc) | run_onload(doc) | ||||
frappe.get_user().update_recent(doc.doctype, doc.name) | frappe.get_user().update_recent(doc.doctype, doc.name) | ||||
send_updated_docs(doc) | send_updated_docs(doc) | ||||
frappe.local.flags.currently_saving = None | |||||
except Exception: | except Exception: | ||||
if not frappe.local.message_log: | if not frappe.local.message_log: | ||||
frappe.msgprint(frappe._('Did not save')) | frappe.msgprint(frappe._('Did not save')) | ||||
@@ -350,7 +350,9 @@ class BaseDocument(object): | |||||
def db_set(self, fieldname, value, update_modified=True): | def db_set(self, fieldname, value, update_modified=True): | ||||
self.set(fieldname, value) | self.set(fieldname, value) | ||||
if update_modified: | |||||
if update_modified and (self.doctype, self.name) not in frappe.flags.currently_saving: | |||||
# don't update modified timestamp if called from post save methods | |||||
# like on_update or on_submit | |||||
self.set("modified", now()) | self.set("modified", now()) | ||||
self.set("modified_by", frappe.session.user) | self.set("modified_by", frappe.session.user) | ||||
@@ -374,6 +374,8 @@ class Document(BaseDocument): | |||||
if not d.creation: | if not d.creation: | ||||
d.creation = self.creation | d.creation = self.creation | ||||
frappe.flags.currently_saving.append((self.doctype, self.name)) | |||||
def set_docstatus(self): | def set_docstatus(self): | ||||
if self.docstatus==None: | if self.docstatus==None: | ||||
self.docstatus=0 | self.docstatus=0 | ||||
@@ -720,6 +722,9 @@ class Document(BaseDocument): | |||||
self.clear_cache() | self.clear_cache() | ||||
self.notify_update() | self.notify_update() | ||||
if (self.doctype, self.name) in frappe.flags.currently_saving: | |||||
frappe.flags.currently_saving.remove((self.doctype, self.name)) | |||||
self.latest = None | self.latest = None | ||||
def clear_cache(self): | def clear_cache(self): | ||||
@@ -61,9 +61,9 @@ class Meta(Document): | |||||
super(Meta, self).__init__("DocType", doctype) | super(Meta, self).__init__("DocType", doctype) | ||||
self.process() | self.process() | ||||
def load_from_db(self): | |||||
def reload(self): | |||||
try: | try: | ||||
super(Meta, self).load_from_db() | |||||
super(Meta, self).reload() | |||||
except frappe.DoesNotExistError: | except frappe.DoesNotExistError: | ||||
if self.doctype=="DocType" and self.name in self.special_doctypes: | if self.doctype=="DocType" and self.name in self.special_doctypes: | ||||
self.__dict__.update(load_doctype_from_file(self.name)) | self.__dict__.update(load_doctype_from_file(self.name)) | ||||
@@ -147,7 +147,7 @@ class TestDocument(unittest.TestCase): | |||||
d.meta.get_field("starts_on").allow_on_submit = 0 | d.meta.get_field("starts_on").allow_on_submit = 0 | ||||
# when comparing date(2014, 1, 1) and "2014-01-01" | # when comparing date(2014, 1, 1) and "2014-01-01" | ||||
d.load_from_db() | |||||
d.reload() | |||||
d.starts_on = "2014-01-01" | d.starts_on = "2014-01-01" | ||||
d.validate_update_after_submit() | d.validate_update_after_submit() | ||||
@@ -164,7 +164,7 @@ class TestDocument(unittest.TestCase): | |||||
escaped_xss = xss.replace('<', '<').replace('>', '>') | escaped_xss = xss.replace('<', '<').replace('>', '>') | ||||
d.subject += xss | d.subject += xss | ||||
d.save() | d.save() | ||||
d.load_from_db() | |||||
d.reload() | |||||
self.assertTrue(xss not in d.subject) | self.assertTrue(xss not in d.subject) | ||||
self.assertTrue(escaped_xss in d.subject) | self.assertTrue(escaped_xss in d.subject) | ||||
@@ -174,7 +174,7 @@ class TestDocument(unittest.TestCase): | |||||
escaped_xss = '<div>Test</div>' | escaped_xss = '<div>Test</div>' | ||||
d.subject += xss | d.subject += xss | ||||
d.save() | d.save() | ||||
d.load_from_db() | |||||
d.reload() | |||||
self.assertTrue(xss not in d.subject) | self.assertTrue(xss not in d.subject) | ||||
self.assertTrue(escaped_xss in d.subject) | self.assertTrue(escaped_xss in d.subject) | ||||
@@ -184,7 +184,7 @@ class TestDocument(unittest.TestCase): | |||||
escaped_xss = '<div style="color: red;">Test</div>' | escaped_xss = '<div style="color: red;">Test</div>' | ||||
d.subject += xss | d.subject += xss | ||||
d.save() | d.save() | ||||
d.load_from_db() | |||||
d.reload() | |||||
self.assertTrue(xss not in d.subject) | self.assertTrue(xss not in d.subject) | ||||
self.assertTrue(escaped_xss in d.subject) | self.assertTrue(escaped_xss in d.subject) | ||||
@@ -44,7 +44,7 @@ def update_nsm(doc): | |||||
doc.set(opf, p) | doc.set(opf, p) | ||||
frappe.db.set_value(doc.doctype, doc.name, opf, p or '') | frappe.db.set_value(doc.doctype, doc.name, opf, p or '') | ||||
doc.load_from_db() | |||||
doc.reload() | |||||
def update_add_node(doc, parent, parent_field): | def update_add_node(doc, parent, parent_field): | ||||
""" | """ | ||||