From 9a7dc6d43e63fe776e5d4053786595a97c4aabda Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Tue, 19 Feb 2019 16:40:47 +0100 Subject: [PATCH 1/2] Be able to define hook to trigger after changing a setting value --- src/yunohost/settings.py | 51 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/src/yunohost/settings.py b/src/yunohost/settings.py index bbfb3ca56..cb98fa57e 100644 --- a/src/yunohost/settings.py +++ b/src/yunohost/settings.py @@ -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,44 @@ 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(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(old_value, new_value): +# # Do some stuff +# +# =========================================== + + +#@post_change_hook("example.int") +#def myfunc(old_value, new_value): +# print("In hook") +# print(old_value) +# print(new_value) From c029ccb7ad80f415fb3831bf5fc9dce217d8ee97 Mon Sep 17 00:00:00 2001 From: Alexandre Aubin Date: Thu, 21 Feb 2019 15:07:06 +0100 Subject: [PATCH 2/2] Also feed the setting name when calling setting hook --- src/yunohost/settings.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/yunohost/settings.py b/src/yunohost/settings.py index cb98fa57e..81ea46114 100644 --- a/src/yunohost/settings.py +++ b/src/yunohost/settings.py @@ -264,7 +264,7 @@ def trigger_post_change_hook(setting_name, old_value, new_value): return f = post_change_hooks[setting_name] - f(old_value, new_value) + f(setting_name, old_value, new_value) # =========================================== @@ -273,14 +273,15 @@ def trigger_post_change_hook(setting_name, old_value, new_value): # You can define such an action with : # # @post_change_hook("your.setting.name") -# def some_function_name(old_value, new_value): +# def some_function_name(setting_name, old_value, new_value): # # Do some stuff # # =========================================== #@post_change_hook("example.int") -#def myfunc(old_value, new_value): +#def myfunc(setting_name, old_value, new_value): # print("In hook") +# print(setting_name) # print(old_value) # print(new_value)