diff --git a/frappe/core/doctype/user/user.js b/frappe/core/doctype/user/user.js index 9e6afe4d41..c5ccde182c 100644 --- a/frappe/core/doctype/user/user.js +++ b/frappe/core/doctype/user/user.js @@ -35,10 +35,6 @@ cur_frm.cscript.before_load = function(doc, dt, dn, callback) { } } -cur_frm.cscript.user_image = function(doc) { - refresh_field("user_image_show"); -} - cur_frm.cscript.refresh = function(doc) { if(doc.name===user && !doc.__unsaved && frappe.languages && (doc.language || frappe.boot.user.language) && doc.language !== frappe.boot.user.language) { @@ -76,7 +72,7 @@ cur_frm.cscript.refresh = function(doc) { cur_frm.cscript.enabled = function(doc) { if(!doc.__islocal && has_common(user_roles, ["Administrator", "System Manager"])) { cur_frm.toggle_display(['sb1', 'sb3', 'modules_access'], doc.enabled); - cur_frm.toggle_enable('*', doc.enabled); + // cur_frm.toggle_enable('*', doc.enabled); cur_frm.set_df_property('enabled', 'read_only', 0); } diff --git a/frappe/core/doctype/user/user.json b/frappe/core/doctype/user/user.json index 7436fa5397..c7dcf918aa 100644 --- a/frappe/core/doctype/user/user.json +++ b/frappe/core/doctype/user/user.json @@ -58,6 +58,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "depends_on": "enabled", "fieldname": "section_break_3", "fieldtype": "Section Break", "hidden": 0, @@ -285,35 +286,14 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "depends_on": "eval:!doc.__islocal || !cint(doc.send_welcome_email)", - "fieldname": "change_password", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "", - "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": "new_password", - "fieldtype": "Password", + "description": "Get your globally recognized avatar from Gravatar.com", + "fieldname": "user_image", + "fieldtype": "Attach Image", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Set New Password", + "label": "User Image", "no_copy": 1, "permlevel": 0, "print_hide": 0, @@ -327,18 +307,17 @@ { "allow_on_submit": 0, "bold": 0, - "collapsible": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "send_password_update_notification", - "fieldtype": "Check", + "collapsible": 1, + "depends_on": "enabled", + "fieldname": "short_bio", + "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Send Password Update Notification", + "label": "More Information", "no_copy": 0, "permlevel": 0, - "precision": "", "print_hide": 0, "read_only": 0, "report_hide": 0, @@ -351,36 +330,17 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "reset_password_key", - "fieldtype": "Data", - "hidden": 1, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Reset Password Key", - "no_copy": 1, - "permlevel": 0, - "print_hide": 1, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0 - }, - { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "display_settings", - "fieldtype": "Section Break", + "fieldname": "gender", + "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "Gender", "no_copy": 0, + "oldfieldname": "gender", + "oldfieldtype": "Select", + "options": "\nMale\nFemale\nOther", "permlevel": 0, "print_hide": 0, "read_only": 0, @@ -394,15 +354,16 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "description": "Get your globally recognized avatar from Gravatar.com", - "fieldname": "user_image", - "fieldtype": "Attach", + "fieldname": "birth_date", + "fieldtype": "Date", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "User Image", + "label": "Birth Date", "no_copy": 1, + "oldfieldname": "birth_date", + "oldfieldtype": "Date", "permlevel": 0, "print_hide": 0, "read_only": 0, @@ -416,13 +377,14 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "cb21", - "fieldtype": "Column Break", + "fieldname": "location", + "fieldtype": "Data", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "no_copy": 0, + "label": "Location", + "no_copy": 1, "permlevel": 0, "print_hide": 0, "read_only": 0, @@ -436,15 +398,13 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "user_image_show", - "fieldtype": "Image", + "fieldname": "column_break_22", + "fieldtype": "Column Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "user_image_show", "no_copy": 0, - "options": "user_image", "permlevel": 0, "print_hide": 0, "read_only": 0, @@ -458,16 +418,15 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "email_settings", - "fieldtype": "Section Break", + "fieldname": "bio", + "fieldtype": "Small Text", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Email Settings", - "no_copy": 0, + "label": "Bio", + "no_copy": 1, "permlevel": 0, - "precision": "", "print_hide": 0, "read_only": 0, "report_hide": 0, @@ -479,18 +438,17 @@ { "allow_on_submit": 0, "bold": 0, - "collapsible": 0, - "default": "1", - "fieldname": "thread_notify", - "fieldtype": "Check", + "collapsible": 1, + "depends_on": "eval:doc.enabled && (!doc.__islocal || !cint(doc.send_welcome_email))", + "fieldname": "change_password", + "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Send Notifications for Transactions I Follow", + "label": "Change Password", "no_copy": 0, "permlevel": 0, - "precision": "", "print_hide": 0, "read_only": 0, "report_hide": 0, @@ -503,13 +461,13 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "email_signature", - "fieldtype": "Small Text", + "fieldname": "new_password", + "fieldtype": "Password", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Email Signature", + "label": "Set New Password", "no_copy": 1, "permlevel": 0, "print_hide": 0, @@ -524,35 +482,14 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "background", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "", - "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": "background_image", - "fieldtype": "Attach", + "depends_on": "eval:!doc.__islocal", + "fieldname": "send_password_update_notification", + "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Background Image", + "label": "Send Password Update Notification", "no_copy": 0, "permlevel": 0, "precision": "", @@ -568,19 +505,17 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "background_style", - "fieldtype": "Select", - "hidden": 0, + "fieldname": "reset_password_key", + "fieldtype": "Data", + "hidden": 1, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Background Style", - "no_copy": 0, - "options": "Fill Screen\nTile", + "label": "Reset Password Key", + "no_copy": 1, "permlevel": 0, - "precision": "", - "print_hide": 0, - "read_only": 0, + "print_hide": 1, + "read_only": 1, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -590,16 +525,18 @@ { "allow_on_submit": 0, "bold": 0, - "collapsible": 0, - "fieldname": "short_bio", + "collapsible": 1, + "depends_on": "enabled", + "fieldname": "email_settings", "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "", + "label": "Email Settings", "no_copy": 0, "permlevel": 0, + "precision": "", "print_hide": 0, "read_only": 0, "report_hide": 0, @@ -612,18 +549,17 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "gender", - "fieldtype": "Select", + "default": "1", + "fieldname": "thread_notify", + "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Gender", + "label": "Send Notifications for Transactions I Follow", "no_copy": 0, - "oldfieldname": "gender", - "oldfieldtype": "Select", - "options": "\nMale\nFemale\nOther", "permlevel": 0, + "precision": "", "print_hide": 0, "read_only": 0, "report_hide": 0, @@ -636,16 +572,14 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "birth_date", - "fieldtype": "Date", + "fieldname": "email_signature", + "fieldtype": "Small Text", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Birth Date", + "label": "Email Signature", "no_copy": 1, - "oldfieldname": "birth_date", - "oldfieldtype": "Date", "permlevel": 0, "print_hide": 0, "read_only": 0, @@ -658,16 +592,18 @@ { "allow_on_submit": 0, "bold": 0, - "collapsible": 0, - "fieldname": "location", - "fieldtype": "Data", + "collapsible": 1, + "depends_on": "enabled", + "fieldname": "background", + "fieldtype": "Section Break", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Location", - "no_copy": 1, + "label": "Desktop Background", + "no_copy": 0, "permlevel": 0, + "precision": "", "print_hide": 0, "read_only": 0, "report_hide": 0, @@ -680,14 +616,16 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "column_break_22", - "fieldtype": "Column Break", + "fieldname": "background_image", + "fieldtype": "Attach", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, + "label": "Background Image", "no_copy": 0, "permlevel": 0, + "precision": "", "print_hide": 0, "read_only": 0, "report_hide": 0, @@ -700,15 +638,17 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "bio", - "fieldtype": "Small Text", + "fieldname": "background_style", + "fieldtype": "Select", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Bio", - "no_copy": 1, + "label": "Background Style", + "no_copy": 0, + "options": "Fill Screen\nTile", "permlevel": 0, + "precision": "", "print_hide": 0, "read_only": 0, "report_hide": 0, @@ -720,7 +660,8 @@ { "allow_on_submit": 0, "bold": 0, - "collapsible": 0, + "collapsible": 1, + "depends_on": "enabled", "description": "Check / Uncheck roles assigned to the User. Click on the Role to find out what permissions that Role has.", "fieldname": "sb1", "fieldtype": "Section Break", @@ -785,7 +726,7 @@ { "allow_on_submit": 0, "bold": 0, - "collapsible": 0, + "collapsible": 1, "default": "", "description": "Uncheck modules to hide from user's desktop", "fieldname": "modules_access", @@ -902,7 +843,8 @@ { "allow_on_submit": 0, "bold": 0, - "collapsible": 0, + "collapsible": 1, + "depends_on": "enabled", "fieldname": "sb3", "fieldtype": "Section Break", "hidden": 0, @@ -1082,6 +1024,28 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "last_active", + "fieldtype": "Datetime", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Last Active", + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -1108,7 +1072,8 @@ { "allow_on_submit": 0, "bold": 0, - "collapsible": 0, + "collapsible": 1, + "depends_on": "enabled", "fieldname": "third_party_authentication", "fieldtype": "Section Break", "hidden": 0, @@ -1263,7 +1228,7 @@ "issingle": 0, "istable": 0, "max_attachments": 5, - "modified": "2015-10-19 03:04:48.829054", + "modified": "2015-10-29 07:52:54.705196", "modified_by": "Administrator", "module": "Core", "name": "User", diff --git a/frappe/core/doctype/user/user.py b/frappe/core/doctype/user/user.py index 415a6c71ac..c2dda01e4e 100644 --- a/frappe/core/doctype/user/user.py +++ b/frappe/core/doctype/user/user.py @@ -437,7 +437,7 @@ def get_active_users(): return frappe.db.sql("""select count(*) from `tabUser` where enabled = 1 and user_type != 'Website User' and name not in ({}) - and hour(timediff(now(), last_login)) < 72""".format(", ".join(["%s"]*len(STANDARD_USERS))), STANDARD_USERS)[0][0] + and hour(timediff(now(), last_active)) < 72""".format(", ".join(["%s"]*len(STANDARD_USERS))), STANDARD_USERS)[0][0] def get_website_users(): """Returns total no. of website users""" @@ -448,7 +448,7 @@ def get_active_website_users(): """Returns No. of website users who logged in, in the last 3 days""" return frappe.db.sql("""select count(*) from `tabUser` where enabled = 1 and user_type = 'Website User' - and hour(timediff(now(), last_login)) < 72""")[0][0] + and hour(timediff(now(), last_active)) < 72""")[0][0] def get_permission_query_conditions(user): if user=="Administrator": diff --git a/frappe/patches.txt b/frappe/patches.txt index 40680602cd..cccb0d177c 100644 --- a/frappe/patches.txt +++ b/frappe/patches.txt @@ -99,4 +99,5 @@ execute:frappe.delete_doc("DocType", "Backup Manager") frappe.patches.v6_4.reduce_varchar_length frappe.patches.v6_4.rename_bengali_language execute:frappe.db.sql("""update `tabCommunication` set parenttype=null, parent=null, parentfield=null""") #2015-10-22 -execute:frappe.permissions.reset_perms("Web Page") \ No newline at end of file +execute:frappe.permissions.reset_perms("Web Page") +frappe.patches.v6_6.user_last_active diff --git a/frappe/patches/v6_6/__init__.py b/frappe/patches/v6_6/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/frappe/patches/v6_6/user_last_active.py b/frappe/patches/v6_6/user_last_active.py new file mode 100644 index 0000000000..fd55935174 --- /dev/null +++ b/frappe/patches/v6_6/user_last_active.py @@ -0,0 +1,6 @@ +from __future__ import unicode_literals +import frappe + +def execute(): + frappe.reload_doctype("User") + frappe.db.sql("update `tabUser` set last_active=last_login") diff --git a/frappe/sessions.py b/frappe/sessions.py index 85786cd0a2..13d07733e3 100644 --- a/frappe/sessions.py +++ b/frappe/sessions.py @@ -196,8 +196,12 @@ class Session: self.insert_session_record() # update user - frappe.db.sql("""UPDATE tabUser SET last_login = %s, last_ip = %s - where name=%s""", (frappe.utils.now(), frappe.local.request_ip, self.data['user'])) + frappe.db.sql("""UPDATE tabUser SET last_login = %(now)s, last_ip = %(ip)s, last_active = %(now)s + where name=%(name)s""", { + "now": frappe.utils.now(), + "ip": frappe.local.request_ip, + "name": self.data['user'] + }) frappe.db.commit() @@ -313,10 +317,17 @@ class Session: # database persistence is secondary, don't update it too often updated_in_db = False if force or (time_diff==None) or (time_diff > 600): + # update sessions table frappe.db.sql("""update tabSessions set sessiondata=%s, lastupdate=NOW() where sid=%s""" , (str(self.data['data']), self.data['sid'])) + # update last active in user table + frappe.db.sql("""update `tabUser` set last_active=%(now)s where name=%(name)s""", { + "now": frappe.utils.now(), + "name": frappe.session.user + }) + frappe.cache().hset("last_db_session_update", self.sid, now) updated_in_db = True