#! /usr/bin/env python3 import argparse import os import sys import json import csv def _vlog(text): if verbose: print(text) def _add_translation(key): value = input('translate "' + key + '" to: ') if len(value) == 0: print(' --> skipped') return key translation_dictionay.update({ key : value }) with open(translation_file, 'w') as tf: json.dump(translation_dictionay, tf, sort_keys=True, indent=4) return value def _translated(t): if t in translation_dictionay: return translation_dictionay[t] elif translation_input == True: return _add_translation(t) else: return t def _read_translation_file(translation_file): if os.path.exists(translation_file): with open(translation_file, 'r') as tf: return json.load(tf) else: return {} def _get_setting_value(project_name, setting_name, project_settings): single_project_settings = project_settings[project_name] for family_name, settings in single_project_settings.items(): for setting, value in settings.items(): if setting == setting_name: if type(value) is type(''): return value; else: if value == True: return 'x' else: return '' return '' def _get_project_name(settings_file): l = settings_file.split('/') return l[len(l) - 3] def _write_settings_to_csv(project_settings): setting_list = [] field_names = [] for project_name, settings_family in project_settings.items(): field_names.append(project_name) for family_name, settings in settings_family.items(): for setting, value in settings.items(): if not setting in setting_list: setting_list.append(setting) field_names.sort() field_names.insert(0, 'Setting') _vlog(str(len(setting_list)) + ' different settings in total') with open(output_file, mode='w') as csv_file: writer = csv.DictWriter(csv_file, fieldnames=field_names, delimiter=';') writer.writeheader() rows = [] for setting in setting_list: row = {} for field_name in field_names: if field_name == field_names[0]: row.update({field_name : _translated(setting)}) else: row.update({field_name : _get_setting_value(field_name, setting, project_settings)}) rows.append(row) rows.sort(key = lambda row : row['Setting'].upper()) for row in rows: writer.writerow(row) def _parse_settings_file(settings_file): project_name = _get_project_name(settings_file) _vlog('#####################################################') _vlog('# Parsing settings file for project ' + project_name) _vlog('#####################################################') sf = open(settings_file, 'r') project_settings = json.load(sf)['ProjectSettings'] sf.close() ignore_list = [ 'nagios', 'sps', 'recording', 'EquipmentLanguages', 'egcuUsesOnlyOneRelay', 'useExactPositioning' ] settings = {} # [setting_family][setting][value] for setting_family in project_settings: _vlog('Found setting family "' + setting_family + '"') if setting_family == 'Functionalities': settings[setting_family] = {} for setting in project_settings[setting_family]['IdentifierList']['Default']: settings[setting_family][setting] = True elif setting_family == 'SituationMap': continue elif setting_family == 'Office': settings[setting_family] = {'Office' : project_settings[setting_family]['Type']['Default']} else: if not setting_family in settings: settings[setting_family] = {} for setting in project_settings[setting_family]: _vlog(' - setting ' + setting) if setting in ignore_list: _vlog(' --> ignored') continue if setting.startswith('enable') or setting == 'SystemLanguages': value = project_settings[setting_family][setting]['Default'] settings[setting_family][setting] = value _vlog(' --> stored with value "' + str(value) + '"') else: print(_get_project_name(settings_file) + ' > ' + setting_family + ' > ' + setting + ' is not treated!!!') return { project_name : settings } def _find_settings(directory): setting_files = [] entries = os.walk(directory) for root, dirs, files in os.walk(directory, topdown=True): for name in files: if name == 'project_settings.json': settings_file = os.path.join(root, name) setting_files.append(settings_file) _vlog('Found file: "' + settings_file + '"') return setting_files def _parse_args(): parser = argparse.ArgumentParser(description='Starts searching recursivle for "project_settings.json" files in a given directory and converts them to CSV format.') parser.add_argument('-d', '--directory', default='.', help='starts searching in the given directory (default: ".", best value is ".../Lts/Projects/")', type=str) parser.add_argument('-v', '--verbose', help='verbose logging', action='store_true', dest='verbose') parser.add_argument('-t', '--translation_file', default='./project_settings_translation.json', help='file for translation of setting names (default: "./project_settings_translation.json")', type=str) parser.add_argument('-i', '--translation_input', help='ask for terms which are not translated', action='store_true', dest='translation_input') parser.add_argument('-o', '--output_file', default='./project_settings_overview.csv', help='output file (default: "./project_settings_overview.csv")', type=str) return parser.parse_args() def _main(): args = _parse_args() global verbose global translation_dictionay global translation_input global translation_file global output_file verbose = args.verbose translation_input = args.translation_input translation_file = args.translation_file translation_dictionay = _read_translation_file(translation_file) output_file = args.output_file if not output_file.endswith('.csv'): output_file = output_file + '.csv' if not os.path.isdir(args.directory): print('ERROR: "' + args.directory + '" is not a valid directory. Aborting.') exit() project_settings = {} for settings_file in _find_settings(args.directory): project_settings.update(_parse_settings_file(settings_file)) _write_settings_to_csv(project_settings) if __name__ == '__main__': sys.exit(_main())