Klassen zum Laden von CSV's + Auslesen der Assembly-json's aus Sivas + Rückgabe des aktuellen Migrationsstandes (ob Teilenummern bereits in RuleDesigner migriert wurden, oder nicht) aus compare_lists.py in Library umgezogen, da sie teilweise auch im Haupt-Migrationsprogramm benötigt werden

This commit is contained in:
2024-01-31 11:44:31 +01:00
parent da35bb4bb5
commit a59afd70e7
+127
View File
@@ -1,6 +1,7 @@
import os import os
import json import json
from configparser import ConfigParser from configparser import ConfigParser
import pandas as pd
""" """
Diese Lib verwaltet alle Config dateien (als .cfg oder als .json) von CreoMigrate Diese Lib verwaltet alle Config dateien (als .cfg oder als .json) von CreoMigrate
@@ -20,6 +21,132 @@ class JsonBasedConfig:
"""nimm den Json String zur Initialisierung des Objektes""" """nimm den Json String zur Initialisierung des Objektes"""
return json.loads(json_str) return json.loads(json_str)
class CSVBasedConfig:
def __init__(self, config_dir, config_file):
"""merke dir den Pfad zu den Configdateien"""
self.config_path = os.path.join(config_dir, config_file)
def load_csv_from_file(self):
"""lade die csv aus dem angegebenen Dateipfad in ein Dataframe"""
return pd.read_csv(self.config_path, sep=";", dtype="object")
class SivasAssemblyData(JsonBasedConfig):
"""Auslesen der Assembly-Informationen zu einer angegebenen Baugruppennummer"""
def __init__(self, config_dir, config_file):
super().__init__(config_dir, config_file)
self.assembly_data = None
def _lazy_init_assembly_data(func):
"""Sorgt dafür, dass json-Datei der Baugruppe nur 1x geladen wird"""
def wrapper(self, *args, **kwargs):
if self.assembly_data is None:
self.assembly_data = self.load_json_from_file()
return func(self, *args, **kwargs)
return wrapper
@_lazy_init_assembly_data
def get_assembly_ids(self):
"""Gibt alle Teilenummern der Stückliste zurück (auch Teilenummern aus tieferen Baugruppenebenen)"""
assembly_ids = set()
for child_id, parent_properties in self.assembly_data.items():
assembly_ids.add(child_id)
for parent_property in parent_properties:
parent_id = parent_property["Parent"]
assembly_ids.add(parent_id)
return assembly_ids
@_lazy_init_assembly_data
def get_parent_children(self) -> dict:
"""Ordnet Stücklistenpositionen (Kinder) den Baugruppennummern (Eltern) zu. Die Kinder sind entsprechend ihrer Positionsnummern in den Stücklisten sortiert."""
unordered_parent_children = {}
for child_id, parent_properties in self.assembly_data.items():
for parent_property in parent_properties:
parent_id = parent_property["Parent"]
child_posnr_in_parent_bom = int(parent_property["Position"].lstrip(".").split("/")[0])
if parent_id not in unordered_parent_children:
unordered_parent_children[parent_id] = {}
unordered_parent_children[parent_id][child_posnr_in_parent_bom] = child_id
ordered_parent_children = {}
for parent, children in unordered_parent_children.items():
for pos_nr, child in sorted(children.items()):
if parent not in ordered_parent_children:
ordered_parent_children[parent] = []
ordered_parent_children[parent].append(child)
return ordered_parent_children
def get_longest_assembly_id(self) -> str:
"""Gibt die längste Teilenummer von allen Stücklistenpositionen zurück"""
return max(self.get_assembly_ids())
@_lazy_init_assembly_data
def get_max_bom_depth(self) -> int:
"""Gibt die tiefste Stücklistenebene zurück (0 = höchste Ebene)"""
bom_levels = []
for parents in self.assembly_data.values():
for parent in parents:
current_bom_level = parent["Position"].count(".")
bom_levels.append(current_bom_level)
return max(bom_levels)
@_lazy_init_assembly_data
def get_property_names(self) -> list:
"""Gibt alle Eigenschaftsnamen zurück, die in der Assembly-json-Datei enthalten sind"""
for parent_data in self.assembly_data.values():
return list(parent_data[0])
@_lazy_init_assembly_data
def get_property(self, property) -> dict:
"""Gibt eine Eigenschaft zu den Teilenummern der Stückliste zurück (z.B. Bezeichnung)"""
if property not in self.get_property_names():
raise ValueError("Angegebener Eigenschaftsname exisitert nicht!")
id_property_mapping = {}
for child, parent_data in self.assembly_data.items():
for properties in parent_data:
id_property_mapping[child] = properties[property]
return id_property_mapping
class RuleDesignerDatabaseConfig(CSVBasedConfig):
"""Auslesen der Angaben aus der RuleDesigner-Datenbank-CSV"""
def __init__(self, config_dir=".", config_file="RD_Teilenummern.csv"):
super().__init__(config_dir, config_file)
def get_ruledesigner_ids(self):
return tuple(self.load_csv_from_file()['Teilenummern'])
class MigrationStatus:
def __init__(self, file_dir, assembly_json):
self.sivas_assembly_data = SivasAssemblyData(file_dir, assembly_json)
self.ruledesigner_data = RuleDesignerDatabaseConfig(file_dir)
def get_migration_status(self):
"""Gibt zurück, ob die Teilenummern der Baugruppe bereits migriert wurden, oder nicht"""
sivas_assembly_ids = self.sivas_assembly_data.get_assembly_ids()
ruledesigner_ids = self.ruledesigner_data.get_ruledesigner_ids()
migration_status = {}
for sivas_assembly_id in sivas_assembly_ids:
migration_status[sivas_assembly_id] = True if sivas_assembly_id in ruledesigner_ids else False
return migration_status
class TOSGroupsConfig(JsonBasedConfig): class TOSGroupsConfig(JsonBasedConfig):
"""Auslesen der Config Angaben zu den TOS Gruppen""" """Auslesen der Config Angaben zu den TOS Gruppen"""