diff --git a/erpnext/docs/assets/img/articles/twofactor/twofactor-1.png b/erpnext/docs/assets/img/articles/twofactor/twofactor-1.png new file mode 100644 index 0000000000..6dd17f0e57 Binary files /dev/null and b/erpnext/docs/assets/img/articles/twofactor/twofactor-1.png differ diff --git a/erpnext/docs/assets/img/articles/twofactor/twofactor-2.png b/erpnext/docs/assets/img/articles/twofactor/twofactor-2.png new file mode 100644 index 0000000000..c8842139fe Binary files /dev/null and b/erpnext/docs/assets/img/articles/twofactor/twofactor-2.png differ diff --git a/erpnext/docs/assets/img/articles/twofactor/twofactor-3.png b/erpnext/docs/assets/img/articles/twofactor/twofactor-3.png new file mode 100644 index 0000000000..56eee8cfe7 Binary files /dev/null and b/erpnext/docs/assets/img/articles/twofactor/twofactor-3.png differ diff --git a/erpnext/docs/assets/img/articles/twofactor/twofactor-4.png b/erpnext/docs/assets/img/articles/twofactor/twofactor-4.png new file mode 100644 index 0000000000..6d8ecabcbf Binary files /dev/null and b/erpnext/docs/assets/img/articles/twofactor/twofactor-4.png differ diff --git a/erpnext/docs/assets/img/articles/twofactor/twofactor-5.png b/erpnext/docs/assets/img/articles/twofactor/twofactor-5.png new file mode 100644 index 0000000000..1c39e948ce Binary files /dev/null and b/erpnext/docs/assets/img/articles/twofactor/twofactor-5.png differ diff --git a/erpnext/docs/assets/img/articles/twofactor/twofactor-6.png b/erpnext/docs/assets/img/articles/twofactor/twofactor-6.png new file mode 100644 index 0000000000..d62ba532d2 Binary files /dev/null and b/erpnext/docs/assets/img/articles/twofactor/twofactor-6.png differ diff --git a/erpnext/docs/assets/img/articles/twofactor/twofactor-8.png b/erpnext/docs/assets/img/articles/twofactor/twofactor-8.png new file mode 100644 index 0000000000..84cf5fa570 Binary files /dev/null and b/erpnext/docs/assets/img/articles/twofactor/twofactor-8.png differ diff --git a/erpnext/docs/assets/img/articles/twofactor/twofactor_app.jpeg b/erpnext/docs/assets/img/articles/twofactor/twofactor_app.jpeg new file mode 100644 index 0000000000..ae5e93089a Binary files /dev/null and b/erpnext/docs/assets/img/articles/twofactor/twofactor_app.jpeg differ diff --git a/erpnext/docs/assets/img/setup-wizard/twofactor.png b/erpnext/docs/assets/img/setup-wizard/twofactor.png new file mode 100644 index 0000000000..ada4f5b981 Binary files /dev/null and b/erpnext/docs/assets/img/setup-wizard/twofactor.png differ diff --git a/erpnext/docs/assets/img/setup/settings/twofactor-settings.png b/erpnext/docs/assets/img/setup/settings/twofactor-settings.png new file mode 100644 index 0000000000..c56f304a07 Binary files /dev/null and b/erpnext/docs/assets/img/setup/settings/twofactor-settings.png differ diff --git a/erpnext/docs/user/manual/en/setting-up/articles/index.txt b/erpnext/docs/user/manual/en/setting-up/articles/index.txt index e6a3b85a9a..eb4d119cb7 100644 --- a/erpnext/docs/user/manual/en/setting-up/articles/index.txt +++ b/erpnext/docs/user/manual/en/setting-up/articles/index.txt @@ -9,4 +9,5 @@ managing-tree-structure-masters naming-series-current-value overwriting-data-from-data-import-tool rename-user -using-custom-domain-on-erpnext \ No newline at end of file +using-custom-domain-on-erpnext +setup-two-factor-authentication \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/setting-up/articles/setup-two-factor-authentication.md b/erpnext/docs/user/manual/en/setting-up/articles/setup-two-factor-authentication.md new file mode 100644 index 0000000000..cdb4e3409f --- /dev/null +++ b/erpnext/docs/user/manual/en/setting-up/articles/setup-two-factor-authentication.md @@ -0,0 +1,41 @@ +#Setup Two Factor Authentication + +##Enable Two Factor Authentication (2FA) + +Activate two factor authentication by running the command. + +`bench --site [sitename] enable_two_factor_auth true` + +Specify the following in System Settings + +* The method of OTP validation (OTP App = TOTP using Soft or Hard Token while Email/SMS = HOTP using Email or SMS +* The expiry time for the QR Code on the server if OTP App is specified +* The OTP Issuer Name. + +Enable Two Factor Auth + + +On activation of 2FA from setup, it is also activated for the Role "All". In this way, all users including the Administrator have to perform a 2nd level authentication with a token. By unchecking the "Two Factor Authentication" checkbox in the "All" role and enabling it in other roles, the need to login with a token can be limited to specific roles. 2FA does not apply to login by Web Users and API login + +Role Enable Two Factor Auth + +If using SMS authentication, please make sure that your SMS settings are updated + +SMS Settings + +If using Email, make sure that your outgoing Email account settings are updated + +Email Settings + +When the new user tries to log in for the first time in a system that has two-factor authentication enabled and which has the authentication option as OTP App, an email is sent containing a link to the QR Code. + +Email Notify Two Factor +QR Code Page + +Scanning the QR Code with an authentication app like Google Authenticator registers the access for the user and automatically starts to generate tokens that can be used to login + +Two Factor Scan App + +If either of Email/SMS is used as the authentication method, you get notifications also + +Email and SMS \ No newline at end of file diff --git a/erpnext/docs/user/manual/en/setting-up/settings/system-settings.md b/erpnext/docs/user/manual/en/setting-up/settings/system-settings.md index 43f47f1301..e3f745306a 100644 --- a/erpnext/docs/user/manual/en/setting-up/settings/system-settings.md +++ b/erpnext/docs/user/manual/en/setting-up/settings/system-settings.md @@ -10,4 +10,14 @@ To open System Settings, go to: System Settings +####Two Factor Authentication. +Settings for Two Factor Authentication can be configured here. + +* Select the authentication method to be used +* Expiry time for QRCode image if "OTP App" is selected in method +* Issuer name of the One Time Password + +Two Factor Auth + + {next} diff --git a/erpnext/docs/user/manual/en/setting-up/setup-wizard/index.txt b/erpnext/docs/user/manual/en/setting-up/setup-wizard/index.txt index 74f6a42fdf..dad277ae67 100644 --- a/erpnext/docs/user/manual/en/setting-up/setup-wizard/index.txt +++ b/erpnext/docs/user/manual/en/setting-up/setup-wizard/index.txt @@ -1,10 +1,11 @@ step-1-language step-2-currency-and-timezone step-3-user-details -step-4-company-details -step-5-letterhead-and-logo -step-6-add-users -step-7-tax-details -step-8-customer-names -step-9-suppliers -step-10-item +step-4-two-factor-authentication +step-5-company-details +step-6-letterhead-and-logo +step-7-add-users +step-8-tax-details +step-9-customer-names +step-10-suppliers +step-11-item diff --git a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-9-suppliers.md b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-10-suppliers.md similarity index 92% rename from erpnext/docs/user/manual/en/setting-up/setup-wizard/step-9-suppliers.md rename to erpnext/docs/user/manual/en/setting-up/setup-wizard/step-10-suppliers.md index 46bcfba746..364b4d6982 100644 --- a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-9-suppliers.md +++ b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-10-suppliers.md @@ -1,4 +1,4 @@ -# Step 8: Suppliers +# Step 10: Suppliers Enter a few of your Suppliers' names. diff --git a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-10-item.md b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-11-item.md similarity index 94% rename from erpnext/docs/user/manual/en/setting-up/setup-wizard/step-10-item.md rename to erpnext/docs/user/manual/en/setting-up/setup-wizard/step-11-item.md index 837c3335c4..42d7e3d26d 100644 --- a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-10-item.md +++ b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-11-item.md @@ -1,4 +1,4 @@ -# Step 9: Item Names +# Step 11: Item Names In this final step, please enter the names of the Items you buy or sell. diff --git a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-3-user-details.md b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-3-user-details.md index 5d6002aef0..228b9721cb 100644 --- a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-3-user-details.md +++ b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-3-user-details.md @@ -2,8 +2,7 @@ Enter Users Profile Details like Name, User ID and preferred password. -User +User --- diff --git a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-4-two-factor-authentication.md b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-4-two-factor-authentication.md new file mode 100644 index 0000000000..66bbd071a9 --- /dev/null +++ b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-4-two-factor-authentication.md @@ -0,0 +1,13 @@ +# Step 4: Two Factor Authentication + +Enable Two Factor Athentication + +TwoFactor + +--- +###Authentication Method +Whenevever each user logs in, based on the role set for that user, +they will be asked for a **One Time Password** after they input +their login details. + +{next} diff --git a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-4-company-details.md b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-5-company-details.md similarity index 85% rename from erpnext/docs/user/manual/en/setting-up/setup-wizard/step-4-company-details.md rename to erpnext/docs/user/manual/en/setting-up/setup-wizard/step-5-company-details.md index 2558f16cab..13a87e91c3 100644 --- a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-4-company-details.md +++ b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-5-company-details.md @@ -1,9 +1,8 @@ -# Step 4: Company Details +# Step 5: Company Details Enter Company Details like Name, Abbreviation and Financial Year Details. -Company Details +Company Details --- diff --git a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-6-add-users.md b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-6-add-users.md deleted file mode 100644 index 0a0cd00f47..0000000000 --- a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-6-add-users.md +++ /dev/null @@ -1,8 +0,0 @@ -# Step 6: Add Users - -Add other users and assign them roles based on their job responsibilities. - -Users - -{next} diff --git a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-5-letterhead-and-logo.md b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-6-letterhead-and-logo.md similarity index 84% rename from erpnext/docs/user/manual/en/setting-up/setup-wizard/step-5-letterhead-and-logo.md rename to erpnext/docs/user/manual/en/setting-up/setup-wizard/step-6-letterhead-and-logo.md index 9f4564264c..0286a3ee23 100644 --- a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-5-letterhead-and-logo.md +++ b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-6-letterhead-and-logo.md @@ -1,9 +1,8 @@ -# Step 5: Letterhead and Logo +# Step 6: Letterhead and Logo Attach Company Letterhead and Company Logo. -Company Logo and Letterhead +Company Logo and Letterhead --- diff --git a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-7-add-users.md b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-7-add-users.md new file mode 100644 index 0000000000..c92721c91b --- /dev/null +++ b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-7-add-users.md @@ -0,0 +1,7 @@ +# Step 7: Add Users + +Add other users and assign them roles based on their job responsibilities. + +Users + +{next} diff --git a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-7-tax-details.md b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-8-tax-details.md similarity index 91% rename from erpnext/docs/user/manual/en/setting-up/setup-wizard/step-7-tax-details.md rename to erpnext/docs/user/manual/en/setting-up/setup-wizard/step-8-tax-details.md index 3b42ebe917..dae88e4432 100644 --- a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-7-tax-details.md +++ b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-8-tax-details.md @@ -1,9 +1,8 @@ -# Step 6: Tax Details +# Step 8: Tax Details Enter any three types of taxes which you regularly pay. This wizard will create a tax master which will calculate the taxes as per the tax-type. -Tax Details +Tax Details Just set the tax name and the standard percentage levied. diff --git a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-8-customer-names.md b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-9-customer-names.md similarity index 84% rename from erpnext/docs/user/manual/en/setting-up/setup-wizard/step-8-customer-names.md rename to erpnext/docs/user/manual/en/setting-up/setup-wizard/step-9-customer-names.md index 2b6ae0cbbe..e3489433fc 100644 --- a/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-8-customer-names.md +++ b/erpnext/docs/user/manual/en/setting-up/setup-wizard/step-9-customer-names.md @@ -1,10 +1,9 @@ -# Step 7: Customers +# Step 9: Customers Enter your Customer names and the contact person from that organisation. -Customers +Customers --- diff --git a/erpnext/patches/v8_6/point_sms_doctype_module_to_frappe_core.py b/erpnext/patches/v8_6/point_sms_doctype_module_to_frappe_core.py new file mode 100644 index 0000000000..014a74abe3 --- /dev/null +++ b/erpnext/patches/v8_6/point_sms_doctype_module_to_frappe_core.py @@ -0,0 +1,9 @@ +# Copyright (c) 2017, Frappe and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe + +def execute(): + frappe.db.sql('''UPDATE `tabDocType` SET module="Core" + WHERE name IN ("SMS Parameter", "SMS Settings");''') \ No newline at end of file diff --git a/erpnext/public/js/sms_manager.js b/erpnext/public/js/sms_manager.js index 13e226fbb0..6ce8bb1150 100644 --- a/erpnext/public/js/sms_manager.js +++ b/erpnext/public/js/sms_manager.js @@ -35,7 +35,7 @@ erpnext.SMSManager = function SMSManager(doc) { this.get_contact_number = function(contact, ref_doctype, ref_name) { frappe.call({ - method: "erpnext.setup.doctype.sms_settings.sms_settings.get_contact_number", + method: "frappe.core.doctype.sms_settings.sms_settings.get_contact_number", args: { contact_name: contact, ref_doctype: ref_doctype, @@ -85,7 +85,7 @@ erpnext.SMSManager = function SMSManager(doc) { if(v) { $(btn).set_working(); frappe.call({ - method: "erpnext.setup.doctype.sms_settings.sms_settings.send_sms", + method: "frappe.core.doctype.sms_settings.sms_settings.send_sms", args: { receiver_list: [v.number], msg: v.message diff --git a/erpnext/selling/doctype/sms_center/sms_center.py b/erpnext/selling/doctype/sms_center/sms_center.py index ea6832bafb..f3674ae373 100644 --- a/erpnext/selling/doctype/sms_center/sms_center.py +++ b/erpnext/selling/doctype/sms_center/sms_center.py @@ -9,7 +9,7 @@ from frappe import msgprint, _ from frappe.model.document import Document -from erpnext.setup.doctype.sms_settings.sms_settings import send_sms +from frappe.core.doctype.sms_settings.sms_settings import send_sms class SMSCenter(Document): def create_receiver_list(self): diff --git a/erpnext/setup/doctype/sms_parameter/README.md b/erpnext/setup/doctype/sms_parameter/README.md deleted file mode 100644 index 5935a390d2..0000000000 --- a/erpnext/setup/doctype/sms_parameter/README.md +++ /dev/null @@ -1 +0,0 @@ -SMS query parameter for SMS Settings. \ No newline at end of file diff --git a/erpnext/setup/doctype/sms_parameter/__init__.py b/erpnext/setup/doctype/sms_parameter/__init__.py deleted file mode 100755 index baffc48825..0000000000 --- a/erpnext/setup/doctype/sms_parameter/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/setup/doctype/sms_parameter/sms_parameter.json b/erpnext/setup/doctype/sms_parameter/sms_parameter.json deleted file mode 100755 index afcabfaaae..0000000000 --- a/erpnext/setup/doctype/sms_parameter/sms_parameter.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "allow_copy": 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_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "parameter", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "Parameter", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "150px", - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0, - "width": "150px" - }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "value", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "Value", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "print_width": "150px", - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0, - "width": "150px" - } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 1, - "image_view": 0, - "in_create": 0, - "in_dialog": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 1, - "max_attachments": 0, - "modified": "2016-07-11 03:28:08.624783", - "modified_by": "Administrator", - "module": "Setup", - "name": "SMS Parameter", - "owner": "Administrator", - "permissions": [], - "quick_entry": 0, - "read_only": 0, - "read_only_onload": 0, - "track_seen": 0 -} \ No newline at end of file diff --git a/erpnext/setup/doctype/sms_parameter/sms_parameter.py b/erpnext/setup/doctype/sms_parameter/sms_parameter.py deleted file mode 100644 index 08b220b61a..0000000000 --- a/erpnext/setup/doctype/sms_parameter/sms_parameter.py +++ /dev/null @@ -1,10 +0,0 @@ -# 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 diff --git a/erpnext/setup/doctype/sms_settings/README.md b/erpnext/setup/doctype/sms_settings/README.md deleted file mode 100644 index 4fb49803b3..0000000000 --- a/erpnext/setup/doctype/sms_settings/README.md +++ /dev/null @@ -1 +0,0 @@ -Settings for automatically sending SMS from the system. \ No newline at end of file diff --git a/erpnext/setup/doctype/sms_settings/__init__.py b/erpnext/setup/doctype/sms_settings/__init__.py deleted file mode 100755 index baffc48825..0000000000 --- a/erpnext/setup/doctype/sms_settings/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from __future__ import unicode_literals diff --git a/erpnext/setup/doctype/sms_settings/sms_settings.js b/erpnext/setup/doctype/sms_settings/sms_settings.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/erpnext/setup/doctype/sms_settings/sms_settings.json b/erpnext/setup/doctype/sms_settings/sms_settings.json deleted file mode 100755 index 23d6fa23d5..0000000000 --- a/erpnext/setup/doctype/sms_settings/sms_settings.json +++ /dev/null @@ -1,202 +0,0 @@ -{ - "allow_copy": 1, - "allow_import": 0, - "allow_rename": 0, - "creation": "2013-01-10 16:34:24", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "fields": [ - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break0", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, - "width": "50%" - }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "description": "Eg. smsgateway.com/api/send_sms.cgi", - "fieldname": "sms_gateway_url", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "SMS Gateway URL", - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "description": "Enter url parameter for message", - "fieldname": "message_parameter", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "Message Parameter", - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "description": "Enter url parameter for receiver nos", - "fieldname": "receiver_parameter", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "Receiver Parameter", - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "sms_sender_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "SMS Sender Name", - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "static_parameters_section", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, - "width": "50%" - }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 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, - "in_filter": 0, - "in_list_view": 0, - "label": "Static Parameters", - "no_copy": 0, - "options": "SMS Parameter", - "permlevel": 0, - "print_hide": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-cog", - "idx": 1, - "in_create": 0, - "in_dialog": 0, - "is_submittable": 0, - "issingle": 1, - "istable": 0, - "modified": "2015-03-02 02:24:19.692599", - "modified_by": "Administrator", - "module": "Setup", - "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 - } - ], - "read_only": 0, - "read_only_onload": 0 -} \ No newline at end of file diff --git a/erpnext/setup/doctype/sms_settings/sms_settings.py b/erpnext/setup/doctype/sms_settings/sms_settings.py deleted file mode 100644 index a8b59beffa..0000000000 --- a/erpnext/setup/doctype/sms_settings/sms_settings.py +++ /dev/null @@ -1,117 +0,0 @@ -# -*- 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()