Просмотр исходного кода

feat: add name validation to data fieldtype

Signed-off-by: Chinmay D. Pai <chinmaydpai@gmail.com>
version-14
Chinmay D. Pai 5 лет назад
Родитель
Сommit
1dfa8ccbc4
Не найден GPG ключ соответствующий данной подписи Идентификатор GPG ключа: 75507BE256F40CED
8 измененных файлов: 35 добавлений и 4 удалений
  1. +1
    -0
      .eslintrc
  2. +2
    -1
      frappe/exceptions.py
  3. +1
    -1
      frappe/model/__init__.py
  4. +3
    -0
      frappe/model/base_document.py
  5. +3
    -0
      frappe/public/js/frappe/form/controls/data.js
  6. +5
    -1
      frappe/public/js/frappe/utils/datatype.js
  7. +3
    -0
      frappe/public/js/frappe/utils/utils.js
  8. +17
    -1
      frappe/utils/__init__.py

+ 1
- 0
.eslintrc Просмотреть файл

@@ -78,6 +78,7 @@
"has_common": true,
"has_words": true,
"validate_email": true,
"validate_name": true,
"validate_phone": true,
"get_number_format": true,
"format_number": true,


+ 2
- 1
frappe/exceptions.py Просмотреть файл

@@ -78,6 +78,7 @@ class TimestampMismatchError(ValidationError): pass
class EmptyTableError(ValidationError): pass
class LinkExistsError(ValidationError): pass
class InvalidEmailAddressError(ValidationError): pass
class InvalidNameError(ValidationError): pass
class InvalidPhoneNumberError(ValidationError): pass
class TemplateNotFoundError(ValidationError): pass
class UniqueValidationError(ValidationError): pass
@@ -95,4 +96,4 @@ class DataTooLongException(ValidationError): pass
# OAuth exceptions
class InvalidAuthorizationHeader(CSRFTokenError): pass
class InvalidAuthorizationPrefix(CSRFTokenError): pass
class InvalidAuthorizationToken(CSRFTokenError): pass
class InvalidAuthorizationToken(CSRFTokenError): pass

+ 1
- 1
frappe/model/__init__.py Просмотреть файл

@@ -48,7 +48,7 @@ table_fields = ('Table', 'Table MultiSelect')
core_doctypes_list = ('DocType', 'DocField', 'DocPerm', 'DocType Action', 'DocType Link', 'User', 'Role', 'Has Role',
'Page', 'Module Def', 'Print Format', 'Report', 'Customize Form',
'Customize Form Field', 'Property Setter', 'Custom Field', 'Custom Script')
data_field_options = ('Email', 'Phone')
data_field_options = ('Email', 'Name', 'Phone')

def copytables(srctype, src, srcfield, tartype, tar, tarfield, srcfields, tarfields=[]):
if not tarfields:


+ 3
- 0
frappe/model/base_document.py Просмотреть файл

@@ -571,6 +571,9 @@ class BaseDocument(object):
for email_address in frappe.utils.split_emails(data):
frappe.utils.validate_email_address(email_address, throw=True)

if data_field_options == "Name":
frappe.utils.validate_name(data, throw=True)

if data_field_options == "Phone":
frappe.utils.validate_phone_number(data, throw=True)



+ 3
- 0
frappe/public/js/frappe/form/controls/data.js Просмотреть файл

@@ -96,6 +96,9 @@ frappe.ui.form.ControlData = frappe.ui.form.ControlInput.extend({
if(this.df.options == 'Phone') {
this.df.invalid = !validate_phone(v);
return v;
} else if (this.df.options == 'Name') {
this.df.invalid = !validate_name(v);
return v;
} else if(this.df.options == 'Email') {
var email_list = frappe.utils.split_emails(v);
if (!email_list) {


+ 5
- 1
frappe/public/js/frappe/utils/datatype.js Просмотреть файл

@@ -48,6 +48,10 @@ window.validate_phone = function(txt) {
return frappe.utils.validate_type(txt, "phone");
};

window.validate_name = function(txt) {
return frappe.utils.validate_type(txt, "name");
};

window.nth = function(number) {
number = cint(number);
var s = 'th';
@@ -73,4 +77,4 @@ window.has_common = function(list1, list2) {
if(in_list(list2, list1[i]))return true;
}
return false;
};
};

+ 3
- 0
frappe/public/js/frappe/utils/utils.js Просмотреть файл

@@ -237,6 +237,9 @@ Object.assign(frappe.utils, {
case "phone":
regExp = /^([0-9\ \+\_\-\,\.\*\#\(\)]){1,20}$/;
break;
case "name":
regExp = /^[\w][\w\'\-]*([ \w][\w\'\-]+)*$/;
break;
case "number":
regExp = /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/;
break;


+ 17
- 1
frappe/utils/__init__.py Просмотреть файл

@@ -81,13 +81,29 @@ def validate_phone_number(phone_number, throw=False):
return False

phone_number = phone_number.strip()
match = re.match("([0-9\ \+\_\-\,\.\*\#\(\)]){1,20}$", phone_number)
match = re.match(r"([0-9\ \+\_\-\,\.\*\#\(\)]){1,20}$", phone_number)

if not match and throw:
frappe.throw(frappe._("{0} is not a valid Phone Number").format(phone_number), frappe.InvalidPhoneNumberError)

return bool(match)

def validate_name(name, throw=False):
"""Returns True if the name is valid
valid names may have unicode and ascii characters, dash, quotes, numbers
anything else is considered invalid
"""
if not name:
return False

name = name.strip()
match = re.match(r"^[\w][\w\'\-]*([ \w][\w\'\-]+)*$", name)

if not match and throw:
frappe.throw(frappe._("{0} is not a valid Name").format(name), frappe.InvalidNameError)

return bool(match)

def validate_email_address(email_str, throw=False):
"""Validates the email string"""
email = email_str = (email_str or "").strip()


Загрузка…
Отмена
Сохранить