@@ -1 +1 @@ | |||||
__version__ = "4.8.0" | |||||
__version__ = "4.9.0" |
@@ -20,7 +20,8 @@ class PrintFormat(Document): | |||||
jenv = frappe.get_jenv() | jenv = frappe.get_jenv() | ||||
try: | try: | ||||
jenv.from_string(self.html) | jenv.from_string(self.html) | ||||
except TemplateSyntaxError: | |||||
except TemplateSyntaxError, e: | |||||
frappe.msgprint('Line {}: {}'.format(e.lineno, e.message)) | |||||
frappe.throw(frappe._("Syntax error in Jinja template")) | frappe.throw(frappe._("Syntax error in Jinja template")) | ||||
def on_update(self): | def on_update(self): | ||||
@@ -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.8.0" | |||||
app_version = "4.9.0" | |||||
app_color = "#3498db" | app_color = "#3498db" | ||||
app_email = "support@frappe.io" | app_email = "support@frappe.io" | ||||
@@ -387,29 +387,44 @@ frappe.ui.form.ControlInt = frappe.ui.form.ControlData.extend({ | |||||
frappe.ui.form.ControlFloat = frappe.ui.form.ControlInt.extend({ | frappe.ui.form.ControlFloat = frappe.ui.form.ControlInt.extend({ | ||||
parse: function(value) { | parse: function(value) { | ||||
return isNaN(parseFloat(value)) ? null : flt(value); | |||||
return isNaN(parseFloat(value)) ? null : flt(value, this.get_precision()); | |||||
}, | }, | ||||
format_for_input: function(value) { | format_for_input: function(value) { | ||||
var number_format; | var number_format; | ||||
var precision = this.df.precision || cint(frappe.boot.sysdefaults.float_precision, null); | |||||
if (this.df.fieldtype==="Float" && this.df.options && this.df.options.trim()) { | if (this.df.fieldtype==="Float" && this.df.options && this.df.options.trim()) { | ||||
number_format = get_number_format(this.get_currency()); | |||||
number_format = this.get_number_format(); | |||||
} | } | ||||
var formatted_value = format_number(parseFloat(value), number_format, precision); | |||||
var formatted_value = format_number(parseFloat(value), number_format, this.get_precision()); | |||||
return isNaN(parseFloat(value)) ? "" : formatted_value; | return isNaN(parseFloat(value)) ? "" : formatted_value; | ||||
}, | }, | ||||
// even a float field can be formatted based on currency format instead of float format | // even a float field can be formatted based on currency format instead of float format | ||||
get_currency: function() { | |||||
return frappe.meta.get_field_currency(this.df, this.get_doc()); | |||||
get_number_format: function() { | |||||
var currency = frappe.meta.get_field_currency(this.df, this.get_doc()); | |||||
return get_number_format(currency); | |||||
}, | |||||
get_precision: function() { | |||||
// round based on field precision or float precision, else don't round | |||||
return this.df.precision || cint(frappe.boot.sysdefaults.float_precision, null); | |||||
} | } | ||||
}); | }); | ||||
frappe.ui.form.ControlCurrency = frappe.ui.form.ControlFloat.extend({ | frappe.ui.form.ControlCurrency = frappe.ui.form.ControlFloat.extend({ | ||||
format_for_input: function(value) { | format_for_input: function(value) { | ||||
var formatted_value = format_number(parseFloat(value), | |||||
get_number_format(this.get_currency()), this.df.precision || null); | |||||
var formatted_value = format_number(parseFloat(value), this.get_number_format(), this.get_precision()); | |||||
return isNaN(parseFloat(value)) ? "" : formatted_value; | return isNaN(parseFloat(value)) ? "" : formatted_value; | ||||
}, | |||||
get_precision: function() { | |||||
// always round based on field precision or currency's precision | |||||
// this method is also called in this.parse() | |||||
if (!this.df.precision) { | |||||
this.df.precision = get_number_format_info(this.get_number_format()).precision; | |||||
} | |||||
return this.df.precision; | |||||
} | } | ||||
}); | }); | ||||
@@ -11,7 +11,8 @@ function flt(v, decimals, number_format) { | |||||
// strip currency symbol if exists | // strip currency symbol if exists | ||||
if(v.indexOf(" ")!=-1) { | if(v.indexOf(" ")!=-1) { | ||||
v = v.split(" ")[1]; | |||||
// using slice(1).join(" ") because space could also be a group separator | |||||
v = isNaN(parseFloat(v.split(" ")[0])) ? v.split(" ").slice(1).join(" ") : v; | |||||
} | } | ||||
v = strip_number_groups(v, number_format); | v = strip_number_groups(v, number_format); | ||||
@@ -40,15 +41,16 @@ function cint(v, def) { | |||||
function strip_number_groups(v, number_format) { | function strip_number_groups(v, number_format) { | ||||
if(!number_format) number_format = get_number_format(); | if(!number_format) number_format = get_number_format(); | ||||
var info = get_number_format_info(number_format); | |||||
// strip groups (,) | // strip groups (,) | ||||
if(get_number_format_info(number_format).group_sep==".") { | |||||
v = v.replace(/\./g,''); | |||||
var group_regex = new RegExp(info.group_sep==="." ? "\\." : info.group_sep, "g"); | |||||
v = v.replace(group_regex, ""); | |||||
// sanitize decimal separator to . | |||||
v = v.replace(/,/g, "."); | |||||
} else { | |||||
v=v.replace(/,/g,''); | |||||
// replace decimal separator with (.) | |||||
if (info.decimal_str!=="." && info.decimal_str!=="") { | |||||
var decimal_regex = new RegExp(info.decimal_str, "g"); | |||||
v = v.replace(decimal_regex, "."); | |||||
} | } | ||||
return v; | return v; | ||||
@@ -1,7 +1,7 @@ | |||||
from setuptools import setup, find_packages | from setuptools import setup, find_packages | ||||
import os | import os | ||||
version = "4.8.0" | |||||
version = "4.9.0" | |||||
with open("requirements.txt", "r") as f: | with open("requirements.txt", "r") as f: | ||||
install_requires = f.readlines() | install_requires = f.readlines() | ||||