This commit is contained in:
Wolfram 2024-11-30 17:49:03 +01:00
parent 21a88d4507
commit a4dafd856e
6 changed files with 107 additions and 59 deletions

View File

@ -1,3 +1,15 @@
2024.11
- **Features**
- Neu: Option zur Erstellung eines Domänen-Managers. (`manager_domain`)
- Neu: Option zur Erstellung eines werkstattweiten Benutzers. (`domain_user`)
- Neu: Option zum Einstellen des CSV-Trennzeichens. (`csv_delimiter`)
- **Konzeptionelle Änderungen**
-
- **Umbenennungen**
- Die Einstellung `fa_update_dhall` heißt jetzt `fa_dhall_update`, damit ein einheitliches Benennungsschema mit der dazugehörigen Einstellungen `fa_dhall_file` gegeben ist.
- **Weiteres**
- Admin-Berechtigungen wurden vollständig auf Wildcard-Zugriffsschema umgestellt. Zuvor wurden Berechtigungen für einzelne Bereiche vergeben.
2024.6
- **Diagrammerzeugung**
- Das Diagramm enthält jetzt eine Icon-Legende

View File

@ -1,4 +1,4 @@
__version__ = '2024.6'
__version__ = '2024.12'
import time
time_start = time.perf_counter()
@ -49,7 +49,7 @@ if settings["create_file_roles"] == True:
content = generate_csv_roles(roles)
write_file('output/roles.csv', content)
if settings["fa_update_dhall"] == True:
if settings["fa_dhall_update"] == True:
print(' --- Aktualisierung der bffh.dhall')
fa_dhall_file = settings["fa_dhall_file"]
@ -65,7 +65,7 @@ if settings["fa_update_dhall"] == True:
# Pfadangabe "fa_dhall_file" ist leer
else:
print('Einstellung "fa_dhall_file" ist leer, es wurde kein Pfad zur bffh.dhall angegeben.')
print('Bitte das Feld ausfüllen oder "fa_update_dhall" auf "False" setzen.')
print('Bitte das Feld ausfüllen oder "fa_dhall_update" auf "False" setzen.')
# Mermaid-Code
if settings["generate_mermaid"] == True:

View File

@ -15,8 +15,6 @@ class Domain:
perm_handle = domain_id + '.'
id_handle = perm_handle.replace('.', '_')
perms_manager = [perm_handle + '*']
self.domain = {
"id": domain_id,
"name": domain_name
@ -24,16 +22,29 @@ class Domain:
self.domain_manager = {
"id": id_handle + 'manager',
"name": string_managerhandle + domain_name,
"perms": perms_manager
"name": '_' + string_managerhandle + domain_name,
"perms": perm_handle + '*'
}
self.domain_user = {
"id": id_handle + 'user',
"name": '_' + string_userhandle + domain_name,
"perms": []
}
def get_domain(self):
return self.domain
def get_domain_perms(self):
return self.domain_manager["perms"]
def get_domain_manager(self):
return self.domain_manager
def get_domain_user(self):
return self.domain_user
class Area(Domain):
def __init__(self, domain_id, domain_name, area_id, area_name):
@ -274,7 +285,7 @@ class GraphElement:
# Maschinen aus der CSV-importieren
def import_machines(file):
machines = {}
data = csv_listdict(file, csv_match)
data = csv_listdict(file, settings['csv_delimiter'], csv_match)
count = 2
print(f'{"Zeile": ^8} | {"Status": ^24} | {"Zusatzinformation": ^20}')
@ -355,28 +366,28 @@ def generate_roles(machines):
if roledata["id"] not in roles.keys():
roles[roledata["id"]] = roledata
# Schichtleitung anlegen
if settings["manager_schichtleitung"] == True:
roledata = manager_schichtleitung
if roledata["id"] not in roles.keys():
roles[roledata["id"]] = roledata
# Domänen durchlaufen
for id, m in machines.items():
# Domänen-Berechtigung an Manager & Schichtleitung vergeben
roledata = m.get_domain_manager()
for perm in roledata["perms"]:
if perm not in roles[admin_global["id"]]["perms"]:
roles[admin_global["id"]]["perms"].append(perm)
# Domänen-Berechtigung an Admin & Manager vergeben
if settings["manager_schichtleitung"] == True:
for perm in roledata["perms"]:
if perm not in roles[manager_schichtleitung["id"]]["perms"]:
roles[manager_schichtleitung["id"]]["perms"].append(perm)
# 2do: Admin - Überflüssige Berechtigungen?
# for perm in roledata["perms"]:
# if perm not in roles[admin_global["id"]]["perms"]:
# roles[admin_global["id"]]["perms"].append(perm)
# 2do - end
perm = m.get_domain_perms()
if perm not in roles[admin_global["id"]]["perms"]:
roles[admin_global["id"]]["perms"].append(perm)
if settings["manager_domain"] == True:
if roledata["id"] not in roles.keys():
roles[roledata["id"]] = roledata
# Manager: Domain
if settings["multi_domains"] == True:
@ -385,6 +396,10 @@ def generate_roles(machines):
if roledata["id"] not in roles.keys():
roles[roledata["id"]] = roledata
for perm in roledata["perms"]:
if perm not in roles[manager_domain["id"]]["perms"]:
roles[manager_domain["id"]]["perms"].append(perm)
# Manager: Area
if settings["manager_area"] == True:
roledata = m.get_area_manager()
@ -403,30 +418,51 @@ def generate_roles(machines):
# Benutzer: Daten abrufen
if m.has_customrole() == True:
# Extrarolle
roledata = m.get_customrole()
if roledata["id"] in roles.keys():
# Extrarolle vorhanden --> Berechtigungen hinzufügen
for p in roledata["perms"]:
roles[roledata["id"]]["perms"].append(p)
if settings["domain_user"] == True:
# Domäne-Benutzer
roledata = m.get_domain_user()
else:
# Kein Domäne-Benutzer
if m.has_customrole() == True:
# Extrarolle
roledata = m.get_customrole()
if roledata["id"] in roles.keys():
# Extrarolle vorhanden --> Berechtigungen hinzufügen
for p in roledata["perms"]:
roles[roledata["id"]]["perms"].append(p)
if m.has_subarea() == True:
# Unterbereich
roledata = m.get_subarea_user()
else:
# Bereich
roledata = m.get_area_user()
# print_dict(roledata)
if m.has_subarea() == True:
# Unterbereich
roledata = m.get_subarea_user()
else:
# Bereich
roledata = m.get_area_user()
# Benutzer: Hinzufügen
if roledata["id"] not in roles.keys():
roles[roledata["id"]] = roledata
# Domänen-Benutzer: Berechtigungen hinzufügen
if settings["domain_user"] == True:
if m.has_subarea() == True:
# Unterbereich
perms = m.get_subarea_user()["perms"]
else:
# Bereich
perms = m.get_area_user()["perms"]
for p in perms:
if p not in roles[roledata["id"]]["perms"]:
roles[roledata["id"]]["perms"].append(p)
print_dict(roles)
return roles
@ -686,8 +722,8 @@ def graph_create_elements(machines):
data = {}
data["_root"] = GraphElement("root", "Infrastruktur", '')
data["_root"].add_role(f'{icon_admin}{admin_global["name"]}')
if settings["manager_schichtleitung"] == True:
data["_root"].add_role(f'{icon_manager}{manager_schichtleitung["name"]}')
if settings["manager_domain"] == True:
data["_root"].add_role(f'{icon_manager}{manager_domain["name"]}')
for key, m in machines.items():

View File

@ -18,7 +18,7 @@ admin_global = {
"perms": ["bffh.users.manage", "bffh.users.info", "bffh.users.admin"]
}
manager_schichtleitung = {
manager_domain = {
"id": "_manager_schichtleitung",
"name": "_Manager Schichtleitung",
"perms": []

View File

@ -50,7 +50,7 @@ def list_join(my_list, insert):
return my_string
# CSV einlesen: Erzeugt eine Liste, die für jede Zeile ein Dictionary mit Header und Value ausgibt
def csv_listdict(filename, replacedict = {}):
def csv_listdict(filename, csv_delimiter, replacedict = {}):
csvfile = open(filename, 'r', encoding='utf-8-sig')
tempfile = ''
@ -75,7 +75,7 @@ def csv_listdict(filename, replacedict = {}):
# Dictionary bilden
csvfile = open(filename, mode='r', encoding='utf-8-sig')
reader = csv.DictReader(csvfile, delimiter=';')
reader = csv.DictReader(csvfile, delimiter=csv_delimiter)
finaldata = []
@ -181,12 +181,6 @@ def config_load(file, section = 'all'):
return dict_settings
# ------------------ ALT ---------------
# Maschinen-Dictionary sortieren
# Actor-Library einlesen
def load_actors(file):
dict_actors = {}

View File

@ -3,25 +3,31 @@
; Einstellung inkativ = False
[generator]
; Verwendung mehrer Domänen. Bei Verwendung mehrer Domänen werden einzelne Admins nur für die Domäne erstellt
; CSV-Trennzeichen. Bei Ververwendung des Kommas als Trennzeichen müssen Beschreibungstexte in Anführungszeichen gesetzt werden.
csv_delimiter = ;
; Verwendung mehrer Domänen. Bei Verwendung mehrer Domänen werden wird für jede Domäne ein Manager erstellt
multi_domains = False
; Rolle "Schichtleitung" erstellen, die über Manager-Berechtigungen für alle Domänen verfügt
manager_schichtleitung = True
; Erstellung einer Benutzerrolle für die gesamte Werkstatt. (Es werden keine Benutzerrollen für Unterbereiche/ Bereiche erstellt)
domain_user = True
; Manager-Rolle für jeden Bereich erstellen
manager_area = True
; Manager-Rolle für die Domäne erstellen.
manager_domain = True
; Manager-Rolle für jeden Bereich erstellen.
manager_area = False
; Spalte "Unterbereich Manager" der CSV beachten (True) der nicht (False).
manager_subarea = True
manager_subarea = False
; Automatisches Einfügen aller erzeugten Daten (Maschinen, Rolle, Aktoren, Aktor-Verbindungen) in die bffh.dhall
; Die Datei muss über Platzhalter verfügen, siehe Beispieldatei ( /docs/bffh-vorlage.dhall )
fa_update_dhall = False
fa_dhall_update = True
; Pfad zur bffh.dall von FabAccess. Der Pfad muss vollständig sein und die bffh.dhall beinhalten.
; Beispiel: D:\FabAccess\config\bffh\bffh.dhall bzw. /home/fabaccess/bffh/bffh.dhall
fa_dhall_file =
fa_dhall_file = F:\Git\fabaccess-docker\config\bffh\bffh.dhall
; Mermaid-Code erzeugen
generate_mermaid = True