@@ -253,8 +253,8 @@ class User(Document): | |||||
self.email_new_password(new_password) | self.email_new_password(new_password) | ||||
except frappe.OutgoingEmailError: | except frappe.OutgoingEmailError: | ||||
print(frappe.get_traceback()) | |||||
pass # email server not set, don't send email | |||||
# email server not set, don't send email | |||||
frappe.log_error(frappe.get_traceback()) | |||||
@Document.hook | @Document.hook | ||||
def validate_reset_password(self): | def validate_reset_password(self): | ||||
@@ -44,8 +44,9 @@ frappe.ui.form.on('User Permission', { | |||||
set_applicable_for_constraint: frm => { | set_applicable_for_constraint: frm => { | ||||
frm.toggle_reqd('applicable_for', !frm.doc.apply_to_all_doctypes); | frm.toggle_reqd('applicable_for', !frm.doc.apply_to_all_doctypes); | ||||
if (frm.doc.apply_to_all_doctypes && frm.doc.applicable_for) { | if (frm.doc.apply_to_all_doctypes && frm.doc.applicable_for) { | ||||
frm.set_value('applicable_for', null); | |||||
frm.set_value('applicable_for', null, null, true); | |||||
} | } | ||||
}, | }, | ||||
@@ -14,7 +14,6 @@ frappe.ui.form.on("Customize Form", { | |||||
}, | }, | ||||
onload: function(frm) { | onload: function(frm) { | ||||
frm.disable_save(); | |||||
frm.set_query("doc_type", function() { | frm.set_query("doc_type", function() { | ||||
return { | return { | ||||
translate_values: false, | translate_values: false, | ||||
@@ -110,7 +109,7 @@ frappe.ui.form.on("Customize Form", { | |||||
}, | }, | ||||
refresh: function(frm) { | refresh: function(frm) { | ||||
frm.disable_save(); | |||||
frm.disable_save(true); | |||||
frm.page.clear_icons(); | frm.page.clear_icons(); | ||||
if (frm.doc.doc_type) { | if (frm.doc.doc_type) { | ||||
@@ -169,7 +168,7 @@ frappe.ui.form.on("Customize Form", { | |||||
doc_type = localStorage.getItem("customize_doctype"); | doc_type = localStorage.getItem("customize_doctype"); | ||||
} | } | ||||
if (doc_type) { | if (doc_type) { | ||||
setTimeout(() => frm.set_value("doc_type", doc_type), 1000); | |||||
setTimeout(() => frm.set_value("doc_type", doc_type, false, true), 1000); | |||||
} | } | ||||
}, | }, | ||||
@@ -341,11 +340,11 @@ frappe.customize_form.confirm = function(msg, frm) { | |||||
} | } | ||||
frappe.customize_form.clear_locals_and_refresh = function(frm) { | frappe.customize_form.clear_locals_and_refresh = function(frm) { | ||||
delete frm.doc.__unsaved; | |||||
// clear doctype from locals | // clear doctype from locals | ||||
frappe.model.clear_doc("DocType", frm.doc.doc_type); | frappe.model.clear_doc("DocType", frm.doc.doc_type); | ||||
delete frappe.meta.docfield_copy[frm.doc.doc_type]; | delete frappe.meta.docfield_copy[frm.doc.doc_type]; | ||||
frm.refresh(); | frm.refresh(); | ||||
} | |||||
}; | |||||
extend_cscript(cur_frm.cscript, new frappe.model.DocTypeController({frm: cur_frm})); | extend_cscript(cur_frm.cscript, new frappe.model.DocTypeController({frm: cur_frm})); |
@@ -246,10 +246,12 @@ frappe.ui.form.Form = class FrappeForm { | |||||
var me = this; | var me = this; | ||||
// on main doc | // on main doc | ||||
frappe.model.on(me.doctype, "*", function(fieldname, value, doc) { | |||||
frappe.model.on(me.doctype, "*", function(fieldname, value, doc, skip_dirty_trigger=false) { | |||||
// set input | // set input | ||||
if (cstr(doc.name) === me.docname) { | if (cstr(doc.name) === me.docname) { | ||||
me.dirty(); | |||||
if (!skip_dirty_trigger) { | |||||
me.dirty(); | |||||
} | |||||
let field = me.fields_dict[fieldname]; | let field = me.fields_dict[fieldname]; | ||||
field && field.refresh(fieldname); | field && field.refresh(fieldname); | ||||
@@ -953,10 +955,12 @@ frappe.ui.form.Form = class FrappeForm { | |||||
this.toolbar.set_primary_action(); | this.toolbar.set_primary_action(); | ||||
} | } | ||||
disable_save() { | |||||
disable_save(set_dirty=false) { | |||||
// IMPORTANT: this function should be called in refresh event | // IMPORTANT: this function should be called in refresh event | ||||
this.save_disabled = true; | this.save_disabled = true; | ||||
this.toolbar.current_status = null; | this.toolbar.current_status = null; | ||||
// field changes should make form dirty | |||||
this.set_dirty = set_dirty; | |||||
this.page.clear_primary_action(); | this.page.clear_primary_action(); | ||||
} | } | ||||
@@ -1447,7 +1451,7 @@ frappe.ui.form.Form = class FrappeForm { | |||||
return doc; | return doc; | ||||
} | } | ||||
set_value(field, value, if_missing) { | |||||
set_value(field, value, if_missing, skip_dirty_trigger=false) { | |||||
var me = this; | var me = this; | ||||
var _set = function(f, v) { | var _set = function(f, v) { | ||||
var fieldobj = me.fields_dict[f]; | var fieldobj = me.fields_dict[f]; | ||||
@@ -1467,7 +1471,7 @@ frappe.ui.form.Form = class FrappeForm { | |||||
me.refresh_field(f); | me.refresh_field(f); | ||||
return Promise.resolve(); | return Promise.resolve(); | ||||
} else { | } else { | ||||
return frappe.model.set_value(me.doctype, me.doc.name, f, v); | |||||
return frappe.model.set_value(me.doctype, me.doc.name, f, v, me.fieldtype, skip_dirty_trigger); | |||||
} | } | ||||
} | } | ||||
} else { | } else { | ||||
@@ -534,14 +534,14 @@ frappe.ui.form.Toolbar = class Toolbar { | |||||
}); | }); | ||||
} | } | ||||
show_title_as_dirty() { | show_title_as_dirty() { | ||||
if(this.frm.save_disabled) | |||||
if (this.frm.save_disabled && !this.frm.set_dirty) | |||||
return; | return; | ||||
if(this.frm.doc.__unsaved) { | |||||
if (this.frm.is_dirty()) { | |||||
this.page.set_indicator(__("Not Saved"), "orange"); | this.page.set_indicator(__("Not Saved"), "orange"); | ||||
} | } | ||||
$(this.frm.wrapper).attr("data-state", this.frm.doc.__unsaved ? "dirty" : "clean"); | |||||
$(this.frm.wrapper).attr("data-state", this.frm.is_dirty() ? "dirty" : "clean"); | |||||
} | } | ||||
show_jump_to_field_dialog() { | show_jump_to_field_dialog() { | ||||
@@ -375,7 +375,7 @@ export default class ListSettings { | |||||
let me = this; | let me = this; | ||||
if (me.removed_fields) { | if (me.removed_fields) { | ||||
me.removed_fields.concat(fields); | |||||
me.removed_fields = me.removed_fields.concat(fields); | |||||
} else { | } else { | ||||
me.removed_fields = fields; | me.removed_fields = fields; | ||||
} | } | ||||
@@ -412,7 +412,7 @@ $.extend(frappe.model, { | |||||
} | } | ||||
}, | }, | ||||
set_value: function(doctype, docname, fieldname, value, fieldtype) { | |||||
set_value: function(doctype, docname, fieldname, value, fieldtype, skip_dirty_trigger=false) { | |||||
/* help: Set a value locally (if changed) and execute triggers */ | /* help: Set a value locally (if changed) and execute triggers */ | ||||
var doc; | var doc; | ||||
@@ -438,11 +438,11 @@ $.extend(frappe.model, { | |||||
} | } | ||||
doc[key] = value; | doc[key] = value; | ||||
tasks.push(() => frappe.model.trigger(key, value, doc)); | |||||
tasks.push(() => frappe.model.trigger(key, value, doc, skip_dirty_trigger)); | |||||
} else { | } else { | ||||
// execute link triggers (want to reselect to execute triggers) | // execute link triggers (want to reselect to execute triggers) | ||||
if(in_list(["Link", "Dynamic Link"], fieldtype) && doc) { | if(in_list(["Link", "Dynamic Link"], fieldtype) && doc) { | ||||
tasks.push(() => frappe.model.trigger(key, value, doc)); | |||||
tasks.push(() => frappe.model.trigger(key, value, doc, skip_dirty_trigger)); | |||||
} | } | ||||
} | } | ||||
}); | }); | ||||
@@ -467,7 +467,7 @@ $.extend(frappe.model, { | |||||
frappe.model.events[doctype][fieldname].push(fn); | frappe.model.events[doctype][fieldname].push(fn); | ||||
}, | }, | ||||
trigger: function(fieldname, value, doc) { | |||||
trigger: function(fieldname, value, doc, skip_dirty_trigger=false) { | |||||
const tasks = []; | const tasks = []; | ||||
function enqueue_events(events) { | function enqueue_events(events) { | ||||
@@ -477,7 +477,7 @@ $.extend(frappe.model, { | |||||
if (!fn) continue; | if (!fn) continue; | ||||
tasks.push(() => { | tasks.push(() => { | ||||
const return_value = fn(fieldname, value, doc); | |||||
const return_value = fn(fieldname, value, doc, skip_dirty_trigger); | |||||
// if the trigger returns a promise, return it, | // if the trigger returns a promise, return it, | ||||
// or use the default promise frappe.after_ajax | // or use the default promise frappe.after_ajax | ||||
@@ -231,7 +231,7 @@ Object.assign(frappe.utils, { | |||||
if (tt && (tt.substr(0, 1)===">" || tt.substr(0, 4)===">")) { | if (tt && (tt.substr(0, 1)===">" || tt.substr(0, 4)===">")) { | ||||
part.push(t); | part.push(t); | ||||
} else { | } else { | ||||
out.concat(part); | |||||
out = out.concat(part); | |||||
out.push(t); | out.push(t); | ||||
part = []; | part = []; | ||||
} | } | ||||
@@ -1026,7 +1026,7 @@ frappe.views.ReportView = class ReportView extends frappe.views.ListView { | |||||
} | } | ||||
if (!docfield || docfield.report_hide) return; | if (!docfield || docfield.report_hide) return; | ||||
let title = __(docfield ? docfield.label : toTitle(fieldname)); | |||||
let title = __(docfield.label); | |||||
if (doctype !== this.doctype) { | if (doctype !== this.doctype) { | ||||
title += ` (${__(doctype)})`; | title += ` (${__(doctype)})`; | ||||
} | } | ||||
@@ -650,8 +650,6 @@ def extract_messages_from_code(code): | |||||
if isinstance(e, InvalidIncludePath): | if isinstance(e, InvalidIncludePath): | ||||
frappe.clear_last_message() | frappe.clear_last_message() | ||||
pass | |||||
messages = [] | messages = [] | ||||
pattern = r"_\(([\"']{,3})(?P<message>((?!\1).)*)\1(\s*,\s*context\s*=\s*([\"'])(?P<py_context>((?!\5).)*)\5)*(\s*,\s*(.)*?\s*(,\s*([\"'])(?P<js_context>((?!\11).)*)\11)*)*\)" | pattern = r"_\(([\"']{,3})(?P<message>((?!\1).)*)\1(\s*,\s*context\s*=\s*([\"'])(?P<py_context>((?!\5).)*)\5)*(\s*,\s*(.)*?\s*(,\s*([\"'])(?P<js_context>((?!\11).)*)\11)*)*\)" | ||||
@@ -15,7 +15,7 @@ import click | |||||
# imports - module imports | # imports - module imports | ||||
import frappe | import frappe | ||||
from frappe import _, conf | |||||
from frappe import conf | |||||
from frappe.utils import get_file_size, get_url, now, now_datetime, cint | from frappe.utils import get_file_size, get_url, now, now_datetime, cint | ||||
from frappe.utils.password import get_encryption_key | from frappe.utils.password import get_encryption_key | ||||
@@ -505,7 +505,7 @@ download only after 24 hours.""" % { | |||||
datetime_str.strftime("%d/%m/%Y %H:%M:%S") + """ - Backup ready to be downloaded""" | datetime_str.strftime("%d/%m/%Y %H:%M:%S") + """ - Backup ready to be downloaded""" | ||||
) | ) | ||||
frappe.sendmail(recipients=recipient_list, msg=msg, subject=subject) | |||||
frappe.sendmail(recipients=recipient_list, message=msg, subject=subject) | |||||
return recipient_list | return recipient_list | ||||
@@ -779,7 +779,7 @@ if __name__ == "__main__": | |||||
db_type=db_type, | db_type=db_type, | ||||
db_port=db_port, | db_port=db_port, | ||||
) | ) | ||||
odb.send_email("abc.sql.gz") | |||||
odb.send_email() | |||||
if cmd == "delete_temp_backups": | if cmd == "delete_temp_backups": | ||||
delete_temp_backups() | delete_temp_backups() |
@@ -227,7 +227,6 @@ class NestedSet(Document): | |||||
update_nsm(self) | update_nsm(self) | ||||
except frappe.DoesNotExistError: | except frappe.DoesNotExistError: | ||||
if self.flags.on_rollback: | if self.flags.on_rollback: | ||||
pass | |||||
frappe.message_log.pop() | frappe.message_log.pop() | ||||
else: | else: | ||||
raise | raise | ||||