From b151b77fa69edc2995e6044b8885726242624c78 Mon Sep 17 00:00:00 2001
From: P-Froggy <60393001+P-Froggy@users.noreply.github.com>
Date: Mon, 30 Mar 2020 12:24:07 +0200
Subject: [PATCH 1/9] Fix translation, permission & UI bugs
Fix several untranslatable strings
Fix permission issue in communication when changing status
Fix functions in inbox view broken, like Tags View and Likes
Add ability to move emails to another email account
Add status = open in standard filters of communication
Add ability to sort after communication date in communication list
Add indicators for status closed and replied in inbox view
Add new role "Inbox User"
Reorder and regroup some custom buttons in communication form
Show more useful fields in email account list
---
.../doctype/communication/communication.js | 89 +++++++++++++++----
.../doctype/communication/communication.json | 10 +++
.../communication/communication_list.js | 2 +-
.../doctype/email_account/email_account.json | 9 +-
frappe/email/inbox.py | 13 +++
frappe/public/js/frappe/list/list_sidebar.js | 4 +-
.../js/frappe/views/inbox/inbox_view.js | 46 +++++++++-
frappe/translations/de.csv | 3 +-
8 files changed, 152 insertions(+), 24 deletions(-)
diff --git a/frappe/core/doctype/communication/communication.js b/frappe/core/doctype/communication/communication.js
index 1c51319790..3924fbd05b 100644
--- a/frappe/core/doctype/communication/communication.js
+++ b/frappe/core/doctype/communication/communication.js
@@ -37,13 +37,11 @@ frappe.ui.form.on("Communication", {
if(frm.doc.status==="Open") {
frm.add_custom_button(__("Close"), function() {
- frm.set_value("status", "Closed");
- frm.save();
+ frm.trigger('mark_as_closed_open');
});
} else if (frm.doc.status !== "Linked") {
frm.add_custom_button(__("Reopen"), function() {
- frm.set_value("status", "Open");
- frm.save();
+ frm.trigger('mark_as_closed_open');
});
}
@@ -61,30 +59,34 @@ frappe.ui.form.on("Communication", {
frm.add_custom_button(__("Reply All"), function() {
frm.trigger('reply_all');
- }, "Actions");
+ }, __("Actions"));
frm.add_custom_button(__("Forward"), function() {
frm.trigger('forward_mail');
- }, "Actions");
+ }, __("Actions"));
- frm.add_custom_button(__("Mark as {0}", [frm.doc.seen? "Unread": "Read"]), function() {
+ frm.add_custom_button(frm.doc.seen ? __("Mark as Unread") : __("Mark as Read"), function() {
frm.trigger('mark_as_read_unread');
- }, "Actions");
+ }, __("Actions"));
- frm.add_custom_button(__("Add Contact"), function() {
- frm.trigger('add_to_contact');
- }, "Actions");
+ frm.add_custom_button(__("Move"), function() {
+ frm.trigger('show_move_dialog');
+ }, __("Actions"));
if(frm.doc.email_status != "Spam")
frm.add_custom_button(__("Mark as Spam"), function() {
frm.trigger('mark_as_spam');
- }, "Actions");
+ }, __("Actions"));
if(frm.doc.email_status != "Trash") {
frm.add_custom_button(__("Move To Trash"), function() {
frm.trigger('move_to_trash');
- }, "Actions");
+ }, __("Actions"));
}
+
+ frm.add_custom_button(__("Contact"), function() {
+ frm.trigger('add_to_contact');
+ }, __('Create'));
}
if(frm.doc.communication_type=="Communication"
@@ -93,7 +95,7 @@ frappe.ui.form.on("Communication", {
frm.add_custom_button(__("Add Contact"), function() {
frm.trigger('add_to_contact');
- }, "Actions");
+ }, __("Actions"));
}
},
@@ -145,6 +147,44 @@ frappe.ui.form.on("Communication", {
d.show();
},
+ show_move_dialog: function(frm){
+ var lib = "frappe.email";
+ var d = new frappe.ui.Dialog ({
+ title: __("Move"),
+ fields: [{
+ "fieldtype": "Link",
+ "options": "Email Account",
+ "label": __("Email Account"),
+ "fieldname": "email_account",
+ "reqd": 1,
+ "get_query": function() {
+ return {
+ "filters": {
+ "name": ["!=", frm.doc.email_account],
+ }
+ }
+ }
+ }],
+ primary_action_label: __("Move"),
+ primary_action(values) {
+ d.hide();
+ frappe.call({
+ method: "frappe.email.inbox.move_email",
+ args: {
+ communication: frm.doc.name,
+ email_account: values.email_account
+ },
+ freeze: true,
+ callback: function(r) {
+ frappe.msgprint(__("Email has been moved to Account {0}", [values.email_account]));
+ frm.reload_doc();
+ }
+ });
+ }
+ });
+ d.show();
+ },
+
mark_as_read_unread: function(frm) {
var action = frm.doc.seen? "Unread": "Read";
var flag = "(\\SEEN)";
@@ -156,7 +196,26 @@ frappe.ui.form.on("Communication", {
'action': action,
'flag': flag
},
- freeze: true
+ freeze: true,
+ callback: function(r) {
+ frm.reload_doc();
+ }
+ });
+ },
+
+ mark_as_closed_open: function(frm) {
+ var action = frm.doc.status == "Open" ? "Close" : "Open";
+
+ return frappe.call({
+ method: "frappe.email.inbox.mark_as_closed_open",
+ args: {
+ communication: frm.doc.name,
+ action: action
+ },
+ freeze: true,
+ callback: function(r) {
+ frm.reload_doc();
+ }
});
},
diff --git a/frappe/core/doctype/communication/communication.json b/frappe/core/doctype/communication/communication.json
index 5e34804b93..7add513b01 100644
--- a/frappe/core/doctype/communication/communication.json
+++ b/frappe/core/doctype/communication/communication.json
@@ -195,6 +195,7 @@
"label": "More Information"
},
{
+ "bold": 0,
"default": "Now",
"fieldname": "communication_date",
"fieldtype": "Datetime",
@@ -421,6 +422,15 @@
"share": 1,
"write": 1
},
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "export":1,
+ "print":1,
+ "read": 1,
+ "role": "Inbox User"
+ },
{
"delete": 1,
"email": 1,
diff --git a/frappe/core/doctype/communication/communication_list.js b/frappe/core/doctype/communication/communication_list.js
index 67d4855c1f..454897b865 100644
--- a/frappe/core/doctype/communication/communication_list.js
+++ b/frappe/core/doctype/communication/communication_list.js
@@ -3,7 +3,7 @@ frappe.listview_settings['Communication'] = {
"sent_or_received","recipients", "subject",
"communication_medium", "communication_type",
"sender", "seen", "reference_doctype", "reference_name",
- "has_attachment"
+ "has_attachment", "communication_date"
],
filters: [["status", "=", "Open"]],
diff --git a/frappe/email/doctype/email_account/email_account.json b/frappe/email/doctype/email_account/email_account.json
index e724102fdf..4f25d755f3 100644
--- a/frappe/email/doctype/email_account/email_account.json
+++ b/frappe/email/doctype/email_account/email_account.json
@@ -65,6 +65,7 @@
"fieldname": "email_id",
"fieldtype": "Data",
"in_global_search": 1,
+ "in_list_view": 1,
"label": "Email Address",
"reqd": 1
},
@@ -89,14 +90,12 @@
"default": "0",
"fieldname": "awaiting_password",
"fieldtype": "Check",
- "in_list_view": 1,
"label": "Awaiting password"
},
{
"default": "0",
"fieldname": "ascii_encode_password",
"fieldtype": "Check",
- "in_list_view": 1,
"label": "Use ASCII encoding for password"
},
{
@@ -115,6 +114,8 @@
"fieldname": "domain",
"fieldtype": "Link",
"label": "Domain",
+ "in_list_view": 1,
+ "in_standard_filter": 1,
"options": "Email Domain"
},
{
@@ -423,6 +424,10 @@
"role": "System Manager",
"set_user_permissions": 1,
"write": 1
+ },
+ {
+ "read": 1,
+ "role": "Inbox User"
}
],
"sort_field": "modified",
diff --git a/frappe/email/inbox.py b/frappe/email/inbox.py
index 9d15b387e3..dfea6f7ef9 100644
--- a/frappe/email/inbox.py
+++ b/frappe/email/inbox.py
@@ -96,6 +96,19 @@ def create_email_flag_queue(names, action):
update_modified=False)
mark_as_seen_unseen(name, action)
+@frappe.whitelist()
+def mark_as_closed_open(communication, action):
+ """set status to open or close"""
+ if action == "Close":
+ frappe.db.set_value("Communication", communication, "status", "Closed")
+ else:
+ frappe.db.set_value("Communication", communication, "status", "Open")
+
+@frappe.whitelist()
+def move_email(communication, email_account):
+ """move email to another email_account"""
+ frappe.db.set_value("Communication", communication, "email_account", email_account)
+
@frappe.whitelist()
def mark_as_trash(communication):
"""set email status to trash"""
diff --git a/frappe/public/js/frappe/list/list_sidebar.js b/frappe/public/js/frappe/list/list_sidebar.js
index e3ba08a87c..8ed439bf83 100644
--- a/frappe/public/js/frappe/list/list_sidebar.js
+++ b/frappe/public/js/frappe/list/list_sidebar.js
@@ -209,11 +209,13 @@ frappe.views.ListSidebar = class ListSidebar {
accounts.forEach((account) => {
let email_account = (account.email_id == "All Accounts") ? "All Accounts" : account.email_account;
let route = ["List", "Communication", "Inbox", email_account].join('/');
+ let display_name = (account.email_id == "All Accounts" || account.email_id == "Sent Mail" || account.email_id == "Spam" || account.email_id == "Trash") ? __(account.email_id) : account.email_id
+
if (!divider) {
this.get_divider().appendTo($dropdown);
divider = true;
}
- $(`
${account.email_id}`).appendTo($dropdown);
+ $(`${display_name}`).appendTo($dropdown);
if (account.email_id === "Sent Mail")
divider = false;
});
diff --git a/frappe/public/js/frappe/views/inbox/inbox_view.js b/frappe/public/js/frappe/views/inbox/inbox_view.js
index 2b35d38683..0b40faff96 100644
--- a/frappe/public/js/frappe/views/inbox/inbox_view.js
+++ b/frappe/public/js/frappe/views/inbox/inbox_view.js
@@ -45,13 +45,46 @@ frappe.views.InboxView = class InboxView extends frappe.views.ListView {
this.filters = this.get_inbox_filters();
}
+ setup_columns() {
+ // setup columns for list view
+ this.columns = [];
+ this.columns.push({
+ type: 'Subject',
+ df: {
+ label: __('Subject'),
+ fieldname: 'subject'
+ }
+ });
+ this.columns.push({
+ type: 'Field',
+ df: {
+ label: this.is_sent_emails ? __("To") : __("From"),
+ fieldname: this.is_sent_emails ? 'recipients' : 'sender'
+ }
+ });
+ }
+
get is_sent_emails() {
const f = this.filter_area.get()
.find(filter => filter[1] === 'sent_or_received');
return f && f[3] === 'Sent';
}
+ render_header() {
+ this.$result.find('.list-row-head').remove()
+ this.$result.prepend(this.get_header_html());
+ }
+
render() {
+ this.setup_columns();
+ this.render_header();
+ this.render_list();
+ this.on_row_checked();
+ this.render_count();
+ this.render_tags();
+ }
+
+ /* render() {
this.emails = this.data;
this.render_inbox_view();
}
@@ -90,13 +123,13 @@ frappe.views.InboxView = class InboxView extends frappe.views.ListView {
-
+
${this.is_sent_emails ? email.recipients : email.sender }
`;
return this.get_list_row_html_skeleton(columns_html, this.get_meta_html(email));
- }
+ }*/
get_meta_html(email) {
const attachment = email.has_attachment ?
@@ -109,13 +142,17 @@ frappe.views.InboxView = class InboxView extends frappe.views.ListView {
` : '';
- const modified = comment_when(email.modified, true);
+ const communication_date = comment_when(email.communication_date, true);
+ const status = email.status == "Closed" ? `
`
+ : email.status == "Replied" ? `
`
+ : "";
return `
${link}
${attachment}
- ${modified}
+ ${status}
+ ${communication_date}
`;
}
@@ -146,6 +183,7 @@ frappe.views.InboxView = class InboxView extends frappe.views.ListView {
filters = default_filters.concat([
["Communication", "sent_or_received", "=", "Received", true],
+ ["Communication", "status", "=", "Open", true],
["Communication", "email_account", op, email_account, true],
["Communication", "email_status", "not in", "Spam,Trash", true],
]);
diff --git a/frappe/translations/de.csv b/frappe/translations/de.csv
index efeb68df62..e31f33114f 100644
--- a/frappe/translations/de.csv
+++ b/frappe/translations/de.csv
@@ -4003,7 +4003,6 @@ apps/frappe/frappe/handler.py,Logged Out,Abgemeldet
apps/frappe/frappe/public/js/frappe/ui/toolbar/search.js,More...,Mehr...
DocType: System Settings,User can login using Email id or Mobile number,Benutzer können sich entweder mit Email-Adresse oder Handynummer anmelden
DocType: Bulk Update,Update Value,Wert aktualisieren
-apps/frappe/frappe/core/doctype/communication/communication.js,Mark as {0},als {0} markieren
apps/frappe/frappe/model/rename_doc.py,Please select a new name to rename,Bitte wählen Sie einen neuen Namen umbenennen
apps/frappe/frappe/public/js/frappe/views/reports/report_view.js,Invalid column,Ungültige Spalte
DocType: Data Migration Connector,Data Migration,Datenmigration
@@ -4188,3 +4187,5 @@ DocType: DocField,Ignore User Permissions,Ignorieren von Benutzerberechtigungen
apps/frappe/frappe/public/js/frappe/web_form/web_form.js,Saved Successfully,Erfolgreich gespeichert
apps/frappe/frappe/core/doctype/user/user.py,Please ask your administrator to verify your sign-up,Bitte fragen Sie Ihren Administrator Ihre Anmeldung bis zum überprüfen
DocType: Domain Settings,Active Domains,Aktive Domains
+DocType: Assignment Rule,Inbox User,Posteingangsnutzer
+apps/frappe/frappe/core/doctype/communication/communication.js,Forward,Weiterleiten
\ No newline at end of file
From b95da2a670efab0a909c2e54441942eaa140967a Mon Sep 17 00:00:00 2001
From: P-Froggy <60393001+P-Froggy@users.noreply.github.com>
Date: Tue, 31 Mar 2020 19:06:24 +0200
Subject: [PATCH 2/9] Add default sort filter "communication_date"
---
.../doctype/communication/communication.js | 3 +-
.../js/frappe/views/inbox/inbox_view.js | 54 +++----------------
2 files changed, 7 insertions(+), 50 deletions(-)
diff --git a/frappe/core/doctype/communication/communication.js b/frappe/core/doctype/communication/communication.js
index 3924fbd05b..83c3b36577 100644
--- a/frappe/core/doctype/communication/communication.js
+++ b/frappe/core/doctype/communication/communication.js
@@ -176,8 +176,7 @@ frappe.ui.form.on("Communication", {
},
freeze: true,
callback: function(r) {
- frappe.msgprint(__("Email has been moved to Account {0}", [values.email_account]));
- frm.reload_doc();
+ window.history.back();
}
});
}
diff --git a/frappe/public/js/frappe/views/inbox/inbox_view.js b/frappe/public/js/frappe/views/inbox/inbox_view.js
index 0b40faff96..ca4e8a15f8 100644
--- a/frappe/public/js/frappe/views/inbox/inbox_view.js
+++ b/frappe/public/js/frappe/views/inbox/inbox_view.js
@@ -40,6 +40,11 @@ frappe.views.InboxView = class InboxView extends frappe.views.ListView {
setup_defaults() {
super.setup_defaults();
+
+ // initialize with saved order by
+ this.sort_by = this.view_user_settings.sort_by || 'communication_date';
+ this.sort_order = this.view_user_settings.sort_order || 'desc';
+
this.email_account = frappe.get_route()[3];
this.page_title = this.email_account;
this.filters = this.get_inbox_filters();
@@ -84,53 +89,6 @@ frappe.views.InboxView = class InboxView extends frappe.views.ListView {
this.render_tags();
}
- /* render() {
- this.emails = this.data;
- this.render_inbox_view();
- }
-
- render_inbox_view() {
- let html = this.emails.map(this.render_email_row.bind(this)).join("");
-
- this.$result.html(`
- ${this.get_header_html()}
- ${html}
- `);
- }
-
- get_header_html() {
- return this.get_header_html_skeleton(`
-
-
- ${__('Subject')}
-
-
- ${this.is_sent_emails ? __("To") : __("From")}
-
- `);
- }
-
- render_email_row(email) {
- if (!email.css_seen && email.seen)
- email.css_seen = "seen";
-
- const columns_html = `
-
-
- ${this.is_sent_emails ? email.recipients : email.sender }
-
- `;
-
- return this.get_list_row_html_skeleton(columns_html, this.get_meta_html(email));
- }*/
-
get_meta_html(email) {
const attachment = email.has_attachment ?
`
` : '';
@@ -145,7 +103,7 @@ frappe.views.InboxView = class InboxView extends frappe.views.ListView {
const communication_date = comment_when(email.communication_date, true);
const status = email.status == "Closed" ? `
`
: email.status == "Replied" ? `
`
- : "";
+ : "";
return `
From fe36f44b9ff746524bb06bc73530761737e0b40e Mon Sep 17 00:00:00 2001
From: P-Froggy <60393001+P-Froggy@users.noreply.github.com>
Date: Thu, 2 Apr 2020 22:00:47 +0200
Subject: [PATCH 3/9] Fix errors found by Codacy
---
frappe/core/doctype/communication/communication.js | 9 +++++----
frappe/email/inbox.py | 8 ++++----
frappe/public/js/frappe/list/list_sidebar.js | 2 +-
frappe/public/js/frappe/views/inbox/inbox_view.js | 6 +++---
4 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/frappe/core/doctype/communication/communication.js b/frappe/core/doctype/communication/communication.js
index 83c3b36577..10f88f569f 100644
--- a/frappe/core/doctype/communication/communication.js
+++ b/frappe/core/doctype/communication/communication.js
@@ -147,7 +147,7 @@ frappe.ui.form.on("Communication", {
d.show();
},
- show_move_dialog: function(frm){
+ show_move_dialog: function(frm) {
var lib = "frappe.email";
var d = new frappe.ui.Dialog ({
title: __("Move"),
@@ -161,12 +161,13 @@ frappe.ui.form.on("Communication", {
return {
"filters": {
"name": ["!=", frm.doc.email_account],
+ "enable_incoming": ["=", 1]
}
}
}
}],
- primary_action_label: __("Move"),
- primary_action(values) {
+ primary_action_label: __("Move"),
+ primary_action(values) {
d.hide();
frappe.call({
method: "frappe.email.inbox.move_email",
@@ -179,7 +180,7 @@ frappe.ui.form.on("Communication", {
window.history.back();
}
});
- }
+ }
});
d.show();
},
diff --git a/frappe/email/inbox.py b/frappe/email/inbox.py
index dfea6f7ef9..984a9a6184 100644
--- a/frappe/email/inbox.py
+++ b/frappe/email/inbox.py
@@ -98,7 +98,7 @@ def create_email_flag_queue(names, action):
@frappe.whitelist()
def mark_as_closed_open(communication, action):
- """set status to open or close"""
+ """Set status to open or close"""
if action == "Close":
frappe.db.set_value("Communication", communication, "status", "Closed")
else:
@@ -106,17 +106,17 @@ def mark_as_closed_open(communication, action):
@frappe.whitelist()
def move_email(communication, email_account):
- """move email to another email_account"""
+ """Move email to another email_account"""
frappe.db.set_value("Communication", communication, "email_account", email_account)
@frappe.whitelist()
def mark_as_trash(communication):
- """set email status to trash"""
+ """Set email status to trash"""
frappe.db.set_value("Communication", communication, "email_status", "Trash")
@frappe.whitelist()
def mark_as_spam(communication, sender):
- """ set email status to spam """
+ """Set email status to spam"""
email_rule = frappe.db.get_value("Email Rule", { "email_id": sender })
if not email_rule:
frappe.get_doc({
diff --git a/frappe/public/js/frappe/list/list_sidebar.js b/frappe/public/js/frappe/list/list_sidebar.js
index 8ed439bf83..a7d60a19c4 100644
--- a/frappe/public/js/frappe/list/list_sidebar.js
+++ b/frappe/public/js/frappe/list/list_sidebar.js
@@ -209,7 +209,7 @@ frappe.views.ListSidebar = class ListSidebar {
accounts.forEach((account) => {
let email_account = (account.email_id == "All Accounts") ? "All Accounts" : account.email_account;
let route = ["List", "Communication", "Inbox", email_account].join('/');
- let display_name = (account.email_id == "All Accounts" || account.email_id == "Sent Mail" || account.email_id == "Spam" || account.email_id == "Trash") ? __(account.email_id) : account.email_id
+ let display_name = (account.email_id == "All Accounts" || account.email_id == "Sent Mail" || account.email_id == "Spam" || account.email_id == "Trash") ? __(account.email_id) : account.email_id;
if (!divider) {
this.get_divider().appendTo($dropdown);
diff --git a/frappe/public/js/frappe/views/inbox/inbox_view.js b/frappe/public/js/frappe/views/inbox/inbox_view.js
index ca4e8a15f8..2a81dd2537 100644
--- a/frappe/public/js/frappe/views/inbox/inbox_view.js
+++ b/frappe/public/js/frappe/views/inbox/inbox_view.js
@@ -76,7 +76,7 @@ frappe.views.InboxView = class InboxView extends frappe.views.ListView {
}
render_header() {
- this.$result.find('.list-row-head').remove()
+ this.$result.find('.list-row-head').remove();
this.$result.prepend(this.get_header_html());
}
@@ -102,8 +102,8 @@ frappe.views.InboxView = class InboxView extends frappe.views.ListView {
const communication_date = comment_when(email.communication_date, true);
const status = email.status == "Closed" ? `
`
- : email.status == "Replied" ? `
`
- : "";
+ : email.status == "Replied" ? `
`
+ : "";
return `
From 6f8c5e2633f1d0208b52dc21de31d4aa9067b2fb Mon Sep 17 00:00:00 2001
From: P-Froggy <60393001+P-Froggy@users.noreply.github.com>
Date: Sun, 5 Apr 2020 14:20:55 +0200
Subject: [PATCH 4/9] Update frappe/public/js/frappe/list/list_sidebar.js
Co-Authored-By: Chinmay Pai
---
frappe/public/js/frappe/list/list_sidebar.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frappe/public/js/frappe/list/list_sidebar.js b/frappe/public/js/frappe/list/list_sidebar.js
index a7d60a19c4..0c7312d537 100644
--- a/frappe/public/js/frappe/list/list_sidebar.js
+++ b/frappe/public/js/frappe/list/list_sidebar.js
@@ -209,7 +209,7 @@ frappe.views.ListSidebar = class ListSidebar {
accounts.forEach((account) => {
let email_account = (account.email_id == "All Accounts") ? "All Accounts" : account.email_account;
let route = ["List", "Communication", "Inbox", email_account].join('/');
- let display_name = (account.email_id == "All Accounts" || account.email_id == "Sent Mail" || account.email_id == "Spam" || account.email_id == "Trash") ? __(account.email_id) : account.email_id;
+ let display_name = ["All Accounts", "Sent Mail", "Spam", "Trash"].includes(account.email_id) ? __(account.email_id) : account.email_id;
if (!divider) {
this.get_divider().appendTo($dropdown);
From 60a871e5d7afa1a215fa8042db406c110bf50500 Mon Sep 17 00:00:00 2001
From: P-Froggy <60393001+P-Froggy@users.noreply.github.com>
Date: Tue, 7 Apr 2020 02:50:22 +0200
Subject: [PATCH 5/9] Don't hide meta column of inbox view on small displays
---
frappe/email/inbox.py | 6 +++---
frappe/public/js/frappe/views/inbox/inbox_view.js | 9 +++++----
2 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/frappe/email/inbox.py b/frappe/email/inbox.py
index 984a9a6184..ce4982d6af 100644
--- a/frappe/email/inbox.py
+++ b/frappe/email/inbox.py
@@ -106,17 +106,17 @@ def mark_as_closed_open(communication, action):
@frappe.whitelist()
def move_email(communication, email_account):
- """Move email to another email_account"""
+ """Move email to another email account."""
frappe.db.set_value("Communication", communication, "email_account", email_account)
@frappe.whitelist()
def mark_as_trash(communication):
- """Set email status to trash"""
+ """Set email status to trash."""
frappe.db.set_value("Communication", communication, "email_status", "Trash")
@frappe.whitelist()
def mark_as_spam(communication, sender):
- """Set email status to spam"""
+ """Set email status to spam."""
email_rule = frappe.db.get_value("Email Rule", { "email_id": sender })
if not email_rule:
frappe.get_doc({
diff --git a/frappe/public/js/frappe/views/inbox/inbox_view.js b/frappe/public/js/frappe/views/inbox/inbox_view.js
index 2a81dd2537..bf4843a0d1 100644
--- a/frappe/public/js/frappe/views/inbox/inbox_view.js
+++ b/frappe/public/js/frappe/views/inbox/inbox_view.js
@@ -101,12 +101,13 @@ frappe.views.InboxView = class InboxView extends frappe.views.ListView {
` : '';
const communication_date = comment_when(email.communication_date, true);
- const status = email.status == "Closed" ? ``
- : email.status == "Replied" ? ``
- : "";
+ const status =
+ email.status == "Closed" ? `` :
+ email.status == "Replied" ? `` :
+ "";
return `
-
+
${link}
${attachment}
${status}
From ea798af266a97aacd968779fb34016b6d1fd3e2b Mon Sep 17 00:00:00 2001
From: "Chinmay D. Pai"
Date: Mon, 13 Apr 2020 20:55:19 +0530
Subject: [PATCH 6/9] fix: make backup files optional and ux fixes
Signed-off-by: Chinmay D. Pai
---
.../s3_backup_settings.json | 81 +++++++++++++++++--
.../s3_backup_settings/s3_backup_settings.py | 15 ++--
2 files changed, 83 insertions(+), 13 deletions(-)
diff --git a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.json b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.json
index bbdbf74a67..03ac2ebee9 100755
--- a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.json
+++ b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.json
@@ -1,18 +1,28 @@
{
+ "actions": [],
"creation": "2017-09-04 20:57:20.129205",
"doctype": "DocType",
"editable_grid": 1,
"engine": "InnoDB",
"field_order": [
"enabled",
- "notify_email",
- "send_email_for_successful_backup",
- "frequency",
+ "api_access_section",
"access_key_id",
+ "column_break_4",
"secret_access_key",
- "region",
- "endpoint_url",
+ "notification_section",
+ "notify_email",
+ "column_break_8",
+ "send_email_for_successful_backup",
+ "s3_bucket_details_section",
"bucket",
+ "endpoint_url",
+ "column_break_13",
+ "region",
+ "backup_details_section",
+ "frequency",
+ "backup_files",
+ "column_break_18",
"backup_limit"
],
"fields": [
@@ -27,6 +37,7 @@
"fieldtype": "Data",
"in_list_view": 1,
"label": "Send Notifications To",
+ "mandatory_depends_on": "enabled",
"reqd": 1
},
{
@@ -41,6 +52,7 @@
"fieldtype": "Select",
"in_list_view": 1,
"label": "Backup Frequency",
+ "mandatory_depends_on": "enabled",
"options": "Daily\nWeekly\nMonthly\nNone",
"reqd": 1
},
@@ -49,13 +61,15 @@
"fieldtype": "Data",
"in_list_view": 1,
"label": "Access Key ID",
+ "mandatory_depends_on": "enabled",
"reqd": 1
},
{
"fieldname": "secret_access_key",
"fieldtype": "Password",
"in_list_view": 1,
- "label": "Secret Access Key",
+ "label": "Access Key Secret",
+ "mandatory_depends_on": "enabled",
"reqd": 1
},
{
@@ -74,19 +88,70 @@
{
"fieldname": "bucket",
"fieldtype": "Data",
- "label": "Bucket",
+ "label": "Bucket Name",
+ "mandatory_depends_on": "enabled",
"reqd": 1
},
{
+ "description": "Set to 0 for no limit on the number of backups taken",
"fieldname": "backup_limit",
"fieldtype": "Int",
"label": "Backup Limit",
+ "mandatory_depends_on": "enabled",
"reqd": 1
+ },
+ {
+ "depends_on": "enabled",
+ "fieldname": "api_access_section",
+ "fieldtype": "Section Break",
+ "label": "API Access"
+ },
+ {
+ "fieldname": "column_break_4",
+ "fieldtype": "Column Break"
+ },
+ {
+ "depends_on": "enabled",
+ "fieldname": "notification_section",
+ "fieldtype": "Section Break",
+ "label": "Notification"
+ },
+ {
+ "fieldname": "column_break_8",
+ "fieldtype": "Column Break"
+ },
+ {
+ "depends_on": "enabled",
+ "fieldname": "s3_bucket_details_section",
+ "fieldtype": "Section Break",
+ "label": "S3 Bucket Details"
+ },
+ {
+ "fieldname": "column_break_13",
+ "fieldtype": "Column Break"
+ },
+ {
+ "depends_on": "enabled",
+ "fieldname": "backup_details_section",
+ "fieldtype": "Section Break",
+ "label": "Backup Details"
+ },
+ {
+ "default": "0",
+ "description": "Backup public and private files along with the database.",
+ "fieldname": "backup_files",
+ "fieldtype": "Check",
+ "label": "Backup Files"
+ },
+ {
+ "fieldname": "column_break_18",
+ "fieldtype": "Column Break"
}
],
"hide_toolbar": 1,
"issingle": 1,
- "modified": "2019-08-22 16:26:04.774571",
+ "links": [],
+ "modified": "2020-04-13 20:50:12.956162",
"modified_by": "Administrator",
"module": "Integrations",
"name": "S3 Backup Settings",
diff --git a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py
index 7e69da922c..95edb8ca81 100755
--- a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py
+++ b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py
@@ -114,17 +114,22 @@ def backup_to_s3():
backup = new_backup(ignore_files=False, backup_path_db=None,
backup_path_files=None, backup_path_private_files=None, force=True)
db_filename = os.path.join(get_backups_path(), os.path.basename(backup.backup_path_db))
- files_filename = os.path.join(get_backups_path(), os.path.basename(backup.backup_path_files))
- private_files = os.path.join(get_backups_path(), os.path.basename(backup.backup_path_private_files))
+ if doc.backup_files:
+ files_filename = os.path.join(get_backups_path(), os.path.basename(backup.backup_path_files))
+ private_files = os.path.join(get_backups_path(), os.path.basename(backup.backup_path_private_files))
else:
- db_filename, files_filename, private_files = get_latest_backup_file(with_files=True)
+ if doc.backup_files:
+ db_filename, files_filename, private_files = get_latest_backup_file(with_files=doc.backup_files)
+ else:
+ db_filename = get_latest_backup_file()
folder = os.path.basename(db_filename)[:15] + '/'
# for adding datetime to folder name
upload_file_to_s3(db_filename, folder, conn, bucket)
- upload_file_to_s3(private_files, folder, conn, bucket)
- upload_file_to_s3(files_filename, folder, conn, bucket)
+ if doc.backup_files:
+ upload_file_to_s3(private_files, folder, conn, bucket)
+ upload_file_to_s3(files_filename, folder, conn, bucket)
delete_old_backups(doc.backup_limit, bucket)
From f19d70b2e0c837157baa2913cd23477c56f2ec14 Mon Sep 17 00:00:00 2001
From: "Chinmay D. Pai"
Date: Mon, 13 Apr 2020 20:58:55 +0530
Subject: [PATCH 7/9] chore: set backup_files by default and use cint
Signed-off-by: Chinmay D. Pai
---
.../doctype/s3_backup_settings/s3_backup_settings.json | 4 ++--
.../doctype/s3_backup_settings/s3_backup_settings.py | 9 +++++----
2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.json b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.json
index 03ac2ebee9..830afbae53 100755
--- a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.json
+++ b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.json
@@ -137,7 +137,7 @@
"label": "Backup Details"
},
{
- "default": "0",
+ "default": "1",
"description": "Backup public and private files along with the database.",
"fieldname": "backup_files",
"fieldtype": "Check",
@@ -151,7 +151,7 @@
"hide_toolbar": 1,
"issingle": 1,
"links": [],
- "modified": "2020-04-13 20:50:12.956162",
+ "modified": "2020-04-13 20:57:24.432183",
"modified_by": "Administrator",
"module": "Integrations",
"name": "S3 Backup Settings",
diff --git a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py
index 95edb8ca81..21232992f4 100755
--- a/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py
+++ b/frappe/integrations/doctype/s3_backup_settings/s3_backup_settings.py
@@ -102,6 +102,7 @@ def backup_to_s3():
doc = frappe.get_single("S3 Backup Settings")
bucket = doc.bucket
+ backup_files = cint(doc.backup_files)
conn = boto3.client(
's3',
@@ -114,12 +115,12 @@ def backup_to_s3():
backup = new_backup(ignore_files=False, backup_path_db=None,
backup_path_files=None, backup_path_private_files=None, force=True)
db_filename = os.path.join(get_backups_path(), os.path.basename(backup.backup_path_db))
- if doc.backup_files:
+ if backup_files:
files_filename = os.path.join(get_backups_path(), os.path.basename(backup.backup_path_files))
private_files = os.path.join(get_backups_path(), os.path.basename(backup.backup_path_private_files))
else:
- if doc.backup_files:
- db_filename, files_filename, private_files = get_latest_backup_file(with_files=doc.backup_files)
+ if backup_files:
+ db_filename, files_filename, private_files = get_latest_backup_file(with_files=backup_files)
else:
db_filename = get_latest_backup_file()
@@ -127,7 +128,7 @@ def backup_to_s3():
# for adding datetime to folder name
upload_file_to_s3(db_filename, folder, conn, bucket)
- if doc.backup_files:
+ if backup_files:
upload_file_to_s3(private_files, folder, conn, bucket)
upload_file_to_s3(files_filename, folder, conn, bucket)
delete_old_backups(doc.backup_limit, bucket)
From c8558e2b9858d22ae19f8f0eba1a5697f3af54ed Mon Sep 17 00:00:00 2001
From: "Chinmay D. Pai"
Date: Sun, 19 Apr 2020 13:46:52 +0530
Subject: [PATCH 8/9] chore: simplify setting email status as open or closed
Signed-off-by: Chinmay D. Pai
---
frappe/core/doctype/communication/communication.js | 4 ++--
frappe/email/inbox.py | 9 +++------
2 files changed, 5 insertions(+), 8 deletions(-)
diff --git a/frappe/core/doctype/communication/communication.js b/frappe/core/doctype/communication/communication.js
index 10f88f569f..7bc5e0904c 100644
--- a/frappe/core/doctype/communication/communication.js
+++ b/frappe/core/doctype/communication/communication.js
@@ -204,13 +204,13 @@ frappe.ui.form.on("Communication", {
},
mark_as_closed_open: function(frm) {
- var action = frm.doc.status == "Open" ? "Close" : "Open";
+ var status = frm.doc.status == "Open" ? "Closed" : "Open";
return frappe.call({
method: "frappe.email.inbox.mark_as_closed_open",
args: {
communication: frm.doc.name,
- action: action
+ status: status
},
freeze: true,
callback: function(r) {
diff --git a/frappe/email/inbox.py b/frappe/email/inbox.py
index ce4982d6af..395a2d3e2d 100644
--- a/frappe/email/inbox.py
+++ b/frappe/email/inbox.py
@@ -97,12 +97,9 @@ def create_email_flag_queue(names, action):
mark_as_seen_unseen(name, action)
@frappe.whitelist()
-def mark_as_closed_open(communication, action):
+def mark_as_closed_open(communication, status):
"""Set status to open or close"""
- if action == "Close":
- frappe.db.set_value("Communication", communication, "status", "Closed")
- else:
- frappe.db.set_value("Communication", communication, "status", "Open")
+ frappe.db.set_value("Communication", communication, "status", status)
@frappe.whitelist()
def move_email(communication, email_account):
@@ -131,4 +128,4 @@ def link_communication_to_document(doc, reference_doctype, reference_name, ignor
doc.reference_doctype = reference_doctype
doc.reference_name = reference_name
doc.status = "Linked"
- doc.save(ignore_permissions=True)
\ No newline at end of file
+ doc.save(ignore_permissions=True)
From 080f1a1e41958ab9dc148d93c961056ca7f3edbe Mon Sep 17 00:00:00 2001
From: "Chinmay D. Pai"
Date: Sun, 19 Apr 2020 14:19:09 +0530
Subject: [PATCH 9/9] chore: fix sider issues
Signed-off-by: Chinmay D. Pai
---
frappe/core/doctype/communication/communication.js | 9 ++++-----
frappe/public/js/frappe/views/inbox/inbox_view.js | 6 +++---
2 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/frappe/core/doctype/communication/communication.js b/frappe/core/doctype/communication/communication.js
index 7bc5e0904c..cdbdf97852 100644
--- a/frappe/core/doctype/communication/communication.js
+++ b/frappe/core/doctype/communication/communication.js
@@ -148,7 +148,6 @@ frappe.ui.form.on("Communication", {
},
show_move_dialog: function(frm) {
- var lib = "frappe.email";
var d = new frappe.ui.Dialog ({
title: __("Move"),
fields: [{
@@ -163,7 +162,7 @@ frappe.ui.form.on("Communication", {
"name": ["!=", frm.doc.email_account],
"enable_incoming": ["=", 1]
}
- }
+ };
}
}],
primary_action_label: __("Move"),
@@ -176,7 +175,7 @@ frappe.ui.form.on("Communication", {
email_account: values.email_account
},
freeze: true,
- callback: function(r) {
+ callback: function() {
window.history.back();
}
});
@@ -197,7 +196,7 @@ frappe.ui.form.on("Communication", {
'flag': flag
},
freeze: true,
- callback: function(r) {
+ callback: function() {
frm.reload_doc();
}
});
@@ -213,7 +212,7 @@ frappe.ui.form.on("Communication", {
status: status
},
freeze: true,
- callback: function(r) {
+ callback: function() {
frm.reload_doc();
}
});
diff --git a/frappe/public/js/frappe/views/inbox/inbox_view.js b/frappe/public/js/frappe/views/inbox/inbox_view.js
index bf4843a0d1..f80b07751e 100644
--- a/frappe/public/js/frappe/views/inbox/inbox_view.js
+++ b/frappe/public/js/frappe/views/inbox/inbox_view.js
@@ -102,9 +102,9 @@ frappe.views.InboxView = class InboxView extends frappe.views.ListView {
const communication_date = comment_when(email.communication_date, true);
const status =
- email.status == "Closed" ? `` :
- email.status == "Replied" ? `` :
- "";
+ email.status == "Closed" ? `` :
+ email.status == "Replied" ? `` :
+ "";
return `