#!/usr/bin/env python3 # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import json import logging import os import sys from collections import OrderedDict import yaml from weblate_utils import IniConfig from weblate_utils import WeblateRestService WEBLATE_URI = "https://openstack.weblate.cloud/api/%s" LOG = logging.getLogger("weblate_users") YAML_COMMENT = """\ # This file is generated by tools/weblate/weblate_users.py. """ class WeblateUtility(object): """Utilities to collect Weblate language contributors""" def __init__(self, wconfig): accept = 'application/json' content_type = 'application/json' self.rest_service = WeblateRestService(wconfig, accept=accept, content_type=content_type) def read_uri(self, uri): try: req = self.rest_service.query(uri) return req.text except Exception as e: LOG.error( 'Error "%(error)s" while reading uri %(uri)s', {"error": e, "uri": uri} ) raise def read_json_from_uri(self, uri): data = self.read_uri(uri) try: return json.loads(data) except Exception as e: LOG.error( 'Error "%(error)s" parsing json from uri %(uri)s', {"error": e, "uri": uri}, ) raise def get_users(self): uri = WEBLATE_URI % "users/" LOG.debug( "Reading the list of all users from %s" % uri ) users_data = self.read_json_from_uri(uri) return users_data def get_languages(self): uri = WEBLATE_URI % "groups/" languages = {} while True: LOG.debug("Reading the list of languages from %s" % uri) groups_data = self.read_json_from_uri(uri) for group in groups_data["results"]: for language in group["languages"]: language_data = self.read_json_from_uri(language) languages[language_data["name"]] = { "language": language_data["code"], "translators": [], } if groups_data["next"] is None: break else: uri = groups_data["next"] return languages def get_user_language(self, user): groups = user["groups"] languages = [] for group in groups: group_data = self.read_json_from_uri(group) for language in group_data["languages"]: language_data = self.read_json_from_uri(language) languages.append(language_data["name"]) return languages def save_to_yaml(data, output_file): with open(output_file, "w") as out: out.write(YAML_COMMENT) for k, v in data.items(): yaml.safe_dump( {k: v}, out, allow_unicode=True, indent=4, encoding="utf-8", default_flow_style=False, ) def collect_weblate_groups_and_users(wc): weblate = WeblateUtility(wc) LOG.info("Retrieving language list") languages = weblate.get_languages() users = weblate.get_users()["results"] for user in users: LOG.info("Getting language list from user %s" % user["username"]) user_language = weblate.get_user_language(user) for language in languages.keys(): if language in user_language: languages[language]["translators"].append(user["username"]) result = OrderedDict((k, languages[k]) for k in sorted(languages)) return result if __name__ == "__main__": # Loads weblate.ini configuration file try: wc = IniConfig(os.path.expanduser('~/.config/weblate.ini')) except ValueError as e: sys.exit(e) parser = argparse.ArgumentParser() parser.add_argument( "-o", "--output-file", default="translation_team.yaml", help="Specify the output file. " "Default: translation_team.yaml", ) options = parser.parse_args() output_file = options.output_file data = collect_weblate_groups_and_users(wc) save_to_yaml(data, output_file) print("output is saved to filename: %s" % output_file)