Merge pull request #2594 from mbauskar/master

[fixes] added logout feed
This commit is contained in:
Nabin Hait 2017-01-17 15:36:37 +05:30 committed by GitHub
commit 9bbbbdfaac
5 changed files with 29 additions and 10 deletions

View file

@ -255,7 +255,7 @@ class LoginManager:
self.run_trigger('on_logout')
if user == frappe.session.user:
delete_session(frappe.session.sid)
delete_session(frappe.session.sid, user=user, reason="User Manually Logged Out")
self.clear_cookies()
else:
clear_sessions(user)

View file

@ -52,15 +52,16 @@ def clear_website_cache(context):
frappe.destroy()
@click.command('destroy-all-sessions')
@click.option('--reason')
@pass_context
def destroy_all_sessions(context):
def destroy_all_sessions(context, reason=None):
"Clear sessions of all users (logs them out)"
import frappe.sessions
for site in context.sites:
try:
frappe.init(site=site)
frappe.connect()
frappe.sessions.clear_all_sessions()
frappe.sessions.clear_all_sessions(reason)
frappe.db.commit()
finally:
frappe.destroy()

View file

@ -58,6 +58,15 @@ def login_feed(login_manager):
"full_name": get_fullname(login_manager.user)
})
def logout_feed(user, reason):
if not user:
return
add_info_comment(**{
"subject": _("{0} logged out: <b>{1}</b>").format(get_fullname(user), reason),
"full_name": get_fullname(user),
})
def get_feed_match_conditions(user=None, force=True):
if not user: user = frappe.session.user

View file

@ -59,7 +59,8 @@ class DocType(Document):
self.make_amendable()
self.validate_website()
self.update_fields_to_fetch()
if not self.is_new():
self.update_fields_to_fetch()
def check_developer_mode(self):
"""Throw exception if not developer mode or via patch"""

View file

@ -73,19 +73,27 @@ def clear_sessions(user=None, keep_current=False, device=None):
where user=%s and device=%s {condition}
order by lastupdate desc limit {limit}, 100""".format(condition=condition, limit=limit),
(user, device))):
delete_session(sid)
delete_session(sid, reason="Logged In From Another Session")
def delete_session(sid=None, user=None, reason="Session Expired"):
from frappe.core.doctype.communication.feed import logout_feed
def delete_session(sid=None, user=None):
frappe.cache().hdel("session", sid)
frappe.cache().hdel("last_db_session_update", sid)
if sid and not user:
user_details = frappe.db.sql("""select user from tabSessions where sid=%s""", sid, as_dict=True)
if user_details: user = user_details[0].get("user")
logout_feed(user, reason)
frappe.db.sql("""delete from tabSessions where sid=%s""", sid)
frappe.db.commit()
def clear_all_sessions():
def clear_all_sessions(reason=None):
"""This effectively logs out all users"""
frappe.only_for("Administrator")
if not reason: reason = "Deleted All Active Session"
for sid in frappe.db.sql_list("select sid from `tabSessions`"):
delete_session(sid)
delete_session(sid, reason=reason)
def clear_expired_sessions():
"""This function is meant to be called from scheduler"""
@ -93,7 +101,7 @@ def clear_expired_sessions():
for sid in frappe.db.sql_list("""select sid from tabSessions
where TIMEDIFF(NOW(), lastupdate) > TIME(%s)
and device = %s""", (get_expiry_period(device), device)):
delete_session(sid)
delete_session(sid, reason="Session Expired")
def get():
"""get session boot info"""
@ -310,7 +318,7 @@ class Session:
return (cint(parts[0]) * 3600) + (cint(parts[1]) * 60) + cint(parts[2])
def delete_session(self):
delete_session(self.sid)
delete_session(self.sid, reason="Session Expired")
def start_as_guest(self):
"""all guests share the same 'Guest' session"""