Test auf invalid Characters implementiert. ERP_Item.ini rausgeschmissen. Sonderzeichen im Configparser nicht einfach zu lesen. FileEncoding war auch nicht utf-8. Eigene Textdatei für Sonderzeichen

This commit is contained in:
2024-03-13 11:44:12 +01:00
parent 1e917e5bbd
commit 8f74aac945
6 changed files with 163 additions and 127 deletions
-51
View File
@@ -1,51 +0,0 @@
[Settings]
DoWriteLogfile=True
ExportFolder=\\ruledesigner\RDF_Daten\ERP\ITEM
WorkingFolder=\\ruledesigner\RDF_Daten\ERP\Working
#ExportFolder=\\ssg.local\freigaben\SIVAS_CAD_EDM\Austausch\Item
DoExportTextfile=False
DoExportXML=False
DoExportCSV=True
ExportSeparator=;
#Es wird geprüft welche Zeichen für Attributswerte nicht erlaubt sind
# Original: InvalidCharacters=/,\,&,%,°,?,|,!,@,à,è,ì,ò,ù,[,],£,$,%,&,;
InvalidCharacters=\,%,?,|,!,@,à,è,ì,ò,ù,£,$,%,;
[Values]
Value01=Teilenummer
Value02=Bezeichnung Kombiniert
Value03=Ersteller
Value04=Abgeändert
Value05=Revision
Value06=Beschaffungsart
Value07=TOS-Gruppe_ERP
Value08=Dispogruppe_ERP
Value09=Dispolaufgruppe_ERP
Value10=Einheit_ERP
Value11=Ersetzt
Value12=Ersetzt von
Value13=Werkstoff
Value14=Oberflächenbehandlung
Value15=Farbe
Value16=Alternativwerkstoff
Value17=Alternativfarbe
Value18=Fertigungsart_ERP
Value19=FOS-Gruppe_ERP
Value20=Änderungsbeschreibung
Value21=Freigabevermerk
Value22=Halbzeug_ERP
Value23=Halbzeug Bezeichnung
Value24=HalbzeugOhneSaegeliste_ERP
Value25=Hersteller
Value26=Hersteller Teilenummer
Value27=Kalkulationsart_ERP
Value28=Ruestcode_ERP
Value29=Serien-Status
Value30=Kategorie
[History]
#Attribute werden aus der Datenbank abgelesen (Autor,Änderungsdatum,Änderungsbeschreibung,Freigabevermerk,Ersetzt, Ersetzt von)
AddHistoryInformation=False
ExportDetail=
+1
View File
@@ -0,0 +1 @@
\,?,|,!,@,à,è,ì,ò,ù,£,$,%,;
+7 -6
View File
@@ -80,13 +80,14 @@ class Environment:
self.cfg_dir = os.environ.get('CREMIG_CFG')
self.ruledesigner_csv_filename = os.environ.get('RD_DATABASE_NAME')
def build_gui(model, configs, sivasid, uselocal=True):
def build_gui(model, configs, env, sivasid, uselocal=True):
root = tk.Tk()
#root = ttk.Window()
app = App(root)
controller = Controller(model, app)
controller.set_env(configs.get_env())
controller.set_env(env)
controller.set_config(configs)
controller.get_csv_files_of_asm(sivasid, uselocal)
logic = GuiLogic(model, configs)
@@ -111,28 +112,28 @@ if __name__ == '__main__':
args = parser.parse_args()
environment = Environment()
output_dir = environment.out_dir
data_dir = environment.data_dir
configs = Configs(environment.cfg_dir)
configs.set_env(environment)
configs.set_data_dir(data_dir)
model = CadItem()
if args.demo:
model.from_json(json.loads(demo_data))
build_gui(model, configs, "400102196", True)
build_gui(model, configs, environment, "400102196", True)
elif args.sivasid:
sivasid = args.sivasid.strip()
output_dir = environment.out_dir
assembl_path = os.path.join(output_dir, sivasid + '.json')
if os.path.exists(assembl_path):
# wenn schon einmal das assembly als json abgespeichert wurde, dann dieses laden
model.load(assembl_path)
else:
# die Gui aufbauen
build_gui(model, configs, sivasid, args.uselocal)
build_gui(model, configs, environment, sivasid, args.uselocal)
else:
parser.print_help()
+111 -36
View File
@@ -69,7 +69,7 @@ class CadItem(DataModel):
"lebenszyklus_status_neu",
"model3d_neu",
"bezeichnung1_sivas", "bezeichnung1_neu",
"bezeichnung2_sivas", "bezeichnung2_neu",
"bezeichnung2_sivas",
"halbzeugOhneSaege_sivas", "halbzeugOhneSaege_neu",
"ruestcode_sivas", "ruestcode_neu",
"fertigungsart_sivas", "fertigungsart_neu",
@@ -87,7 +87,7 @@ class CadItem(DataModel):
"ersetztdurch_sivas", "ersetztdurch_neu",
"herstteilenr_sivas", "herstteilenr_neu",
"werkstoffdiskr_neu",
"werkstofftyp_sivas", "werkstofftyp_neu",
"werkstofftyp_neu",
"material_sivas", "material_neu",
"oberflaeche_neu",
"farbe_neu",
@@ -166,6 +166,67 @@ class CadItem(DataModel):
# "Indexbearbeiter":"in"
}
key2label = {
"asm_id": "Baugruppennummer",
"teilenummer": "Teilenummer",
"pdm_kategorie_neu": "PDM-Kategorie",
"halbzeugnummer_neu": "Halbzeugnummer",
"halbzeuglaenge_neu": "Halbzeuglänge",
"halbzeugoberflaeche_neu": "Halbzeugoberfläche",
"halbzeugfarbe_neu": "Halbzeugfarbe",
"lebenszyklus_status_neu": "Lebenzyklusstatus",
"model3d_neu": "3D-Modell",
"bezeichnung1_sivas": "Bezeichnung 1",
"bezeichnung1_neu": "Bezeichnung 1",
"bezeichnung2_sivas": "Bezeichnung 2",
"halbzeugOhneSaege_sivas": "Halbzeug ohne Sägeliste",
"halbzeugOhneSaege_neu": "Halbzeug ohne Sägeliste",
"ruestcode_sivas": "Rüstcode",
"ruestcode_neu": "Rüstcode",
"fertigungsart_sivas": "Fertigungsart",
"fertigungsart_neu": "Fertigungsart",
"allgemeintoleranz_sivas": "Allgemeintoleranz",
"allgemeintoleranz_neu": "Allgemeintoleranz",
"fosGruppe_sivas": "FOS-Gruppe",
"fosGruppe_neu": "FOS-Gruppe",
"kalkulationsart_sivas": "Kalkulationsart",
"kalkulationsart_neu": "Kalkulationsart",
"beschaffungsart_sivas": "Beschaffungsart",
"beschaffungsart_neu": "Beschaffungsart",
"mengeneinheit_sivas": "Mengeneinheit",
"mengeneinheit_neu": "Mengeneinheit",
"halbzeug_sivas": "Halbzeug",
"halbzeug_neu": "Halbzeug",
"tosgruppe_sivas": "TOS-Gruppe",
"tosgruppe_neu": "TOS-Gruppe",
"dispogruppe_sivas": "Dispogruppe",
"dispogruppe_neu": "Dispogruppe",
"dispolaufgruppe_sivas": "Dispolaufgruppe",
"dispolaufgruppe_neu": "Dispolaufgruppe",
"hersteller_sivas": "Hersteller",
"hersteller_neu": "Hersteller",
"ersatzfuer_sivas": "Ersatz für",
"ersatzfuer_neu": "Ersatz für",
"ersetztdurch_sivas": "Ersetzt durch",
"ersetztdurch_neu": "Ersetzt durch",
"herstteilenr_sivas": "Hersteller Teilenummer",
"herstteilenr_neu": "Hersteller Teilenummer",
"werkstofftyp_neu": "Werkstofftyp",
"material_sivas": "Material",
"material_neu": "Material",
"oberflaeche_neu": "Oberfläche",
"farbe_neu": "Farbe",
"version_sivas": "Version",
"aenderungsindex_sivas": "Änderungsindex",
"aenderungsindex_neu": "Änderungsindex",
"aenderungstext_sivas": "Änderungstext",
"aenderungstext_neu": "Änderungstext",
"freigabevermerk_sivas": "Freigabevermerk",
"freigabevermerk_neu": "Freigabevermerk",
"zusatzinfos_auto_text": "Zusatzinformationen automatisch",
"zusatzinfos_bendef_text": "Zusatzinformationen Benutzerdefiniert",
}
def __init__(self):
""" is initalized with its unique id"""
super().__init__()
@@ -495,22 +556,15 @@ class CadItem(DataModel):
def message_error(self, title, key):
return self._controller.message_error(title, key)
def check(self):
res = self.check_pflichtfelder()
if len(res) > 0:
return (False, res)
else:
return (True, [])
def check_key_existence(self, mess, key, missing):
def check_key_existence(self, key, missing):
if not self.get_gui_data(key):
missing.append(mess)
missing.append(self.key2label[key])
def check_key_both_columns(self, mess, key_sivas, key_neu, missing):
def check_key_both_columns(self, key_sivas, key_neu, missing):
if not self.get_gui_data(key_sivas):
if not self.get_gui_data(key_neu):
missing.append(mess)
missing.append(self.key2label[key_neu])
def check_pflichtfelder(self):
"""Allgemeine Prüfungen:
@@ -519,11 +573,11 @@ class CadItem(DataModel):
missing = list()
# Teilenummer
self.check_key_existence( 'Teilenummer', "teilenummer", missing)
self.check_key_existence("teilenummer", missing)
# Datenbank
self.check_key_existence("Datenbank", "datenbank", missing)
self.check_key_existence("datenbank", missing)
# PDM-Kategorie
self.check_key_existence("PDM-Kategorie", "pdm_kategorie_neu", missing)
self.check_key_existence("pdm_kategorie_neu", missing)
# Halbzeugfarbe
hblzeug_oberfläche = self.get_gui_data("oberflaeche_neu")
@@ -532,54 +586,75 @@ class CadItem(DataModel):
missing.append("Halbzeugfarbe")
# Lebenszyklusstatus
self.check_key_existence("Lebenszyklusstatus", "lebenszyklus_status_neu", missing)
self.check_key_existence("lebenszyklus_status_neu", missing)
# 3D-Modell
self.check_key_existence("3D-Model", "model3d_neu", missing)
self.check_key_existence("model3d_neu", missing)
# Bezeichnung 1
self.check_key_both_columns("Bezeichnung 1", "bezeichnung1_sivas", "bezeichnung1_neu", missing)
self.check_key_both_columns("bezeichnung1_sivas", "bezeichnung1_neu", missing)
# Halbzeug ohne Sägeliste
self.check_key_both_columns("Halbzeug ohne Sägeliste", "halbzeugOhneSaege_sivas", "halbzeugOhneSaege_neu", missing)
self.check_key_both_columns("halbzeugOhneSaege_sivas", "halbzeugOhneSaege_neu", missing)
# Rüstcode
self.check_key_both_columns("Rüstcode", "ruestcode_sivas", "ruestcode_neu", missing)
self.check_key_both_columns("ruestcode_sivas", "ruestcode_neu", missing)
pdm_kategorie_neu = self.get_gui_data("pdm_kategorie_neu")
# Fertigungsart
if pdm_kategorie_neu == "Einzelteil" or pdm_kategorie_neu == "Schweissbaugruppe":
self.check_key_both_columns("Fertigungsart", "fertigungsart_sivas", "fertigungsart_neu", missing)
self.check_key_both_columns("fertigungsart_sivas", "fertigungsart_neu", missing)
# Allgemeintoleranz
self.check_key_both_columns("Allgemeintoleranz", "allgemeintoleranz_sivas", "allgemeintoleranz_neu", missing)
self.check_key_both_columns("allgemeintoleranz_sivas", "allgemeintoleranz_neu", missing)
# FOS-Gruppe
self.check_key_both_columns("FOS-Gruppe", "fosGruppe_sivas", "fosGruppe_neu", missing)
self.check_key_both_columns("fosGruppe_sivas", "fosGruppe_neu", missing)
# Kalkulationsart
self.check_key_both_columns("Kalkulationsart", "kalkulationsart_sivas", "kalkulationsart_neu", missing)
self.check_key_both_columns("kalkulationsart_sivas", "kalkulationsart_neu", missing)
# Beschaffungsart
self.check_key_both_columns("Beschaffungsart", "beschaffungsart_sivas", "beschaffungsart_neu", missing)
self.check_key_both_columns("beschaffungsart_sivas", "beschaffungsart_neu", missing)
# Mengeneinheit
self.check_key_both_columns("Mengeneinheit", "mengeneinheit_sivas", "mengeneinheit_neu", missing)
self.check_key_both_columns("mengeneinheit_sivas", "mengeneinheit_neu", missing)
# Halbzeug
self.check_key_both_columns("Halbzeug", "halbzeug_sivas", "halbzeug_neu", missing)
self.check_key_both_columns("halbzeug_sivas", "halbzeug_neu", missing)
# TOS-Gruppe
self.check_key_both_columns("Tosgruppe", "tosgruppe_sivas", "tosgruppe_neu", missing)
self.check_key_both_columns("tosgruppe_sivas", "tosgruppe_neu", missing)
# Dispogruppe
self.check_key_both_columns("Dispogruppe", "dispogruppe_sivas", "dispogruppe_neu", missing)
self.check_key_both_columns("dispogruppe_sivas", "dispogruppe_neu", missing)
# Dispolaufgruppe
self.check_key_both_columns("Dispolaufgruppe", "dispolaufgruppe_sivas", "dispolaufgruppe_neu", missing)
self.check_key_both_columns("dispolaufgruppe_sivas", "dispolaufgruppe_neu", missing)
# Werkstofftyp
aus_halbzeug = self.get_gui_data("aus_halbzeug_neu")
if aus_halbzeug is False:
self.check_key_both_columns("Werkstofftyp", "werkstofftyp_sivas", "werkstofftyp_neu", missing)
self.check_key_existence("werkstofftyp_neu", missing)
# Änderungstext
self.check_key_both_columns("Änderungstext", "aenderungstext_sivas", "aenderungstext_neu", missing)
self.check_key_both_columns("aenderungstext_sivas", "aenderungstext_neu", missing)
# Freigabevermerk
self.check_key_both_columns("Freigabevermerk", "freigabevermerk_sivas", "freigabevermerk_neu", missing)
self.check_key_both_columns("freigabevermerk_sivas", "freigabevermerk_neu", missing)
# Automatische Zusatzinformationen
self.check_key_existence("Automatische Zusatzinformationen", "zusatzinfos_auto_text", missing)
return missing
self.check_key_existence("zusatzinfos_auto_text", missing)
if len(missing) > 0:
return (False, missing)
else:
return (True, [])
def check_improper_chars(self, invalid_chars):
""" überprüft ob inder Oberfläche nicht erlaubte Zeichen eingetragen wurden"""
wrongchars = dict()
for key in self.key2label:
content = self.get_gui_data(key)
for c in invalid_chars:
if c in content:
Label = self.key2label[key]
if Label in wrongchars:
wrongchars[Label].append(c)
else:
wrongchars[Label] = [c]
if len(wrongchars.keys()) > 0:
return (False, wrongchars)
else:
return (True, {})
class CadItemRepository:
"""
+24 -17
View File
@@ -13,7 +13,7 @@ messages = {
"beschaffungsart_infos": ' Komponenten der Schweißbaugruppe müssen eigene Teilenummern erhalten, falls diese aktuell als Underline-Nummern in der Creo-Baugruppe vorliegen, aber keine eigenen Teilenummern in SIVAS besitzen!',
"mengeneinheit_infos":'Bitte prüfen, ob Mengeneinheit ≠ "M - Meter" korrekt ist!',
"material_infos":'Werkstoffvorschlag nicht möglich, da das Material nicht in der Mappingdatei "Materialübersetzung.json" enthalten ist.\nBitte Werkstoff in dieser Datei nachfpflegen und prüfen, ob der Werkstoff in den nachfolgenden Systemen vorhanden ist:\n- RuleDesigner\n- SIVAS-Produktiv- und Schulungsdatenbank\n- Solid Edge\nWenn nicht, bitte in diesen Systemen ebenfalls nachpflegen!',
"unzulaessige_zeichen":'Unzulässige Zeichen identifiziert:\nZeichen: {Zeichentyp} -> Feld: {Feldname}',
"unzulaessige_zeichen":"Unzulässige Zeichen identifiziert:\nZeichen: '{Zeichentyp}' -> Feld: '{Feldname}'",
"bezeichnung_zu_gross":'Bezeichnung besitzt mehr als 50 Zeichen. Bitte verkürzen!',
"konflikt_ruestcode_saegeliste":'In Sivas prüfen, wieso Haken bei "Halbzeug ohne Sägeliste" trotz Rüstcode "SRC Standard Rüstcode" gesetzt ist.',
"teilenummre_ohne_ruestcode":'Teilenummer darf nicht ohne Rüstcode migriert werden!',
@@ -61,6 +61,7 @@ class Controller(Observer):
"""
def __init__(self, model, view):
self._environment = None
self._config = None
self.set_model(model)
self.set_view(view)
@@ -82,6 +83,9 @@ class Controller(Observer):
raise Exception("this path is not defined "+env_path)
return ret
def set_config(self, config):
self._config = config
def get_csv_files_of_asm(self, asmid, uselocal):
""" sich die Einzelteile als .csv und den Aufbau des Assemblies als .json holen """
@@ -213,9 +217,7 @@ class Controller(Observer):
if 'Labels' in values:
text = text.format(Labels=values['Labels'])
if 'Zeichentyp' in values:
text = text.format(Zeichentyp=values['Zeichentyp'])
if 'Feldname' in values:
text = text.format(Feldname=values['Feldname'])
text = text.format(Zeichentyp=values['Zeichentyp'], Feldname=values['Feldname'] )
return messagebox.showerror(title, text)
def callback(self, key, value):
@@ -256,24 +258,29 @@ class Controller(Observer):
self.refresh_gui()
def migrieren(self):
(ok, missing) = self._model.check()
(ok, missing) = self._model.check_pflichtfelder()
if ok == False:
labels = ', '.join(missing)
self.message_error('Fehlende Angaben', 'missing_data', {'Labels':labels})
return
invalid_chars = self._config.InvalidChars.get()
(ok, wrongchars) = self._model.check_improper_chars(invalid_chars)
if ok == False:
for label,achars in wrongchars.items():
chars = ''.join(achars)
self.message_error('Unzulässige Zeichen', 'unzulaessige_zeichen', {'Zeichentyp': chars, 'Feldname':label})
return
def zuruecksetzen(self):
data = dict()
data['halbzeugnummer_neu'] = {'background':'red', 'foreground':'white'}
self._view.configure(data)
# cid = self.get_current_item_id()
# self._model.clear()
# self._view.clear_rightframes()
# csv_data = self._model.sivas_data_from_csv(str(cid))
# # transform the csv keys into keys used behind the gui
# gui_data = self._model.csv2guidata(csv_data)
# self.set_gui_dict(gui_data)
# # create dropdown and other defaults
# self._model.set_gui_defaults()
cid = self.get_current_item_id()
self._model.clear()
self._view.clear_rightframes()
csv_data = self._model.sivas_data_from_csv(str(cid))
# transform the csv keys into keys used behind the gui
gui_data = self._model.csv2guidata(csv_data)
self.set_gui_dict(gui_data)
# create dropdown and other defaults
self._model.set_gui_defaults()
def suche_3d(self):
pdm_kategorie_neu = self._model.get_gui_data("pdm_kategorie_neu")
+20 -17
View File
@@ -1,6 +1,6 @@
import os
import json
from configparser import ConfigParser
from configparser import ConfigParser, RawConfigParser
import pandas as pd
import update_database
@@ -447,10 +447,21 @@ class ZusatzConfig(IniBasedConfig):
def __init__(self, config_dir='.', config_file='Zusatzinformationen.cfg'):
super().__init__(config_dir, config_file)
class ERPConfig(IniBasedConfig):
class InvaldCharsConfig():
"""Auslesen der Zusatzinformationen die aus dem Änderungsindex abgeleitet werden"""
def __init__(self, config_dir='.', config_file='ERP_Item.ini'):
super().__init__(config_dir, config_file)
def __init__(self, config_dir='.', config_file='InvalidCharacters.txt'):
self.config_path = os.path.join(config_dir, config_file)
if not os.path.exists(self.config_path):
raise Exception("path does not exist")
self._isInitalized = False
file = open(self.config_path,'r')
line = file.read()
line = line.rstrip()
self._characters = line.split(',')
def get(self):
return self._characters
class Configs:
"""Sammlung aller Configdateien """
@@ -466,13 +477,12 @@ class Configs:
self.Pfade = PfadConfig(cfg_dir)
self.Werkstoffe = WerkstoffeConfig(cfg_dir)
self.Zusatz = ZusatzConfig(cfg_dir)
self.ERP = ERPConfig(cfg_dir)
self.InvalidChars = InvaldCharsConfig(cfg_dir)
self.TOSGruppen = TOSGroupsConfig(cfg_dir)
self.Materialien = MaterialTransConfig(cfg_dir)
self._TeileNummern = None
self._blacklist = None
self._env = None
def get_cfg_path(self):
return self._cfg_dir
@@ -482,23 +492,16 @@ class Configs:
def get_data_dir(self):
return self._data_dir
def set_env(self, env):
self._env = env
def get_env(self):
if self._env:
return self._env
return None
def get_ruledesigner_ids(self):
if not self._data_dir:
raise Exception("set_data_dir not called. path not set")
if not self._TeileNummern:
self._TeileNummern = RuleDesignerDatabaseConfig(self._env.data_dir).get_ruledesigner_ids()
self._TeileNummern = RuleDesignerDatabaseConfig(self._data_dir).get_ruledesigner_ids()
return self._TeileNummern
def get_blacklist(self):
if not self._data_dir:
return None
raise Exception("set_data_dir not called. path not set")
if not self._blacklist:
with open(os.path.join(self._data_dir, 'blacklist.txt')) as f:
lines = f.read().splitlines()