from django.contrib import admin, messages from django.shortcuts import render from django.views import generic from django.utils.translation import ngettext, gettext_lazy as _ from orchestra.contrib.settings import Setting from orchestra.utils import sys from . import parser from .forms import SettingFormSet class SettingView(generic.edit.FormView): template_name = 'admin/settings/change_form.html' reload_template_name = 'admin/settings/reload.html' form_class = SettingFormSet success_url = '.' def get_context_data(self, **kwargs): context = super(SettingView, self).get_context_data(**kwargs) context.update({ 'title': _("Change settings"), 'settings_file': parser.get_settings_file(), }) return context def get_initial(self): initial_data = [] prev_app = None account = 0 for name, setting in Setting.settings.items(): app = name.split('_')[0] initial = { 'name': setting.name, 'help_text': setting.help_text, 'default': setting.default, 'type': type(setting.default), 'value': setting.value, 'setting': setting, 'app': app, } if app == 'ORCHESTRA': initial_data.insert(account, initial) account += 1 else: initial_data.append(initial) return initial_data def form_valid(self, form): settings = Setting.settings changes = {} for data in form.cleaned_data: setting = settings[data['name']] if not isinstance(data['value'], parser.NotSupported) and setting.editable: if setting.value != data['value']: # Ignore differences between lists and tuples if (type(setting.value) != type(data['value']) and isinstance(data['value'], list) and tuple(data['value']) == setting.value): continue if setting.default == data['value']: changes[setting.name] = parser.Remove() else: changes[setting.name] = data['value'] if changes: # Display confirmation if not self.request.POST.get('confirmation'): settings_file = parser.get_settings_file() new_content = parser.apply(changes) cmd = "cat <