From f795e0d226bd950a996588534e8ce01723710bab Mon Sep 17 00:00:00 2001 From: "Alexie (Boyong) Madolid" Date: Mon, 26 Jun 2023 14:02:46 +0800 Subject: [PATCH] [FEATURE]: Config Vars --- .../jaseci/cli_tools/tests/test_jsctl.py | 14 +-- jaseci_core/jaseci/extens/api/config_api.py | 95 ++++++------------- jaseci_core/jaseci/extens/api/global_api.py | 93 ++++++++++++++---- jaseci_core/jaseci/extens/api/object_api.py | 7 -- jaseci_core/jaseci/jsorc/jsorc.py | 10 +- jaseci_core/jaseci/jsorc/memory.py | 93 +++++++++++++++--- jaseci_core/jaseci/jsorc/redis.py | 49 +++++++++- jaseci_core/jaseci/utils/utils.py | 33 +++++++ jaseci_serv/jaseci_serv/base/admin.py | 9 ++ jaseci_serv/jaseci_serv/base/models.py | 21 +++- jaseci_serv/jaseci_serv/hook/orm.py | 78 ++++++++++++++- .../jac_api/tests/test_jac_admin_api.py | 7 +- jaseci_serv/jaseci_serv/settings.py | 18 ---- 13 files changed, 380 insertions(+), 147 deletions(-) diff --git a/jaseci_core/jaseci/cli_tools/tests/test_jsctl.py b/jaseci_core/jaseci/cli_tools/tests/test_jsctl.py index 5bbcfb692d..4fada2f874 100644 --- a/jaseci_core/jaseci/cli_tools/tests/test_jsctl.py +++ b/jaseci_core/jaseci/cli_tools/tests/test_jsctl.py @@ -150,14 +150,14 @@ def test_jsctl_config_cmds(self): self.call( f"sentinel register {os.path.dirname(__file__)}/zsb.jac -name zsb -set_active true" ) - self.call('config set CONFIG_EXAMPLE -value "TEST" -do_check False') - self.call("config set APPLE -value Grape2 -do_check False") - self.call("config set APPLE_JSON -value '{\"test\":true}' -do_check False") - self.call('config set "Banana" -value "Grape" -do_check False') - self.call('config set "Pear" -value "Banana" -do_check False') - r = self.call("config get APPLE -do_check False") + self.call('global set CONFIG_EXAMPLE -value "TEST"') + self.call("global set APPLE -value Grape2") + self.call("global set APPLE_JSON -value '{\"test\":true}'") + self.call('global set "Banana" -value "Grape"') + self.call('global set "Pear" -value "Banana"') + r = self.call("global get APPLE") self.assertEqual(r.strip(), "Grape2") - r = self.call_cast("config list") + r = self.call_cast("global list") self.assertEqual(len(r), 1) diff --git a/jaseci_core/jaseci/extens/api/config_api.py b/jaseci_core/jaseci/extens/api/config_api.py index f8d51bdc3b..6566b11de2 100644 --- a/jaseci_core/jaseci/extens/api/config_api.py +++ b/jaseci_core/jaseci/extens/api/config_api.py @@ -1,61 +1,46 @@ """ Admin config api functions as a mixin """ - -from typing import Optional from json import dumps, loads +from jaseci.utils.utils import manipulate_data from jaseci.extens.api.interface import Interface class ConfigApi: """ Admin config APIs - Abstracted since there are no valid configs in core atm, see jaseci_serv - to see how used. """ - def __init__(self, *args, **kwargs): - self._valid_configs = [ - "CONFIG_EXAMPLE", - "ACTION_SETS", - "REDIS_CONFIG", - "TASK_CONFIG", - "MAIL_CONFIG", - "PROME_CONFIG", - "ELASTIC_CONFIG", - "STRIPE_CONFIG", - "KUBE_CONFIG", - "JSORC_CONFIG", - ] - @Interface.admin_api(cli_args=["name"]) - def config_get(self, name: str, do_check: bool = True): + def config_get(self, name: str): """ Get a config """ - if do_check and not self.name_check(name): - return self.name_error(name) - return self._h.get_glob(name) + conf = self._h.get_conf(name) + if isinstance(conf, (str, bytes, bytearray)): + try: + return loads(conf) + except Exception: + pass + + return conf @Interface.admin_api(cli_args=["name"]) - def config_set(self, name: str, value: str or dict, do_check: bool = True): + def config_set(self, name: str, value: str or dict or list or tuple): """ Set a config """ - if do_check and not self.name_check(name): - return self.name_error(name) - - if not (value is None) and type(value) is dict: + if not (value is None) and isinstance(value, (dict, list, tuple)): value = dumps(value) - self._h.save_glob(name, value) - return [f"Config of '{name}' to '{value}' set!"] + self._h.save_conf(name, value) + return [f"Config '{name}' to '{value}' set!"] @Interface.admin_api(cli_args=["name"]) def config_update( self, name: str, - field_key: str, + field_key: str or int or list or tuple, field_value: str or int or float @@ -64,66 +49,40 @@ def config_update( or bool or tuple or None, # json serializable types - do_check: bool = True, ): """ Update a key-value of a config """ - if do_check and not self.name_check(name): - return self.name_error(name) - - conf = self._h.get_glob(name) + conf = self._h.get_conf(name) try: - conf = loads(conf) - except Exception: + conf = manipulate_data(conf, field_key, field_value) + self._h.save_conf(name, conf) return [ - f"Config {name} is not a dictionary. Uses config_set to set the value for this config." + f"Config '{name}' is updated with {field_key}:{field_value}. Current config value: {conf}" + ] + except Exception as e: + return [ + f"Config {name} is not a dictionary or list. Uses config_set to set the value for this config." ] - if field_key not in conf: - return [f"Field {field_key} does not exist in config {name}"] - - conf[field_key] = field_value - conf = dumps(conf) - self._h.save_glob(name, conf) - return [ - f"Config of '{name}' is updated with {field_key}:{field_value}. Current config value: {conf}" - ] @Interface.admin_api() def config_list(self): """ Check a config is present """ - return [v for v in self._h.list_glob() if v in self._valid_configs] - - @Interface.admin_api() - def config_index(self): - """ - List all valid configs - """ - return self._valid_configs + return self._h.list_conf() @Interface.admin_api(cli_args=["name"]) def config_exists(self, name: str): """ Check a config is present """ - return self._h.has_glob(name) + return self._h.has_conf(name) @Interface.admin_api(cli_args=["name"]) - def config_delete(self, name: str, do_check: bool = True): + def config_delete(self, name: str): """ Delete a config """ - if do_check and not self.name_check(name): - return self.name_error(name) - self._h.destroy_glob(name) + self._h.destroy_conf(name) return [f"{name} Deleted."] - - def name_error(self, name): - """Much used error output""" - return [f"Config {name} not recognized, must be in {self._valid_configs}!"] - - def name_check(self, name): - """Much used name check""" - return name in self._valid_configs diff --git a/jaseci_core/jaseci/extens/api/global_api.py b/jaseci_core/jaseci/extens/api/global_api.py index 09e254f7e5..00caf1f31a 100644 --- a/jaseci_core/jaseci/extens/api/global_api.py +++ b/jaseci_core/jaseci/extens/api/global_api.py @@ -1,9 +1,10 @@ """ Admin Global api functions as a mixin """ +from jaseci.utils.utils import manipulate_data from jaseci.extens.api.interface import Interface from jaseci.prim.sentinel import Sentinel -import uuid +from json import dumps, loads class GlobalApi: @@ -11,33 +12,89 @@ class GlobalApi: Admin global APIs """ + @Interface.private_api(cli_args=["name"]) + def global_get(self, name: str): + """ + Get a global + """ + glob = self._h.get_glob(name) + + if isinstance(glob, (str, bytes, bytearray)): + try: + return loads(glob) + except Exception: + pass + + return glob + @Interface.admin_api(cli_args=["name"]) - def global_set(self, name: str, value: str): + def global_set(self, name: str, value: str or dict or list or tuple): """ Set a global """ - ret = {"success": True} - if name == "GLOB_SENTINEL" or name in self._valid_configs: - ret["response"] = f"{name} is sacred!" - ret["success"] = False - else: - self._h.save_glob(name, value) - ret["response"] = f"Global variable '{name}' to '{value}' set!" - return ret + if name == "GLOB_SENTINEL": + return f"{name} is sacred!" + + if not (value is None) and isinstance(value, (dict, list, tuple)): + value = dumps(value) + + self._h.save_glob(name, value) + return [f"Global '{name}' to '{value}' set!"] + + @Interface.admin_api(cli_args=["name"]) + def global_update( + self, + name: str, + field_key: str or int or list or tuple, + field_value: str + or int + or float + or list + or dict + or bool + or tuple + or None, # json serializable types + ): + """ + Update a key-value of a global + """ + + glob = self._h.get_glob(name) + try: + glob = manipulate_data(glob, field_key, field_value) + self._h.save_glob(name, glob) + return [ + f"Global '{name}' is updated with {field_key}:{field_value}. Current global value: {glob}" + ] + except Exception: + return [ + f"Global {name} is not a dictionary or list. Uses global_set to set the value." + ] + + @Interface.admin_api() + def global_list(self): + """ + Check a global is present + """ + return self._h.list_glob() + + @Interface.admin_api(cli_args=["name"]) + def global_exists(self, name: str): + """ + Check a global is present + """ + return self._h.has_glob(name) @Interface.admin_api(cli_args=["name"]) def global_delete(self, name: str): """ Delete a global """ - ret = {"success": True} - if name == "GLOB_SENTINEL" or name in self._valid_configs: - ret["response"] = f"{name} is sacred!" - ret["success"] = False - else: - self._h.destroy_glob(name) - ret["response"] = f"Global {name} deleted." - return ret + if name == "GLOB_SENTINEL": + return f"{name} is sacred!" + + self._h.destroy_glob(name) + return [f"{name} Deleted."] @Interface.admin_api() def global_sentinel_set(self, snt: Sentinel = None): diff --git a/jaseci_core/jaseci/extens/api/object_api.py b/jaseci_core/jaseci/extens/api/object_api.py index 4cb4c97d9b..7a6d674e9c 100644 --- a/jaseci_core/jaseci/extens/api/object_api.py +++ b/jaseci_core/jaseci/extens/api/object_api.py @@ -15,13 +15,6 @@ def __init__(self): self.perm_default = "private" self._valid_perms = ["public", "private", "read_only"] - @Interface.private_api(cli_args=["name"]) - def global_get(self, name: str): - """ - Get a global var - """ - return {"value": self._h.get_glob(name)} - @Interface.private_api(cli_args=["obj"]) def object_get(self, obj: Element, depth: int = 0, detailed: bool = False): """Returns object details for any Jaseci object.""" diff --git a/jaseci_core/jaseci/jsorc/jsorc.py b/jaseci_core/jaseci/jsorc/jsorc.py index 7ebe41b922..ed3980f773 100644 --- a/jaseci_core/jaseci/jsorc/jsorc.py +++ b/jaseci_core/jaseci/jsorc/jsorc.py @@ -75,7 +75,7 @@ def configure(cls): if cls.db_check(): hook = cls.hook() - config = hook.get_or_create_glob("JSORC_CONFIG", config) + config = hook.resolve_conf("JSORC_CONFIG", config) cls._config = config cls._backoff_interval = max(5, config.get("backoff_interval", 10)) @@ -228,10 +228,10 @@ def _svc(cls, service: str) -> cs: if cls.db_check(): hook = cls.hook(use_proxy=instance["proxy"]) - config = hook.get_or_create_glob(instance["config"], config) + config = hook.resolve_conf(instance["config"], config) manifest = ( - hook.get_or_create_glob(instance["manifest"], manifest) + hook.resolve_conf(instance["manifest"], manifest) if instance["manifest"] else {} ) @@ -484,7 +484,7 @@ def regenerate_service(cls): if service.manifest and kube.is_running(): try: manifest = kube.resolve_manifest( - hook.get_or_create_glob( + hook.resolve_conf( service.source["manifest"], service.manifest ), *cls.overrided_namespace( @@ -492,7 +492,7 @@ def regenerate_service(cls): ), ) - rmhists: dict = hook.get_or_create_glob( + rmhists: dict = hook.resolve_conf( "RESOLVED_MANIFEST_HISTORY", {} ) diff --git a/jaseci_core/jaseci/jsorc/memory.py b/jaseci_core/jaseci/jsorc/memory.py index e1d56c0234..2a3bbc34ad 100644 --- a/jaseci_core/jaseci/jsorc/memory.py +++ b/jaseci_core/jaseci/jsorc/memory.py @@ -14,12 +14,11 @@ class MemoryHook: """ def __init__(self): - from jaseci.jsorc.live_actions import get_global_actions - - self.mem = {"global": {}} + self.mem = {"global": {}, "config": {}} self._machine = None self.save_obj_list = set() self.save_glob_dict = {} + self.save_conf_dict = {} #################################################### # COMMON GETTER/SETTER # @@ -97,13 +96,46 @@ def destroy_glob(self, name, persist=True): if persist: self.destroy_glob_from_store(name) - # ----------------- SERVICE GLOB ----------------- # + # --------------------- CONF --------------------- # - def get_or_create_glob(self, name, val): - if not self.has_glob(name): - self.save_glob(name, dumps(val)) + def get_conf(self, name): + """ + Get config from session cache by id, then try store + """ + return self.get_conf_from_store(name) + + def has_conf(self, name): + """ + Checks for config existance + """ + return self.has_conf_in_store(name) + + def resolve_conf(self, name, value): + """ + Util function for returning config if exists otherwise save a new one and return + """ + if not self.has_conf(name): + self.save_conf(name, dumps(value)) self.commit() - return loads(self.get_glob(name)) + return loads(self.get_conf(name)) + + def save_conf(self, name, value, persist=True): + """Save config to session cache, then to store""" + self.commit_conf_to_cache(name, value) + + if persist: + self.save_conf_dict[name] = value + + def list_conf(self): + """Lists all configs present""" + return self.list_conf_from_store() + + def destroy_conf(self, name, persist=True): + """Destroy config from session cache then store""" + self.decommit_conf_from_cache(name) + + if persist: + self.destroy_conf_from_store(name) #################################################### # DATASOURCE METHOD (TO BE OVERRIDE) # @@ -157,6 +189,32 @@ def list_glob_from_store(self): """Get list of global config to externally hooked general store""" return list(self.mem["global"].keys()) + # --------------------- CONF --------------------- # + + def get_conf_from_store(self, name): + """ + Get config from externally hooked general store by name + """ + if name in self.mem["config"]: + return self.mem["config"][name] + + return None + + def has_conf_in_store(self, name): + """ + Checks for config existance in store + """ + return name in self.mem["config"] + + def destroy_conf_from_store(self, name): + """Destroy config to externally hooked general store""" + if name in self.save_conf_dict: + self.save_conf_dict.pop(name) + + def list_conf_from_store(self): + """Get list of config to externally hooked general store""" + return list(self.mem["config"].keys()) + #################################################### # ------------------ COMMITTER ------------------- # #################################################### @@ -168,16 +226,21 @@ def commit(self, skip_cache=False): self.save_obj_list = set() - for i in self.save_glob_dict.keys(): - self.commit_glob_to_cache(name=i, value=self.save_glob_dict[i]) + for key, value in self.save_glob_dict.items(): + self.commit_glob_to_cache(name=key, value=value) self.save_glob_dict = {} + for key, value in self.save_conf_dict.items(): + self.commit_conf_to_cache(name=key, value=value) + + self.save_conf_dict = {} + ################################################### # CACHE CONTROL (SHOULD NOT OVERRIDEN ON ORM) # ################################################### - # -------------------- GLOBS -------------------- # + # -------------------- GLOB -------------------- # def commit_glob_to_cache(self, name, value): self.mem["global"][name] = value @@ -185,6 +248,14 @@ def commit_glob_to_cache(self, name, value): def decommit_glob_from_cache(self, name): self.mem["global"].pop(name) + # -------------------- CONF -------------------- # + + def commit_conf_to_cache(self, name, value): + self.mem["config"][name] = value + + def decommit_conf_from_cache(self, name): + self.mem["config"].pop(name) + # --------------------- OBJ --------------------- # def has_id_in_mem_cache(self, id): diff --git a/jaseci_core/jaseci/jsorc/redis.py b/jaseci_core/jaseci/jsorc/redis.py index c44c935e27..6619821ff4 100644 --- a/jaseci_core/jaseci/jsorc/redis.py +++ b/jaseci_core/jaseci/jsorc/redis.py @@ -96,11 +96,45 @@ def list_glob_from_store(self): return globs + # --------------------- CONF --------------------- # + + def get_conf_from_store(self, name): + """ + Get config from externally hooked general store by name + """ + glob = super().get_conf_from_store(name) + + if glob is None and self.redis.is_running(): + glob = self.redis.hget("config", name) + + if glob: + self.red_touch_count += 1 + super().commit_conf_to_cache(name, glob) + + return glob + + def has_conf_in_store(self, name): + """ + Checks for config existance in store + """ + return super().has_conf_in_store(name) or ( + self.redis.is_running() and self.redis.hexists("config", name) + ) + + def list_conf_from_store(self): + """Get list of config to externally hooked general store""" + globs = super().list_conf_from_store() + + if not globs and self.redis.is_running(): + globs = self.redis.hkeys("config") + + return globs + ################################################### # CACHE CONTROL (SHOULD NOT OVERRIDEN ON ORM) # ################################################### - # -------------------- GLOBS -------------------- # + # -------------------- GLOB -------------------- # def commit_glob_to_cache(self, name, value): super().commit_glob_to_cache(name, value) @@ -113,6 +147,19 @@ def decommit_glob_from_cache(self, name): if self.redis.is_running(): self.redis.hdel("global", name) + # -------------------- CONF -------------------- # + + def commit_conf_to_cache(self, name, value): + super().commit_conf_to_cache(name, value) + if self.redis.is_running(): + self.redis.hset("config", name, value) + + def decommit_conf_from_cache(self, name): + super().decommit_conf_from_cache(name) + + if self.redis.is_running(): + self.redis.hdel("config", name) + # --------------------- OBJ --------------------- # def commit_obj_to_cache(self, item, all_caches=False): diff --git a/jaseci_core/jaseci/utils/utils.py b/jaseci_core/jaseci/utils/utils.py index 9e98563894..287acda945 100644 --- a/jaseci_core/jaseci/utils/utils.py +++ b/jaseci_core/jaseci/utils/utils.py @@ -16,6 +16,7 @@ import traceback import inspect import unittest +from json import dumps, loads from time import time from pathlib import Path from pprint import pformat @@ -376,3 +377,35 @@ def model_base_path(cache_dir: Union[str, Path]) -> Path: else: model_cache = cache_dir return model_cache + + +def manipulate_data(data, field_key, value): + data = loads(data) + keys = [] + if isinstance(field_key, int): + keys = [field_key] + elif isinstance(field_key, list): + keys = field_key + field_key = ".".join(field_key) + elif isinstance(field_key, tuple): + keys = list(field_key) + field_key = ".".join(field_key) + else: + keys = field_key.split(".") + + target = data + key_length = len(keys) + while key_length: + key = keys.pop(0) + if key_length == 1: + if isinstance(target, list): + target[int(key)] = value + else: + target[key] = value + elif key_length > 1: + if isinstance(target, list): + target = target[int(key)] + else: + target = target[key] + key_length = len(keys) + return dumps(data) diff --git a/jaseci_serv/jaseci_serv/base/admin.py b/jaseci_serv/jaseci_serv/base/admin.py index 7eb022ba01..54ff40aafb 100644 --- a/jaseci_serv/jaseci_serv/base/admin.py +++ b/jaseci_serv/jaseci_serv/base/admin.py @@ -60,3 +60,12 @@ class GlobalVarsAdmin(admin.ModelAdmin): admin.site.register(models.GlobalVars, GlobalVarsAdmin) + + +class ConfigVarsAdmin(admin.ModelAdmin): + ordering = ["name"] + list_display = ("name", "value") + search_fields = ["name", "value"] + + +admin.site.register(models.ConfigVars, ConfigVarsAdmin) diff --git a/jaseci_serv/jaseci_serv/base/models.py b/jaseci_serv/jaseci_serv/base/models.py index cc301add00..9df3345457 100644 --- a/jaseci_serv/jaseci_serv/base/models.py +++ b/jaseci_serv/jaseci_serv/base/models.py @@ -13,17 +13,12 @@ from jaseci.extens.api.interface import Interface from jaseci.prim.master import Master as CoreMaster from jaseci.prim.super_master import SuperMaster as CoreSuper -from jaseci_serv.settings import JASECI_CONFIGS from jaseci.jsorc.jsorc import JsOrc from jaseci_serv.base.jsorc import JsOrcApi @JsOrc.context(name="master", priority=1) class Master(CoreMaster): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._valid_configs += JASECI_CONFIGS - def user_creator(self, name, password, other_fields: dict = {}, send_email=True): """ Create a master instance and return root node master object @@ -250,6 +245,9 @@ class JaseciObject(models.Model): j_rw_acc_ids = models.TextField(blank=True) jsci_obj = models.TextField(blank=True) + class Meta: + verbose_name_plural = "Jaseci Objects" + class GlobalVars(models.Model): """Global configuration item""" @@ -257,6 +255,9 @@ class GlobalVars(models.Model): name = models.CharField(max_length=31, unique=True) value = models.TextField(blank=True) + class Meta: + verbose_name_plural = "Global Vars" + def lookup_global_config(name, default=None): """Helper for looking up GlobalVars, returns default if not found""" @@ -264,3 +265,13 @@ def lookup_global_config(name, default=None): return GlobalVars.objects.get(name=name).value except GlobalVars.DoesNotExist: return default + + +class ConfigVars(models.Model): + """Global configuration item""" + + name = models.CharField(max_length=31, unique=True) + value = models.TextField(blank=True) + + class Meta: + verbose_name_plural = "Config Vars" diff --git a/jaseci_serv/jaseci_serv/hook/orm.py b/jaseci_serv/jaseci_serv/hook/orm.py index 32653f543f..a1e96ff1e3 100644 --- a/jaseci_serv/jaseci_serv/hook/orm.py +++ b/jaseci_serv/jaseci_serv/hook/orm.py @@ -27,10 +27,11 @@ class OrmHook(RedisHook): """ def __init__(self): - from jaseci_serv.base.models import GlobalVars, JaseciObject + from jaseci_serv.base.models import GlobalVars, JaseciObject, ConfigVars self.objects = JaseciObject.objects self.globs = GlobalVars.objects + self.confs = ConfigVars.objects self.db_touch_count = 0 super().__init__() @@ -150,6 +151,68 @@ def destroy_glob_from_store(self, name): except OperationalError as e: logger.error(f"Operation failed due to {e}") + # --------------------- CONF --------------------- # + + def get_conf_from_store(self, name): + """ + Get config from externally hooked general store by name + """ + + conf = super().get_conf_from_store(name) + if conf is None: + try: + conf = self.confs.get(name=name).value + self.db_touch_count += 1 + except ObjectDoesNotExist: + logger.error( + str(f"Config {name} does not exist in Django ORM!"), exc_info=True + ) + return None + except OperationalError as e: + logger.error(f"Operation failed due to {e}") + return None + + super().commit_conf_to_cache(name, conf) + return conf + return conf + + def has_conf_in_store(self, name): + """ + Checks for config existance in store + """ + ret = super().has_conf_in_store(name) + + if not ret: + try: + return self.confs.filter(name=name).count() > 0 + except OperationalError as e: + logger.error(f"Operation failed due to {e}") + logger.error(name) + + return ret + + def list_conf_from_store(self): + """Get list of config to externally hooked general store""" + confs = super().list_conf_from_store() + + if not confs: + try: + return [entry["name"] for entry in self.confs.values("name")] + except OperationalError as e: + logger.error(f"Operation failed due to {e}") + + return confs + + def destroy_conf_from_store(self, name): + """Destroy config to externally hooked general store""" + super().destroy_glob_from_store(name) + try: + self.confs.get(name=name).delete() + except ObjectDoesNotExist: + pass + except OperationalError as e: + logger.error(f"Operation failed due to {e}") + #################################################### # COMMITTER # #################################################### @@ -172,6 +235,15 @@ def commit_glob(self, name, value): except OperationalError as e: logger.error(f"Operation failed due to {e}") + def commit_conf(self, name, value): + self.commit_glob_to_cache(name, value) + try: + item_from_db, created = self.confs.get_or_create(name=name) + item_from_db.value = value + item_from_db.save() + except OperationalError as e: + logger.error(f"Operation failed due to {e}") + def commit(self, skip_cache=False): """Write through all saves to store""" for i in self.save_obj_list: @@ -184,6 +256,10 @@ def commit(self, skip_cache=False): self.commit_glob(k, v) self.save_glob_dict = {} + for k, v in self.save_conf_dict.items(): + self.commit_conf(k, v) + self.save_conf_dict = {} + def map_assignment_of_matching_fields(dest, source): """ diff --git a/jaseci_serv/jaseci_serv/jac_api/tests/test_jac_admin_api.py b/jaseci_serv/jaseci_serv/jac_api/tests/test_jac_admin_api.py index d44a59fc85..bf12645938 100644 --- a/jaseci_serv/jaseci_serv/jac_api/tests/test_jac_admin_api.py +++ b/jaseci_serv/jaseci_serv/jac_api/tests/test_jac_admin_api.py @@ -40,12 +40,7 @@ def test_jac_api_config_index_has_core(self): def test_jac_api_create_config(self): """Test API for creating a config""" - payload = { - "op": "config_set", - "name": "EMAIL_HOST_USER", - "value": "val1", - "do_check": False, - } + payload = {"op": "config_set", "name": "EMAIL_HOST_USER", "value": "val1"} res = self.client.post( reverse(f'jac_api:{payload["op"]}'), payload, format="json" ) diff --git a/jaseci_serv/jaseci_serv/settings.py b/jaseci_serv/jaseci_serv/settings.py index 48c817525c..230cfa3d82 100644 --- a/jaseci_serv/jaseci_serv/settings.py +++ b/jaseci_serv/jaseci_serv/settings.py @@ -199,23 +199,5 @@ LOGIN_REDIRECT_URL = "/ui" LOGOUT_REDIRECT_URL = "/ui" -# Configs to Manage by Jaseci -JASECI_CONFIGS = [ - "EMAIL_BACKEND", - "EMAIL_USE_TLS", - "EMAIL_HOST", - "EMAIL_HOST_USER", - "EMAIL_HOST_PASSWORD", - "EMAIL_PORT", - "EMAIL_DEFAULT_FROM", - "EMAIL_ACTIVATION_SUBJ", - "EMAIL_ACTIVATION_BODY", - "EMAIL_ACTIVATION_HTML_BODY", - "EMAIL_RESETPASS_SUBJ", - "EMAIL_RESETPASS_BODY", - "EMAIL_RESETPASS_HTML_BODY", - "LOGIN_TOKEN_TTL_HOURS", -] - DJANGO_CELERY_BEAT_TZ_AWARE = False DEFAULT_AUTO_FIELD = "django.db.models.AutoField"