diff --git a/frappe/core/doctype/custom_field/custom_field.json b/frappe/core/doctype/custom_field/custom_field.json index 55c404c902..712ba856f7 100644 --- a/frappe/core/doctype/custom_field/custom_field.json +++ b/frappe/core/doctype/custom_field/custom_field.json @@ -62,6 +62,16 @@ "reqd": 1, "search_index": 0 }, + { + "depends_on": "eval:in_list([\"Float\", \"Currency\", \"Percent\"], doc.fieldtype)", + "description": "Set non-standard precision for a Float or Currency field", + "fieldname": "precision", + "fieldtype": "Select", + "label": "Precision", + "options": "\n1\n2\n3\n4\n5\n6", + "permlevel": 0, + "precision": "" + }, { "fieldname": "options_help", "fieldtype": "HTML", @@ -257,7 +267,7 @@ ], "icon": "icon-glass", "idx": 1, - "modified": "2014-06-20 05:54:17.225853", + "modified": "2014-09-05 07:41:13.076820", "modified_by": "Administrator", "module": "Core", "name": "Custom Field", diff --git a/frappe/core/doctype/custom_field/test_custom_field.py b/frappe/core/doctype/custom_field/test_custom_field.py new file mode 100644 index 0000000000..ad4def6175 --- /dev/null +++ b/frappe/core/doctype/custom_field/test_custom_field.py @@ -0,0 +1,10 @@ +# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors +# See license.txt + +import frappe +import unittest + +test_records = frappe.get_test_records('Custom Field') + +class TestCustomField(unittest.TestCase): + pass diff --git a/frappe/core/doctype/custom_field/test_records.json b/frappe/core/doctype/custom_field/test_records.json new file mode 100644 index 0000000000..fe51488c70 --- /dev/null +++ b/frappe/core/doctype/custom_field/test_records.json @@ -0,0 +1 @@ +[] diff --git a/frappe/core/doctype/customize_form/customize_form.py b/frappe/core/doctype/customize_form/customize_form.py index adb63ab5f3..8f9f7f8a9d 100644 --- a/frappe/core/doctype/customize_form/customize_form.py +++ b/frappe/core/doctype/customize_form/customize_form.py @@ -40,7 +40,8 @@ class CustomizeForm(Document): 'allow_on_submit': 'Check', 'depends_on': 'Data', 'description': 'Text', - 'default': 'Text' + 'default': 'Text', + 'precision': 'Select' } allowed_fieldtype_change = (('Currency', 'Float', 'Percent'), ('Small Text', 'Data'), diff --git a/frappe/core/doctype/customize_form_field/customize_form_field.json b/frappe/core/doctype/customize_form_field/customize_form_field.json index 23bb06dc1d..0c540044bc 100644 --- a/frappe/core/doctype/customize_form_field/customize_form_field.json +++ b/frappe/core/doctype/customize_form_field/customize_form_field.json @@ -5,6 +5,13 @@ "docstatus": 0, "doctype": "DocType", "fields": [ + { + "fieldname": "label_and_type", + "fieldtype": "Section Break", + "label": "Label and Type", + "permlevel": 0, + "precision": "" + }, { "fieldname": "label", "fieldtype": "Data", @@ -19,6 +26,7 @@ "search_index": 1 }, { + "default": "Data", "fieldname": "fieldtype", "fieldtype": "Select", "hidden": 0, @@ -46,6 +54,42 @@ "reqd": 0, "search_index": 1 }, + { + "fieldname": "reqd", + "fieldtype": "Check", + "hidden": 0, + "label": "Mandatory", + "oldfieldname": "reqd", + "oldfieldtype": "Check", + "permlevel": 0, + "print_hide": 0, + "print_width": "50px", + "reqd": 0, + "search_index": 0, + "width": "50px" + }, + { + "fieldname": "in_list_view", + "fieldtype": "Check", + "label": "In List View", + "permlevel": 0 + }, + { + "fieldname": "column_break_7", + "fieldtype": "Column Break", + "permlevel": 0, + "precision": "" + }, + { + "depends_on": "eval:in_list([\"Float\", \"Currency\", \"Percent\"], doc.fieldtype)", + "description": "Set non-standard precision for a Float or Currency field", + "fieldname": "precision", + "fieldtype": "Select", + "label": "Precision", + "options": "\n1\n2\n3\n4\n5\n6", + "permlevel": 0, + "precision": "" + }, { "description": "For Links, enter the DocType as range\nFor Select, enter list of Options separated by comma", "fieldname": "options", @@ -60,6 +104,25 @@ "reqd": 0, "search_index": 0 }, + { + "fieldname": "permissions", + "fieldtype": "Section Break", + "label": "Permissions", + "permlevel": 0, + "precision": "" + }, + { + "description": "This field will appear only if the fieldname defined here has value OR the rules are true (examples):
\nmyfield\neval:doc.myfield=='My Value'
\neval:doc.age>18", + "fieldname": "depends_on", + "fieldtype": "Data", + "hidden": 0, + "label": "Depends On", + "oldfieldname": "depends_on", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "reqd": 0 + }, { "default": "0", "fieldname": "permlevel", @@ -75,35 +138,11 @@ "search_index": 0 }, { - "fieldname": "width", - "fieldtype": "Data", - "hidden": 0, - "in_list_view": 1, - "label": "Width", - "oldfieldname": "width", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "print_width": "50px", - "reqd": 0, - "search_index": 0, - "width": "50px" - }, - { - "description": "Print Width of the field, if the field is a column in a table", - "fieldname": "print_width", - "fieldtype": "Data", - "label": "Print Width", - "permlevel": 0, - "print_width": "50px", - "width": "50px" - }, - { - "fieldname": "reqd", + "fieldname": "hidden", "fieldtype": "Check", "hidden": 0, - "label": "Reqd", - "oldfieldname": "reqd", + "label": "Hidden", + "oldfieldname": "hidden", "oldfieldtype": "Check", "permlevel": 0, "print_hide": 0, @@ -112,12 +151,59 @@ "search_index": 0, "width": "50px" }, + { + "fieldname": "column_break_14", + "fieldtype": "Column Break", + "permlevel": 0, + "precision": "" + }, { "fieldname": "ignore_user_permissions", "fieldtype": "Check", "label": "Ignore User Permissions", "permlevel": 0 }, + { + "fieldname": "allow_on_submit", + "fieldtype": "Check", + "hidden": 0, + "label": "Allow on Submit", + "oldfieldname": "allow_on_submit", + "oldfieldtype": "Check", + "permlevel": 0, + "print_hide": 0, + "reqd": 0 + }, + { + "fieldname": "report_hide", + "fieldtype": "Check", + "hidden": 0, + "label": "Report Hide", + "oldfieldname": "report_hide", + "oldfieldtype": "Check", + "permlevel": 0, + "print_hide": 0, + "reqd": 0 + }, + { + "fieldname": "display", + "fieldtype": "Section Break", + "label": "Display", + "permlevel": 0, + "precision": "" + }, + { + "fieldname": "default", + "fieldtype": "Text", + "hidden": 0, + "label": "Default", + "oldfieldname": "default", + "oldfieldtype": "Text", + "permlevel": 0, + "print_hide": 0, + "reqd": 0, + "search_index": 0 + }, { "fieldname": "in_filter", "fieldtype": "Check", @@ -132,70 +218,10 @@ "width": "50px" }, { - "fieldname": "in_list_view", - "fieldtype": "Check", - "label": "In List View", - "permlevel": 0 - }, - { - "fieldname": "hidden", - "fieldtype": "Check", - "hidden": 0, - "label": "Hidden", - "oldfieldname": "hidden", - "oldfieldtype": "Check", + "fieldname": "column_break_21", + "fieldtype": "Column Break", "permlevel": 0, - "print_hide": 0, - "print_width": "50px", - "reqd": 0, - "search_index": 0, - "width": "50px" - }, - { - "fieldname": "print_hide", - "fieldtype": "Check", - "hidden": 0, - "label": "Print Hide", - "oldfieldname": "print_hide", - "oldfieldtype": "Check", - "permlevel": 0, - "print_hide": 0, - "reqd": 0, - "search_index": 0 - }, - { - "fieldname": "report_hide", - "fieldtype": "Check", - "hidden": 0, - "label": "Report Hide", - "oldfieldname": "report_hide", - "oldfieldtype": "Check", - "permlevel": 0, - "print_hide": 0, - "reqd": 0 - }, - { - "fieldname": "allow_on_submit", - "fieldtype": "Check", - "hidden": 0, - "label": "Allow on Submit", - "oldfieldname": "allow_on_submit", - "oldfieldtype": "Check", - "permlevel": 0, - "print_hide": 0, - "reqd": 0 - }, - { - "description": "This field will appear only if the fieldname defined here has value OR the rules are true (examples):
\nmyfield\neval:doc.myfield=='My Value'
\neval:doc.age>18", - "fieldname": "depends_on", - "fieldtype": "Data", - "hidden": 0, - "label": "Depends On", - "oldfieldname": "depends_on", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "reqd": 0 + "precision": "" }, { "fieldname": "description", @@ -211,16 +237,40 @@ "width": "300px" }, { - "fieldname": "default", - "fieldtype": "Text", + "fieldname": "print_hide", + "fieldtype": "Check", "hidden": 0, - "label": "Default", - "oldfieldname": "default", - "oldfieldtype": "Text", + "label": "Print Hide", + "oldfieldname": "print_hide", + "oldfieldtype": "Check", "permlevel": 0, "print_hide": 0, "reqd": 0, "search_index": 0 + }, + { + "description": "Print Width of the field, if the field is a column in a table", + "fieldname": "print_width", + "fieldtype": "Data", + "label": "Print Width", + "permlevel": 0, + "print_width": "50px", + "width": "50px" + }, + { + "fieldname": "width", + "fieldtype": "Data", + "hidden": 0, + "in_list_view": 1, + "label": "Width", + "oldfieldname": "width", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "print_width": "50px", + "reqd": 0, + "search_index": 0, + "width": "50px" } ], "hide_heading": 0, @@ -228,7 +278,7 @@ "idx": 1, "issingle": 0, "istable": 1, - "modified": "2014-09-05 03:47:29.743676", + "modified": "2014-09-05 07:41:29.641454", "modified_by": "Administrator", "module": "Core", "name": "Customize Form Field", diff --git a/frappe/core/doctype/docfield/docfield.json b/frappe/core/doctype/docfield/docfield.json index b68c2e8ec4..1bb0d71a57 100644 --- a/frappe/core/doctype/docfield/docfield.json +++ b/frappe/core/doctype/docfield/docfield.json @@ -91,6 +91,16 @@ "fieldtype": "Column Break", "permlevel": 0 }, + { + "depends_on": "eval:in_list([\"Float\", \"Currency\", \"Percent\"], doc.fieldtype)", + "description": "Set non-standard precision for a Float or Currency field", + "fieldname": "precision", + "fieldtype": "Select", + "label": "Precision", + "options": "\n1\n2\n3\n4\n5\n6", + "permlevel": 0, + "print_hide": 1 + }, { "description": "For Links, enter the DocType as range\nFor Select, enter list of Options separated by comma", "fieldname": "options", @@ -304,7 +314,7 @@ "in_dialog": 1, "issingle": 0, "istable": 1, - "modified": "2014-08-11 07:00:52.537012", + "modified": "2014-09-05 07:41:05.956027", "modified_by": "Administrator", "module": "Core", "name": "DocField", diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index c65de18f85..b20eb09b46 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -232,6 +232,10 @@ def validate_fields(fields): if d.fieldtype == "Check" and d.default and d.default not in ('0', '1'): frappe.throw(_("Default for 'Check' type of field must be either '0' or '1'")) + def check_precision(d): + if d.fieldtype in ("Currency", "Float", "Percent") and d.precision is not None and not (1 <= cint(d.precision) <= 6): + frappe.throw(_("Precision should be between 1 and 6")) + def check_fold(fields): fold_exists = False for i, f in enumerate(fields): diff --git a/frappe/model/document.py b/frappe/model/document.py index bd58ad9b3e..0993c19008 100644 --- a/frappe/model/document.py +++ b/frappe/model/document.py @@ -552,26 +552,24 @@ class Document(BaseDocument): if parentfield and not isinstance(parentfield, basestring): parentfield = parentfield.parentfield + cache_key = parentfield or "main" + if not hasattr(self, "_precision"): - self._precision = frappe._dict({ - "default": cint(frappe.db.get_default("float_precision")) or 3, - "options": {} - }) + self._precision = frappe._dict() - if self._precision.setdefault(parentfield or "main", {}).get(fieldname) is None: - meta = frappe.get_meta(self.meta.get_field(parentfield).options if parentfield else self.doctype) - df = meta.get_field(fieldname) + if cache_key not in self._precision: + self._precision[cache_key] = frappe._dict() - if df.fieldtype == "Currency" and df.options and not self._precision.options.get(df.options): - self._precision.options[df.options] = get_field_precision(df, self) + if fieldname not in self._precision[cache_key]: + self._precision[cache_key][fieldname] = None - if df.fieldtype == "Currency": - self._precision[parentfield or "main"][fieldname] = cint(self._precision.options.get(df.options)) or \ - self._precision.default - elif df.fieldtype in ("Float", "Percent"): - self._precision[parentfield or "main"][fieldname] = self._precision.default + doctype = self.meta.get_field(parentfield).options if parentfield else self.doctype + df = frappe.get_meta(doctype).get_field(fieldname) - return self._precision[parentfield or "main"][fieldname] + if df.fieldtype in ("Currency", "Float", "Percent"): + self._precision[cache_key][fieldname] = get_field_precision(df, self) + + return self._precision[cache_key][fieldname] def get_url(self): return "/desk#Form/{doctype}/{name}".format(doctype=self.doctype, name=self.name) diff --git a/frappe/model/meta.py b/frappe/model/meta.py index 9960510282..0a65f5e4c5 100644 --- a/frappe/model/meta.py +++ b/frappe/model/meta.py @@ -258,19 +258,23 @@ def get_field_precision(df, doc): """get precision based on DocField options and fieldvalue in doc""" from frappe.utils import get_number_format_info - number_format = None + precision = cint(df.precision) or cint(frappe.db.get_default("float_precision")) or 3 + if df.fieldtype == "Currency": + number_format = None currency = get_field_currency(df, doc) + + if not currency: + # use default currency + currency = frappe.db.get_default("currency") + if currency: number_format = frappe.db.get_value("Currency", currency, "number_format") - if not number_format: - number_format = frappe.db.get_default("number_format") or "#,###.##" + if not number_format: + number_format = frappe.db.get_default("number_format") or "#,###.##" - decimal_str, comma_str, precision = get_number_format_info(number_format) - - if df.fieldtype in ("Float", "Percent"): - precision = cint(frappe.db.get_default("float_precision")) or 3 + decimal_str, comma_str, precision = get_number_format_info(number_format) return precision diff --git a/frappe/public/js/frappe/form/control.js b/frappe/public/js/frappe/form/control.js index 5ffb028da0..a5de157e87 100644 --- a/frappe/public/js/frappe/form/control.js +++ b/frappe/public/js/frappe/form/control.js @@ -385,20 +385,26 @@ frappe.ui.form.ControlFloat = frappe.ui.form.ControlInt.extend({ return callback(isNaN(parseFloat(value)) ? null : flt(value)); }, format_for_input: function(value) { - var formatted_value = format_number(parseFloat(value), - null, cint(frappe.boot.sysdefaults.float_precision, null)); + 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()) { + number_format = get_number_format(this.get_currency()); + } + var formatted_value = format_number(parseFloat(value), number_format, precision); return isNaN(parseFloat(value)) ? "" : formatted_value; + }, + + // 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()); } }); frappe.ui.form.ControlCurrency = frappe.ui.form.ControlFloat.extend({ format_for_input: function(value) { var formatted_value = format_number(parseFloat(value), - get_number_format(this.get_currency())); + get_number_format(this.get_currency()), this.df.precision || null); return isNaN(parseFloat(value)) ? "" : formatted_value; - }, - get_currency: function() { - return frappe.meta.get_field_currency(this.df, this.get_doc()); } }); diff --git a/frappe/public/js/frappe/form/formatters.js b/frappe/public/js/frappe/form/formatters.js index 9b896e29c6..02aff3a009 100644 --- a/frappe/public/js/frappe/form/formatters.js +++ b/frappe/public/js/frappe/form/formatters.js @@ -19,12 +19,28 @@ frappe.form.formatters = { Select: function(value) { return __(frappe.form.formatters["Data"](value)); }, - Float: function(value, docfield, options) { - var decimals = cint(docfield.options, null) || cint(frappe.boot.sysdefaults.float_precision, null); - return frappe.form.formatters._right( - ((value==null || value==="") - ? "" - : format_number(value, null, decimals)), options) + Float: function(value, docfield, options, doc) { + // don't allow 0 precision for Floats, hence or'ing with null + var precision = docfield.precision || cint(frappe.boot.sysdefaults.float_precision) || null; + if (docfield.options && docfield.options.trim()) { + // options points to a currency field, but expects precision of float! + docfield.precision = precision; + return frappe.form.formatters.Currency(value, docfield, options, doc); + + } else { + // show 1.000000 as 1 + if (!is_null(value)) { + var temp = cstr(value).split("."); + if (temp[1]==undefined || cint(temp[1])===0) { + precision = 0; + } + } + + return frappe.form.formatters._right( + ((value==null || value==="") + ? "" + : format_number(value, null, precision)), options); + } }, Int: function(value, docfield, options) { return frappe.form.formatters._right(value==null ? "" : cint(value), options) @@ -35,7 +51,7 @@ frappe.form.formatters = { Currency: function(value, docfield, options, doc) { var currency = frappe.meta.get_field_currency(docfield, doc); return frappe.form.formatters._right((value==null || value==="") - ? "" : format_currency(value, currency), options); + ? "" : format_currency(value, currency, docfield.precision || null), options); }, Check: function(value) { return value ? "" : ""; diff --git a/frappe/public/js/frappe/form/grid.js b/frappe/public/js/frappe/form/grid.js index 5d2ecfe4b0..2fea3b8941 100644 --- a/frappe/public/js/frappe/form/grid.js +++ b/frappe/public/js/frappe/form/grid.js @@ -562,6 +562,7 @@ frappe.ui.form.GridRow = Class.extend({ // in form if(this.fields_dict && this.fields_dict[fieldname]) { this.fields_dict[fieldname].refresh(); + this.layout.refresh_dependency(); } }, get_visible_columns: function(blacklist) { diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js index 5e576eab93..6b70abc3b9 100644 --- a/frappe/public/js/frappe/form/layout.js +++ b/frappe/public/js/frappe/form/layout.js @@ -71,6 +71,9 @@ frappe.ui.form.Layout = Class.extend({ .appendTo(me.wrapper) } }, 100); + + // dependent fields + this.refresh_dependency(); }, render: function() { var me = this; @@ -318,5 +321,59 @@ frappe.ui.form.Layout = Class.extend({ get_open_grid_row: function() { return $(".grid-row-open").data("grid_row"); }, + refresh_dependency: function() { + // Resolve "depends_on" and show / hide accordingly + var me = this; + var doc = me.doc; + if (!doc) return; + + var parent = doc.parent ? locals[doc.parenttype][doc.parent] : {}; + + // build dependants' dictionary + var has_dep = false; + + for(fkey in this.fields_list) { + var f = this.fields_list[fkey]; + f.dependencies_clear = true; + if(f.df.depends_on) { + has_dep = true; + } + } + + if(!has_dep)return; + + // show / hide based on values + for(var i=me.fields_list.length-1;i>=0;i--) { + var f = me.fields_list[i]; + f.guardian_has_value = true; + if(f.df.depends_on) { + // evaluate guardian + if(f.df.depends_on.substr(0,5)=='eval:') { + f.guardian_has_value = eval(f.df.depends_on.substr(5)); + } else if(f.df.depends_on.substr(0,3)=='fn:' && me.frm) { + f.guardian_has_value = me.frm.script_manager.trigger(f.df.depends_on.substr(3), me.doctype, me.docname); + } else { + if(!doc[f.df.depends_on]) { + f.guardian_has_value = false; + } + } + + // show / hide + if(f.guardian_has_value) { + if(f.df.hidden_due_to_dependency) { + f.df.hidden_due_to_dependency = false; + f.refresh(); + } + } else { + if(!f.df.hidden_due_to_dependency) { + f.df.hidden_due_to_dependency = true; + f.refresh(); + } + } + } + } + + this.refresh_section_count(); + } }) diff --git a/frappe/public/js/frappe/misc/number_format.js b/frappe/public/js/frappe/misc/number_format.js index 422f613783..0fba7e1017 100644 --- a/frappe/public/js/frappe/misc/number_format.js +++ b/frappe/public/js/frappe/misc/number_format.js @@ -76,8 +76,8 @@ window.format_number = function(v, format, decimals){ info = get_number_format_info(format); - //Fix the decimal first, toFixed will auto fill trailing zero. - decimals = decimals || info.precision; + // Fix the decimal first, toFixed will auto fill trailing zero. + if (decimals == null) decimals = info.precision; v = flt(v, decimals, format); diff --git a/frappe/public/js/frappe/model/meta.js b/frappe/public/js/frappe/model/meta.js index 4ab3bfbbf0..23c430f6cc 100644 --- a/frappe/public/js/frappe/model/meta.js +++ b/frappe/public/js/frappe/model/meta.js @@ -168,12 +168,14 @@ $.extend(frappe.meta, { }, get_field_precision: function(df, doc) { - var precision = frappe.defaults.get_default("float_precision") || 3; - if(df && df.fieldtype === "Currency") { + var precision = cint(frappe.defaults.get_default("float_precision")) || 3; + if (df && cint(df.precision)) { + precision = cint(df.precision); + } else if(df && df.fieldtype === "Currency") { var currency = this.get_field_currency(df, doc); var number_format = get_number_format(currency); var number_format_info = get_number_format_info(number_format); - precision = number_format_info.precision || precision; + precision = number_format_info.precision; } return precision; }, diff --git a/frappe/public/js/legacy/form.js b/frappe/public/js/legacy/form.js index 0e5902cd77..25a93ef924 100644 --- a/frappe/public/js/legacy/form.js +++ b/frappe/public/js/legacy/form.js @@ -194,7 +194,7 @@ _f.Frm.prototype.watch_model_updates = function() { me.fields_dict[fieldname] && me.fields_dict[fieldname].refresh(fieldname); - me.refresh_dependency(); + me.layout.refresh_dependency(); me.script_manager.trigger(fieldname, doc.doctype, doc.name); } }) @@ -432,9 +432,6 @@ _f.Frm.prototype.refresh_fields = function() { // cleanup activities after refresh this.cleanup_refresh(this); - - // dependent fields - this.refresh_dependency(); } @@ -468,60 +465,6 @@ _f.Frm.prototype.cleanup_refresh = function() { } } -// Resolve "depends_on" and show / hide accordingly - -_f.Frm.prototype.refresh_dependency = function() { - var me = this; - var doc = locals[this.doctype][this.docname]; - - // build dependants' dictionary - var has_dep = false; - - for(fkey in me.fields) { - var f = me.fields[fkey]; - f.dependencies_clear = true; - if(f.df.depends_on) { - has_dep = true; - } - } - - if(!has_dep)return; - - // show / hide based on values - for(var i=me.fields.length-1;i>=0;i--) { - var f = me.fields[i]; - f.guardian_has_value = true; - if(f.df.depends_on) { - // evaluate guardian - var v = doc[f.df.depends_on]; - if(f.df.depends_on.substr(0,5)=='eval:') { - f.guardian_has_value = eval(f.df.depends_on.substr(5)); - } else if(f.df.depends_on.substr(0,3)=='fn:') { - f.guardian_has_value = me.script_manager.trigger(f.df.depends_on.substr(3), me.doctype, me.docname); - } else { - if(!v) { - f.guardian_has_value = false; - } - } - - // show / hide - if(f.guardian_has_value) { - if(f.df.hidden_due_to_dependency) { - f.df.hidden_due_to_dependency = false; - f.refresh(); - } - } else { - if(!f.df.hidden_due_to_dependency) { - f.df.hidden_due_to_dependency = true; - f.refresh(); - } - } - } - } - - this.layout.refresh_section_count(); -} - _f.Frm.prototype.setnewdoc = function() { // moved this call to refresh function // this.check_doctype_conflict(docname); diff --git a/frappe/utils/data.py b/frappe/utils/data.py index e61ba9b2f0..c4641aafec 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -261,7 +261,7 @@ def fmt_money(amount, precision=None, currency=None): decimal_str, comma_str, number_format_precision = get_number_format_info(number_format) - if not precision: + if precision is None: precision = number_format_precision amount = '%.*f' % (precision, flt(amount)) diff --git a/frappe/utils/formatters.py b/frappe/utils/formatters.py index 486178c9a2..e97560b6c7 100644 --- a/frappe/utils/formatters.py +++ b/frappe/utils/formatters.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals import frappe -from frappe.utils import formatdate, fmt_money, flt +from frappe.utils import formatdate, fmt_money, flt, cstr, cint from frappe.model.meta import get_field_currency, get_field_precision import re @@ -11,12 +11,21 @@ def format_value(value, df, doc=None, currency=None): if df.get("fieldtype")=="Date": return formatdate(value) - elif df.get("fieldtype") == "Currency": + elif df.get("fieldtype") == "Currency" or (df.get("fieldtype")=="Float" and (df.options or "").strip()): return fmt_money(value, precision=get_field_precision(df, doc), currency=currency if currency else (get_field_currency(df, doc) if doc else None)) elif df.get("fieldtype") == "Float": - return fmt_money(value, precision=get_field_precision(df, doc)) + precision = get_field_precision(df, doc) + + # show 1.000000 as 1 + # options should not specified + if not df.options and value is not None: + temp = cstr(value).split(".") + if len(temp)==1 or cint(temp[1])==0: + precision = 0 + + return fmt_money(value, precision=precision) elif df.get("fieldtype") == "Percent": return "{}%".format(flt(value, 2))