From 82b98330fd0f0cbfcbd62b6775fc3955796e4d01 Mon Sep 17 00:00:00 2001 From: Hussain Nagaria Date: Wed, 14 Apr 2021 19:50:08 +0530 Subject: [PATCH] feat: Add URL option for data type fields --- frappe/model/__init__.py | 3 ++- frappe/model/base_document.py | 3 +++ frappe/public/js/frappe/form/controls/data.js | 3 +++ frappe/public/js/frappe/utils/datatype.js | 4 ++++ frappe/utils/__init__.py | 15 ++++++++++++++- 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/frappe/model/__init__.py b/frappe/model/__init__.py index af06696621..205b451336 100644 --- a/frappe/model/__init__.py +++ b/frappe/model/__init__.py @@ -71,7 +71,8 @@ numeric_fieldtypes = ( data_field_options = ( 'Email', 'Name', - 'Phone' + 'Phone', + 'URL' ) default_fields = ( diff --git a/frappe/model/base_document.py b/frappe/model/base_document.py index 983511f7a4..cf63aa98b6 100644 --- a/frappe/model/base_document.py +++ b/frappe/model/base_document.py @@ -666,6 +666,9 @@ class BaseDocument(object): if data_field_options == "Phone": frappe.utils.validate_phone_number(data, throw=True) + if data_field_options == "URL": + frappe.utils.validate_url(data, throw=True) + def _validate_constants(self): if frappe.flags.in_import or self.is_new() or self.flags.ignore_validate_constants: return diff --git a/frappe/public/js/frappe/form/controls/data.js b/frappe/public/js/frappe/form/controls/data.js index f381d1b4a2..b4d24d9a8f 100644 --- a/frappe/public/js/frappe/form/controls/data.js +++ b/frappe/public/js/frappe/form/controls/data.js @@ -126,6 +126,9 @@ frappe.ui.form.ControlData = frappe.ui.form.ControlInput.extend({ this.df.invalid = email_invalid; return v; } + } else if (this.df.options == 'URL') { + this.df.invalid = !validate_url(v); + return v; } else { return v; } diff --git a/frappe/public/js/frappe/utils/datatype.js b/frappe/public/js/frappe/utils/datatype.js index 1b9206f434..ad0fd4324c 100644 --- a/frappe/public/js/frappe/utils/datatype.js +++ b/frappe/public/js/frappe/utils/datatype.js @@ -52,6 +52,10 @@ window.validate_name = function(txt) { return frappe.utils.validate_type(txt, "name"); }; +window.validate_url = function(txt) { + return frappe.utils.validate_type(txt, "url"); +} + window.nth = function(number) { number = cint(number); var s = 'th'; diff --git a/frappe/utils/__init__.py b/frappe/utils/__init__.py index efa69d4453..3e397afee6 100644 --- a/frappe/utils/__init__.py +++ b/frappe/utils/__init__.py @@ -19,7 +19,7 @@ from gzip import GzipFile from typing import Generator, Iterable from six import string_types, text_type -from six.moves.urllib.parse import quote +from six.moves.urllib.parse import quote, urlparse from werkzeug.test import Client import frappe @@ -161,6 +161,19 @@ def split_emails(txt): return email_list +def validate_url(txt, throw=False): + try: + url = urlparse(txt).netloc + if not url: + raise frappe.ValidationError + except Exception as e: + if throw: + frappe.throw( + frappe._("'{0}' is not a valid URL").format(txt) + ) + + return False + def random_string(length): """generate a random string""" import string