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:
Alexandre Aubin 2019-02-25 00:51:33 +01:00 committed by GitHub
commit 0320ca9402
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -115,10 +115,18 @@ def settings_set(key, value):
raise YunohostError('global_settings_unknown_type', setting=key,
unknown_type=key_type)
old_value = settings[key].get("value")
settings[key]["value"] = value
_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):
"""
@ -235,3 +243,45 @@ def _save_settings(settings, location=SETTINGS_PATH):
settings_fd.write(result)
except Exception as 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)