|
|
@@ -16,6 +16,12 @@ from frappe.utils.password import get_decrypted_password, set_encrypted_password |
|
|
|
from frappe.utils import (cint, flt, now, cstr, strip_html, getdate, get_datetime, to_timedelta, |
|
|
|
sanitize_html, sanitize_email, cast_fieldtype) |
|
|
|
|
|
|
|
max_positive_value = { |
|
|
|
'smallint': 2 ** 15, |
|
|
|
'int': 2 ** 31, |
|
|
|
'bigint': 2 ** 63 |
|
|
|
} |
|
|
|
|
|
|
|
_classes = {} |
|
|
|
|
|
|
|
def get_controller(doctype): |
|
|
@@ -549,7 +555,6 @@ class BaseDocument(object): |
|
|
|
# single doctype value type is mediumtext |
|
|
|
return |
|
|
|
|
|
|
|
column_types_to_check_length = ('varchar', 'int', 'bigint') |
|
|
|
type_map = frappe.db.type_map |
|
|
|
|
|
|
|
for fieldname, value in iteritems(self.get_valid_dict()): |
|
|
@@ -560,20 +565,29 @@ class BaseDocument(object): |
|
|
|
continue |
|
|
|
|
|
|
|
column_type = type_map[df.fieldtype][0] or None |
|
|
|
default_column_max_length = type_map[df.fieldtype][1] or None |
|
|
|
|
|
|
|
if df and df.fieldtype in type_map and column_type in column_types_to_check_length: |
|
|
|
if column_type == 'varchar': |
|
|
|
default_column_max_length = type_map[df.fieldtype][1] or None |
|
|
|
max_length = cint(df.get("length")) or cint(default_column_max_length) |
|
|
|
|
|
|
|
if len(cstr(value)) > max_length: |
|
|
|
if self.parentfield and self.idx: |
|
|
|
reference = _("{0}, Row {1}").format(_(self.doctype), self.idx) |
|
|
|
self.throw_length_exceeded_error(df, max_length, value) |
|
|
|
|
|
|
|
elif column_type in ('int', 'bigint', 'smallint'): |
|
|
|
max_length = max_positive_value[column_type] |
|
|
|
|
|
|
|
if abs(value) > max_length: |
|
|
|
self.throw_length_exceeded_error(df, max_length, value) |
|
|
|
|
|
|
|
else: |
|
|
|
reference = "{0} {1}".format(_(self.doctype), self.name) |
|
|
|
def throw_length_exceeded_error(self, df, max_length, value): |
|
|
|
if self.parentfield and self.idx: |
|
|
|
reference = _("{0}, Row {1}").format(_(self.doctype), self.idx) |
|
|
|
|
|
|
|
else: |
|
|
|
reference = "{0} {1}".format(_(self.doctype), self.name) |
|
|
|
|
|
|
|
frappe.throw(_("{0}: '{1}' ({3}) will get truncated, as max characters allowed is {2}")\ |
|
|
|
.format(reference, _(df.label), max_length, value), frappe.CharacterLengthExceededError, title=_('Value too big')) |
|
|
|
frappe.throw(_("{0}: '{1}' ({3}) will get truncated, as max characters allowed is {2}")\ |
|
|
|
.format(reference, _(df.label), max_length, value), frappe.CharacterLengthExceededError, title=_('Value too big')) |
|
|
|
|
|
|
|
def _validate_update_after_submit(self): |
|
|
|
# get the full doc with children |
|
|
|