From d4061411da6aaadb0fbba67809ab11fa2b227ef4 Mon Sep 17 00:00:00 2001 From: Wolfram Date: Wed, 2 Apr 2025 20:58:45 +0200 Subject: [PATCH] 2025.4 --- README.md | 5 + config-generator.py | 2 +- import-dhall.py | 320 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 326 insertions(+), 1 deletion(-) create mode 100644 import-dhall.py diff --git a/README.md b/README.md index 6b791b2..0600826 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,11 @@ Dokumentation unter [https://elem74.github.io/fabaccess-config-generator-docs/]( # Changelog +## 2025.4 +**Neuerungen** + - Unterstützung für Initiatoren. + - Import einer bestehenden `bffh.dhall`. + ## 2025.2 **Neuerungen** - Option zur Erstellung eines Domänen-Managers (`manager_domain`). diff --git a/config-generator.py b/config-generator.py index a81be25..540a762 100755 --- a/config-generator.py +++ b/config-generator.py @@ -1,6 +1,6 @@ #!/usr/bin/env python -__version__ = '2025.2' +__version__ = '2025.4' import os import sys diff --git a/import-dhall.py b/import-dhall.py new file mode 100644 index 0000000..9f63399 --- /dev/null +++ b/import-dhall.py @@ -0,0 +1,320 @@ +# Rich-Module +try: + from rich.table import Table + from rich.console import Console + from rich.text import Text + module_rich = True +except ImportError: + module_rich = False + +from generator.globals import csv_match + +# -------------------------------------------------- + +class ImportedMachine: + def __init__(self, id): + self.id = id + self.actor = '' + self.name = '' + self.description = '' + self.wiki = '' + self.category = '' + + def set_actor(self, var): + self.actor = var + + def set_name(self, var): + self.name = var + + def set_description(self, var): + self.description = var + + def set_wiki(self, var): + self.wiki = var + + def set_category(self, var): + self.category = var + + def get_specs(self): + specs = { + "id": self.id, + "name": self.name, + "description": self.description, + "actor": self.actor, + "wiki": self.wiki, + "category": self.category + } + return specs + +def dhall_parse(dhall_file): + + display = [] + + prettynames = { + 'machines': 'Maschine', + 'actor_connections': 'Aktorenverbindung' + } + + machines = {} + + with open(dhall_file, 'r', encoding='utf-8-sig') as dhall_data: + + status_section = 'none' + + level = 1 + + # 0 = Datei + # 1 = Konfiguration + # 2 = Sektion + # 3 = Eintrag + + for line in dhall_data: + + l = line.replace('\n', '') + + if status_section == 'none': + + if ('actor_connections' not in line) and ('machines' not in line): + continue + + # if ('actor_connections' in line) or ('machines' in line): + # print('-- section found ') + + save_data = {} + save_var = 0 + + if status_section != 'actor_connections': + if '{' in line or '[' in line: + level += line.count('{') + level += line.count('[') + + if '}' in line and status_section != 'actor_connections': + level -= line.count('}') + + if ']' in line and status_section == 'actor_connections': + level -= line.count(']') + + # print(f'{level}: {status_section} {l}') + + match(level): + case 1: + status_section = 'none' + + # Sektion gefunden? + case 2: + if status_section == 'none': + if ('machines' in line) and ('=' in line): + status_section = 'machines' + # print(' |-- machines found') + continue + + if ('actor_connections' in line) and ('=' in line): + status_section = 'actor_connections' + # print(' |-- actor_connections found') + continue + + # Maschineneintrag gefunden? + if status_section == 'machines': + + if '=' in line: + + # print(' |-- machine found') + id = ( + line.split('=')[0] + .replace(' ', '') + .strip() + ) + + machines[id] = ImportedMachine(id) + # print(f'{level}: id = |{id}|') + + display.append( + { + 'section': prettynames[status_section], + 'id': id, + 'actor': '' + } + ) + + continue + + if status_section == 'actor_connections': + + if '=' in line: + # print(' |-- actorconnection found') + save_var = 1 + + temp = ( + line.replace('"', '') + .replace('\'', '') + .replace('\n', '') + .replace('\r\n', '') + .replace('{', '') + .replace('}', '') + .strip() + ) + + strings = [] + + if ',' in temp: + split = temp.split(',') + strings.append(split[0].strip()) + strings.append(split[1].strip()) + else: + strings.append(temp.strip()) + + for s in strings: + split = s.split('=') + variable = split[0].strip() + value = split[1].strip() + + save_data[variable] = value + + display.append( + { + 'section': prettynames[status_section], + 'id': save_data["machine"], + 'actor': save_data["actor"] + } + ) + + # for key, value in save_data.items(): + # print(f' + {key} = {value}') + + + case 3: + if (status_section == 'machines'): + if '=' in line: + save_var = 1 + + temp = ( + line.replace('"', '') + .replace('\'', '') + .replace(',', '') + .replace('\n', '') + .replace('\r\n', '') + .strip() + ) + + split = temp.split('=') + variable = split[0].replace(' ', '').strip() + value = split[1] + + save_data[variable] = value + + + + + if status_section == 'actor_connections' or status_section == 'machines': + # print('---------------SD---------------') + # print(save_data) + + if save_var == 1: + # print('saving') + # print(f'{level}: |{variable}| = {value}') + + for key, value in save_data.items(): + # print(f'actormatch {key} = {value}') + + match(key): + # Maschine + case 'name': + machines[id].set_name(value) + + case 'description': + machines[id].set_description(value) + + case 'wiki': + machines[id].set_wiki(value) + + case 'category': + machines[id].set_category(value) + + # Aktorenverbindung + case 'machine': + id = value + + case 'actor': + machines[id].set_actor(value) + + + if module_rich == True: + console = Console() + table = Table(highlight="pale_green3") + table.add_column("Datentyp") + table.add_column("ID") + table.add_column("Aktor") + + for d in display: + table.add_row(d["section"], f'{d["id"]}', f'{d["actor"]}') + + console.print(table) + else: + print(f'{"Sektion": <20} | {"ID": <60} | {"Aktor": <40} |') + print(f'{125 * "-"}') + + for d in display: + print(f'{d["section"]: <20} | {f'{d["id"]}': <60} | {f'{d["actor"]}': <40} |') + + + return machines + +def importdata_to_csv(machines, outputfile): + + lines = [] + + header = 'Name Domäne;Name Bereich;Name Unterbereich;Name Maschine;Maschinenbeschreibung;Manager Unterbereich;Name Alternativrolle;ID Alternativrolle;Wiki-URL;ID Domäne;ID Bereich;ID Unterbereich;ID Maschine;Aktor ID;Aktor Typ;Kommentar' + template = 'domain_name;area_name;subarea_name;machine_name;machine_desc;subarea_manager;customrole_name;customrole_id;machine_wikiurl;domain_id;area_id;subarea_id;machine_id;actor_id;actor_type;' + + lines.append(header) + + for m in machines: + specs = machines[m].get_specs() + temp = template + + temp = temp.replace('domain_name', '') + temp = temp.replace(';subarea_name', ';') + temp = temp.replace(';subarea_manager', ';') + temp = temp.replace(';customrole_name', ';') + temp = temp.replace(';customrole_id', ';') + temp = temp.replace(';domain_id', ';') + temp = temp.replace(';area_id', ';') + temp = temp.replace(';subarea_id', ';') + temp = temp.replace(';actor_type', ';') + + for key, value in specs.items(): + + match(key): + + case('id'): + temp = temp.replace(';machine_id', f';{value}') + + case('name'): + temp = temp.replace(';machine_name', f';{value}') + + case('description'): + temp = temp.replace(';machine_desc', f';{value}') + + case('wiki'): + temp = temp.replace(';machine_wikiurl', f';{value}') + + case('actor'): + temp = temp.replace(';actor_id', f';{value}') + + case('category'): + temp = temp.replace(';area_name', f';{value}') + + lines.append(temp) + + with open(outputfile, "w", encoding='utf-8-sig', newline='\n') as csv_file: + for l in lines: + csv_file.write(l + '\n') + + + + +machines = dhall_parse('bffh.dhall') + +file = 'output/importedresources.csv' +importdata_to_csv(machines, file) +