Merge pull request #4166 from netchampfaris/webhook-fix
[fix] webhooks cache
This commit is contained in:
commit
a975ee2af8
4 changed files with 32 additions and 15 deletions
|
|
@ -9,24 +9,40 @@ def run_webhooks(doc, method):
|
|||
if frappe.flags.in_import or frappe.flags.in_patch or frappe.flags.in_install:
|
||||
return
|
||||
|
||||
if not getattr(frappe.local, 'webhooks_executed', None):
|
||||
frappe.local.webhooks_executed = []
|
||||
if frappe.flags.webhooks_executed is None:
|
||||
frappe.flags.webhooks_executed = {}
|
||||
|
||||
if doc.flags.webhooks == None:
|
||||
webhooks = frappe.cache().hget('webhooks', doc.doctype)
|
||||
if frappe.flags.webhooks == None:
|
||||
# load webhooks from cache
|
||||
webhooks = frappe.cache().get_value('webhooks')
|
||||
if webhooks==None:
|
||||
webhooks = frappe.get_all('Webhook',
|
||||
# query webhooks
|
||||
webhooks_list = frappe.get_all('Webhook',
|
||||
fields=["name", "webhook_docevent", "webhook_doctype"])
|
||||
frappe.cache().hset('webhooks', doc.doctype, webhooks)
|
||||
doc.flags.webhooks = webhooks
|
||||
|
||||
if not doc.flags.webhooks:
|
||||
# make webhooks map for cache
|
||||
webhooks = {}
|
||||
for w in webhooks_list:
|
||||
webhooks.setdefault(w.webhook_doctype, []).append(w)
|
||||
frappe.cache().set_value('webhooks', webhooks)
|
||||
|
||||
frappe.flags.webhooks = webhooks
|
||||
|
||||
# get webhooks for this doctype
|
||||
webhooks_for_doc = frappe.flags.webhooks.get(doc.doctype, None)
|
||||
|
||||
if not webhooks_for_doc:
|
||||
# no webhooks, quit
|
||||
return
|
||||
|
||||
def _webhook_request(webhook):
|
||||
if not webhook.name in frappe.local.webhooks_executed:
|
||||
if not webhook.name in frappe.flags.webhooks_executed.get(doc.name, []):
|
||||
frappe.enqueue("frappe.integrations.doctype.webhook.webhook.enqueue_webhook", doc=doc, webhook=webhook)
|
||||
frappe.local.webhooks_executed.append(webhook.name)
|
||||
|
||||
# keep list of webhooks executed for this doc in this request
|
||||
# so that we don't run the same webhook for the same document multiple times
|
||||
# in one request
|
||||
frappe.flags.webhooks_executed.setdefault(doc.name, []).append(webhook.name)
|
||||
|
||||
event_list = ["on_update", "after_insert", "on_submit", "on_cancel", "on_trash"]
|
||||
|
||||
|
|
@ -35,7 +51,7 @@ def run_webhooks(doc, method):
|
|||
event_list.append('on_change')
|
||||
event_list.append('before_update_after_submit')
|
||||
|
||||
for webhook in doc.flags.webhooks:
|
||||
for webhook in webhooks_for_doc:
|
||||
event = method if method in event_list else None
|
||||
if event and webhook.webhook_docevent == event and webhook.webhook_doctype == doc.doctype:
|
||||
if event and webhook.webhook_docevent == event:
|
||||
_webhook_request(webhook)
|
||||
|
|
|
|||
|
|
@ -19,6 +19,9 @@ class Webhook(Document):
|
|||
self.validate_request_url()
|
||||
self.validate_repeating_fields()
|
||||
|
||||
def on_update(self):
|
||||
frappe.cache().delete_value('webhooks')
|
||||
|
||||
def validate_docevent(self):
|
||||
if self.webhook_doctype:
|
||||
is_submittable = frappe.get_value("DocType", self.webhook_doctype, "is_submittable")
|
||||
|
|
|
|||
|
|
@ -170,7 +170,6 @@ class Document(BaseDocument):
|
|||
return
|
||||
|
||||
self.flags.email_alerts_executed = []
|
||||
setattr(frappe.local, 'webhooks_executed', [])
|
||||
|
||||
if ignore_permissions!=None:
|
||||
self.flags.ignore_permissions = ignore_permissions
|
||||
|
|
@ -244,7 +243,6 @@ class Document(BaseDocument):
|
|||
return
|
||||
|
||||
self.flags.email_alerts_executed = []
|
||||
setattr(frappe.local, 'webhooks_executed', [])
|
||||
|
||||
if ignore_permissions!=None:
|
||||
self.flags.ignore_permissions = ignore_permissions
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ def clear_global_cache():
|
|||
frappe.model.meta.clear_cache()
|
||||
frappe.cache().delete_value(["app_hooks", "installed_apps",
|
||||
"app_modules", "module_app", "notification_config", 'system_settings'
|
||||
'scheduler_events', 'time_zone'])
|
||||
'scheduler_events', 'time_zone', 'webhooks'])
|
||||
frappe.setup_module_map()
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue