In update_database.py Funktion 'get_sivas_dbase' in 'get_sivas_bom' umbenannt, da mit dieser Funktion ausschließlich die Stückliste geholt wird und somit spezifischer ist. In der Datei 'manage_configs.py' Funktionen folglich analog umbenannt. Ansonsten Funktionen in 'update_database.py' denested, um Lesbarkeit zu verbessern und Print-Statements in Deutsch geändert, da aktuell ein Mix aus Deutsch und Englisch vorliegt, was zu Verwirrung führen kann. Zudem Docstrings ergänzt und Fehler in den Print-statements behoben. Keine funktionalen Änderungen vorgenommen
This commit is contained in:
@@ -116,7 +116,7 @@ class SivasAssemblyData(JsonBasedConfig):
|
||||
def create_asm_json(self):
|
||||
"""Erstellt JSON mit den aktuellen Baugruppeninformationen"""
|
||||
try:
|
||||
update_database.get_sivas_dbase(self._config_file.removesuffix(".json"))
|
||||
update_database.get_sivas_bom(self._config_file.removesuffix(".json"))
|
||||
except:
|
||||
raise ValueError("JSON-Datei mit Baugruppeninformationen konnte nicht erstellt werden!")
|
||||
|
||||
@@ -270,7 +270,7 @@ class RuleDesignerDatabaseConfig(CSVBasedConfig):
|
||||
def copy_csv_from_server(self):
|
||||
"""Kopiert CSV-Datei vom Server, in der alle Teilenummern, die sich in RuleDesigner befinden"""
|
||||
try:
|
||||
update_database.get_rd_dbase()
|
||||
update_database.get_ruledesigner_ids()
|
||||
except:
|
||||
raise ValueError("CSV mit RuleDesigner-Teilenummern konnte nicht ins lokale Verzeichnis kopiert werden!")
|
||||
|
||||
|
||||
+85
-78
@@ -5,22 +5,34 @@ import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
|
||||
"""
|
||||
Dieses Programm:
|
||||
- Kopiert die CSV-Datei mit allen RuleDesigner-Nummern
|
||||
- Fragt Sivas ab und generiert dabei eine json-Datei, in der alle Teilenummern aufgelistet sind,
|
||||
die in Verbindung mit einer angegebenen Teilenummer migriert werden müssen.
|
||||
Diese Library erzeugt Dateien mit RuleDesigner-, bzw. SIVAS-Informationen,
|
||||
bzw. stellt diese durch Kopieren / Verschieben von bereits vorhandenen
|
||||
Dateien auf Netzlaufwerken bereit
|
||||
"""
|
||||
|
||||
def get_blacklist(outdir):
|
||||
"""read out list of sivas Ids which are not allowed from network drive
|
||||
'//ruledesigner//DF_Daten//onfigurator//ustomVaulting//RP_BOM.ini'
|
||||
within the section 'Settings'
|
||||
in the key 'PartNumbersToDrop'
|
||||
|
||||
"""
|
||||
Schreibt Teilenummern aus der nachfolgenden .ini-Datei in eine .txt-Datei:
|
||||
|
||||
-> Dateipfad: //ruledesigner/RDF_Daten/Configurator/CustomVaulting/ERP_BOM.ini'
|
||||
-> Abschnitt: 'Settings'
|
||||
-> Schlüssel: 'PartNumbersToDrop'
|
||||
|
||||
Bei diesen Teilenummern darf keine Stücklistenübergabe an SIVAS erfolgen, da sich die Stücklistenstruktur
|
||||
zwischen dem CAD und SIVAS unterscheidet (vorrangig bei Baugruppen mit Lieferantenbeistellungen)
|
||||
"""
|
||||
|
||||
blacklist_net_share = os.environ.get("BLACKLIST_DATABASE_SOURCE")
|
||||
blacklist_ini_filename = os.environ.get("BLACKLIST_DATABASE_NAME")
|
||||
blacklist_source_path = os.path.join(blacklist_net_share, blacklist_ini_filename)
|
||||
config = configparser.RawConfigParser()
|
||||
|
||||
if not os.path.isfile(blacklist_source_path):
|
||||
raise FileNotFoundError(f"Kein Zugriff auf ini-Datei '{blacklist_source_path}' mit den Blacklist-Teilenummern möglich. Bitte $BLACKLIST_DATABASE_SOURCE & $BLACKLIST_DATABASE_NAME in cremig_setenv.bat sowie VPN-Verbindung prüfen")
|
||||
|
||||
try:
|
||||
config.read(blacklist_source_path)
|
||||
except configparser.DuplicateOptionError:
|
||||
@@ -28,73 +40,72 @@ def get_blacklist(outdir):
|
||||
|
||||
content = config.get('Settings','PartNumbersToDrop')
|
||||
|
||||
if type(content) == list:
|
||||
content = content[0] # Wird benötigt, weil der String mit den Nummern aus der Blackliste manchmal in eine Liste gepackt wird, manchmal nicht - warum wissen die Götter...
|
||||
if isinstance(content, list):
|
||||
content = content[0] # Manchmal wird String mit den Blacklist-Nummern in einer Liste geschrieben - warum wissen die Götter...
|
||||
|
||||
if len(content) == 0 or len(content) == 0:
|
||||
print(f"import of '{blacklist_ini_filename}' from '{blacklist_net_share}' failed")
|
||||
exit
|
||||
if len(content) == 0:
|
||||
raise ValueError(f"Öffnen der Blacklist-Datei'{blacklist_ini_filename}' in '{blacklist_net_share}' fehlgeschlagen")
|
||||
|
||||
blacklist = content.split(';')
|
||||
|
||||
print("writing txt-file of blacklist ids...")
|
||||
outfile = os.path.join(outdir, 'blacklist.txt')
|
||||
|
||||
print(f"Schreibe Blacklist-Teilenummern in '{outfile}'...")
|
||||
with open(outfile, 'w', encoding='utf-8') as fh:
|
||||
fh.write('\n'.join(blacklist))
|
||||
print("done")
|
||||
|
||||
def get_rd_dbase(out_dir=os.environ.get('CREMIG_DATA')):
|
||||
def get_ruledesigner_ids(out_dir=os.environ.get('CREMIG_DATA')):
|
||||
"""Kopiert CSV-Datei, in der alle RuleDesigner-Teilenummern aufgelistet sind, vom Netzlaufwerk in ein lokales Verzeichnis"""
|
||||
|
||||
rd_csv_source_dir = os.environ.get("RD_DATABASE_SOURCE")
|
||||
rd_csv_filename = os.environ.get("RD_DATABASE_NAME")
|
||||
csv_source_path = os.path.join(rd_csv_source_dir, rd_csv_filename)
|
||||
|
||||
if os.path.isfile(csv_source_path):
|
||||
csv_destiny_path = os.path.join(out_dir, rd_csv_filename)
|
||||
|
||||
if os.path.isdir(out_dir):
|
||||
print("Copying CSV-file of RuleDesigner database...")
|
||||
shutil.copyfile(csv_source_path, csv_destiny_path)
|
||||
print("done")
|
||||
else:
|
||||
print(f"Can't copy RuleDesigner-database, because output directory ${out_dir} doesn't exist. Check %CREMIG_DATA% in cremig_setenv.bat")
|
||||
sys.exit(0)
|
||||
else:
|
||||
print(f"File with ruldesigner-partnumbers ${csv_source_path} doesn't exist. Check VPN connection and %RD_DATABASE_SOURCE% + %RD_DATABASE_NAME% in cremig_setenv.bat")
|
||||
sys.exit(0)
|
||||
if not os.path.isfile(csv_source_path):
|
||||
raise FileNotFoundError(f"CSV-Datei mit RuleDesigner-Teilenummern existiert nicht unter '{csv_source_path}'. Bitte $RD_DATABASE_SOURCE & $RD_DATABASE_NAME in cremig_setenv.bat prüfen.")
|
||||
|
||||
def get_sivas_dbase(sivas_id, out_dir=os.environ.get('CREMIG_DATA')):
|
||||
sivas_exe_path = os.environ.get('SIVAS_BOM')
|
||||
if not os.path.isdir(out_dir):
|
||||
raise NotADirectoryError(f"Zielverzeichnis '{out_dir}' für CSV-Datei mit RuleDesigner-Teilenummern existiert nicht. Bitte $CREMIG_DATA in cremig_setenv.bat und VPN-Verbindung prüfen")
|
||||
|
||||
print(f"Kopiere '{rd_csv_source_dir}\{rd_csv_filename}'...")
|
||||
shutil.copyfile(csv_source_path, csv_destiny_path)
|
||||
|
||||
def get_sivas_bom(sivas_id, out_dir=os.environ.get('CREMIG_DATA')):
|
||||
"""Generiert JSON-Datei, in der die Stücklisteninformationen zu einer SIVAS-Teilenummer mit Stammstückliste gespeichert sind.
|
||||
Die Erstellung der JSON-Datei erfolgt unter Verwendung des externen Sivas2Json-Programms von Hr. Jakob"""
|
||||
|
||||
sivas2json_exe_path = os.environ.get('SIVAS_BOM')
|
||||
sivas_id = sivas_id.replace(".json", "")
|
||||
|
||||
if os.path.isfile(sivas_exe_path):
|
||||
if not os.path.isfile(sivas2json_exe_path):
|
||||
raise FileNotFoundError(f"Programmpfad '{sivas2json_exe_path}' nicht erreichbar. Bitte prüfen, ob Zugriff auf Laufwerk Y: besteht. Andernfalls $SIVAS_BOM in cremig_setenv.bat sowie VPN-Verbindung prüfen")
|
||||
|
||||
if os.path.isdir(out_dir):
|
||||
print(f"Attempting to generate a json-file of all parts to be migrated in relation with '{sivas_id}'")
|
||||
subprocess.run(f'{sivas_exe_path} -o {out_dir} --format json -number "{sivas_id}"')
|
||||
if not os.path.isdir(out_dir):
|
||||
raise NotADirectoryError(f"Ausgabeverzeichnis '{out_dir}' für die Stücklisten-JSON existiert nicht. Bitte $SIVAS_BOM in cremig_setenv.bat oder VPN-Verbindung prüfen.")
|
||||
|
||||
if os.path.isfile(os.path.join(out_dir, sivas_id + ".json")):
|
||||
print("done")
|
||||
print(f"Erstelle JSON mit Stücklisteninformationen...")
|
||||
subprocess.run(f'{sivas2json_exe_path} -o {out_dir} --format json -number "{sivas_id}"')
|
||||
|
||||
if not os.path.isfile(os.path.join(out_dir, sivas_id + ".json")):
|
||||
print(f"Fehler - Konnte {sivas_id}.json nicht erzeugen. Es handelt sich evtl. um eine Nummer ohne Stückliste. Andernfalls prüfen, ob Teilenummer korrekt geschrieben wurde.")
|
||||
return False
|
||||
return True
|
||||
else:
|
||||
print(f"Failure - Couldn't generate {sivas_id}.json. Check for any spelling/typing errors. Otherwise given number is a part without a BOM.")
|
||||
return False
|
||||
else:
|
||||
print(f"'Output directory for .json-file {out_dir}' doesn't exist. Check cremig_setenv.bat or VPN connection.")
|
||||
return False
|
||||
else:
|
||||
print(f"Can't execute SIVAS-database query. Check VPN connection and check the path of %SIVAS_DATABASE_QUERY% in cremig_setenv.bat")
|
||||
return False
|
||||
|
||||
def get_sivas_teilestamm(sivas_ids, out_dir=os.environ.get('CREMIG_DATA'), overwrite=True):
|
||||
"""call the sivas exe for getting all csv files with the item data for the given sivas ids"""
|
||||
|
||||
"""
|
||||
Generiert für jede angegebene SIVAS-Teilenummer eine CSV-Datei, in der die Teilestamm-Informationen gespeichert sind
|
||||
Es kann eine oder mehrere Nummern angegeben werden. Mehrere Nummern sind entweder als kommaseparierter String oder
|
||||
in Form einer Liste anzugeben
|
||||
"""
|
||||
|
||||
sivas_teilestamm_exe = os.environ.get('SIVAS_TEILESTAMM')
|
||||
if not os.path.isfile(sivas_teilestamm_exe):
|
||||
raise FileNotFoundError(f"Check VPN connection or path of %SIVAS_DATABASE_QUERY% in cremig_setenv.bat")
|
||||
raise FileNotFoundError(f"Programmpfad '{sivas_teilestamm_exe}' nicht erreichbar. Bitte prüfen, ob Zugriff auf Laufwerk Y: besteht. Andernfalls $SIVAS_TEILESTAMM in cremig_setenv.bat sowie VPN-Verbindung prüfen")
|
||||
|
||||
if not os.path.isdir(out_dir):
|
||||
raise NotADirectoryError(f"Output directory for .csv-file(s) ${out_dir} doesn't exist.")
|
||||
raise NotADirectoryError(f"Ausgabeverzeichnis '{out_dir}' für die Teilestamm-CSV existiert nicht. Bitte $SIVAS_TEILESTAMM in cremig_setenv.bat oder VPN-Verbindung prüfen.")
|
||||
|
||||
if isinstance(sivas_ids, str):
|
||||
sivas_ids = list(set(sivas_ids.strip().split(",")))
|
||||
@@ -107,44 +118,40 @@ def get_sivas_teilestamm(sivas_ids, out_dir=os.environ.get('CREMIG_DATA'), overw
|
||||
ids_to_generate.append(f'"{id}"') # Anführungszeichen erforderlich, damit Art.Nr. mit Leerzeichen, z.B. "TOS Auswahl ILS" funktionieren
|
||||
|
||||
if len(ids_to_generate) == 0:
|
||||
print("CSV-file(s) already exist or given partnumber(s) are migrated.")
|
||||
print("CSV-Datei(en) existieren bereits oder angegebene Teilenummer(n) sind bereits migriert")
|
||||
return
|
||||
|
||||
ids_to_generate = ",".join(ids_to_generate)
|
||||
os.environ["SIVAS_EXCEL_EXPORT_DIR"] = out_dir
|
||||
os.environ["SIVAS_EXCEL_EXPORT_DIR"] = out_dir # Umgebungsvariable legt Ausgabeverzeichnis der CSV-Dateien im Programm 'KSbExcelExportSivasTeilestamm' fest. Der Variablenname ist durch genanntes Programm vorgegeben, siehe help-Text des Programms!
|
||||
print(f"Erstelle CSV(s) mit Teilestamminformationen...")
|
||||
subprocess.run(f'{sivas_teilestamm_exe} -teilenr={ids_to_generate} -open_target_dir=n')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(description='fetches data from sivas or ruledesigner fusion', prog='update_database')
|
||||
parser.add_argument('-s', '--sivasid', action='store', help='fetch data of this id from sivas fo local database folder', metavar='id')
|
||||
parser.add_argument('-r', '--rd', action='store_true', help='fetch list of existing parts from network drive')
|
||||
parser.add_argument('-b', '--blacklist', action='store_true', help='fetch list of not allowed parts from network drive')
|
||||
parser.add_argument('-t', '--teilestamm', action='store_true', help='fetch teilestamm-data for given partnumbers as csv')
|
||||
parser.add_argument('-w', '--overwrite', action='store_true', help='vorhandene CSV-Dateien werden nicht erneut aus SIVAS abgefragt')
|
||||
|
||||
parser = argparse.ArgumentParser(description='Erzeugt Dateien mit RuleDesigner-, bzw. SIVAS-Informationen, bzw. stellt diese bereit', prog='update_database')
|
||||
parser.add_argument('-b', '--blacklist', action='store_true', help='Schreibe .txt-Datei mit allen Teilenummern, bei denen keine Stücklistenübergabe aus dem CAD nach SIVAS erfolgen darf')
|
||||
parser.add_argument('-d', '--out_dir', action='store', default=os.environ.get('CREMIG_DATA'), help='Ausgabeverzeichnis für Datei', metavar="dir")
|
||||
parser.add_argument('-m', '--bom', action='store_true', help='Schreibe Stückliste einer SIVAS-Teilenummer als JSON-Datei')
|
||||
parser.add_argument('-o', '--overwrite', action='store_true', default=False, help='Überschreibe Datei, wenn diese bereits in Zielverzeichnis vorliegt')
|
||||
parser.add_argument('-r', '--rd_ids', action='store_true' ,help='Kopiere CSV-Datei, in der alle RuleDesigner-Teilenummern aufgelistet sind')
|
||||
parser.add_argument('-s', '--sivasid', action='store', help='SIVAS-Teilenummer', metavar='id')
|
||||
parser.add_argument('-t', '--teilestamm', action='store_true', help='Schreibe Teilestamm-Medataten einer SIVAS-Teilenummer als CSV-Datei')
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
out_dir = os.environ.get('CREMIG_DATA')
|
||||
|
||||
if args.rd:
|
||||
get_rd_dbase(out_dir)
|
||||
|
||||
elif args.sivasid:
|
||||
|
||||
if args.teilestamm:
|
||||
|
||||
overwrite = args.overwrite
|
||||
if overwrite:
|
||||
get_sivas_teilestamm(args.sivasid, out_dir, overwrite = True)
|
||||
else:
|
||||
get_sivas_teilestamm(args.sivasid, out_dir, overwrite = False)
|
||||
|
||||
else:
|
||||
get_sivas_dbase(args.sivasid, out_dir)
|
||||
|
||||
elif args.blacklist:
|
||||
get_blacklist(out_dir)
|
||||
|
||||
else:
|
||||
if len(sys.argv) == 1:
|
||||
parser.print_help()
|
||||
|
||||
if args.rd_ids:
|
||||
get_ruledesigner_ids(args.out_dir)
|
||||
|
||||
if args.blacklist:
|
||||
get_blacklist(args.out_dir)
|
||||
|
||||
if args.sivasid:
|
||||
if args.teilestamm:
|
||||
get_sivas_teilestamm(args.sivasid, args.out_dir, overwrite = True)
|
||||
|
||||
if args.stueckliste:
|
||||
get_sivas_bom(args.sivasid, args.out_dir)
|
||||
Reference in New Issue
Block a user