Merge pull request #4166 from netchampfaris/webhook-fix

[fix] webhooks cache
This commit is contained in:
Rushabh Mehta 2017-09-25 11:35:22 +05:30 committed by GitHub
commit a975ee2af8
4 changed files with 32 additions and 15 deletions

View file

@ -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)

View file

@ -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")

View file

@ -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

View file

@ -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()