From 853b98d3c3fb41e32355618ff21fa659c8c6b5a5 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 13 Jan 2017 18:03:52 +0530 Subject: [PATCH 1/5] [Fix] Add attached documents in the attachments folder --- frappe/core/doctype/communication/email.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/frappe/core/doctype/communication/email.py b/frappe/core/doctype/communication/email.py index 7f713284c0..e03a190770 100755 --- a/frappe/core/doctype/communication/email.py +++ b/frappe/core/doctype/communication/email.py @@ -336,12 +336,13 @@ def add_attachments(name, attachments): # loop through attachments for a in attachments: - attach = frappe.db.get_value("File", {"name":a}, - ["file_name", "file_url", "is_private"], as_dict=1) + if isinstance(a, basestring): + attach = frappe.db.get_value("File", {"name":a}, + ["file_name", "file_url", "is_private"], as_dict=1) - # save attachments to new doc - save_url(attach.file_url, attach.file_name, "Communication", name, - "Home/Attachments", attach.is_private) + # save attachments to new doc + save_url(attach.file_url, attach.file_name, "Communication", name, + "Home/Attachments", attach.is_private) def filter_email_list(doc, email_list, exclude, is_cc=False): # temp variables From c4c7d507a850622ff30681f4542effe181684651 Mon Sep 17 00:00:00 2001 From: mbauskar Date: Mon, 16 Jan 2017 15:26:09 +0530 Subject: [PATCH 2/5] [minor] logout feed for activity logs --- frappe/auth.py | 2 +- frappe/commands/utils.py | 5 +++-- frappe/core/doctype/communication/feed.py | 9 +++++++++ frappe/sessions.py | 20 ++++++++++++++------ 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/frappe/auth.py b/frappe/auth.py index fcaa9da0da..44f7cab6e4 100644 --- a/frappe/auth.py +++ b/frappe/auth.py @@ -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 Logged Out") self.clear_cookies() else: clear_sessions(user) diff --git a/frappe/commands/utils.py b/frappe/commands/utils.py index 7c74e41834..67fef989ad 100644 --- a/frappe/commands/utils.py +++ b/frappe/commands/utils.py @@ -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() diff --git a/frappe/core/doctype/communication/feed.py b/frappe/core/doctype/communication/feed.py index b9054f7218..b49bd1163e 100644 --- a/frappe/core/doctype/communication/feed.py +++ b/frappe/core/doctype/communication/feed.py @@ -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: {1}").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 diff --git a/frappe/sessions.py b/frappe/sessions.py index 2a16489ab4..898ced3e0c 100644 --- a/frappe/sessions.py +++ b/frappe/sessions.py @@ -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""" From 8ce126fe66c617b8a94ed44994f3bdb26273db4e Mon Sep 17 00:00:00 2001 From: mbauskar Date: Mon, 16 Jan 2017 18:52:36 +0530 Subject: [PATCH 3/5] [minor] checked if doc is new before update_fields_to_fetch --- frappe/core/doctype/doctype/doctype.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frappe/core/doctype/doctype/doctype.py b/frappe/core/doctype/doctype/doctype.py index 66fedc53aa..fc2bb91c57 100644 --- a/frappe/core/doctype/doctype/doctype.py +++ b/frappe/core/doctype/doctype/doctype.py @@ -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""" From 7b8dda7745e3f512ac8926cd0c196c8c41bb906c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 17 Jan 2017 15:36:07 +0530 Subject: [PATCH 4/5] Update auth.py --- frappe/auth.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/auth.py b/frappe/auth.py index 44f7cab6e4..24c442980a 100644 --- a/frappe/auth.py +++ b/frappe/auth.py @@ -255,7 +255,7 @@ class LoginManager: self.run_trigger('on_logout') if user == frappe.session.user: - delete_session(frappe.session.sid, user=user, reason="User Logged Out") + delete_session(frappe.session.sid, user=user, reason="User Manually Logged Out") self.clear_cookies() else: clear_sessions(user) From 575a6ed478a27396cd20b94266180a2b9c93e08d Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 17 Jan 2017 16:12:50 +0600 Subject: [PATCH 5/5] bumped to version 7.2.11 --- frappe/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/__init__.py b/frappe/__init__.py index e10cdedfa4..b033a14351 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -13,7 +13,7 @@ import os, sys, importlib, inspect, json from .exceptions import * from .utils.jinja import get_jenv, get_template, render_template -__version__ = '7.2.10' +__version__ = '7.2.11' __title__ = "Frappe Framework" local = Local()