Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
仰若水
frappe
Commits
27c58f6a
Commit
27c58f6a
authored
7 years ago
by
mbauskar
Browse files
Options
Download
Plain Diff
Merge branch 'staging'
parents
a825342f
3dc6a37f
develop
v11.1.5
v11.1.4
v11.1.3
v11.1.2
v11.1.1
v11.1.0
v11.0.3
v11.0.3-beta.51
v11.0.3-beta.50
v11.0.3-beta.49
v11.0.3-beta.48
v11.0.3-beta.47
v11.0.3-beta.46
v11.0.3-beta.45
v11.0.3-beta.44
v11.0.3-beta.43
v11.0.3-beta.42
v11.0.3-beta.41
v11.0.3-beta.40
v11.0.3-beta.39
v11.0.3-beta.38
v11.0.3-beta.37
v11.0.3-beta.36
v11.0.3-beta.35
v11.0.3-beta.34
v11.0.3-beta.33
v11.0.3-beta.32
v11.0.3-beta.31
v11.0.3-beta.30
v11.0.3-beta.29
v11.0.3-beta.28
v11.0.3-beta.27
v11.0.3-beta.26
v11.0.3-beta.25
v11.0.3-beta.24
v11.0.3-beta.23
v11.0.3-beta.22
v11.0.3-beta.21
v11.0.3-beta.20
v11.0.3-beta.19
v11.0.3-beta.18
v11.0.3-beta.17
v11.0.3-beta.16
v11.0.3-beta.15
v11.0.3-beta.14
v11.0.3-beta.13
v11.0.3-beta.12
v11.0.3-beta.11
v11.0.3-beta.10
v11.0.3-beta.9
v11.0.3-beta.8
v11.0.3-beta.7
v11.0.3-beta.6
v11.0.3-beta.5
v11.0.3-beta.4
v11.0.3-beta.3
v11.0.3-beta.2
v11.0.3-beta.1
v11.0.2
v11.0.1
v11.0.0-beta
v10.1.71
v10.1.70
v10.1.69
v10.1.68
v10.1.67
v10.1.66
v10.1.65
v10.1.64
v10.1.63
v10.1.62
v10.1.61
v10.1.60
v10.1.59
v10.1.58
v10.1.57
v10.1.56
v10.1.55
v10.1.54
v10.1.53
v10.1.52
v10.1.51
v10.1.50
v10.1.49
v10.1.49-beta.1
v10.1.48
v10.1.47
v10.1.46
v10.1.45
v10.1.44
v10.1.43
v10.1.42
v10.1.41
v10.1.40
v10.1.39
v10.1.38
v10.1.37
v10.1.36
v10.1.35
v10.1.34
v10.1.33
v10.1.32
v10.1.31
v10.1.30
v10.1.29
v10.1.28
v10.1.27
v10.1.26
v10.1.25
v10.1.24
v10.1.23
v10.1.22
v10.1.21
v10.1.20
v10.1.19
v10.1.18
v10.1.17
v10.1.16
v10.1.15
v10.1.14
v10.1.13
v10.1.12
v10.1.11
v10.1.10
v10.1.9
v10.1.8
v10.1.7
v10.1.6
v10.1.5
v10.1.4
v10.1.3
v10.1.2
v10.1.1
v10.1.0
v10.0.25
v10.0.24
v10.0.23
v10.0.22
v10.0.21
v10.0.20
v10.0.19
v10.0.18
v10.0.17
v10.0.16
v10.0.15
v10.0.14
v10.0.13
v10.0.12
v10.0.11
v10.0.10
v10.0.9
v10.0.8
v10.0.7
v10.0.6
v10.0.5
v10.0.4
v10.0.3
v10.0.2
v10.0.1
v10.0.0
v9.2.25
v9.2.24
v9.2.23
v9.2.22
v9.2.21
v9.2.20
v9.2.19
v9.2.18
v9.2.17
v9.2.16
v9.2.15
v9.2.14
v9.2.13
v9.2.12
v9.2.11
v9.2.10
v9.2.9
v9.2.8
v9.2.7
v9.2.6
v9.2.5
v9.2.4
v9.2.3
v9.2.2
v9.2.1
v9.2.0
v9.1.11
v9.1.10
v9.1.9
v9.1.8
v9.1.7
v9.1.6
v9.1.5
v9.1.4
v9.1.3
v9.1.2
v9.1.1
v9.1.0
v9.0.10
v9.0.9
v9.0.8
v9.0.7
v9.0.6
v9.0.5
v9.0.4
v9.0.3
v9.0.2
v9.0.1
v9.0.0
v8.10.9
v8.10.8
v8.10.7
v8.10.6
v8.10.5
v8.10.4
v8.10.3
v8.10.2
v8.10.1
v8.10.0
v8.9.4
v8.9.3
v8.9.2
v8.9.1
v8.9.0
v8.8.5
v8.8.4
v8.8.3
v8.8.2
v8.8.1
v8.8.0
No related merge requests found
Changes
80
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
frappe/__init__.py
+1
-1
frappe/__init__.py
frappe/auth.py
+20
-6
frappe/auth.py
frappe/build.js
+15
-11
frappe/build.js
frappe/change_log/v8/v8_8_0.md
+2
-0
frappe/change_log/v8/v8_8_0.md
frappe/client.py
+5
-0
frappe/client.py
frappe/contacts/doctype/address/address.js
+1
-0
frappe/contacts/doctype/address/address.js
frappe/core/doctype/doctype/boilerplate/test_controller.js
+2
-2
frappe/core/doctype/doctype/boilerplate/test_controller.js
frappe/core/doctype/role/role.json
+32
-1
frappe/core/doctype/role/role.json
frappe/core/doctype/sms_parameter/README.md
+1
-0
frappe/core/doctype/sms_parameter/README.md
frappe/core/doctype/sms_parameter/__init__.py
+1
-0
frappe/core/doctype/sms_parameter/__init__.py
frappe/core/doctype/sms_parameter/sms_parameter.json
+98
-0
frappe/core/doctype/sms_parameter/sms_parameter.json
frappe/core/doctype/sms_parameter/sms_parameter.py
+10
-0
frappe/core/doctype/sms_parameter/sms_parameter.py
frappe/core/doctype/sms_settings/README.md
+1
-0
frappe/core/doctype/sms_settings/README.md
frappe/core/doctype/sms_settings/__init__.py
+1
-0
frappe/core/doctype/sms_settings/__init__.py
frappe/core/doctype/sms_settings/sms_settings.js
+0
-0
frappe/core/doctype/sms_settings/sms_settings.js
frappe/core/doctype/sms_settings/sms_settings.json
+267
-0
frappe/core/doctype/sms_settings/sms_settings.json
frappe/core/doctype/sms_settings/sms_settings.py
+117
-0
frappe/core/doctype/sms_settings/sms_settings.py
frappe/core/doctype/sms_settings/test_sms_settings.js
+23
-0
frappe/core/doctype/sms_settings/test_sms_settings.js
frappe/core/doctype/system_settings/system_settings.json
+160
-1
frappe/core/doctype/system_settings/system_settings.json
frappe/core/doctype/system_settings/system_settings.py
+7
-0
frappe/core/doctype/system_settings/system_settings.py
with
764 additions
and
22 deletions
+764
-22
frappe/__init__.py
View file @
27c58f6a
...
...
@@ -14,7 +14,7 @@ import os, sys, importlib, inspect, json
from
.exceptions
import
*
from
.utils.jinja
import
get_jenv
,
get_template
,
render_template
,
get_email_from_template
__version__
=
'8.
7.11
'
__version__
=
'8.
8.0
'
__title__
=
"Frappe Framework"
local
=
Local
()
...
...
This diff is collapsed.
Click to expand it.
frappe/auth.py
View file @
27c58f6a
...
...
@@ -16,9 +16,14 @@ from frappe.modules.patch_handler import check_session_stopped
from
frappe.translate
import
get_lang_code
from
frappe.utils.password
import
check_password
from
frappe.core.doctype.authentication_log.authentication_log
import
add_authentication_log
from
frappe.utils.background_jobs
import
enqueue
from
twofactor
import
(
should_run_2fa
,
authenticate_for_2factor
,
confirm_otp_token
,
get_cached_user_pass
)
from
six.moves.urllib.parse
import
quote
import
pyotp
,
base64
,
os
class
HTTPRequest
:
def
__init__
(
self
):
# Get Environment variables
...
...
@@ -62,6 +67,7 @@ class HTTPRequest:
def
validate_csrf_token
(
self
):
if
frappe
.
local
.
request
and
frappe
.
local
.
request
.
method
==
"POST"
:
if
not
frappe
.
local
.
session
:
return
if
not
frappe
.
local
.
session
.
data
.
csrf_token
\
or
frappe
.
local
.
session
.
data
.
device
==
"mobile"
\
or
frappe
.
conf
.
get
(
'ignore_csrf'
,
None
):
...
...
@@ -88,7 +94,7 @@ class HTTPRequest:
def
connect
(
self
,
ac_name
=
None
):
"""connect to db, from ac_name or db_name"""
frappe
.
local
.
db
=
frappe
.
database
.
Database
(
user
=
self
.
get_db_name
(),
\
password
=
getattr
(
conf
,
'db_password'
,
''
))
password
=
getattr
(
conf
,
'db_password'
,
''
))
class
LoginManager
:
def
__init__
(
self
):
...
...
@@ -98,7 +104,7 @@ class LoginManager:
self
.
user_type
=
None
if
frappe
.
local
.
form_dict
.
get
(
'cmd'
)
==
'login'
or
frappe
.
local
.
request
.
path
==
"/api/method/login"
:
self
.
login
()
if
self
.
login
()
==
False
:
return
self
.
resume
=
False
# run login triggers
...
...
@@ -116,7 +122,12 @@ class LoginManager:
def
login
(
self
):
# clear cache
frappe
.
clear_cache
(
user
=
frappe
.
form_dict
.
get
(
'usr'
))
self
.
authenticate
()
user
,
pwd
=
get_cached_user_pass
()
self
.
authenticate
(
user
=
user
,
pwd
=
pwd
)
if
should_run_2fa
(
self
.
user
):
authenticate_for_2factor
(
self
.
user
)
if
not
confirm_otp_token
(
self
):
return
False
self
.
post_login
()
def
post_login
(
self
):
...
...
@@ -183,7 +194,7 @@ class LoginManager:
if
not
(
user
and
pwd
):
user
,
pwd
=
frappe
.
form_dict
.
get
(
'usr'
),
frappe
.
form_dict
.
get
(
'pwd'
)
if
not
(
user
and
pwd
):
self
.
fail
(
'Incomplete login details'
,
user
=
user
)
self
.
fail
(
_
(
'Incomplete login details'
)
,
user
=
user
)
if
cint
(
frappe
.
db
.
get_value
(
"System Settings"
,
"System Settings"
,
"allow_login_using_mobile_number"
)):
user
=
frappe
.
db
.
get_value
(
"User"
,
filters
=
{
"mobile_no"
:
user
},
fieldname
=
"name"
)
or
user
...
...
@@ -205,7 +216,9 @@ class LoginManager:
except
frappe
.
AuthenticationError
:
self
.
fail
(
'Incorrect password'
,
user
=
user
)
def
fail
(
self
,
message
,
user
=
"NA"
):
def
fail
(
self
,
message
,
user
=
None
):
if
not
user
:
user
=
_
(
'Unknown User'
)
frappe
.
local
.
response
[
'message'
]
=
message
add_authentication_log
(
message
,
user
,
status
=
"Failed"
)
frappe
.
db
.
commit
()
...
...
@@ -302,6 +315,7 @@ class CookieManager:
for
key
in
set
(
self
.
to_delete
):
response
.
set_cookie
(
key
,
""
,
expires
=
expires
)
@
frappe
.
whitelist
()
def
get_logged_user
():
return
frappe
.
session
.
user
...
...
@@ -317,4 +331,4 @@ def get_website_user_home_page(user):
home_page
=
frappe
.
get_attr
(
home_page_method
[
-
1
])(
user
)
return
'/'
+
home_page
.
strip
(
'/'
)
else
:
return
'/me'
return
'/me'
\ No newline at end of file
This diff is collapsed.
Click to expand it.
frappe/build.js
View file @
27c58f6a
...
...
@@ -10,6 +10,7 @@ const path_join = path.resolve;
const
app
=
require
(
'
express
'
)();
const
http
=
require
(
'
http
'
).
Server
(
app
);
const
io
=
require
(
'
socket.io
'
)(
http
);
const
touch
=
require
(
"
touch
"
);
// basic setup
const
sites_path
=
path_join
(
__dirname
,
'
..
'
,
'
..
'
,
'
..
'
,
'
sites
'
);
...
...
@@ -42,6 +43,7 @@ function build(minify) {
for
(
const
output_path
in
build_map
)
{
pack
(
output_path
,
build_map
[
output_path
],
minify
);
}
touch
(
path_join
(
sites_path
,
'
.build
'
),
{
force
:
true
});
}
let
socket_connection
=
false
;
...
...
@@ -228,7 +230,7 @@ function watch_less(ondirty) {
const
less_paths
=
app_paths
.
map
(
path
=>
path_join
(
path
,
'
public
'
,
'
less
'
));
const
to_watch
=
filter_valid_paths
(
less_paths
);
chokidar
.
watch
(
to_watch
).
on
(
'
change
'
,
(
filename
,
stats
)
=>
{
chokidar
.
watch
(
to_watch
).
on
(
'
change
'
,
(
filename
)
=>
{
console
.
log
(
filename
,
'
dirty
'
);
var
last_index
=
filename
.
lastIndexOf
(
'
/
'
);
const
less_path
=
filename
.
slice
(
0
,
last_index
);
...
...
@@ -236,17 +238,18 @@ function watch_less(ondirty) {
filename
=
filename
.
split
(
'
/
'
).
pop
();
compile_less_file
(
filename
,
less_path
,
public_path
)
.
then
(
css_file_path
=>
{
// build the target css file for which this css file is input
for
(
const
target
in
build_map
)
{
const
sources
=
build_map
[
target
];
if
(
sources
.
includes
(
css_file_path
))
{
pack
(
target
,
sources
);
ondirty
&&
ondirty
(
target
);
break
;
.
then
(
css_file_path
=>
{
// build the target css file for which this css file is input
for
(
const
target
in
build_map
)
{
const
sources
=
build_map
[
target
];
if
(
sources
.
includes
(
css_file_path
))
{
pack
(
target
,
sources
);
ondirty
&&
ondirty
(
target
);
break
;
}
}
}
})
}
);
touch
(
path_join
(
sites_path
,
'
.build
'
),
{
force
:
true
})
;
});
}
...
...
@@ -265,6 +268,7 @@ function watch_js(ondirty) {
// break;
}
}
touch
(
path_join
(
sites_path
,
'
.build
'
),
{
force
:
true
});
});
}
...
...
This diff is collapsed.
Click to expand it.
frappe/change_log/v8/v8_8_0.md
0 → 100644
View file @
27c58f6a
### Two Factor Authentication
-
Now you can authenticate user with two factor authentication. You can enable the Two Factor Authentication from System Settings.
\ No newline at end of file
This diff is collapsed.
Click to expand it.
frappe/client.py
View file @
27c58f6a
...
...
@@ -296,3 +296,8 @@ def get_js(items):
out
.
append
(
code
)
return
out
@
frappe
.
whitelist
(
allow_guest
=
True
)
def
get_time_zone
():
'''Returns default time zone'''
return
{
"time_zone"
:
frappe
.
defaults
.
get_defaults
().
get
(
"time_zone"
)}
This diff is collapsed.
Click to expand it.
frappe/contacts/doctype/address/address.js
View file @
27c58f6a
...
...
@@ -22,6 +22,7 @@ frappe.ui.form.on("Address", {
}
}
});
frm
.
refresh_field
(
"
links
"
);
},
validate
:
function
(
frm
)
{
// clear linked customer / supplier / sales partner on saving...
...
...
This diff is collapsed.
Click to expand it.
frappe/core/doctype/doctype/boilerplate/test_controller.js
View file @
27c58f6a
...
...
@@ -8,9 +8,9 @@ QUnit.test("test: {doctype}", function (assert) {{
// number of asserts
assert
.
expect
(
1
);
frappe
.
run_serially
(
'
{doctype}
'
,
[
frappe
.
run_serially
([
// insert a new {doctype}
()
=>
frappe
.
tests
.
make
([
()
=>
frappe
.
tests
.
make
(
'
{doctype}
'
,
[
// values to be set
{{
key
:
'
value
'
}}
]),
...
...
This diff is collapsed.
Click to expand it.
frappe/core/doctype/role/role.json
View file @
27c58f6a
...
...
@@ -105,6 +105,37 @@
"set_only_once"
:
0
,
"unique"
:
0
},
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
"bold"
:
0
,
"collapsible"
:
0
,
"columns"
:
0
,
"default"
:
"0"
,
"fieldname"
:
"two_factor_auth"
,
"fieldtype"
:
"Check"
,
"hidden"
:
0
,
"ignore_user_permissions"
:
0
,
"ignore_xss_filter"
:
0
,
"in_filter"
:
0
,
"in_global_search"
:
0
,
"in_list_view"
:
0
,
"in_standard_filter"
:
0
,
"label"
:
"Two Factor Authentication"
,
"length"
:
0
,
"no_copy"
:
0
,
"permlevel"
:
0
,
"precision"
:
""
,
"print_hide"
:
0
,
"print_hide_if_no_value"
:
0
,
"read_only"
:
0
,
"remember_last_selected_value"
:
0
,
"report_hide"
:
0
,
"reqd"
:
0
,
"search_index"
:
0
,
"set_only_once"
:
0
,
"unique"
:
0
},
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
...
...
@@ -148,7 +179,7 @@
"issingle"
:
0
,
"istable"
:
0
,
"max_attachments"
:
0
,
"modified"
:
"2017-0
5
-0
4
1
1:03:41.533058
"
,
"modified"
:
"2017-0
7
-0
6
1
2:42:57.097914
"
,
"modified_by"
:
"Administrator"
,
"module"
:
"Core"
,
"name"
:
"Role"
,
...
...
This diff is collapsed.
Click to expand it.
frappe/core/doctype/sms_parameter/README.md
0 → 100644
View file @
27c58f6a
SMS query parameter for SMS Settings.
\ No newline at end of file
This diff is collapsed.
Click to expand it.
frappe/core/doctype/sms_parameter/__init__.py
0 → 100755
View file @
27c58f6a
from
__future__
import
unicode_literals
This diff is collapsed.
Click to expand it.
frappe/core/doctype/sms_parameter/sms_parameter.json
0 → 100755
View file @
27c58f6a
{
"allow_copy"
:
0
,
"allow_guest_to_view"
:
0
,
"allow_import"
:
0
,
"allow_rename"
:
0
,
"beta"
:
0
,
"creation"
:
"2013-02-22 01:27:58"
,
"custom"
:
0
,
"docstatus"
:
0
,
"doctype"
:
"DocType"
,
"editable_grid"
:
1
,
"fields"
:
[
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
"bold"
:
0
,
"collapsible"
:
0
,
"columns"
:
0
,
"fieldname"
:
"parameter"
,
"fieldtype"
:
"Data"
,
"hidden"
:
0
,
"ignore_user_permissions"
:
0
,
"ignore_xss_filter"
:
0
,
"in_filter"
:
0
,
"in_global_search"
:
0
,
"in_list_view"
:
1
,
"in_standard_filter"
:
0
,
"label"
:
"Parameter"
,
"length"
:
0
,
"no_copy"
:
0
,
"permlevel"
:
0
,
"print_hide"
:
0
,
"print_hide_if_no_value"
:
0
,
"print_width"
:
"150px"
,
"read_only"
:
0
,
"remember_last_selected_value"
:
0
,
"report_hide"
:
0
,
"reqd"
:
1
,
"search_index"
:
0
,
"set_only_once"
:
0
,
"unique"
:
0
,
"width"
:
"150px"
},
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
"bold"
:
0
,
"collapsible"
:
0
,
"columns"
:
0
,
"fieldname"
:
"value"
,
"fieldtype"
:
"Data"
,
"hidden"
:
0
,
"ignore_user_permissions"
:
0
,
"ignore_xss_filter"
:
0
,
"in_filter"
:
0
,
"in_global_search"
:
0
,
"in_list_view"
:
1
,
"in_standard_filter"
:
0
,
"label"
:
"Value"
,
"length"
:
0
,
"no_copy"
:
0
,
"permlevel"
:
0
,
"print_hide"
:
0
,
"print_hide_if_no_value"
:
0
,
"print_width"
:
"150px"
,
"read_only"
:
0
,
"remember_last_selected_value"
:
0
,
"report_hide"
:
0
,
"reqd"
:
1
,
"search_index"
:
0
,
"set_only_once"
:
0
,
"unique"
:
0
,
"width"
:
"150px"
}
],
"has_web_view"
:
0
,
"hide_heading"
:
0
,
"hide_toolbar"
:
0
,
"idx"
:
1
,
"image_view"
:
0
,
"in_create"
:
0
,
"is_submittable"
:
0
,
"issingle"
:
0
,
"istable"
:
1
,
"max_attachments"
:
0
,
"modified"
:
"2017-07-22 22:52:53.309396"
,
"modified_by"
:
"chude.osiegbu@manqala.com"
,
"module"
:
"Core"
,
"name"
:
"SMS Parameter"
,
"owner"
:
"Administrator"
,
"permissions"
:
[],
"quick_entry"
:
0
,
"read_only"
:
0
,
"read_only_onload"
:
0
,
"show_name_in_global_search"
:
0
,
"track_changes"
:
0
,
"track_seen"
:
0
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
frappe/core/doctype/sms_parameter/sms_parameter.py
0 → 100644
View file @
27c58f6a
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
from
__future__
import
unicode_literals
import
frappe
from
frappe.model.document
import
Document
class
SMSParameter
(
Document
):
pass
\ No newline at end of file
This diff is collapsed.
Click to expand it.
frappe/core/doctype/sms_settings/README.md
0 → 100644
View file @
27c58f6a
Settings for automatically sending SMS from the system.
\ No newline at end of file
This diff is collapsed.
Click to expand it.
frappe/core/doctype/sms_settings/__init__.py
0 → 100755
View file @
27c58f6a
from
__future__
import
unicode_literals
This diff is collapsed.
Click to expand it.
frappe/core/doctype/sms_settings/sms_settings.js
0 → 100644
View file @
27c58f6a
This diff is collapsed.
Click to expand it.
frappe/core/doctype/sms_settings/sms_settings.json
0 → 100755
View file @
27c58f6a
{
"allow_copy"
:
1
,
"allow_guest_to_view"
:
0
,
"allow_import"
:
0
,
"allow_rename"
:
0
,
"beta"
:
0
,
"creation"
:
"2013-01-10 16:34:24"
,
"custom"
:
0
,
"docstatus"
:
0
,
"doctype"
:
"DocType"
,
"editable_grid"
:
0
,
"fields"
:
[
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
"bold"
:
0
,
"collapsible"
:
0
,
"columns"
:
0
,
"fieldname"
:
"column_break0"
,
"fieldtype"
:
"Column Break"
,
"hidden"
:
0
,
"ignore_user_permissions"
:
0
,
"ignore_xss_filter"
:
0
,
"in_filter"
:
0
,
"in_global_search"
:
0
,
"in_list_view"
:
0
,
"in_standard_filter"
:
0
,
"length"
:
0
,
"no_copy"
:
0
,
"permlevel"
:
0
,
"print_hide"
:
0
,
"print_hide_if_no_value"
:
0
,
"read_only"
:
0
,
"remember_last_selected_value"
:
0
,
"report_hide"
:
0
,
"reqd"
:
0
,
"search_index"
:
0
,
"set_only_once"
:
0
,
"unique"
:
0
,
"width"
:
"50%"
},
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
"bold"
:
0
,
"collapsible"
:
0
,
"columns"
:
0
,
"description"
:
"Eg. smsgateway.com/api/send_sms.cgi"
,
"fieldname"
:
"sms_gateway_url"
,
"fieldtype"
:
"Data"
,
"hidden"
:
0
,
"ignore_user_permissions"
:
0
,
"ignore_xss_filter"
:
0
,
"in_filter"
:
0
,
"in_global_search"
:
0
,
"in_list_view"
:
1
,
"in_standard_filter"
:
0
,
"label"
:
"SMS Gateway URL"
,
"length"
:
0
,
"no_copy"
:
0
,
"permlevel"
:
0
,
"print_hide"
:
0
,
"print_hide_if_no_value"
:
0
,
"read_only"
:
0
,
"remember_last_selected_value"
:
0
,
"report_hide"
:
0
,
"reqd"
:
1
,
"search_index"
:
0
,
"set_only_once"
:
0
,
"unique"
:
0
},
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
"bold"
:
0
,
"collapsible"
:
0
,
"columns"
:
0
,
"description"
:
"Enter url parameter for message"
,
"fieldname"
:
"message_parameter"
,
"fieldtype"
:
"Data"
,
"hidden"
:
0
,
"ignore_user_permissions"
:
0
,
"ignore_xss_filter"
:
0
,
"in_filter"
:
0
,
"in_global_search"
:
0
,
"in_list_view"
:
1
,
"in_standard_filter"
:
0
,
"label"
:
"Message Parameter"
,
"length"
:
0
,
"no_copy"
:
0
,
"permlevel"
:
0
,
"print_hide"
:
0
,
"print_hide_if_no_value"
:
0
,
"read_only"
:
0
,
"remember_last_selected_value"
:
0
,
"report_hide"
:
0
,
"reqd"
:
1
,
"search_index"
:
0
,
"set_only_once"
:
0
,
"unique"
:
0
},
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
"bold"
:
0
,
"collapsible"
:
0
,
"columns"
:
0
,
"description"
:
"Enter url parameter for receiver nos"
,
"fieldname"
:
"receiver_parameter"
,
"fieldtype"
:
"Data"
,
"hidden"
:
0
,
"ignore_user_permissions"
:
0
,
"ignore_xss_filter"
:
0
,
"in_filter"
:
0
,
"in_global_search"
:
0
,
"in_list_view"
:
1
,
"in_standard_filter"
:
0
,
"label"
:
"Receiver Parameter"
,
"length"
:
0
,
"no_copy"
:
0
,
"permlevel"
:
0
,
"print_hide"
:
0
,
"print_hide_if_no_value"
:
0
,
"read_only"
:
0
,
"remember_last_selected_value"
:
0
,
"report_hide"
:
0
,
"reqd"
:
1
,
"search_index"
:
0
,
"set_only_once"
:
0
,
"unique"
:
0
},
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
"bold"
:
0
,
"collapsible"
:
0
,
"columns"
:
0
,
"fieldname"
:
"sms_sender_name"
,
"fieldtype"
:
"Data"
,
"hidden"
:
0
,
"ignore_user_permissions"
:
0
,
"ignore_xss_filter"
:
0
,
"in_filter"
:
0
,
"in_global_search"
:
0
,
"in_list_view"
:
0
,
"in_standard_filter"
:
0
,
"label"
:
"SMS Sender Name"
,
"length"
:
0
,
"no_copy"
:
0
,
"permlevel"
:
0
,
"precision"
:
""
,
"print_hide"
:
0
,
"print_hide_if_no_value"
:
0
,
"read_only"
:
0
,
"remember_last_selected_value"
:
0
,
"report_hide"
:
0
,
"reqd"
:
0
,
"search_index"
:
0
,
"set_only_once"
:
0
,
"unique"
:
0
},
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
"bold"
:
0
,
"collapsible"
:
0
,
"columns"
:
0
,
"fieldname"
:
"static_parameters_section"
,
"fieldtype"
:
"Column Break"
,
"hidden"
:
0
,
"ignore_user_permissions"
:
0
,
"ignore_xss_filter"
:
0
,
"in_filter"
:
0
,
"in_global_search"
:
0
,
"in_list_view"
:
0
,
"in_standard_filter"
:
0
,
"length"
:
0
,
"no_copy"
:
0
,
"permlevel"
:
0
,
"print_hide"
:
0
,
"print_hide_if_no_value"
:
0
,
"read_only"
:
0
,
"remember_last_selected_value"
:
0
,
"report_hide"
:
0
,
"reqd"
:
0
,
"search_index"
:
0
,
"set_only_once"
:
0
,
"unique"
:
0
,
"width"
:
"50%"
},
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
"bold"
:
0
,
"collapsible"
:
0
,
"columns"
:
0
,
"description"
:
"Enter static url parameters here (Eg. sender=ERPNext, username=ERPNext, password=1234 etc.)"
,
"fieldname"
:
"parameters"
,
"fieldtype"
:
"Table"
,
"hidden"
:
0
,
"ignore_user_permissions"
:
0
,
"ignore_xss_filter"
:
0
,
"in_filter"
:
0
,
"in_global_search"
:
0
,
"in_list_view"
:
0
,
"in_standard_filter"
:
0
,
"label"
:
"Static Parameters"
,
"length"
:
0
,
"no_copy"
:
0
,
"options"
:
"SMS Parameter"
,
"permlevel"
:
0
,
"print_hide"
:
0
,
"print_hide_if_no_value"
:
0
,
"read_only"
:
0
,
"remember_last_selected_value"
:
0
,
"report_hide"
:
0
,
"reqd"
:
0
,
"search_index"
:
0
,
"set_only_once"
:
0
,
"unique"
:
0
}
],
"has_web_view"
:
0
,
"hide_heading"
:
0
,
"hide_toolbar"
:
0
,
"icon"
:
"fa fa-cog"
,
"idx"
:
1
,
"image_view"
:
0
,
"in_create"
:
0
,
"is_submittable"
:
0
,
"issingle"
:
1
,
"istable"
:
0
,
"max_attachments"
:
0
,
"modified"
:
"2017-07-22 22:52:16.066981"
,
"modified_by"
:
"chude.osiegbu@manqala.com"
,
"module"
:
"Core"
,
"name"
:
"SMS Settings"
,
"owner"
:
"Administrator"
,
"permissions"
:
[
{
"amend"
:
0
,
"apply_user_permissions"
:
0
,
"cancel"
:
0
,
"create"
:
1
,
"delete"
:
0
,
"email"
:
0
,
"export"
:
0
,
"if_owner"
:
0
,
"import"
:
0
,
"permlevel"
:
0
,
"print"
:
0
,
"read"
:
1
,
"report"
:
0
,
"role"
:
"System Manager"
,
"set_user_permissions"
:
0
,
"share"
:
1
,
"submit"
:
0
,
"write"
:
1
}
],
"quick_entry"
:
0
,
"read_only"
:
0
,
"read_only_onload"
:
0
,
"show_name_in_global_search"
:
0
,
"track_changes"
:
0
,
"track_seen"
:
0
}
\ No newline at end of file
This diff is collapsed.
Click to expand it.
frappe/core/doctype/sms_settings/sms_settings.py
0 → 100644
View file @
27c58f6a
# -*- coding: utf-8 -*-
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
from
__future__
import
unicode_literals
import
frappe
from
frappe
import
_
,
throw
,
msgprint
from
frappe.utils
import
nowdate
from
frappe.model.document
import
Document
class
SMSSettings
(
Document
):
pass
def
validate_receiver_nos
(
receiver_list
):
validated_receiver_list
=
[]
for
d
in
receiver_list
:
# remove invalid character
for
x
in
[
' '
,
'+'
,
'-'
,
'('
,
')'
]:
d
=
d
.
replace
(
x
,
''
)
validated_receiver_list
.
append
(
d
)
if
not
validated_receiver_list
:
throw
(
_
(
"Please enter valid mobile nos"
))
return
validated_receiver_list
def
get_sender_name
():
"returns name as SMS sender"
sender_name
=
frappe
.
db
.
get_single_value
(
'SMS Settings'
,
'sms_sender_name'
)
or
\
'ERPNXT'
if
len
(
sender_name
)
>
6
and
\
frappe
.
db
.
get_default
(
"country"
)
==
"India"
:
throw
(
"""As per TRAI rule, sender name must be exactly 6 characters.
Kindly change sender name in Setup --> Global Defaults.
Note: Hyphen, space, numeric digit, special characters are not allowed."""
)
return
sender_name
@
frappe
.
whitelist
()
def
get_contact_number
(
contact_name
,
ref_doctype
,
ref_name
):
"returns mobile number of the contact"
number
=
frappe
.
db
.
sql
(
"""select mobile_no, phone from tabContact
where name=%s
and exists(
select name from `tabDynamic Link` where link_doctype=%s and link_name=%s
)
"""
,
(
contact_name
,
ref_doctype
,
ref_name
))
return
number
and
(
number
[
0
][
0
]
or
number
[
0
][
1
])
or
''
@
frappe
.
whitelist
()
def
send_sms
(
receiver_list
,
msg
,
sender_name
=
''
,
success_msg
=
True
):
import
json
if
isinstance
(
receiver_list
,
basestring
):
receiver_list
=
json
.
loads
(
receiver_list
)
if
not
isinstance
(
receiver_list
,
list
):
receiver_list
=
[
receiver_list
]
receiver_list
=
validate_receiver_nos
(
receiver_list
)
arg
=
{
'receiver_list'
:
receiver_list
,
'message'
:
unicode
(
msg
).
encode
(
'utf-8'
),
'sender_name'
:
sender_name
or
get_sender_name
(),
'success_msg'
:
success_msg
}
if
frappe
.
db
.
get_value
(
'SMS Settings'
,
None
,
'sms_gateway_url'
):
send_via_gateway
(
arg
)
else
:
msgprint
(
_
(
"Please Update SMS Settings"
))
def
send_via_gateway
(
arg
):
ss
=
frappe
.
get_doc
(
'SMS Settings'
,
'SMS Settings'
)
args
=
{
ss
.
message_parameter
:
arg
.
get
(
'message'
)}
for
d
in
ss
.
get
(
"parameters"
):
args
[
d
.
parameter
]
=
d
.
value
success_list
=
[]
for
d
in
arg
.
get
(
'receiver_list'
):
args
[
ss
.
receiver_parameter
]
=
d
status
=
send_request
(
ss
.
sms_gateway_url
,
args
)
if
200
<=
status
<
300
:
success_list
.
append
(
d
)
if
len
(
success_list
)
>
0
:
args
.
update
(
arg
)
create_sms_log
(
args
,
success_list
)
if
arg
.
get
(
'success_msg'
):
frappe
.
msgprint
(
_
(
"SMS sent to following numbers: {0}"
).
format
(
"
\n
"
+
"
\n
"
.
join
(
success_list
)))
def
send_request
(
gateway_url
,
params
):
import
requests
response
=
requests
.
get
(
gateway_url
,
params
=
params
,
headers
=
{
'Accept'
:
"text/plain, text/html, */*"
})
response
.
raise_for_status
()
return
response
.
status_code
# Create SMS Log
# =========================================================
def
create_sms_log
(
args
,
sent_to
):
sl
=
frappe
.
new_doc
(
'SMS Log'
)
sl
.
sender_name
=
args
[
'sender_name'
]
sl
.
sent_on
=
nowdate
()
sl
.
message
=
args
[
'message'
].
decode
(
'utf-8'
)
sl
.
no_of_requested_sms
=
len
(
args
[
'receiver_list'
])
sl
.
requested_numbers
=
"
\n
"
.
join
(
args
[
'receiver_list'
])
sl
.
no_of_sent_sms
=
len
(
sent_to
)
sl
.
sent_to
=
"
\n
"
.
join
(
sent_to
)
sl
.
flags
.
ignore_permissions
=
True
sl
.
save
()
This diff is collapsed.
Click to expand it.
frappe/core/doctype/sms_settings/test_sms_settings.js
0 → 100644
View file @
27c58f6a
/* eslint-disable */
// rename this file from _test_[name] to test_[name] to activate
// and remove above this line
QUnit
.
test
(
"
test: SMS Settings
"
,
function
(
assert
)
{
let
done
=
assert
.
async
();
// number of asserts
assert
.
expect
(
1
);
frappe
.
run_serially
(
'
SMS Settings
'
,
[
// insert a new SMS Settings
()
=>
frappe
.
tests
.
make
([
// values to be set
{
key
:
'
value
'
}
]),
()
=>
{
assert
.
equal
(
cur_frm
.
doc
.
key
,
'
value
'
);
},
()
=>
done
()
]);
});
This diff is collapsed.
Click to expand it.
frappe/core/doctype/system_settings/system_settings.json
View file @
27c58f6a
...
...
@@ -895,6 +895,165 @@
"set_only_once"
:
0
,
"unique"
:
0
},
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
"bold"
:
0
,
"collapsible"
:
1
,
"columns"
:
0
,
"fieldname"
:
"two_factor_authentication"
,
"fieldtype"
:
"Section Break"
,
"hidden"
:
0
,
"ignore_user_permissions"
:
0
,
"ignore_xss_filter"
:
0
,
"in_filter"
:
0
,
"in_global_search"
:
0
,
"in_list_view"
:
0
,
"in_standard_filter"
:
0
,
"label"
:
"Two Factor Authentication"
,
"length"
:
0
,
"no_copy"
:
0
,
"permlevel"
:
0
,
"precision"
:
""
,
"print_hide"
:
0
,
"print_hide_if_no_value"
:
0
,
"read_only"
:
0
,
"remember_last_selected_value"
:
0
,
"report_hide"
:
0
,
"reqd"
:
0
,
"search_index"
:
0
,
"set_only_once"
:
0
,
"unique"
:
0
},
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
"bold"
:
0
,
"collapsible"
:
0
,
"columns"
:
0
,
"fieldname"
:
"enable_two_factor_auth"
,
"fieldtype"
:
"Check"
,
"hidden"
:
0
,
"ignore_user_permissions"
:
0
,
"ignore_xss_filter"
:
0
,
"in_filter"
:
0
,
"in_global_search"
:
0
,
"in_list_view"
:
0
,
"in_standard_filter"
:
0
,
"label"
:
"Enable Two Factor Auth"
,
"length"
:
0
,
"no_copy"
:
0
,
"permlevel"
:
0
,
"precision"
:
""
,
"print_hide"
:
0
,
"print_hide_if_no_value"
:
0
,
"read_only"
:
0
,
"remember_last_selected_value"
:
0
,
"report_hide"
:
0
,
"reqd"
:
0
,
"search_index"
:
0
,
"set_only_once"
:
0
,
"unique"
:
0
},
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
"bold"
:
0
,
"collapsible"
:
0
,
"columns"
:
0
,
"default"
:
"OTP App"
,
"depends_on"
:
""
,
"description"
:
"Choose authentication method to be used by all users"
,
"fieldname"
:
"two_factor_method"
,
"fieldtype"
:
"Select"
,
"hidden"
:
0
,
"ignore_user_permissions"
:
0
,
"ignore_xss_filter"
:
0
,
"in_filter"
:
0
,
"in_global_search"
:
0
,
"in_list_view"
:
0
,
"in_standard_filter"
:
0
,
"label"
:
"Two Factor Authentication method"
,
"length"
:
0
,
"no_copy"
:
0
,
"options"
:
"OTP App
\n
SMS
\n
Email"
,
"permlevel"
:
0
,
"precision"
:
""
,
"print_hide"
:
0
,
"print_hide_if_no_value"
:
0
,
"read_only"
:
0
,
"remember_last_selected_value"
:
0
,
"report_hide"
:
0
,
"reqd"
:
0
,
"search_index"
:
0
,
"set_only_once"
:
0
,
"unique"
:
0
},
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
"bold"
:
0
,
"collapsible"
:
0
,
"columns"
:
0
,
"depends_on"
:
"eval:doc.two_factor_method ==
\"
OTP App
\"
"
,
"description"
:
"Time in seconds to retain QR code image on server. Min:<strong>240</strong>"
,
"fieldname"
:
"lifespan_qrcode_image"
,
"fieldtype"
:
"Int"
,
"hidden"
:
0
,
"ignore_user_permissions"
:
0
,
"ignore_xss_filter"
:
0
,
"in_filter"
:
0
,
"in_global_search"
:
0
,
"in_list_view"
:
0
,
"in_standard_filter"
:
0
,
"label"
:
"Expiry time of QR Code Image Page"
,
"length"
:
0
,
"no_copy"
:
0
,
"permlevel"
:
0
,
"precision"
:
""
,
"print_hide"
:
0
,
"print_hide_if_no_value"
:
0
,
"read_only"
:
0
,
"remember_last_selected_value"
:
0
,
"report_hide"
:
0
,
"reqd"
:
0
,
"search_index"
:
0
,
"set_only_once"
:
0
,
"unique"
:
0
},
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
"bold"
:
0
,
"collapsible"
:
0
,
"columns"
:
0
,
"default"
:
"Frappe Framework"
,
"depends_on"
:
"enable_two_factor_auth"
,
"fieldname"
:
"otp_issuer_name"
,
"fieldtype"
:
"Data"
,
"hidden"
:
0
,
"ignore_user_permissions"
:
0
,
"ignore_xss_filter"
:
0
,
"in_filter"
:
0
,
"in_global_search"
:
0
,
"in_list_view"
:
0
,
"in_standard_filter"
:
0
,
"label"
:
"OTP Issuer Name"
,
"length"
:
0
,
"no_copy"
:
0
,
"options"
:
""
,
"permlevel"
:
0
,
"precision"
:
""
,
"print_hide"
:
0
,
"print_hide_if_no_value"
:
0
,
"read_only"
:
0
,
"remember_last_selected_value"
:
0
,
"report_hide"
:
0
,
"reqd"
:
0
,
"search_index"
:
0
,
"set_only_once"
:
0
,
"unique"
:
0
},
{
"allow_bulk_edit"
:
0
,
"allow_on_submit"
:
0
,
...
...
@@ -1027,7 +1186,7 @@
"issingle"
:
1
,
"istable"
:
0
,
"max_attachments"
:
0
,
"modified"
:
"2017-0
7-20 22:57:56.46686
7"
,
"modified"
:
"2017-0
8-07 23:29:18.85879
7"
,
"modified_by"
:
"Administrator"
,
"module"
:
"Core"
,
"name"
:
"System Settings"
,
...
...
This diff is collapsed.
Click to expand it.
frappe/core/doctype/system_settings/system_settings.py
View file @
27c58f6a
...
...
@@ -9,6 +9,7 @@ from frappe.model import no_value_fields
from
frappe.translate
import
set_default_language
from
frappe.utils
import
cint
from
frappe.utils.momentjs
import
get_all_timezones
from
frappe.twofactor
import
toggle_two_factor_auth
class
SystemSettings
(
Document
):
def
validate
(
self
):
...
...
@@ -25,6 +26,12 @@ class SystemSettings(Document):
if
len
(
parts
)
!=
2
or
not
(
cint
(
parts
[
0
])
or
cint
(
parts
[
1
])):
frappe
.
throw
(
_
(
"Session Expiry must be in format {0}"
).
format
(
"hh:mm"
))
if
self
.
enable_two_factor_auth
:
if
self
.
two_factor_method
==
'SMS'
:
if
not
frappe
.
db
.
get_value
(
'SMS Settings'
,
None
,
'sms_gateway_url'
):
frappe
.
throw
(
_
(
'Please setup SMS before setting it as an authentication method, via SMS Settings'
))
toggle_two_factor_auth
(
True
,
roles
=
[
'All'
])
def
on_update
(
self
):
for
df
in
self
.
meta
.
get
(
"fields"
):
if
df
.
fieldtype
not
in
no_value_fields
:
...
...
This diff is collapsed.
Click to expand it.
Prev
1
2
3
4
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help