mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
Merge pull request #654 from YunoHost/trigger-actions-when-changing-settings
[enh] Be able to define hook to trigger when changing a setting
This commit is contained in:
commit
0320ca9402
1 changed files with 51 additions and 1 deletions
|
@ -115,10 +115,18 @@ def settings_set(key, value):
|
||||||
raise YunohostError('global_settings_unknown_type', setting=key,
|
raise YunohostError('global_settings_unknown_type', setting=key,
|
||||||
unknown_type=key_type)
|
unknown_type=key_type)
|
||||||
|
|
||||||
|
old_value = settings[key].get("value")
|
||||||
settings[key]["value"] = value
|
settings[key]["value"] = value
|
||||||
|
|
||||||
_save_settings(settings)
|
_save_settings(settings)
|
||||||
|
|
||||||
|
# TODO : whatdo if the old value is the same as
|
||||||
|
# the new value...
|
||||||
|
try:
|
||||||
|
trigger_post_change_hook(key, old_value, value)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error("Post-change hook for setting %s failed : %s" % (key, e))
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
def settings_reset(key):
|
def settings_reset(key):
|
||||||
"""
|
"""
|
||||||
|
@ -235,3 +243,45 @@ def _save_settings(settings, location=SETTINGS_PATH):
|
||||||
settings_fd.write(result)
|
settings_fd.write(result)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise YunohostError('global_settings_cant_write_settings', reason=e)
|
raise YunohostError('global_settings_cant_write_settings', reason=e)
|
||||||
|
|
||||||
|
|
||||||
|
# Meant to be a dict of setting_name -> function to call
|
||||||
|
post_change_hooks = {}
|
||||||
|
|
||||||
|
|
||||||
|
def post_change_hook(setting_name):
|
||||||
|
def decorator(func):
|
||||||
|
assert setting_name in DEFAULTS.keys(), "The setting %s does not exists" % setting_name
|
||||||
|
assert setting_name not in post_change_hooks, "You can only register one post change hook per setting (in particular for %s)" % setting_name
|
||||||
|
post_change_hooks[setting_name] = func
|
||||||
|
return func
|
||||||
|
return decorator
|
||||||
|
|
||||||
|
|
||||||
|
def trigger_post_change_hook(setting_name, old_value, new_value):
|
||||||
|
if setting_name not in post_change_hooks:
|
||||||
|
logger.debug("Nothing to do after changing setting %s" % setting_name)
|
||||||
|
return
|
||||||
|
|
||||||
|
f = post_change_hooks[setting_name]
|
||||||
|
f(setting_name, old_value, new_value)
|
||||||
|
|
||||||
|
|
||||||
|
# ===========================================
|
||||||
|
#
|
||||||
|
# Actions to trigger when changing a setting
|
||||||
|
# You can define such an action with :
|
||||||
|
#
|
||||||
|
# @post_change_hook("your.setting.name")
|
||||||
|
# def some_function_name(setting_name, old_value, new_value):
|
||||||
|
# # Do some stuff
|
||||||
|
#
|
||||||
|
# ===========================================
|
||||||
|
|
||||||
|
|
||||||
|
#@post_change_hook("example.int")
|
||||||
|
#def myfunc(setting_name, old_value, new_value):
|
||||||
|
# print("In hook")
|
||||||
|
# print(setting_name)
|
||||||
|
# print(old_value)
|
||||||
|
# print(new_value)
|
||||||
|
|
Loading…
Add table
Reference in a new issue