@@ -1 +1 @@ | |||||
__version__ = "4.11.0" | |||||
__version__ = "4.11.1" |
@@ -3,7 +3,7 @@ app_title = "Frappe Framework" | |||||
app_publisher = "Web Notes Technologies Pvt. Ltd." | app_publisher = "Web Notes Technologies Pvt. Ltd." | ||||
app_description = "Full Stack Web Application Framework in Python" | app_description = "Full Stack Web Application Framework in Python" | ||||
app_icon = "assets/frappe/images/frappe.svg" | app_icon = "assets/frappe/images/frappe.svg" | ||||
app_version = "4.11.0" | |||||
app_version = "4.11.1" | |||||
app_color = "#3498db" | app_color = "#3498db" | ||||
app_email = "support@frappe.io" | app_email = "support@frappe.io" | ||||
@@ -411,10 +411,17 @@ class Document(BaseDocument): | |||||
fn.__name__ = method.encode("utf-8") | fn.__name__ = method.encode("utf-8") | ||||
return Document.hook(fn)(self, *args, **kwargs) | return Document.hook(fn)(self, *args, **kwargs) | ||||
@staticmethod | |||||
def whitelist(f): | |||||
f.whitelisted = True | |||||
return f | |||||
@whitelist.__func__ | |||||
def submit(self): | def submit(self): | ||||
self.docstatus = 1 | self.docstatus = 1 | ||||
self.save() | self.save() | ||||
@whitelist.__func__ | |||||
def cancel(self): | def cancel(self): | ||||
self.docstatus = 2 | self.docstatus = 2 | ||||
self.save() | self.save() | ||||
@@ -451,16 +458,12 @@ class Document(BaseDocument): | |||||
elif self._action=="update_after_submit": | elif self._action=="update_after_submit": | ||||
self.run_method("on_update_after_submit") | self.run_method("on_update_after_submit") | ||||
def check_no_back_links_exist(self): | def check_no_back_links_exist(self): | ||||
from frappe.model.delete_doc import check_if_doc_is_linked | from frappe.model.delete_doc import check_if_doc_is_linked | ||||
if not self.get("ignore_links"): | if not self.get("ignore_links"): | ||||
check_if_doc_is_linked(self, method="Cancel") | check_if_doc_is_linked(self, method="Cancel") | ||||
@staticmethod | |||||
def whitelist(f): | |||||
f.whitelisted = True | |||||
return f | |||||
@staticmethod | @staticmethod | ||||
def hook(f): | def hook(f): | ||||
def add_to_return_value(self, new_return_value): | def add_to_return_value(self, new_return_value): | ||||
@@ -142,9 +142,10 @@ frappe.ui.form.Grid = Class.extend({ | |||||
set_column_disp: function(fieldname, show) { | set_column_disp: function(fieldname, show) { | ||||
if($.isArray(fieldname)) { | if($.isArray(fieldname)) { | ||||
var me = this; | var me = this; | ||||
$.each(fieldname, function(i, fname) { | |||||
for(var i=0, l=fieldname.length; i<l; i++) { | |||||
var fname = fieldname[i]; | |||||
frappe.meta.get_docfield(me.doctype, fname, me.frm.docname).hidden = show ? 0 : 1; | frappe.meta.get_docfield(me.doctype, fname, me.frm.docname).hidden = show ? 0 : 1; | ||||
}); | |||||
} | |||||
} else { | } else { | ||||
frappe.meta.get_docfield(this.doctype, fieldname, this.frm.docname).hidden = show ? 0 : 1; | frappe.meta.get_docfield(this.doctype, fieldname, this.frm.docname).hidden = show ? 0 : 1; | ||||
} | } | ||||
@@ -292,17 +293,17 @@ frappe.ui.form.GridRow = Class.extend({ | |||||
add_buttons: function() { | add_buttons: function() { | ||||
var me = this; | var me = this; | ||||
if(this.doc && this.grid.is_editable()) { | |||||
if(!this.grid.$row_actions) { | |||||
this.grid.$row_actions = $('<div class="col-xs-1 pull-right" \ | |||||
if(this.doc && this.grid.is_editable() && this.frm.doc[this.doc.parentfield].length <= 50) { | |||||
if(!this.grid.row_actions) { | |||||
this.grid.row_actions = '<div class="col-xs-1 pull-right" \ | |||||
style="text-align: right; padding-right: 5px;">\ | style="text-align: right; padding-right: 5px;">\ | ||||
<span class="text-success grid-insert-row" style="padding: 4px;">\ | <span class="text-success grid-insert-row" style="padding: 4px;">\ | ||||
<i class="icon icon-plus-sign"></i></span>\ | <i class="icon icon-plus-sign"></i></span>\ | ||||
<span class="grid-delete-row" style="padding: 4px;">\ | <span class="grid-delete-row" style="padding: 4px;">\ | ||||
<i class="icon icon-trash"></i></span>\ | <i class="icon icon-trash"></i></span>\ | ||||
</div>'); | |||||
</div>'; | |||||
} | } | ||||
$col = this.grid.$row_actions.clone().appendTo(this.row); | |||||
$col = $(this.grid.row_actions).appendTo(this.row); | |||||
if($col.width() < 50) { | if($col.width() < 50) { | ||||
$col.toggle(false); | $col.toggle(false); | ||||
@@ -478,9 +479,10 @@ frappe.ui.form.GridRow = Class.extend({ | |||||
this.layout.refresh(this.doc); | this.layout.refresh(this.doc); | ||||
// copy get_query to fields | // copy get_query to fields | ||||
$.each(this.grid.fieldinfo || {}, function(fieldname, fi) { | |||||
for(var fieldname in (this.grid.fieldinfo || {})) { | |||||
var fi = this.grid.fieldinfo[fieldname]; | |||||
$.extend(me.fields_dict[fieldname], fi); | $.extend(me.fields_dict[fieldname], fi); | ||||
}) | |||||
} | |||||
this.toggle_add_delete_button_display(this.wrapper.find(".panel:first")); | this.toggle_add_delete_button_display(this.wrapper.find(".panel:first")); | ||||
@@ -50,7 +50,8 @@ frappe.ui.form.Layout = Class.extend({ | |||||
this.wrapper.find(".empty-form-alert").remove(); | this.wrapper.find(".empty-form-alert").remove(); | ||||
$.each(this.fields_list, function(i, fieldobj) { | |||||
for(var i=0, l=this.fields_list.length; i<l; i++) { | |||||
var fieldobj = this.fields_list[i]; | |||||
if(me.doc) { | if(me.doc) { | ||||
fieldobj.doc = me.doc; | fieldobj.doc = me.doc; | ||||
fieldobj.doctype = me.doc.doctype; | fieldobj.doctype = me.doc.doctype; | ||||
@@ -61,7 +62,8 @@ frappe.ui.form.Layout = Class.extend({ | |||||
fieldobj.perm = me.frm.perm; | fieldobj.perm = me.frm.perm; | ||||
}; | }; | ||||
fieldobj.refresh && fieldobj.refresh(); | fieldobj.refresh && fieldobj.refresh(); | ||||
}); | |||||
} | |||||
if(this.frm && this.frm.wrapper) | if(this.frm && this.frm.wrapper) | ||||
$(this.frm.wrapper).trigger("refresh-fields"); | $(this.frm.wrapper).trigger("refresh-fields"); | ||||
setTimeout(function() { | setTimeout(function() { | ||||
@@ -149,20 +149,21 @@ $.extend(frappe.model, { | |||||
// create row doc | // create row doc | ||||
idx = idx ? idx - 0.1 : (parent_doc[parentfield] || []).length + 1; | idx = idx ? idx - 0.1 : (parent_doc[parentfield] || []).length + 1; | ||||
var d = frappe.model.get_new_doc(doctype, parent_doc, parentfield); | |||||
d.idx = idx; | |||||
var child = frappe.model.get_new_doc(doctype, parent_doc, parentfield); | |||||
child.idx = idx; | |||||
// renum for fraction | // renum for fraction | ||||
if(idx !== cint(idx)) { | if(idx !== cint(idx)) { | ||||
var sorted = parent_doc[parentfield].sort(function(a, b) { return a.idx - b.idx; }); | var sorted = parent_doc[parentfield].sort(function(a, b) { return a.idx - b.idx; }); | ||||
$.each(sorted, function(i, d) { | |||||
for(var i=0, j=sorted.length; i<j; i++) { | |||||
var d = sorted[i]; | |||||
d.idx = i + 1; | d.idx = i + 1; | ||||
}); | |||||
} | |||||
} | } | ||||
if (cur_frm && cur_frm.doc == parent_doc) cur_frm.dirty(); | if (cur_frm && cur_frm.doc == parent_doc) cur_frm.dirty(); | ||||
return d; | |||||
return child; | |||||
}, | }, | ||||
copy_doc: function(doc, from_amend, parent_doc, parentfield) { | copy_doc: function(doc, from_amend, parent_doc, parentfield) { | ||||
@@ -176,11 +177,12 @@ $.extend(frappe.model, { | |||||
if(df && key.substr(0,2)!='__' | if(df && key.substr(0,2)!='__' | ||||
&& !in_list(no_copy_list, key) | && !in_list(no_copy_list, key) | ||||
&& !(df && (!from_amend && cint(df.no_copy)==1))) { | && !(df && (!from_amend && cint(df.no_copy)==1))) { | ||||
value = doc[key]; | |||||
var value = doc[key] || []; | |||||
if(df.fieldtype==="Table") { | if(df.fieldtype==="Table") { | ||||
$.each(value || [], function(i, d) { | |||||
for(var i=0, j=value.length; i<j; i++) { | |||||
var d = value[i]; | |||||
frappe.model.copy_doc(d, from_amend, newdoc, df.fieldname); | frappe.model.copy_doc(d, from_amend, newdoc, df.fieldname); | ||||
}); | |||||
} | |||||
} else { | } else { | ||||
newdoc[key] = doc[key]; | newdoc[key] = doc[key]; | ||||
} | } | ||||
@@ -41,9 +41,11 @@ $.extend(frappe.meta, { | |||||
if(!c[doctype][docname]) | if(!c[doctype][docname]) | ||||
c[doctype][docname] = {}; | c[doctype][docname] = {}; | ||||
$.each(frappe.meta.docfield_list[doctype] || [], function(i, df) { | |||||
var docfield_list = frappe.meta.docfield_list[doctype] || []; | |||||
for(var i=0, j=docfield_list.length; i<j; i++) { | |||||
var df = docfield_list[i]; | |||||
c[doctype][docname][df.fieldname || df.label] = copy_dict(df); | c[doctype][docname][df.fieldname || df.label] = copy_dict(df); | ||||
}) | |||||
} | |||||
}, | }, | ||||
get_docfield: function(dt, fn, dn) { | get_docfield: function(dt, fn, dn) { | ||||
@@ -343,9 +343,12 @@ $.extend(frappe.model, { | |||||
get_no_copy_list: function(doctype) { | get_no_copy_list: function(doctype) { | ||||
var no_copy_list = ['name','amended_from','amendment_date','cancel_reason']; | var no_copy_list = ['name','amended_from','amendment_date','cancel_reason']; | ||||
$.each(frappe.get_doc("DocType", doctype).fields || [], function(i, df) { | |||||
var docfields = frappe.get_doc("DocType", doctype).fields || []; | |||||
for(var i=0, j=docfields.length; i<j; i++) { | |||||
var df = docfields[i]; | |||||
if(cint(df.no_copy)) no_copy_list.push(df.fieldname); | if(cint(df.no_copy)) no_copy_list.push(df.fieldname); | ||||
}) | |||||
} | |||||
return no_copy_list; | return no_copy_list; | ||||
}, | }, | ||||
@@ -412,9 +415,10 @@ $.extend(frappe.model, { | |||||
fieldnames = frappe.meta.get_fieldnames(doc.doctype, doc.parent, | fieldnames = frappe.meta.get_fieldnames(doc.doctype, doc.parent, | ||||
{"fieldtype": ["in", ["Currency", "Float"]]}); | {"fieldtype": ["in", ["Currency", "Float"]]}); | ||||
} | } | ||||
$.each(fieldnames, function(i, fieldname) { | |||||
for(var i=0, j=fieldnames.length; i < j; i++) { | |||||
var fieldname = fieldnames[i]; | |||||
doc[fieldname] = flt(doc[fieldname], precision(fieldname, doc)); | doc[fieldname] = flt(doc[fieldname], precision(fieldname, doc)); | ||||
}); | |||||
} | |||||
}, | }, | ||||
validate_missing: function(doc, fieldname) { | validate_missing: function(doc, fieldname) { | ||||
@@ -428,9 +432,10 @@ $.extend(frappe.model, { | |||||
var all = [doc]; | var all = [doc]; | ||||
for(key in doc) { | for(key in doc) { | ||||
if($.isArray(doc[key])) { | if($.isArray(doc[key])) { | ||||
$.each(doc[key], function(i, d) { | |||||
all.push(d); | |||||
}); | |||||
var children = doc[key]; | |||||
for (var i=0, l=children.length; i < l; i++) { | |||||
all.push(children[i]); | |||||
} | |||||
} | } | ||||
} | } | ||||
return all; | return all; | ||||
@@ -23,6 +23,8 @@ def get_email(recipients, sender='', msg='', subject='[No Subject]', | |||||
for attach in (attachments or []): | for attach in (attachments or []): | ||||
emailobj.add_attachment(**attach) | emailobj.add_attachment(**attach) | ||||
emailobj.validate() | |||||
return emailobj | return emailobj | ||||
class EMail: | class EMail: | ||||
@@ -1,7 +1,7 @@ | |||||
from setuptools import setup, find_packages | from setuptools import setup, find_packages | ||||
import os | import os | ||||
version = "4.11.0" | |||||
version = "4.11.1" | |||||
with open("requirements.txt", "r") as f: | with open("requirements.txt", "r") as f: | ||||
install_requires = f.readlines() | install_requires = f.readlines() | ||||