mirror of
https://github.com/ansible/awx.git
synced 2024-11-02 01:21:21 +03:00
26d393e5c2
* Allows for invalidating an entire function from the memoizer
65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
# Copyright (c) 2016 Ansible, Inc.
|
|
# All Rights Reserved.
|
|
|
|
# Django
|
|
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
|
|
from awx.main.utils import memoize, memoize_delete
|
|
|
|
__all__ = ['LicenseForbids', 'get_license', 'get_licensed_features',
|
|
'feature_enabled', 'feature_exists']
|
|
|
|
|
|
class LicenseForbids(APIException):
|
|
status_code = 402
|
|
default_detail = _('Your Tower license does not allow that.')
|
|
|
|
|
|
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':
|
|
memoize_delete('feature_enabled')
|
|
|
|
|
|
def get_license(show_key=False):
|
|
"""Return a dictionary representing the active license on this Tower instance."""
|
|
license_data = _get_validated_license_data()
|
|
if not show_key:
|
|
license_data.pop('license_key', None)
|
|
return license_data
|
|
|
|
|
|
def get_licensed_features():
|
|
"""Return a set of all features enabled by the active license."""
|
|
features = set()
|
|
for feature, enabled in _get_validated_license_data().get('features', {}).items():
|
|
if enabled:
|
|
features.add(feature)
|
|
return features
|
|
|
|
|
|
@memoize(track_function=True)
|
|
def feature_enabled(name):
|
|
"""Return True if the requested feature is enabled, False otherwise."""
|
|
validated_license_data = _get_validated_license_data()
|
|
if validated_license_data.get('license_type', 'UNLICENSED') == 'open':
|
|
return True
|
|
return validated_license_data.get('features', {}).get(name, False)
|
|
|
|
|
|
def feature_exists(name):
|
|
"""Return True if the requested feature name exists, False otherwise."""
|
|
return bool(name in _get_validated_license_data().get('features', {}))
|