From 65e18e057f4bc52c0fbc35feb765cdb2a674514e Mon Sep 17 00:00:00 2001 From: John Anderson Date: Wed, 27 Jun 2018 22:17:17 -0400 Subject: [PATCH] fixed #2203 --- netbox/extras/apps.py | 2 -- netbox/extras/signals.py | 16 ------------- netbox/extras/webhooks.py | 49 +++++++++++---------------------------- netbox/netbox/settings.py | 8 ------- 4 files changed, 14 insertions(+), 61 deletions(-) delete mode 100644 netbox/extras/signals.py diff --git a/netbox/extras/apps.py b/netbox/extras/apps.py index 1cac98a23..4520b1923 100644 --- a/netbox/extras/apps.py +++ b/netbox/extras/apps.py @@ -9,8 +9,6 @@ class ExtrasConfig(AppConfig): name = "extras" def ready(self): - import extras.signals - # Check that we can connect to the configured Redis database if webhooks are enabled. if settings.WEBHOOKS_ENABLED: try: diff --git a/netbox/extras/signals.py b/netbox/extras/signals.py deleted file mode 100644 index d676cdf8d..000000000 --- a/netbox/extras/signals.py +++ /dev/null @@ -1,16 +0,0 @@ -from __future__ import unicode_literals - -from django.db.models.signals import post_delete, post_save -from django.dispatch import receiver -from django.core.cache import caches - -from .models import Webhook - - -@receiver((post_save, post_delete), sender=Webhook) -def update_webhook_cache(**kwargs): - """ - When a Webhook has been modified, update the webhook cache. - """ - cache = caches['default'] - cache.set('webhook_cache', Webhook.objects.all()) diff --git a/netbox/extras/webhooks.py b/netbox/extras/webhooks.py index 2357e6289..7f77773c8 100644 --- a/netbox/extras/webhooks.py +++ b/netbox/extras/webhooks.py @@ -4,30 +4,12 @@ from importlib import import_module from django.db.models.signals import post_save, post_delete from django.conf import settings from django.core.cache import caches +from django.db.models import Q from django.dispatch import Signal from django.contrib.contenttypes.models import ContentType from utilities.utils import dynamic_import -from .models import Webhook - - -# -# Webhooks signals regiters and receivers -# - -def get_or_set_webhook_cache(): - """ - Retrieve the webhook cache. If it is None set it to the current - Webhook queryset - """ - cache = caches['default'] - webhook_cache = cache.get('webhook_cache', None) - - if webhook_cache is None: - webhook_cache = Webhook.objects.all() - cache.set('webhook_cache', webhook_cache) - - return webhook_cache +from extras.models import Webhook def enqueue_webhooks(webhooks, model_class, data, event, signal_received_timestamp): @@ -66,18 +48,17 @@ def post_save_receiver(sender, instance, created, **kwargs): """ if settings.WEBHOOKS_ENABLED: signal_received_timestamp = time.time() - webhook_cache = get_or_set_webhook_cache() # look for any webhooks that match this event updated = not created obj_type = ContentType.objects.get_for_model(sender) - webhooks = [ - x - for x in webhook_cache - if ( - x.enabled and x.type_create == created or x.type_update == updated and - obj_type in x.obj_type.all() - ) - ] + webhooks = Webhook.objects.filter( + Q(enabled=True) & + ( + Q(type_create=created) | + Q(type_update=updated) + ) & + Q(obj_type=obj_type) + ) event = 'created' if created else 'updated' if webhooks: enqueue_webhooks(webhooks, sender, instance, event, signal_received_timestamp) @@ -90,10 +71,9 @@ def post_delete_receiver(sender, instance, **kwargs): """ if settings.WEBHOOKS_ENABLED: signal_received_timestamp = time.time() - webhook_cache = get_or_set_webhook_cache() obj_type = ContentType.objects.get_for_model(sender) # look for any webhooks that match this event - webhooks = [x for x in webhook_cache if x.enabled and x.type_delete and obj_type in x.obj_type.all()] + webhooks = Webhook.objects.filter(enabled=True, type_delete=True, obj_type=obj_type) if webhooks: enqueue_webhooks(webhooks, sender, instance, 'deleted', signal_received_timestamp) @@ -106,15 +86,14 @@ def bulk_operation_receiver(sender, **kwargs): if settings.WEBHOOKS_ENABLED: signal_received_timestamp = time.time() event = kwargs['event'] - webhook_cache = get_or_set_webhook_cache() obj_type = ContentType.objects.get_for_model(sender) # look for any webhooks that match this event if event == 'created': - webhooks = [x for x in webhook_cache if x.enabled and x.type_create and obj_type in x.obj_type.all()] + webhooks = Webhook.objects.filter(enabled=True, type_create=True, obj_type=obj_type) elif event == 'updated': - webhooks = [x for x in webhook_cache if x.enabled and x.type_update and obj_type in x.obj_type.all()] + webhooks = Webhook.objects.filter(enabled=True, type_update=True, obj_type=obj_type) elif event == 'deleted': - webhooks = [x for x in webhook_cache if x.enabled and x.type_delete and obj_type in x.obj_type.all()] + webhooks = Webhook.objects.filter(enabled=True, type_delete=True, obj_type=obj_type) else: webhooks = None diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index f526ebf19..90ee8103a 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -304,14 +304,6 @@ INTERNAL_IPS = ( '::1', ) -# Django CACHE - local memory cache -CACHES = { - 'default': { - 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', - 'LOCATION': 'webhooks', - } -} - try: HOSTNAME = socket.gethostname()