diff --git a/awx/conf/license.py b/awx/conf/license.py index 17a1d323c7..820f4f2d58 100644 --- a/awx/conf/license.py +++ b/awx/conf/license.py @@ -2,13 +2,17 @@ # All Rights Reserved. # Django +from django.core.cache import cache +from django.core.signals import setting_changed +from django.dispatch import receiver from django.utils.translation import ugettext_lazy as _ # Django REST Framework from rest_framework.exceptions import APIException # Tower -from awx.main.utils.common import get_licenser, memoize +from awx.main.utils.common import get_licenser +from awx.main.utils import memoize __all__ = ['LicenseForbids', 'get_license', 'get_licensed_features', 'feature_enabled', 'feature_exists'] @@ -19,10 +23,18 @@ class LicenseForbids(APIException): default_detail = _('Your Tower license does not allow that.') +@memoize(cache_key='_validated_license_data') def _get_validated_license_data(): return get_licenser().validate() +@receiver(setting_changed) +def _on_setting_changed(sender, **kwargs): + # Clear cached result above when license changes. + if kwargs.get('setting', None) == 'LICENSE': + cache.delete('_validated_license_data') + + def get_license(show_key=False): """Return a dictionary representing the active license on this Tower instance.""" license_data = _get_validated_license_data() @@ -40,7 +52,6 @@ def get_licensed_features(): return features -@memoize(cache_name='ephemeral') def feature_enabled(name): """Return True if the requested feature is enabled, False otherwise.""" validated_license_data = _get_validated_license_data() diff --git a/awx/main/utils/common.py b/awx/main/utils/common.py index e62d2274c4..c8c382472a 100644 --- a/awx/main/utils/common.py +++ b/awx/main/utils/common.py @@ -107,14 +107,13 @@ class RequireDebugTrueOrTest(logging.Filter): return settings.DEBUG or 'test' in sys.argv -def memoize(ttl=60, cache_key=None, cache_name='default'): +def memoize(ttl=60, cache_key=None): ''' Decorator to wrap a function and cache its result. ''' - from django.core.cache import caches + from django.core.cache import cache def _memoizer(f, *args, **kwargs): - cache = caches[cache_name] key = cache_key or slugify('%s %r %r' % (f.__name__, args, kwargs)) value = cache.get(key) if value is None: diff --git a/awx/settings/defaults.py b/awx/settings/defaults.py index 189ec344b3..d4747a8078 100644 --- a/awx/settings/defaults.py +++ b/awx/settings/defaults.py @@ -481,9 +481,6 @@ if is_testing(): 'default': { 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', }, - 'ephemeral': { - 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', - }, } else: CACHES = { @@ -491,9 +488,6 @@ else: 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': 'memcached:11211', }, - 'ephemeral': { - 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', - }, } # Social Auth configuration.