Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix!: allow system managers to toggle email queue (backport #17466) #17556

7 changes: 0 additions & 7 deletions frappe/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -290,13 +290,6 @@ def delete(doctype, name):
frappe.delete_doc(doctype, name, ignore_missing=False)


@frappe.whitelist(methods=["POST", "PUT"])
def set_default(key, value, parent=None):
"""set a user default value"""
frappe.db.set_default(key, value, parent or frappe.session.user)
frappe.clear_cache(user=frappe.session.user)


@frappe.whitelist(methods=["POST", "PUT"])
def bulk_update(docs):
"""Bulk update documents
Expand Down
11 changes: 10 additions & 1 deletion frappe/email/doctype/email_queue/email_queue.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from frappe import _
from frappe.email.queue import send_one
from frappe.model.document import Document
from frappe.utils import now_datetime
from frappe.utils import sbool


class EmailQueue(Document):
Expand All @@ -35,6 +35,8 @@ def get_duplicate(self, recipients):
@frappe.whitelist()
def retry_sending(name):
doc = frappe.get_doc("Email Queue", name)
doc.check_permission()

if doc and (doc.status == "Error" or doc.status == "Partially Errored"):
doc.status = "Not Sent"
for d in doc.recipients:
Expand All @@ -45,9 +47,16 @@ def retry_sending(name):

@frappe.whitelist()
def send_now(name):
frappe.has_permission("Email Queue", doc=name, throw=True)
send_one(name, now=True)


@frappe.whitelist()
def toggle_sending(enable):
frappe.only_for("System Manager")
frappe.db.set_default("suspend_email_queue", 0 if sbool(enable) else 1)


def on_doctype_update():
"""Add index in `tabCommunication` for `(reference_doctype, reference_name)`"""
frappe.db.add_index(
Expand Down
43 changes: 27 additions & 16 deletions frappe/email/doctype/email_queue/email_queue_list.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,32 @@ frappe.listview_settings['Email Queue'] = {
var colour = {'Sent': 'green', 'Sending': 'blue', 'Not Sent': 'grey', 'Error': 'red', 'Expired': 'orange'};
return [__(doc.status), colour[doc.status], "status,=," + doc.status];
},
refresh: function(doclist){
if (has_common(frappe.user_roles, ["Administrator", "System Manager"])){
if (cint(frappe.defaults.get_default("hold_queue"))){
doclist.page.clear_inner_toolbar()
doclist.page.add_inner_button(__("Resume Sending"), function() {
frappe.defaults.set_default("hold_queue", 0);
cur_list.refresh();
})
} else {
doclist.page.clear_inner_toolbar()
doclist.page.add_inner_button(__("Suspend Sending"), function() {
frappe.defaults.set_default("hold_queue", 1)
cur_list.refresh();
})
}
refresh: show_toggle_sending_button,
};

function show_toggle_sending_button(list_view) {
if (!has_common(frappe.user_roles, ["Administrator", "System Manager"]))
return;

const sending_disabled = cint(frappe.sys_defaults.suspend_email_queue);
const label = sending_disabled ? __("Resume Sending") : __("Suspend Sending");

list_view.page.add_inner_button(
label,
async () => {
await frappe.xcall(
"frappe.email.doctype.email_queue.email_queue.toggle_sending",

// enable if disabled
{ enable: sending_disabled }
);

// set new value for suspend_email_queue in sys_defaults
frappe.sys_defaults.suspend_email_queue = sending_disabled ? 0 : 1;

// clear the button and show one with the opposite label
list_view.page.remove_inner_button(label);
show_toggle_sending_button(list_view);
}
}
);
}
4 changes: 2 additions & 2 deletions frappe/email/queue.py
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ def flush(from_test=False):

for email in get_queue():

if cint(frappe.defaults.get_defaults().get("hold_queue")) == 1:
if cint(frappe.db.get_default("suspend_email_queue")) == 1:
break

if email.name:
Expand Down Expand Up @@ -487,7 +487,7 @@ def send_one(email, smtpserver=None, auto_commit=True, now=False):
frappe.msgprint(_("Emails are muted"))
return

if cint(frappe.defaults.get_defaults().get("hold_queue")) == 1:
if cint(frappe.db.get_default("suspend_email_queue")) == 1:
return

if email.status not in ("Not Sent", "Partially Sent"):
Expand Down
1 change: 1 addition & 0 deletions frappe/patches.txt
Original file line number Diff line number Diff line change
Expand Up @@ -188,3 +188,4 @@ frappe.patches.v13_0.encrypt_2fa_secrets
frappe.patches.v13_0.set_document_expiry_default
frappe.patches.v13_0.reset_corrupt_defaults
frappe.patches.v13_0.payment_gateways_deprecation_warning
frappe.patches.v13_0.set_suspend_email_queue_default
13 changes: 13 additions & 0 deletions frappe/patches/v13_0/set_suspend_email_queue_default.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import frappe
from frappe.cache_manager import clear_defaults_cache


def execute():
frappe.db.set_default(
"suspend_email_queue",
frappe.db.get_default("hold_queue", "Administrator") or 0,
parent="__default",
)

frappe.db.delete("DefaultValue", {"defkey": "hold_queue"})
clear_defaults_cache()
14 changes: 0 additions & 14 deletions frappe/public/js/frappe/defaults.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,20 +47,6 @@ frappe.defaults = {
if(!$.isArray(d)) d = [d];
return d;
},
set_default: function(key, value, callback) {
if(typeof value!=="string")
value = JSON.stringify(value);

frappe.boot.user.defaults[key] = value;
return frappe.call({
method: "frappe.client.set_default",
args: {
key: key,
value: value
},
callback: callback || function(r) {}
});
},
set_user_default_local: function(key, value) {
frappe.boot.user.defaults[key] = value;
},
Expand Down