# HG changeset patch # User Martin Bornhold # Date 2016-07-06 14:33:56 # Node ID cac3b481fa809fcc6ed293aff9e8b663d20c82ed # Parent 6dd024fc8513979ee50eb2a2a3cde881d5dc551e api: Add api methods to get/set repository settings, implements #4021 diff --git a/rhodecode/api/views/repo_api.py b/rhodecode/api/views/repo_api.py --- a/rhodecode/api/views/repo_api.py +++ b/rhodecode/api/views/repo_api.py @@ -43,7 +43,7 @@ from rhodecode.model.db import ( from rhodecode.model.repo import RepoModel from rhodecode.model.repo_group import RepoGroupModel from rhodecode.model.scm import ScmModel, RepoList -from rhodecode.model.settings import SettingsModel +from rhodecode.model.settings import SettingsModel, VcsSettingsModel from rhodecode.model.validation_schema import RepoSchema log = logging.getLogger(__name__) @@ -1773,3 +1773,110 @@ def strip(request, apiuser, repoid, revi 'Unable to strip commit %s from repo `%s`' % ( revision, repo.repo_name) ) + + +@jsonrpc_method() +def get_repo_settings(request, apiuser, repoid, key=Optional(None)): + """ + Returns all settings for a repository. If key is given it only returns the + setting identified by the key or null. + + :param apiuser: This is filled automatically from the |authtoken|. + :type apiuser: AuthUser + :param repoid: The repository name or repository id. + :type repoid: str or int + :param key: Key of the setting to return. + :type: key: Optional(str) + + Example output: + + .. code-block:: bash + + { + "error": null, + "id": 237, + "result": { + "extensions_largefiles": true, + "hooks_changegroup_push_logger": true, + "hooks_changegroup_repo_size": false, + "hooks_outgoing_pull_logger": true, + "phases_publish": "True", + "rhodecode_hg_use_rebase_for_merging": true, + "rhodecode_pr_merge_enabled": true, + "rhodecode_use_outdated_comments": true + } + } + """ + + # Restrict access to this api method to admins only. + if not has_superadmin_permission(apiuser): + raise JSONRPCForbidden() + + try: + repo = get_repo_or_error(repoid) + settings_model = VcsSettingsModel(repo=repo) + settings = settings_model.get_global_settings() + settings.update(settings_model.get_repo_settings()) + + # If only a single setting is requested fetch it from all settings. + key = Optional.extract(key) + if key is not None: + settings = settings.get(key, None) + except Exception: + msg = 'Failed to fetch settings for repository `{}`'.format(repoid) + log.exception(msg) + raise JSONRPCError(msg) + + return settings + + +@jsonrpc_method() +def set_repo_settings(request, apiuser, repoid, settings): + """ + Update repository settings. Returns true on success. + + :param apiuser: This is filled automatically from the |authtoken|. + :type apiuser: AuthUser + :param repoid: The repository name or repository id. + :type repoid: str or int + :param settings: The new settings for the repository. + :type: settings: dict + + Example output: + + .. code-block:: bash + + { + "error": null, + "id": 237, + "result": true + } + """ + # Restrict access to this api method to admins only. + if not has_superadmin_permission(apiuser): + raise JSONRPCForbidden() + + if type(settings) is not dict: + raise JSONRPCError('Settings have to be a JSON Object.') + + try: + settings_model = VcsSettingsModel(repo=repoid) + + # Merge global, repo and incoming settings. + new_settings = settings_model.get_global_settings() + new_settings.update(settings_model.get_repo_settings()) + new_settings.update(settings) + + # Update the settings. + inherit_global_settings = new_settings.get( + 'inherit_global_settings', False) + settings_model.create_or_update_repo_settings( + new_settings, inherit_global_settings=inherit_global_settings) + Session().commit() + except Exception: + msg = 'Failed to update settings for repository `{}`'.format(repoid) + log.exception(msg) + raise JSONRPCError(msg) + + # Indicate success. + return True