fix!: allow system managers to toggle email queue

This commit is contained in:
Sagar Vora 2022-07-11 22:16:34 +05:30
parent 04f4fd8cfc
commit 9a7f92ca1d
7 changed files with 68 additions and 45 deletions

View file

@ -274,13 +274,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

View file

@ -27,6 +27,7 @@ from frappe.utils import (
get_hook_method,
get_string_between,
nowdate,
sbool,
split_emails,
)
@ -110,8 +111,11 @@ class EmailQueue(Document):
return self.status in ["Not Sent", "Partially Sent"]
def can_send_now(self):
hold_queue = cint(frappe.defaults.get_defaults().get("hold_queue")) == 1
if frappe.are_emails_muted() or not self.is_to_be_sent() or hold_queue:
if (
frappe.are_emails_muted()
or not self.is_to_be_sent()
or cint(frappe.db.get_default("hold_queue")) == 1
):
return False
return True
@ -359,6 +363,8 @@ class SendMailContext:
@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:
@ -371,9 +377,16 @@ def retry_sending(name):
def send_now(name):
record = EmailQueue.find(name)
if record:
record.check_permission()
record.send()
@frappe.whitelist()
def toggle_sending(enable):
frappe.only_for("System Manager")
frappe.db.set_default("hold_queue", 0 if sbool(enable) else 1)
def on_doctype_update():
"""Add index in `tabCommunication` for `(reference_doctype, reference_name)`"""
frappe.db.add_index(

View file

@ -3,27 +3,37 @@ 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();
})
}
}
},
onload: function(listview) {
refresh: show_toggle_sending_button,
onload: function(list_view) {
frappe.require("logtypes.bundle.js", () => {
frappe.utils.logtypes.show_log_retention_message(cur_list.doctype);
frappe.utils.logtypes.show_log_retention_message(list_view.doctype);
})
}
}
};
function show_toggle_sending_button(list_view) {
if (!has_common(frappe.user_roles, ["Administrator", "System Manager"]))
return;
const sending_disabled = cint(frappe.sys_defaults.hold_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 hold_queue in sys_defaults
frappe.sys_defaults.hold_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);
}
);
}

View file

@ -148,7 +148,7 @@ def flush(from_test=False):
msgprint(_("Emails are muted"))
from_test = True
if cint(frappe.defaults.get_defaults().get("hold_queue")) == 1:
if cint(frappe.db.get_default("hold_queue")) == 1:
return
for row in get_queue():

View file

@ -205,3 +205,4 @@ frappe.patches.v14_0.update_auto_account_deletion_duration
frappe.patches.v14_0.update_integration_request
frappe.patches.v14_0.set_document_expiry_default
frappe.patches.v14_0.delete_data_migration_tool
frappe.patches.v14_0.set_hold_queue_default

View file

@ -0,0 +1,20 @@
import frappe
from frappe.cache_manager import clear_defaults_cache
def execute():
frappe.db.set_default(
"hold_queue",
frappe.db.get_default("hold_queue", "Administrator") or 0,
parent="__default",
)
frappe.db.delete(
"DefaultValue",
{
"defkey": "hold_queue",
"parent": ("!=", "__default"),
},
)
clear_defaults_cache()

View file

@ -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;
},