Merge pull request #9849 from saurabh6790/scheduler_based_server_scripts

This commit is contained in:
Chinmay Pai 2020-04-17 11:09:22 +05:30 committed by GitHub
commit 6d8540fbe2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 101 additions and 7 deletions

View file

@ -13,6 +13,7 @@
"field_order": [
"stopped",
"method",
"server_script",
"frequency",
"cron_format",
"last_execution",
@ -63,6 +64,14 @@
"options": "All\nHourly\nHourly Long\nDaily\nDaily Long\nWeekly\nWeekly Long\nMonthly\nMonthly Long\nCron\nYearly\nAnnual",
"read_only": 1,
"reqd": 1
},
{
"fieldname": "server_script",
"fieldtype": "Link",
"label": "Server Script",
"options": "Server Script",
"read_only": 1,
"search_index": 1
}
],
"in_create": 1,
@ -72,7 +81,7 @@
"link_fieldname": "scheduled_job_type"
}
],
"modified": "2019-12-09 11:10:21.259929",
"modified": "2020-04-05 17:27:33.480562",
"modified_by": "Administrator",
"module": "Core",
"name": "Scheduled Job Type",

View file

@ -70,7 +70,12 @@ class ScheduledJobType(Document):
self.scheduler_log = None
try:
self.log_status('Start')
frappe.get_attr(self.method)()
if self.server_script:
script_name = frappe.db.get_value("Server Script", self.server_script)
if script_name:
frappe.get_doc('Server Script', script_name).execute_scheduled_method()
else:
frappe.get_attr(self.method)()
frappe.db.commit()
self.log_status('Complete')
except Exception:

View file

@ -2,7 +2,45 @@
// For license information, please see license.txt
frappe.ui.form.on('Server Script', {
// refresh: function(frm) {
refresh: function(frm) {
if(frm.doc.script_type === 'Scheduler Event' && !frm.doc.disabled){
frm.add_custom_button('Schedule Script', function() {
var d = new frappe.ui.Dialog({
title: "Schedule Script Execution",
fields: [
{
fieldname: "event_type",
label: __('Select Event Type'),
fieldtype: "Select",
options: "All\nHourly\nDaily\nWeekly\nMonthly\nYearly\nHourly Long\nDaily Long\nWeekly Long\nMonthly Long"
},
],
primary_action_label: __('Schedule Script'),
primary_action: () => {
d.get_primary_btn().attr('disabled', true);
var data = d.get_values();
d.hide();
if(data) {
frm.events.schedule_script(frm, data);
}
}
});
d.show();
});
}
},
schedule_script(frm, data){
frm.call({
method: "frappe.core.doctype.server_script.server_script.setup_scheduler_events",
args: {
'script_name': frm.doc.name,
'frequency': data.event_type
}
})
}
// }
});

View file

@ -22,7 +22,7 @@
"fieldtype": "Select",
"in_list_view": 1,
"label": "Script Type",
"options": "DocType Event\nAPI",
"options": "DocType Event\nScheduler Event\nAPI",
"reqd": 1
},
{
@ -75,7 +75,7 @@
}
],
"links": [],
"modified": "2019-12-17 12:55:07.389775",
"modified": "2020-04-06 11:24:38.161555",
"modified_by": "Administrator",
"module": "Core",
"name": "Server Script",

View file

@ -7,6 +7,8 @@ from __future__ import unicode_literals
import frappe
from frappe.model.document import Document
from frappe.utils.safe_exec import safe_exec
from frappe import _
class ServerScript(Document):
@staticmethod
@ -31,3 +33,39 @@ class ServerScript(Document):
# execute event
safe_exec(self.script, None, dict(doc = doc))
def execute_scheduled_method(self):
if self.script_type == 'Scheduler Event':
safe_exec(self.script)
else:
# wrong report type!
raise frappe.DoesNotExistError
@frappe.whitelist()
def setup_scheduler_events(script_name, frequency):
method = frappe.scrub(script_name) + '_' + frequency.lower()
scheduled_script = frappe.db.get_value('Scheduled Job Type',
dict(method=method))
if not scheduled_script:
doc = frappe.get_doc(dict(
doctype = 'Scheduled Job Type',
method = method,
frequency = frequency,
server_script = script_name
))
doc.insert()
frappe.msgprint(_('Enabled scheduled execution for script {0}').format(script_name))
else:
doc = frappe.get_doc('Scheduled Job Type', scheduled_script)
doc.update(dict(
doctype = 'Scheduled Job Type',
method = method,
frequency = frequency,
server_script = script_name
))
doc.save()
frappe.msgprint(_('Scheduled execution for script {0} has updated').format(script_name))

View file

@ -66,6 +66,7 @@ def get_server_script_map():
script_map.setdefault(script.reference_doctype, {}).setdefault(script.doctype_event, []).append(script.name)
else:
script_map.setdefault('_api', {})[script.api_method] = script.name
frappe.cache().set_value('server_script_map', script_map)
return script_map
return script_map

View file

@ -11,6 +11,7 @@ from frappe.website.utils import (get_shade, get_toc, get_next_link)
from frappe.modules import scrub
from frappe.www.printview import get_visible_columns
import frappe.exceptions
import frappe.integrations.utils
class ServerScriptNotEnabled(frappe.PermissionError): pass
@ -79,6 +80,8 @@ def get_safe_globals():
user=user,
csrf_token=frappe.local.session.data.csrf_token if getattr(frappe.local, "session", None) else ''
),
make_get_request = frappe.integrations.utils.make_get_request,
make_post_request = frappe.integrations.utils.make_post_request,
socketio_port=frappe.conf.socketio_port,
get_hooks=frappe.get_hooks,
),