@@ -133,11 +133,11 @@
{% trans "Delete" %}
{% if user.is_active %}
-
+
{% trans "Block" %}
{% else %}
-
+
{% trans "Unblock" %}
{% endif %}
diff --git a/accounts/urls.py b/accounts/urls.py
index 21b7264..e4306df 100644
--- a/accounts/urls.py
+++ b/accounts/urls.py
@@ -1,4 +1,4 @@
-from django.urls import path, re_path
+from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
diff --git a/accounts/views.py b/accounts/views.py
index 3d15e81..0239f4c 100644
--- a/accounts/views.py
+++ b/accounts/views.py
@@ -4,10 +4,10 @@ from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
-
from accounts.forms import UserAddForm
from accounts.models import *
from admin.decorators import superuser_only
+from appsettings.models import AppSettings
from instances.models import Instance
import sass
@@ -22,7 +22,6 @@ def profile(request):
error_messages = []
# user = User.objects.get(id=request.user.id)
publickeys = UserSSHKey.objects.filter(user_id=request.user.id)
-
themes_list = os.listdir(settings.SCSS_DIR +"/wvc-theme")
if request.method == 'POST':
@@ -69,20 +68,6 @@ def profile(request):
delkeypublic = UserSSHKey.objects.get(id=keyid)
delkeypublic.delete()
return HttpResponseRedirect(request.get_full_path())
- if 'change_theme' in request.POST:
- theme = request.POST.get('theme_select', '')
- scss_var = f"@import '{settings.SCSS_DIR}/wvc-theme/{theme}/variables';"
- scss_bootswatch = f"@import '{settings.SCSS_DIR}/wvc-theme/{theme}/bootswatch';"
- scss_boot = f"@import '{settings.SCSS_DIR}/bootstrap-overrides.scss';"
-
- with open(settings.SCSS_DIR + "/wvc-main.scss", "w") as main:
- main.write(scss_var + "\n" + scss_boot + "\n" + scss_bootswatch)
-
- css_compressed = sass.compile(string=scss_var + "\n"+ scss_boot + "\n" + scss_bootswatch, output_style='compressed')
- with open("static/" + "css/wvc-main.min.css", "w") as css:
- css.write(css_compressed)
-
- return HttpResponseRedirect(request.get_full_path())
return render(request, 'profile.html', locals())
@@ -119,8 +104,8 @@ def account(request, user_id):
return HttpResponseRedirect(request.get_full_path())
if 'add' in request.POST:
inst_id = request.POST.get('inst_id', '')
-
- if settings.ALLOW_INSTANCE_MULTIPLE_OWNER:
+
+ if AppSettings.objects.get(key="ALLOW_INSTANCE_MULTIPLE_OWNER").value == 'True':
check_inst = UserInstance.objects.filter(instance_id=int(inst_id), user_id=int(user_id))
else:
check_inst = UserInstance.objects.filter(instance_id=int(inst_id))
diff --git a/appsettings/migrations/0001_initial.py b/appsettings/migrations/0001_initial.py
index 32bf9cd..7964143 100644
--- a/appsettings/migrations/0001_initial.py
+++ b/appsettings/migrations/0001_initial.py
@@ -1,4 +1,4 @@
-# Generated by Django 2.2.12 on 2020-05-23 15:53
+# Generated by Django 2.2.12 on 2020-05-27 16:03
from django.db import migrations, models
@@ -16,8 +16,9 @@ class Migration(migrations.Migration):
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=25)),
- ('key', models.CharField(max_length=50, unique=True)),
+ ('key', models.CharField(db_index=True, max_length=50, unique=True)),
('value', models.CharField(max_length=25)),
+ ('choices', models.CharField(max_length=50)),
('description', models.CharField(max_length=100, null=True)),
],
),
diff --git a/appsettings/migrations/0002_auto_20200523_1553.py b/appsettings/migrations/0002_auto_20200523_1553.py
deleted file mode 100644
index 2ef86eb..0000000
--- a/appsettings/migrations/0002_auto_20200523_1553.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# Generated by Django 2.2.12 on 2020-05-23 12:05
-
-from django.db import migrations
-
-def add_default_settings(apps, schema_editor):
-
- setting = apps.get_model("appsettings", "AppSettings")
- db_alias = schema_editor.connection.alias
- setting.objects.using(db_alias).bulk_create([
- setting(1, "Console Type", "QEMU_CONSOLE_DEFAULT_TYPE", "vnc", "Default console type"),
- setting(2, "Libvirt K.alive Intrval", "LIBVIRT_KEEPALIVE_INTERVAL", "5", "libvirt keepalive interval"),
- setting(3, "Libvirt K.alive Count", "LIBVIRT_KEEPALIVE_COUNT", "5", "libvirt keepalive count"),
- setting(4, "Multiple Owner for VM ", "ALLOW_INSTANCE_MULTIPLE_OWNER", "True"),
- setting(5, "VM Clone Name Prefix", "CLONE_INSTANCE_DEFAULT_PREFIX", "instance"),
- setting(6, "VM Clone Auto Name", "CLONE_INSTANCE_AUTO_NAME", "False"),
- setting(7, "VM Clone Auto Migrate", "CLONE_INSTANCE_AUTO_MIGRATE", "False"),
- setting(8, "Logs per Page", "LOGS_PER_PAGE", "100"),
- setting(9, "Quota Debug", "QUOTA_DEBUG", "True"),
- setting(10, "Empty Password", "ALLOW_EMPTY_PASSWORD", "True"),
- setting(11, "Account View Style", "VIEW_ACCOUNTS_STYLE", "grid", "available: default (grid), list"),
- setting(12, "Instance List View", "VIEW_INSTANCES_LIST_STYLE", "grouped", "available instance list style: default (grouped), nongrouped"),
- setting(13, "Show Bottom Bar", "VIEW_INSTANCE_DETAIL_BOTTOM_BAR", "True", "available options: True, False"),
- setting(14, "Disk Format", "INSTANCE_VOLUME_DEFAULT_FORMAT", "qcow2", "available volume format: raw, qcow2, qcow"),
- setting(15, "Disk Bus", "INSTANCE_VOLUME_DEFAULT_BUS", "virtio", "available bus types: virtio, scsi, ide, usb, sata"),
- setting(16, "Disk SCSI Controller", "INSTANCE_VOLUME_DEFAULT_SCSI_CONTROLLER", "virtio-scsi", "SCSI Types: virtio-scsi, lsilogic"),
- setting(17, "Disk Cache", "INSTANCE_VOLUME_DEFAULT_CACHE", "directsync", " Volume cache: default, directsync, none, unsafe, writeback, writethrough"),
- setting(18, "Disk IO Type", "INSTANCE_VOLUME_DEFAULT_IO", "default", "Volume io mode: default, native, threads"),
- setting(19, "Disk Detect Zeroes", "INSTANCE_VOLUME_DEFAULT_DETECT_ZEROES", "default", "Volume detect zeroes mode: default, on, off, unmap"),
- setting(20, "Disk Discard", "INSTANCE_VOLUME_DEFAULT_DISCARD", "default", "Volume discard mode: default, unmap, ignore"),
- setting(21, "Disk Owner UID", "INSTANCE_VOLUME_DEFAULT_OWNER_UID", "0", "up to os, 0=root, 107=qemu or libvirt-bin(for ubuntu)"),
- setting(22, "Disk Owner GID", "INSTANCE_VOLUME_DEFAULT_OWNER_GID", "0", "up to os, 0=root, 107=qemu or libvirt-bin(for ubuntu)"),
- setting(23, "CPU Mode", "INSTANCE_CPU_DEFAULT_MODE", "host-model", "Cpu modes: no-model, host-model, host-passthrough, custom"),
- setting(24, "Machine Type", "INSTANCE_MACHINE_DEFAULT_TYPE", "q35", "Chipset/Machine: pc or q35 for x86_64"),
- setting(25, "Firmware Type", "INSTANCE_FIRMWARE_DEFAULT_TYPE", "BIOS", "Firmware: BIOS or UEFI for x86_64"),
- setting(26, "Architecture Type", "INSTANCE_ARCH_DEFAULT_TYPE", "x86_64", "Architecture: x86_64, i686, etc"),
- setting(27, "Theme", "BOOTSTRAP_THEME", "", "Bootstrap CSS & Bootswatch"),
- setting(28, "Sass Path", "SASS_DIR", "", "Bootstrap SASS & Bootswatch SASS "),
- ])
-
-def del_default_settings(apps, schema_editor):
- setting = apps.get_model("appsettings", "AppSettings")
- db_alias = schema_editor.connection.alias
- setting.objects.using(db_alias).filter(id=1, key="QEMU_CONSOLE_DEFAULT_TYPE").delete()
- setting.objects.using(db_alias).filter(id=2, key="LIBVIRT_KEEPALIVE_INTERVAL").delete()
- setting.objects.using(db_alias).filter(id=3, key="LIBVIRT_KEEPALIVE_COUNT").delete()
- setting.objects.using(db_alias).filter(id=4, key="ALLOW_INSTANCE_MULTIPLE_OWNER").delete()
- setting.objects.using(db_alias).filter(id=5, key="CLONE_INSTANCE_DEFAULT_PREFIX").delete()
- setting.objects.using(db_alias).filter(id=6, key="CLONE_INSTANCE_AUTO_NAME").delete()
- setting.objects.using(db_alias).filter(id=7, key="CLONE_INSTANCE_AUTO_MIGRATE").delete()
- setting.objects.using(db_alias).filter(id=8, key="LOGS_PER_PAGE").delete()
- setting.objects.using(db_alias).filter(id=9, key="QUOTA_DEBUG").delete()
- setting.objects.using(db_alias).filter(id=10, key="ALLOW_EMPTY_PASSWORD").delete()
- setting.objects.using(db_alias).filter(id=11, key="VIEW_ACCOUNTS_STYLE").delete()
- setting.objects.using(db_alias).filter(id=12, key="VIEW_INSTANCES_LIST_STYLE").delete()
- setting.objects.using(db_alias).filter(id=13, key="VIEW_INSTANCE_DETAIL_BOTTOM_BAR").delete()
- setting.objects.using(db_alias).filter(id=14, key="INSTANCE_VOLUME_DEFAULT_FORMAT").delete()
- setting.objects.using(db_alias).filter(id=15, key="INSTANCE_VOLUME_DEFAULT_BUS").delete()
- setting.objects.using(db_alias).filter(id=16, key="INSTANCE_VOLUME_DEFAULT_SCSI_CONTROLLER").delete()
- setting.objects.using(db_alias).filter(id=17, key="INSTANCE_VOLUME_DEFAULT_CACHE").delete()
- setting.objects.using(db_alias).filter(id=18, key="INSTANCE_VOLUME_DEFAULT_IO").delete()
- setting.objects.using(db_alias).filter(id=19, key="INSTANCE_VOLUME_DEFAULT_DETECT_ZEROES").delete()
- setting.objects.using(db_alias).filter(id=20, key="INSTANCE_VOLUME_DEFAULT_DISCARD").delete()
- setting.objects.using(db_alias).filter(id=21, key="INSTANCE_VOLUME_DEFAULT_OWNER_UID").delete()
- setting.objects.using(db_alias).filter(id=22, key="INSTANCE_VOLUME_DEFAULT_OWNER_GID").delete()
- setting.objects.using(db_alias).filter(id=23, key="INSTANCE_CPU_DEFAULT_MODE").delete()
- setting.objects.using(db_alias).filter(id=24, key="INSTANCE_MACHINE_DEFAULT_TYPE").delete()
- setting.objects.using(db_alias).filter(id=25, key="INSTANCE_FIRMWARE_DEFAULT_TYPE").delete()
- setting.objects.using(db_alias).filter(id=26, key="INSTANCE_ARCH_DEFAULT_TYPE").delete()
- setting.objects.using(db_alias).filter(id=27, key="BOOTSTRAP_THEME").delete()
- setting.objects.using(db_alias).filter(id=28, key="SASS_DIR").delete()
-
-class Migration(migrations.Migration):
-
- dependencies = [
- ('appsettings', '0001_initial'),
- ]
-
- operations = [
- migrations.RunPython(add_default_settings, del_default_settings),
- ]
diff --git a/appsettings/migrations/0002_auto_20200527_1603.py b/appsettings/migrations/0002_auto_20200527_1603.py
new file mode 100644
index 0000000..2238b75
--- /dev/null
+++ b/appsettings/migrations/0002_auto_20200527_1603.py
@@ -0,0 +1,82 @@
+# Generated by Django 2.2.12 on 2020-05-23 12:05
+
+from django.db import migrations
+
+def add_default_settings(apps, schema_editor):
+
+ setting = apps.get_model("appsettings", "AppSettings")
+ db_alias = schema_editor.connection.alias
+ setting.objects.using(db_alias).bulk_create([
+ setting(1, "Theme", "BOOTSTRAP_THEME", "flaty", "", "Bootstrap CSS & Bootswatch Theme"),
+ setting(2, "Theme SASS Path", "SASS_DIR", "dev/scss/", "", "Bootstrap SASS & Bootswatch SASS Directory"),
+ setting(3, "All Instances View Style", "VIEW_INSTANCES_LIST_STYLE", "grouped", "grouped,nongrouped", "All instances list style"),
+ setting(4, "Account View Style", "VIEW_ACCOUNTS_STYLE", "grid", "grid,list", "User accounts view style"),
+ setting(5, "Logs per Page", "LOGS_PER_PAGE", "100", "", "Pagination for logs"),
+ setting(6, "Multiple Owner for VM ", "ALLOW_INSTANCE_MULTIPLE_OWNER", "True", "True,False", "Allow to have multiple owner for instance"),
+ setting(7, "Quota Debug", "QUOTA_DEBUG", "True", "True,False", "Debug for user quotas"),
+ setting(8, "Empty Password", "ALLOW_EMPTY_PASSWORD", "True", "True,False", "Allow empty password"),
+ setting(9, "Disk Format", "INSTANCE_VOLUME_DEFAULT_FORMAT", "qcow2", "raw,qcow,qcow2", "Instance disk format"),
+ setting(10, "Disk Bus", "INSTANCE_VOLUME_DEFAULT_BUS", "virtio", "virtio,scsi,ide,usb,sata", "Instance disk bus type"),
+ setting(11, "Disk SCSI Controller", "INSTANCE_VOLUME_DEFAULT_SCSI_CONTROLLER", "virtio-scsi", "virtio-scsi, lsilogic, virtio-blk", "SCSI controller type"),
+ setting(12, "Disk Cache", "INSTANCE_VOLUME_DEFAULT_CACHE", "directsync", "default,directsync,none,unsafe,writeback,writethrough", "Disk volume cache type"),
+ setting(13, "Disk IO Type", "INSTANCE_VOLUME_DEFAULT_IO", "default", "default,native,threads", "Volume io modes"),
+ setting(14, "Disk Detect Zeroes", "INSTANCE_VOLUME_DEFAULT_DETECT_ZEROES", "default", "default,on,off,unmap", "Volume detect zeroes mode"),
+ setting(15, "Disk Discard", "INSTANCE_VOLUME_DEFAULT_DISCARD", "default", "default,unmap,ignore", "Volume discard mode"),
+ setting(16, "Disk Owner UID", "INSTANCE_VOLUME_DEFAULT_OWNER_UID", "0", "", "Owner UID: up to os, 0=root, 107=qemu or libvirt-bin(for ubuntu)"),
+ setting(17, "Disk Owner GID", "INSTANCE_VOLUME_DEFAULT_OWNER_GID", "0", "", "Owner GID: up to os, 0=root, 107=qemu or libvirt-bin(for ubuntu)"),
+ setting(18, "VM CPU Mode", "INSTANCE_CPU_DEFAULT_MODE", "host-model", "no-model,host-model,host-passthrough,custom", "Cpu modes"),
+ setting(19, "VM Machine Type", "INSTANCE_MACHINE_DEFAULT_TYPE", "q35", "q35,x86_64", "Chipset/Machine type"),
+ setting(20, "VM Firmware Type", "INSTANCE_FIRMWARE_DEFAULT_TYPE", "BIOS", "BIOS,UEFI", "Firmware type for x86_64"),
+ setting(21, "VM Architecture Type", "INSTANCE_ARCH_DEFAULT_TYPE", "x86_64", "x86_64,i686", "Architecture type: x86_64, i686, etc"),
+ setting(22, "VM Console Type", "QEMU_CONSOLE_DEFAULT_TYPE", "vnc", "vnc,spice", "Default console type"),
+ setting(23, "VM Clone Name Prefix", "CLONE_INSTANCE_DEFAULT_PREFIX", "instance", "True,False", "Prefix for cloned instance name"),
+ setting(24, "VM Clone Auto Name", "CLONE_INSTANCE_AUTO_NAME", "False", "True,False", "Generated name for cloned instance"),
+ setting(25, "VM Clone Auto Migrate", "CLONE_INSTANCE_AUTO_MIGRATE", "False", "True,False", "Auto migrate instance after clone"),
+ setting(26, "VM Bottom Bar", "VIEW_INSTANCE_DETAIL_BOTTOM_BAR", "True", "True,False", "Bottom navbar for instance details"),
+ setting(27, "Show Access Root Pass", "SHOW_ACCESS_ROOT_PASSWORD", "False", "True,False", "Show access root password"),
+ setting(28, "Show Access SSH Keys", "SHOW_ACCESS_SSH_KEYS", "False", "True,False", "Show access ssh keys"),
+ setting(29, "Show Profile Edit Pass", "SHOW_PROFILE_EDIT_PASSWORD", "False", "True,False", "Show profile edit password"),
+ ])
+
+def del_default_settings(apps, schema_editor):
+ setting = apps.get_model("appsettings", "AppSettings")
+ db_alias = schema_editor.connection.alias
+ setting.objects.using(db_alias).filter(key="QEMU_CONSOLE_DEFAULT_TYPE").delete()
+ setting.objects.using(db_alias).filter(key="ALLOW_INSTANCE_MULTIPLE_OWNER").delete()
+ setting.objects.using(db_alias).filter(key="CLONE_INSTANCE_DEFAULT_PREFIX").delete()
+ setting.objects.using(db_alias).filter(key="CLONE_INSTANCE_AUTO_NAME").delete()
+ setting.objects.using(db_alias).filter(key="CLONE_INSTANCE_AUTO_MIGRATE").delete()
+ setting.objects.using(db_alias).filter(key="LOGS_PER_PAGE").delete()
+ setting.objects.using(db_alias).filter(key="QUOTA_DEBUG").delete()
+ setting.objects.using(db_alias).filter(key="ALLOW_EMPTY_PASSWORD").delete()
+ setting.objects.using(db_alias).filter(key="VIEW_ACCOUNTS_STYLE").delete()
+ setting.objects.using(db_alias).filter(key="VIEW_INSTANCES_LIST_STYLE").delete()
+ setting.objects.using(db_alias).filter(key="VIEW_INSTANCE_DETAIL_BOTTOM_BAR").delete()
+ setting.objects.using(db_alias).filter(key="INSTANCE_VOLUME_DEFAULT_FORMAT").delete()
+ setting.objects.using(db_alias).filter(key="INSTANCE_VOLUME_DEFAULT_BUS").delete()
+ setting.objects.using(db_alias).filter(key="INSTANCE_VOLUME_DEFAULT_SCSI_CONTROLLER").delete()
+ setting.objects.using(db_alias).filter(key="INSTANCE_VOLUME_DEFAULT_CACHE").delete()
+ setting.objects.using(db_alias).filter(key="INSTANCE_VOLUME_DEFAULT_IO").delete()
+ setting.objects.using(db_alias).filter(key="INSTANCE_VOLUME_DEFAULT_DETECT_ZEROES").delete()
+ setting.objects.using(db_alias).filter(key="INSTANCE_VOLUME_DEFAULT_DISCARD").delete()
+ setting.objects.using(db_alias).filter(key="INSTANCE_VOLUME_DEFAULT_OWNER_UID").delete()
+ setting.objects.using(db_alias).filter(key="INSTANCE_VOLUME_DEFAULT_OWNER_GID").delete()
+ setting.objects.using(db_alias).filter(key="INSTANCE_CPU_DEFAULT_MODE").delete()
+ setting.objects.using(db_alias).filter(key="INSTANCE_MACHINE_DEFAULT_TYPE").delete()
+ setting.objects.using(db_alias).filter(key="INSTANCE_FIRMWARE_DEFAULT_TYPE").delete()
+ setting.objects.using(db_alias).filter(key="INSTANCE_ARCH_DEFAULT_TYPE").delete()
+ setting.objects.using(db_alias).filter(key="BOOTSTRAP_THEME").delete()
+ setting.objects.using(db_alias).filter(key="SASS_DIR").delete()
+ setting.objects.using(db_alias).filter(key="SHOW_ACCESS_ROOT_PASSWORD").delete()
+ setting.objects.using(db_alias).filter(key="SHOW_ACCESS_SSH_KEYS").delete()
+ setting.objects.using(db_alias).filter(key="SHOW_PROFILE_EDIT_PASSWORD").delete()
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('appsettings', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.RunPython(add_default_settings, del_default_settings),
+ ]
diff --git a/appsettings/models.py b/appsettings/models.py
index 30d1e9d..ed1b73c 100644
--- a/appsettings/models.py
+++ b/appsettings/models.py
@@ -2,7 +2,12 @@ from django.db import models
class AppSettings(models.Model):
+
+ def choices_as_list(self):
+ return self.choices.split(',')
+
name = models.CharField(max_length=25, null=False)
- key = models.CharField(max_length=50, unique=True)
+ key = models.CharField(db_index=True, max_length=50, unique=True)
value = models.CharField(max_length=25)
- description=models.CharField(max_length=100, null=True)
+ choices = models.CharField(max_length=50)
+ description = models.CharField(max_length=100, null=True)
diff --git a/appsettings/templates/appsettings.html b/appsettings/templates/appsettings.html
index 69fdfc1..f1942d4 100644
--- a/appsettings/templates/appsettings.html
+++ b/appsettings/templates/appsettings.html
@@ -57,17 +57,25 @@
{% endif %}
-
{% endblock %}
diff --git a/appsettings/views.py b/appsettings/views.py
index 8cc6e23..eaf175d 100644
--- a/appsettings/views.py
+++ b/appsettings/views.py
@@ -7,7 +7,6 @@ from django.urls import reverse
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.decorators import login_required
from django.contrib import messages
-from django.conf import settings
from appsettings.models import AppSettings
from logs.views import addlogmsg
@@ -22,14 +21,33 @@ def appsettings(request):
"""
error_messages = []
+ sass_dir = AppSettings.objects.get(key="SASS_DIR")
+ bootstrap_theme = AppSettings.objects.get(key="BOOTSTRAP_THEME")
+ try:
+ themes_list = os.listdir(sass_dir.value + "/wvc-theme")
+ except FileNotFoundError as err:
+ error_messages.append(err)
+ addlogmsg(request.user.username, "", err)
+
+ # Bootstrap settings related with filesystems, because of that they are excluded from other settings
+ appsettings = AppSettings.objects.exclude(description__startswith="Bootstrap").order_by("name")
- show_inst_bottom_bar = AppSettings.objects.get(key="VIEW_INSTANCE_DETAIL_BOTTOM_BAR")
- bootstrap_theme = AppSettings.objects.get(key="BOOTSTRAP_THEME")
- sass_dir = AppSettings.objects.get(key="SASS_DIR")
- themes_list = os.listdir(sass_dir.value + "/wvc-theme")
+ if request.method == 'POST':
+ if 'SASS_DIR' in request.POST:
+ try:
+ sass_dir.value = request.POST.get("SASS_DIR", "")
+ sass_dir.save()
+
+ msg = _(f"SASS directory path is changed. Now: {sass_dir.value}")
+ messages.success(request, msg)
+ except Exception as err:
+ msg = err
+ error_messages.append(msg)
+
+ addlogmsg(request.user.username, "", msg)
+ return HttpResponseRedirect(request.get_full_path())
- if request.method == 'POST':
if 'BOOTSTRAP_THEME' in request.POST:
theme = request.POST.get("BOOTSTRAP_THEME", "")
scss_var = f"@import '{sass_dir.value}/wvc-theme/{theme}/variables';"
@@ -56,33 +74,20 @@ def appsettings(request):
addlogmsg(request.user.username, "", msg)
return HttpResponseRedirect(request.get_full_path())
- if 'SASS_DIR' in request.POST:
- try:
- sass_dir.value = request.POST.get("SASS_DIR", "")
- sass_dir.save()
+ for setting in appsettings:
+ if setting.key in request.POST:
+ try:
+ setting.value = request.POST.get(setting.key, "")
+ setting.save()
- msg = _(f"SASS directory path is changed. Now: {sass_dir.value}")
- messages.success(request, msg)
- except Exception as err:
- msg = err
- error_messages.append(msg)
-
- addlogmsg(request.user.username, "", msg)
- return HttpResponseRedirect(request.get_full_path())
-
- if 'VIEW_INSTANCE_DETAIL_BOTTOM_BAR' in request.POST:
- try:
- show_inst_bottom_bar.value = request.POST.get("VIEW_INSTANCE_DETAIL_BOTTOM_BAR", "")
- show_inst_bottom_bar.save()
-
- msg = _(f"Show bottom bar setting is changed. Now: {show_inst_bottom_bar.value}")
- messages.success(request, msg)
- except Exception as err:
- msg = err
- error_messages.append(msg)
-
- addlogmsg(request.user.username, "", msg)
- return HttpResponseRedirect(request.get_full_path())
+ msg = _(f"{setting.name} is changed. Now: {setting.value}")
+ messages.success(request, msg)
+ except Exception as err:
+ msg = err
+ error_messages.append(msg)
+
+ addlogmsg(request.user.username, "", msg)
+ return HttpResponseRedirect(request.get_full_path())
return render(request, 'appsettings.html', locals())
diff --git a/computes/templates/overview.html b/computes/templates/overview.html
index 88ce3db..c2d2e34 100644
--- a/computes/templates/overview.html
+++ b/computes/templates/overview.html
@@ -75,7 +75,7 @@