diff --git a/frappe/auth.py b/frappe/auth.py index 82d4f3d58c..277f5a8df1 100644 --- a/frappe/auth.py +++ b/frappe/auth.py @@ -158,7 +158,8 @@ class LoginManager: self.clear_active_sessions() def clear_active_sessions(self): - if not frappe.conf.get("deny_multiple_sessions"): + """Clear other sessions of the current user if `deny_multiple_sessions` is not set""" + if not (frappe.conf.get("deny_multiple_sessions") or frappe.db.get_system_setting('deny_multiple_sessions')): return if frappe.session.user != "Guest": diff --git a/frappe/core/doctype/system_settings/system_settings.json b/frappe/core/doctype/system_settings/system_settings.json index 4142edac7c..77e686128b 100644 --- a/frappe/core/doctype/system_settings/system_settings.json +++ b/frappe/core/doctype/system_settings/system_settings.json @@ -19,9 +19,11 @@ "in_filter": 0, "in_list_view": 0, "label": "", + "length": 0, "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -40,10 +42,12 @@ "in_filter": 0, "in_list_view": 1, "label": "Language", + "length": 0, "no_copy": 0, "options": "Loading...", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 1, @@ -61,10 +65,12 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, + "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -83,9 +89,11 @@ "in_filter": 0, "in_list_view": 0, "label": "Time Zone", + "length": 0, "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 1, @@ -96,17 +104,19 @@ { "allow_on_submit": 0, "bold": 0, - "collapsible": 0, + "collapsible": 1, "fieldname": "date_and_number_format", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "Date and Number Format", + "length": 0, "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -125,10 +135,12 @@ "in_filter": 0, "in_list_view": 0, "label": "Date Format", + "length": 0, "no_copy": 0, "options": "yyyy-mm-dd\ndd-mm-yyyy\ndd/mm/yyyy\ndd.mm.yyyy\nmm/dd/yyyy\nmm-dd-yyyy", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 1, @@ -146,10 +158,12 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, + "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -168,10 +182,12 @@ "in_filter": 0, "in_list_view": 0, "label": "Number Format", + "length": 0, "no_copy": 0, "options": "#,###.##\n#.###,##\n# ###.##\n# ###,##\n#'###.##\n#, ###.##\n#,##,###.##\n#,###.###\n#.###\n#,###", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 1, @@ -190,10 +206,36 @@ "in_filter": 0, "in_list_view": 0, "label": "Float Precision", + "length": 0, "no_copy": 0, "options": "\n2\n3\n4\n5\n6", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 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": 1, + "fieldname": "background_workers", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Background Workers", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -205,6 +247,54 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "description": "Run scheduled jobs only if checked", + "fieldname": "enable_scheduler", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Enable Scheduled Jobs", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 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": "scheduler_last_event", + "fieldtype": "Data", + "hidden": 1, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Scheduler Last Event", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 1, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, "fieldname": "security", "fieldtype": "Section Break", "hidden": 0, @@ -212,9 +302,11 @@ "in_filter": 0, "in_list_view": 0, "label": "Security", + "length": 0, "no_copy": 0, "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -235,10 +327,12 @@ "in_filter": 0, "in_list_view": 0, "label": "Session Expiry", + "length": 0, "no_copy": 0, "options": "", "permlevel": 0, "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -259,10 +353,12 @@ "in_filter": 0, "in_list_view": 0, "label": "Session Expiry Mobile", + "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -280,10 +376,12 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, + "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -295,41 +393,22 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "description": "Run scheduled jobs only if checked", - "fieldname": "enable_scheduler", + "description": "Note: Multiple sessions will be allowed in case of mobile device", + "fieldname": "deny_multiple_sessions", "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Enable Scheduled Jobs", - "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 - }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "scheduler_last_event", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Scheduler Last Event", + "label": "Allow only one session per user", + "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, - "report_hide": 1, + "report_hide": 0, "reqd": 0, "search_index": 0, "set_only_once": 0, @@ -347,10 +426,12 @@ "in_filter": 0, "in_list_view": 0, "label": "Ignore User Permissions If Missing", + "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -361,7 +442,7 @@ { "allow_on_submit": 0, "bold": 0, - "collapsible": 0, + "collapsible": 1, "fieldname": "email", "fieldtype": "Section Break", "hidden": 0, @@ -369,10 +450,12 @@ "in_filter": 0, "in_list_view": 0, "label": "EMail", + "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -392,10 +475,12 @@ "in_filter": 0, "in_list_view": 0, "label": "Email Footer Address", + "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -413,10 +498,12 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, + "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -435,10 +522,12 @@ "in_filter": 0, "in_list_view": 0, "label": "Disable Standard Email Footer", + "length": 0, "no_copy": 0, "permlevel": 0, "precision": "", "print_hide": 0, + "print_hide_if_no_value": 0, "read_only": 0, "report_hide": 0, "reqd": 0, @@ -450,12 +539,14 @@ "hide_heading": 0, "hide_toolbar": 0, "icon": "icon-cog", + "idx": 0, "in_create": 0, "in_dialog": 0, "is_submittable": 0, "issingle": 1, "istable": 0, - "modified": "2015-09-07 11:36:15.465900", + "max_attachments": 0, + "modified": "2016-02-15 17:13:57.326211", "modified_by": "Administrator", "module": "Core", "name": "System Settings", @@ -484,5 +575,6 @@ } ], "read_only": 0, - "read_only_onload": 0 + "read_only_onload": 0, + "sort_order": "ASC" } \ No newline at end of file diff --git a/frappe/database.py b/frappe/database.py index b4afdf0eea..47aee206f2 100644 --- a/frappe/database.py +++ b/frappe/database.py @@ -775,6 +775,11 @@ class Database: frappe.db.sql("""alter table `tab%s` add unique `%s`(%s)""" % (doctype, constraint_name, ", ".join(fields))) + def get_system_setting(self, key): + def _load_system_settings(): + return self.get_singles_dict("System Settings") + return frappe.cache().get_value("system_settings", _load_system_settings).get(key) + def close(self): """Close database connection.""" if self._conn: diff --git a/frappe/sessions.py b/frappe/sessions.py index 9c655e3172..58846a4ce0 100644 --- a/frappe/sessions.py +++ b/frappe/sessions.py @@ -17,7 +17,6 @@ import frappe.defaults import frappe.translate from frappe.utils.change_log import get_change_log import redis -import os from urllib import unquote @frappe.whitelist() @@ -48,7 +47,7 @@ def clear_cache(user=None): def clear_global_cache(): frappe.model.meta.clear_cache() frappe.cache().delete_value(["app_hooks", "installed_apps", - "app_modules", "module_app", "time_zone", "notification_config"]) + "app_modules", "module_app", "notification_config", 'system_settings']) frappe.setup_module_map() def clear_sessions(user=None, keep_current=False, device=None): diff --git a/frappe/utils/data.py b/frappe/utils/data.py index ead62d3a38..d5fc004caf 100644 --- a/frappe/utils/data.py +++ b/frappe/utils/data.py @@ -112,10 +112,7 @@ def now_datetime(): return dt.replace(tzinfo=None) def _get_time_zone(): - time_zone = (frappe.db.get_single_value("System Settings", "time_zone") - or "Asia/Kolkata") - - return time_zone + return frappe.db.get_system_setting('time_zone') or 'Asia/Kolkata' def get_time_zone(): if frappe.local.flags.in_test: