diff --git a/sonar/permissions/permission_templates.py b/sonar/permissions/permission_templates.py index 687ae63c..c8259bf2 100644 --- a/sonar/permissions/permission_templates.py +++ b/sonar/permissions/permission_templates.py @@ -42,7 +42,7 @@ _CREATE_API = "permissions/create_template" _UPDATE_API = "permissions/update_template" -_IMPORTABLE_PROPERTIES = ("name", "description", "pattern", "permissions", "defaultFor") +_IMPORTABLE_PROPERTIES = ("name", "description", "pattern", "defaultFor", "permissions") class PermissionTemplate(sqobject.SqObject): diff --git a/sonar/platform.py b/sonar/platform.py index 9a1de796..bfa62a79 100644 --- a/sonar/platform.py +++ b/sonar/platform.py @@ -503,8 +503,21 @@ def export(self, export_settings: types.ConfigSettings, full: bool = False) -> t if not self.is_sonarcloud(): json_data[settings.DEVOPS_INTEGRATION] = devops.export(self, export_settings=export_settings) - order = list(settings.CATEGORIES) + ["permissions", "permissionTemplates"] - return {k: json_data[k] for k in order if k in json_data} | {k: v for k, v in json_data.items() if k not in order} + # Convert dicts to lists + special_categories = (settings.LANGUAGES_SETTINGS, settings.DEVOPS_INTEGRATION, "permissions", "permissionTemplates") + for categ in [c for c in settings.CATEGORIES if c not in special_categories]: + json_data[categ] = util.sort_list_by_key(util.dict_to_list(json_data[categ], "key"), "key") + for k, v in json_data[settings.LANGUAGES_SETTINGS].items(): + json_data[settings.LANGUAGES_SETTINGS][k] = util.sort_list_by_key(util.dict_to_list(v, "key"), "key") + json_data[settings.LANGUAGES_SETTINGS] = util.dict_to_list(json_data[settings.LANGUAGES_SETTINGS], "language", "settings") + json_data[settings.DEVOPS_INTEGRATION] = util.dict_to_list(json_data[settings.DEVOPS_INTEGRATION], "key") + json_data["permissions"] = util.perms_to_list(json_data["permissions"]) + for k, v in json_data["permissionTemplates"].items(): + if "permissions" in v: + v["permissions"] = util.perms_to_list(v["permissions"]) + json_data["permissionTemplates"] = util.dict_to_list(json_data["permissionTemplates"], "key") + + return util.order_dict(json_data, list(settings.CATEGORIES) + ["permissions", "permissionTemplates"]) def set_webhooks(self, webhooks_data: types.ObjectJsonRepr) -> bool: """Sets global webhooks with a list of webhooks represented as JSON diff --git a/sonar/utilities.py b/sonar/utilities.py index f4910d81..f005774f 100644 --- a/sonar/utilities.py +++ b/sonar/utilities.py @@ -24,6 +24,7 @@ """ from typing import Any, TextIO, Union, Optional +from collections.abc import Generator from http import HTTPStatus import sys import os @@ -460,7 +461,7 @@ def is_api_v2(api: str) -> bool: @contextlib.contextmanager -def open_file(file: Optional[str] = None, mode: str = "w") -> TextIO: +def open_file(file: Optional[str] = None, mode: str = "w") -> Generator[TextIO, None, None]: """Opens a file if not None or -, otherwise stdout""" if file and file != "-": log.debug("Opening file '%s' in directory '%s'", file, os.getcwd()) @@ -850,3 +851,8 @@ def order_list(l: list[str], *key_order) -> list[str]: """Orders elements of a list in a given order""" new_l = [k for k in key_order if k in l] return new_l + [k for k in l if k not in new_l] + + +def perms_to_list(perms: dict[str, Any]) -> list[str, Any]: + """Converts permissions in dict format to list format""" + return dict_to_list(perms.get("groups", {}), "group", "permissions") + dict_to_list(perms.get("users", {}), "user", "permissions")