mirror of
https://github.com/ZwareBear/awx.git
synced 2026-04-18 14:01:49 -05:00
Expand dbconfig support
* Support updating settings values * Support activity stream endpoint * Support clearing value * Improve type conversion system for displaying values
This commit is contained in:
@@ -2111,6 +2111,35 @@ class TowerSettingsSerializer(BaseSerializer):
|
||||
class Meta:
|
||||
model = TowerSettings
|
||||
fields = ('key', 'description', 'category', 'value', 'value_type', 'user')
|
||||
read_only_fields = ('description', 'category', 'value_type', 'user')
|
||||
|
||||
def from_native(self, data, files):
|
||||
if data['key'] not in settings.TOWER_SETTINGS_MANIFEST:
|
||||
self._errors = {'key': 'Key {0} is not a valid settings key'.format(data['key'])}
|
||||
return
|
||||
current_val = TowerSettings.objects.filter(key=data['key'])
|
||||
if current_val.exists():
|
||||
current_val.delete()
|
||||
manifest_val = settings.TOWER_SETTINGS_MANIFEST[data['key']]
|
||||
data['description'] = manifest_val['description']
|
||||
data['category'] = manifest_val['category']
|
||||
data['value_type'] = manifest_val['type']
|
||||
return super(TowerSettingsSerializer, self).from_native(data, files)
|
||||
|
||||
def validate(self, attrs):
|
||||
manifest = settings.TOWER_SETTINGS_MANIFEST
|
||||
if attrs['key'] not in manifest:
|
||||
raise serializers.ValidationError(dict(key=["Key {0} is not a valid settings key".format(attrs['key'])]))
|
||||
# TODO: Type checking/coercion, contextual validation
|
||||
return attrs
|
||||
|
||||
def save_object(self, obj, **kwargs):
|
||||
print("kwargs {0}".format(kwargs))
|
||||
manifest_val = settings.TOWER_SETTINGS_MANIFEST[obj.key]
|
||||
obj.description = manifest_val['description']
|
||||
obj.category = manifest_val['category']
|
||||
obj.value_type = manifest_val['type']
|
||||
return super(TowerSettingsSerializer, self).save_object(obj, **kwargs)
|
||||
|
||||
class AuthTokenSerializer(serializers.Serializer):
|
||||
|
||||
|
||||
@@ -221,7 +221,8 @@ activity_stream_urls = patterns('awx.api.views',
|
||||
)
|
||||
|
||||
settings_urls = patterns('awx.api.views',
|
||||
url(r'^$', 'settings_list'))
|
||||
url(r'^$', 'settings_list'),
|
||||
url(r'^reset/$', 'settings_reset'))
|
||||
|
||||
v1_urls = patterns('awx.api.views',
|
||||
url(r'^$', 'api_v1_root_view'),
|
||||
|
||||
@@ -70,6 +70,7 @@ from awx.api.renderers import * # noqa
|
||||
from awx.api.serializers import * # noqa
|
||||
from awx.fact.models import * # noqa
|
||||
from awx.main.utils import emit_websocket_notification
|
||||
from awx.main.conf import TowerConfiguration
|
||||
|
||||
def api_exception_handler(exc):
|
||||
'''
|
||||
@@ -2971,7 +2972,12 @@ class SettingsList(ListCreateAPIView):
|
||||
def get_queryset(self):
|
||||
SettingsTuple = namedtuple('Settings', ['key', 'description', 'category', 'value', 'value_type', 'user'])
|
||||
# TODO: Filter by what the user can see
|
||||
all_defined_settings = {s.key: SettingsTuple(s.key, s.description, s.category, s.value, s.value_type, s.user) for s in TowerSettings.objects.all()}
|
||||
all_defined_settings = {s.key: SettingsTuple(s.key,
|
||||
s.description,
|
||||
s.category,
|
||||
s.value_converted,
|
||||
s.value_type,
|
||||
s.user) for s in TowerSettings.objects.all()}
|
||||
manifest_settings = settings.TOWER_SETTINGS_MANIFEST
|
||||
settings_actual = []
|
||||
for settings_key in manifest_settings:
|
||||
@@ -2987,6 +2993,18 @@ class SettingsList(ListCreateAPIView):
|
||||
None))
|
||||
return settings_actual
|
||||
|
||||
class SettingsReset(APIView):
|
||||
|
||||
view_name = "Reset a settings value"
|
||||
new_in_300 = True
|
||||
|
||||
def post(self, request):
|
||||
# TODO: RBAC
|
||||
setting_key = request.DATA.get('key', None)
|
||||
if setting_key is not None:
|
||||
TowerSettings.objects.filter(key=settings_key).delete()
|
||||
return Response(status=status.HTTP_204_NO_CONTENT)
|
||||
|
||||
# Create view functions for all of the class-based views to simplify inclusion
|
||||
# in URL patterns and reverse URL lookups, converting CamelCase names to
|
||||
# lowercase_with_underscore (e.g. MyView.as_view() becomes my_view).
|
||||
|
||||
Reference in New Issue
Block a user