Initial commit of full Emirat project

This commit is contained in:
Damjan Savic 2025-03-18 23:15:29 +01:00
commit bea7fc69b8
17 changed files with 702 additions and 0 deletions

8
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

15
.idea/Emirat.iml generated Normal file
View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.13 (Emirat)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PyDocumentationSettings">
<option name="format" value="PLAIN" />
<option name="myDocStringFormat" value="Plain" />
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="py.test" />
</component>
</module>

View File

@ -0,0 +1,58 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="LossyEncoding" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredPackages">
<value>
<list size="42">
<item index="0" class="java.lang.String" itemvalue="PyQt5" />
<item index="1" class="java.lang.String" itemvalue="psycopg2-binary" />
<item index="2" class="java.lang.String" itemvalue="google-api-python-client" />
<item index="3" class="java.lang.String" itemvalue="pandas" />
<item index="4" class="java.lang.String" itemvalue="pyqtgraph" />
<item index="5" class="java.lang.String" itemvalue="google-auth-oauthlib" />
<item index="6" class="java.lang.String" itemvalue="SQLAlchemy" />
<item index="7" class="java.lang.String" itemvalue="requests" />
<item index="8" class="java.lang.String" itemvalue="PyOTP" />
<item index="9" class="java.lang.String" itemvalue="passlib" />
<item index="10" class="java.lang.String" itemvalue="google-auth" />
<item index="11" class="java.lang.String" itemvalue="PyQt6" />
<item index="12" class="java.lang.String" itemvalue="python-dotenv" />
<item index="13" class="java.lang.String" itemvalue="pyepc" />
<item index="14" class="java.lang.String" itemvalue="importlib-metadata" />
<item index="15" class="java.lang.String" itemvalue="playwright" />
<item index="16" class="java.lang.String" itemvalue="pytest" />
<item index="17" class="java.lang.String" itemvalue="aiofiles" />
<item index="18" class="java.lang.String" itemvalue="black" />
<item index="19" class="java.lang.String" itemvalue="aiohttp" />
<item index="20" class="java.lang.String" itemvalue="isort" />
<item index="21" class="java.lang.String" itemvalue="pytest-asyncio" />
<item index="22" class="java.lang.String" itemvalue="APScheduler" />
<item index="23" class="java.lang.String" itemvalue="flake8" />
<item index="24" class="java.lang.String" itemvalue="openpyxl" />
<item index="25" class="java.lang.String" itemvalue="sphinx-rtd-theme" />
<item index="26" class="java.lang.String" itemvalue="mypy" />
<item index="27" class="java.lang.String" itemvalue="pre-commit" />
<item index="28" class="java.lang.String" itemvalue="ipython" />
<item index="29" class="java.lang.String" itemvalue="gunicorn" />
<item index="30" class="java.lang.String" itemvalue="types-python-dateutil" />
<item index="31" class="java.lang.String" itemvalue="types-requests" />
<item index="32" class="java.lang.String" itemvalue="types-setuptools" />
<item index="33" class="java.lang.String" itemvalue="jupyter" />
<item index="34" class="java.lang.String" itemvalue="pytest-cov" />
<item index="35" class="java.lang.String" itemvalue="pytest-mock" />
<item index="36" class="java.lang.String" itemvalue="Sphinx" />
<item index="37" class="java.lang.String" itemvalue="types-aiofiles" />
<item index="38" class="java.lang.String" itemvalue="uvicorn" />
<item index="39" class="java.lang.String" itemvalue="pyinstaller" />
<item index="40" class="java.lang.String" itemvalue="ttkthemes" />
<item index="41" class="java.lang.String" itemvalue="pillow" />
</list>
</value>
</option>
</inspection_tool>
<inspection_tool class="SqlNoDataSourceInspection" enabled="false" level="WARNING" enabled_by_default="false" />
</profile>
</component>

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

7
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.13 (Decryption)" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.13 (Emirat)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/Emirat.iml" filepath="$PROJECT_DIR$/.idea/Emirat.iml" />
</modules>
</component>
</project>

7
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="$PROJECT_DIR$/Preisliste" vcs="Git" />
</component>
</project>

0
Launcher/__init__.py Normal file
View File

Binary file not shown.

Binary file not shown.

323
Launcher/app_launcher.py Normal file
View File

@ -0,0 +1,323 @@
"""
Hauptklasse für den Anwendungslauncher, der mehrere Anwendungen in Tabs verwaltet.
"""
import os
import sys
import importlib
import importlib.util
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import traceback
import logging
# Logger für den Launcher
logger = logging.getLogger("emirat.launcher")
class ApplicationLauncher(tk.Tk):
"""
Ein Hauptfenster-Launcher, der mehrere Anwendungen in Tabs laden kann.
"""
def __init__(self):
super().__init__()
# Logger einrichten
self._setup_logging()
# Grundlegende Fensterkonfiguration
self.title("Emirat Software Suite")
self.geometry("1200x800")
self.minsize(800, 600)
# Icon laden, falls vorhanden
icon_path = os.path.join(os.path.dirname(__file__), "resources", "ritterdigital.ico")
if os.path.exists(icon_path):
self.iconbitmap(icon_path)
logger.info(f"Icon geladen: {icon_path}")
else:
logger.warning(f"Icon nicht gefunden: {icon_path}")
# Hauptstilkonfiguration
self.style = ttk.Style(self)
self.style.theme_use('clam') # Alternatives Theme: 'alt', 'default', 'classic'
# Rahmen für Inhalt einrichten
self.main_frame = ttk.Frame(self)
self.main_frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
# Statusleiste erstellen
self.status_bar = ttk.Frame(self)
self.status_bar.pack(fill=tk.X, side=tk.BOTTOM)
self.status_label = ttk.Label(self.status_bar, text="Bereit", anchor=tk.W)
self.status_label.pack(side=tk.LEFT, padx=5)
# Notebook (Tabs) für Anwendungen einrichten
self.notebook = ttk.Notebook(self.main_frame)
self.notebook.pack(fill=tk.BOTH, expand=True)
# Anwendungs-Frames und Instanzen speichern
self.app_frames = {}
self.app_instances = {}
# Verfügbare Anwendungen finden und laden
self.app_modules = self.discover_applications()
self.load_applications()
# Event-Binding für Tab-Wechsel
self.notebook.bind("<<NotebookTabChanged>>", self.on_tab_changed)
logger.info("Launcher initialisiert")
def _setup_logging(self):
"""Richtet das Logging-System für den Launcher ein."""
logger.setLevel(logging.INFO)
if not logger.handlers:
# Konsolenausgabe
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger.addHandler(console_handler)
# Datei-Logging
log_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "logs")
os.makedirs(log_dir, exist_ok=True)
file_handler = logging.FileHandler(os.path.join(log_dir, "launcher.log"))
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger.addHandler(file_handler)
logger.info("Launcher-Logging eingerichtet")
def discover_applications(self):
"""
Sucht im Basisverzeichnis nach Anwendungsmodulen.
Erwartet für jede Anwendung einen Ordner mit einem module_launcher.py,
das eine get_app_for_launcher-Funktion enthält.
"""
app_modules = {}
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
logger.info(f"Suche nach Anwendungen in: {base_dir}")
# Bekannte Anwendungspfade
apps_to_check = [
"Preisliste",
# Hier können weitere Anwendungen hinzugefügt werden
]
for app_name in apps_to_check:
app_dir = os.path.join(base_dir, app_name)
logger.info(f"Prüfe Anwendung {app_name} in {app_dir}")
if not os.path.isdir(app_dir):
logger.warning(f"Verzeichnis nicht gefunden: {app_dir}")
continue
# Prüfen, ob es eine module_launcher.py gibt
module_path = os.path.join(app_dir, "module_launcher.py")
if os.path.exists(module_path):
logger.info(f"Gefunden: {module_path}")
app_modules[app_name] = {
"path": module_path,
"module_name": "module_launcher",
"app_dir": app_dir
}
else:
logger.warning(f"Keine module_launcher.py gefunden in {app_dir}")
# Alternativ direkt nach main.py suchen
main_path = os.path.join(app_dir, "main.py")
if os.path.exists(main_path):
logger.info(f"Gefunden: {main_path} (als Fallback)")
app_modules[app_name] = {
"path": main_path,
"module_name": "main",
"app_dir": app_dir
}
logger.info(f"Gefundene Anwendungen: {list(app_modules.keys())}")
return app_modules
def load_applications(self):
"""
Lädt die gefundenen Anwendungen und erstellt für jede einen Tab.
"""
if not self.app_modules:
logger.warning("Keine Anwendungen gefunden")
self._show_no_apps_message()
return
for app_name, app_info in self.app_modules.items():
try:
logger.info(f"Lade Anwendung: {app_name} aus {app_info['path']}")
# Anwendungsverzeichnis zum Python-Pfad hinzufügen
if app_info["app_dir"] not in sys.path:
sys.path.insert(0, app_info["app_dir"])
logger.info(f"Verzeichnis zum Pfad hinzugefügt: {app_info['app_dir']}")
# Tab-Frame erstellen
app_frame = ttk.Frame(self.notebook)
self.app_frames[app_name] = app_frame
# Modul dynamisch laden
try:
# Verschiedene Methoden zum Laden des Moduls versuchen
module = None
# Methode 1: Direkter Import, wenn Modul bereits im Pfad ist
try:
logger.info(f"Versuche direkten Import für {app_name}")
if app_info["module_name"] == "module_launcher":
# Vollständiger Import-Pfad für module_launcher
import_path = f"{app_name}.module_launcher"
logger.info(f"Import-Pfad: {import_path}")
module = importlib.import_module(import_path)
else:
# Einfacher Import für main.py oder ähnliches
import_path = app_info["module_name"]
logger.info(f"Import-Pfad: {import_path}")
module = importlib.import_module(import_path)
except ImportError as e:
logger.warning(f"Direkter Import fehlgeschlagen: {e}")
# Methode 2: Import über spec, wenn direkter Import fehlschlägt
if module is None:
logger.info(f"Versuche Import über spec für {app_name}")
spec = importlib.util.spec_from_file_location(
app_info["module_name"],
app_info["path"]
)
module = importlib.util.module_from_spec(spec)
sys.modules[app_info["module_name"]] = module
spec.loader.exec_module(module)
# Überprüfen, ob Module geladen wurde
if module is None:
raise ImportError(f"Konnte Modul {app_info['module_name']} nicht laden")
# App-Instanz erstellen
if hasattr(module, "get_app_for_launcher"):
logger.info(f"Verwende get_app_for_launcher-Funktion für {app_name}")
app_instance = module.get_app_for_launcher(app_frame)
self.app_instances[app_name] = app_instance
self.notebook.add(app_frame, text=app_name)
self.status_label.config(text=f"Anwendung '{app_name}' geladen")
else:
logger.error(f"Keine get_app_for_launcher-Funktion in {app_name}")
self._show_error_app(app_name, app_frame,
"Die Anwendung unterstützt keine direkte Launcher-Integration")
except Exception as e:
logger.error(f"Fehler beim Laden von {app_name}: {str(e)}")
traceback.print_exc()
self._show_error_app(app_name, app_frame, f"Fehler beim Laden der Anwendung: {str(e)}")
except Exception as e:
logger.error(f"Fehler bei der Anwendungsinitialisierung von {app_name}: {str(e)}")
messagebox.showerror(
"Fehler beim Laden",
f"Anwendung '{app_name}' konnte nicht geladen werden: {str(e)}"
)
traceback.print_exc()
def _show_error_app(self, app_name, frame, error_message):
"""
Zeigt eine Fehleranzeige im Tab einer Anwendung an.
"""
for widget in frame.winfo_children():
widget.destroy()
error_frame = ttk.Frame(frame, padding=20)
error_frame.pack(fill=tk.BOTH, expand=True)
error_icon = ttk.Label(
error_frame,
text="⚠️",
font=("Arial", 24)
)
error_icon.pack(pady=(0, 10))
error_title = ttk.Label(
error_frame,
text=f"Fehler in Anwendung '{app_name}'",
font=("Arial", 14, "bold"),
foreground="red"
)
error_title.pack(pady=(0, 20))
error_label = ttk.Label(
error_frame,
text=error_message,
foreground="black",
justify=tk.LEFT,
wraplength=600
)
error_label.pack(pady=10)
# Hinweis
hint_label = ttk.Label(
error_frame,
text="Weitere Informationen finden Sie in den Logdateien.",
font=("Arial", 9, "italic")
)
hint_label.pack(pady=(20, 0))
self.notebook.add(frame, text=app_name)
logger.info(f"Fehler-Tab für {app_name} erstellt")
def _show_no_apps_message(self):
"""
Zeigt eine Meldung an, wenn keine Anwendungen gefunden wurden.
"""
info_frame = ttk.Frame(self.main_frame, padding=30)
info_frame.pack(fill=tk.BOTH, expand=True)
title = ttk.Label(
info_frame,
text="Keine Anwendungen gefunden",
font=("Arial", 16, "bold")
)
title.pack(pady=(0, 20))
message = ttk.Label(
info_frame,
text=(
"Der Launcher konnte keine Anwendungen finden, die integriert werden können.\n\n"
"Bitte stellen Sie sicher, dass alle Anwendungen korrekt installiert sind und "
"eine module_launcher.py-Datei enthalten."
),
wraplength=600,
justify=tk.CENTER
)
message.pack()
def on_tab_changed(self, event):
"""
Wird aufgerufen, wenn der Benutzer zwischen Tabs wechselt.
"""
try:
current_tab = self.notebook.select()
if not current_tab:
return
tab_index = self.notebook.index(current_tab)
tab_name = self.notebook.tab(tab_index, "text")
self.status_label.config(text=f"Aktive Anwendung: {tab_name}")
# Fokus auf die aktive Anwendung setzen
if tab_name in self.app_instances:
app = self.app_instances[tab_name]
if hasattr(app, "on_activate"):
try:
app.on_activate()
logger.info(f"on_activate aufgerufen für {tab_name}")
except Exception as e:
logger.error(f"Fehler beim Aktivieren der Anwendung {tab_name}: {str(e)}")
except Exception as e:
logger.error(f"Fehler beim Tab-Wechsel: {str(e)}", exc_info=True)
if __name__ == "__main__":
app = ApplicationLauncher()
app.mainloop()

View File

1
Preisliste Submodule

@ -0,0 +1 @@
Subproject commit 2e6bda7d3efe002005884e31fa58228eb6aee157

78
logs/launcher.log Normal file
View File

@ -0,0 +1,78 @@
2025-03-18 22:58:24,832 - emirat.launcher - INFO - Launcher-Logging eingerichtet
2025-03-18 22:58:24,861 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico
2025-03-18 22:58:24,862 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat
2025-03-18 22:58:24,862 - emirat.launcher - INFO - Prüfe Anwendung Preisliste in C:\Development\Emirat\Preisliste
2025-03-18 22:58:24,862 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 22:58:24,863 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste']
2025-03-18 22:58:24,863 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 22:58:24,863 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefügt: C:\Development\Emirat\Preisliste
2025-03-18 22:58:24,863 - emirat.launcher - INFO - Versuche direkten Import für Preisliste
2025-03-18 22:58:24,863 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher
2025-03-18 22:58:24,866 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion für Preisliste
2025-03-18 22:58:25,851 - emirat.launcher - INFO - Launcher initialisiert
2025-03-18 22:58:25,852 - emirat.launcher - INFO - on_activate aufgerufen für Preisliste
2025-03-18 22:59:18,289 - emirat.launcher - INFO - Launcher-Logging eingerichtet
2025-03-18 22:59:18,315 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Prüfe Anwendung Preisliste in C:\Development\Emirat\Preisliste
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste']
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefügt: C:\Development\Emirat\Preisliste
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Versuche direkten Import für Preisliste
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher
2025-03-18 22:59:18,320 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion für Preisliste
2025-03-18 22:59:19,114 - emirat.launcher - INFO - Launcher initialisiert
2025-03-18 22:59:19,115 - emirat.launcher - INFO - on_activate aufgerufen für Preisliste
2025-03-18 23:02:48,042 - emirat.launcher - INFO - Launcher-Logging eingerichtet
2025-03-18 23:02:48,067 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Prüfe Anwendung Preisliste in C:\Development\Emirat\Preisliste
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste']
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefügt: C:\Development\Emirat\Preisliste
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Versuche direkten Import für Preisliste
2025-03-18 23:02:48,069 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher
2025-03-18 23:02:48,071 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion für Preisliste
2025-03-18 23:02:48,881 - emirat.launcher - INFO - Launcher initialisiert
2025-03-18 23:02:48,881 - emirat.launcher - INFO - on_activate aufgerufen für Preisliste
2025-03-18 23:04:03,310 - emirat.launcher - INFO - Launcher-Logging eingerichtet
2025-03-18 23:04:03,337 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Prüfe Anwendung Preisliste in C:\Development\Emirat\Preisliste
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste']
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefügt: C:\Development\Emirat\Preisliste
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Versuche direkten Import für Preisliste
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher
2025-03-18 23:04:03,342 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion für Preisliste
2025-03-18 23:04:04,172 - emirat.launcher - INFO - Launcher initialisiert
2025-03-18 23:04:04,172 - emirat.launcher - INFO - on_activate aufgerufen für Preisliste
2025-03-18 23:07:57,377 - emirat.launcher - INFO - Launcher-Logging eingerichtet
2025-03-18 23:07:57,399 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico
2025-03-18 23:07:57,400 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat
2025-03-18 23:07:57,400 - emirat.launcher - INFO - Prüfe Anwendung Preisliste in C:\Development\Emirat\Preisliste
2025-03-18 23:07:57,401 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:07:57,401 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste']
2025-03-18 23:07:57,401 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:07:57,401 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefügt: C:\Development\Emirat\Preisliste
2025-03-18 23:07:57,401 - emirat.launcher - INFO - Versuche direkten Import für Preisliste
2025-03-18 23:07:57,401 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher
2025-03-18 23:07:57,429 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion für Preisliste
2025-03-18 23:08:00,212 - emirat.launcher - INFO - Launcher initialisiert
2025-03-18 23:08:00,213 - emirat.launcher - INFO - on_activate aufgerufen für Preisliste
2025-03-18 23:08:05,271 - emirat.launcher - INFO - Launcher-Logging eingerichtet
2025-03-18 23:08:05,291 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico
2025-03-18 23:08:05,292 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat
2025-03-18 23:08:05,292 - emirat.launcher - INFO - Prüfe Anwendung Preisliste in C:\Development\Emirat\Preisliste
2025-03-18 23:08:05,293 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:08:05,293 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste']
2025-03-18 23:08:05,293 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:08:05,293 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefügt: C:\Development\Emirat\Preisliste
2025-03-18 23:08:05,293 - emirat.launcher - INFO - Versuche direkten Import für Preisliste
2025-03-18 23:08:05,293 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher
2025-03-18 23:08:05,319 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion für Preisliste
2025-03-18 23:08:06,320 - emirat.launcher - INFO - Launcher initialisiert
2025-03-18 23:08:06,320 - emirat.launcher - INFO - on_activate aufgerufen für Preisliste

View File

@ -0,0 +1,81 @@
2025-03-18 10:39:17,767 - __main__ - INFO - Starte Emirat Software Launcher
2025-03-18 10:39:18,999 - database.db_connector - INFO - Datenbankverbindung hergestellt
2025-03-18 22:33:29,114 - __main__ - INFO - Launcher beendet
2025-03-18 22:49:26,016 - __main__ - INFO - Starte Emirat Software Launcher
2025-03-18 22:49:26,878 - database.db_connector - INFO - Datenbankverbindung hergestellt
2025-03-18 22:49:36,820 - __main__ - INFO - Launcher beendet
2025-03-18 22:50:37,133 - __main__ - INFO - Starte Emirat Software Launcher
2025-03-18 22:50:37,998 - database.db_connector - INFO - Datenbankverbindung hergestellt
2025-03-18 22:58:15,698 - __main__ - INFO - Launcher beendet
2025-03-18 22:58:24,455 - __main__ - INFO - Starte Emirat Software Launcher
2025-03-18 22:58:24,832 - emirat.launcher - INFO - Launcher-Logging eingerichtet
2025-03-18 22:58:24,861 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico
2025-03-18 22:58:24,862 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat
2025-03-18 22:58:24,862 - emirat.launcher - INFO - Prüfe Anwendung Preisliste in C:\Development\Emirat\Preisliste
2025-03-18 22:58:24,862 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 22:58:24,863 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste']
2025-03-18 22:58:24,863 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 22:58:24,863 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefügt: C:\Development\Emirat\Preisliste
2025-03-18 22:58:24,863 - emirat.launcher - INFO - Versuche direkten Import für Preisliste
2025-03-18 22:58:24,863 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher
2025-03-18 22:58:24,866 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion für Preisliste
2025-03-18 22:59:18,241 - __main__ - INFO - Starte Emirat Software Launcher
2025-03-18 22:59:18,289 - emirat.launcher - INFO - Launcher-Logging eingerichtet
2025-03-18 22:59:18,315 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Prüfe Anwendung Preisliste in C:\Development\Emirat\Preisliste
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste']
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefügt: C:\Development\Emirat\Preisliste
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Versuche direkten Import für Preisliste
2025-03-18 22:59:18,317 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher
2025-03-18 22:59:18,320 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion für Preisliste
2025-03-18 23:02:47,992 - __main__ - INFO - Starte Emirat Software Launcher
2025-03-18 23:02:48,042 - emirat.launcher - INFO - Launcher-Logging eingerichtet
2025-03-18 23:02:48,067 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Prüfe Anwendung Preisliste in C:\Development\Emirat\Preisliste
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste']
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefügt: C:\Development\Emirat\Preisliste
2025-03-18 23:02:48,068 - emirat.launcher - INFO - Versuche direkten Import für Preisliste
2025-03-18 23:02:48,069 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher
2025-03-18 23:02:48,071 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion für Preisliste
2025-03-18 23:04:03,261 - __main__ - INFO - Starte Emirat Software Launcher
2025-03-18 23:04:03,310 - emirat.launcher - INFO - Launcher-Logging eingerichtet
2025-03-18 23:04:03,337 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Prüfe Anwendung Preisliste in C:\Development\Emirat\Preisliste
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste']
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefügt: C:\Development\Emirat\Preisliste
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Versuche direkten Import für Preisliste
2025-03-18 23:04:03,339 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher
2025-03-18 23:04:03,342 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion für Preisliste
2025-03-18 23:07:57,332 - __main__ - INFO - Starte Emirat Software Launcher
2025-03-18 23:07:57,377 - emirat.launcher - INFO - Launcher-Logging eingerichtet
2025-03-18 23:07:57,399 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico
2025-03-18 23:07:57,400 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat
2025-03-18 23:07:57,400 - emirat.launcher - INFO - Prüfe Anwendung Preisliste in C:\Development\Emirat\Preisliste
2025-03-18 23:07:57,401 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:07:57,401 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste']
2025-03-18 23:07:57,401 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:07:57,401 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefügt: C:\Development\Emirat\Preisliste
2025-03-18 23:07:57,401 - emirat.launcher - INFO - Versuche direkten Import für Preisliste
2025-03-18 23:07:57,401 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher
2025-03-18 23:07:57,429 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion für Preisliste
2025-03-18 23:08:05,224 - __main__ - INFO - Starte Emirat Software Launcher
2025-03-18 23:08:05,271 - emirat.launcher - INFO - Launcher-Logging eingerichtet
2025-03-18 23:08:05,291 - emirat.launcher - INFO - Icon geladen: C:\Development\Emirat\Launcher\resources\ritterdigital.ico
2025-03-18 23:08:05,292 - emirat.launcher - INFO - Suche nach Anwendungen in: C:\Development\Emirat
2025-03-18 23:08:05,292 - emirat.launcher - INFO - Prüfe Anwendung Preisliste in C:\Development\Emirat\Preisliste
2025-03-18 23:08:05,293 - emirat.launcher - INFO - Gefunden: C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:08:05,293 - emirat.launcher - INFO - Gefundene Anwendungen: ['Preisliste']
2025-03-18 23:08:05,293 - emirat.launcher - INFO - Lade Anwendung: Preisliste aus C:\Development\Emirat\Preisliste\module_launcher.py
2025-03-18 23:08:05,293 - emirat.launcher - INFO - Verzeichnis zum Pfad hinzugefügt: C:\Development\Emirat\Preisliste
2025-03-18 23:08:05,293 - emirat.launcher - INFO - Versuche direkten Import für Preisliste
2025-03-18 23:08:05,293 - emirat.launcher - INFO - Import-Pfad: Preisliste.module_launcher
2025-03-18 23:08:05,319 - emirat.launcher - INFO - Verwende get_app_for_launcher-Funktion für Preisliste

70
main_launcher.py Normal file
View File

@ -0,0 +1,70 @@
"""
Haupteinstiegspunkt für den Anwendungs-Launcher.
Dieses Skript sollte im Hauptverzeichnis (C:/Development/Emirat) abgelegt werden.
"""
import os
import sys
import logging
from datetime import datetime
# Logging einrichten
log_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "logs")
os.makedirs(log_dir, exist_ok=True)
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler(
os.path.join(log_dir, f'launcher_{datetime.now().strftime("%Y%m%d")}.log')
),
logging.StreamHandler(sys.stdout)
]
)
logger = logging.getLogger(__name__)
def main():
"""
Hauptfunktion zum Starten des Launchers.
"""
try:
logger.info("Starte Emirat Software Launcher")
# Launcher-Verzeichnis zum Python-Pfad hinzufügen
launcher_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "Launcher")
if launcher_dir not in sys.path:
sys.path.insert(0, launcher_dir)
# Importiere und starte den Launcher
from Launcher.app_launcher import ApplicationLauncher
app = ApplicationLauncher()
app.mainloop()
logger.info("Launcher beendet")
except Exception as e:
logger.error(f"Fehler beim Starten des Launchers: {str(e)}", exc_info=True)
# Bei Fehlern im Grafikmodus einen Dialog anzeigen
try:
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
root.withdraw() # Verstecke das Hauptfenster
messagebox.showerror(
"Launcher-Fehler",
f"Der Launcher konnte nicht gestartet werden:\n\n{str(e)}\n\n"
f"Details wurden in die Logdatei geschrieben:\n{os.path.join(log_dir, 'launcher_*.log')}"
)
except:
# Fallback, wenn selbst der Fehlerdialog nicht angezeigt werden kann
print(f"KRITISCHER FEHLER: Der Launcher konnte nicht gestartet werden: {str(e)}")
print(f"Details wurden in die Logdatei geschrieben: {os.path.join(log_dir, 'launcher_*.log')}")
input("Drücken Sie Enter, um fortzufahren...")
if __name__ == "__main__":
main()

40
requirements.txt Normal file
View File

@ -0,0 +1,40 @@
# Datenbank-Treiber
pyodbc>=5.2.0
# GUI-Toolkit (tkinter ist in der Standardbibliothek, aber zur Dokumentation)
# Hinweis: tkinter erfordert keine separate Installation mit pip
# Entwicklungswerkzeuge
setuptools>=76.0.0
wheel>=0.45.1
black>=25.1.0 # Code-Formatierung (optional)
autopep8>=2.3.2 # Alternative Code-Formatierung (optional)
# Test-Frameworks
pytest>=8.3.5
pytest-cov>=6.0.0
# Debugging
ptvsd>=4.3.2 # Python-Debugger für VS Code (optional)
# Paketierungswerkzeuge für EXE-Erstellung
pyinstaller>=6.12.0
# Dokumentation
sphinx>=8.2.3 # Dokumentationsgenerator (optional)
# Lokale Pakete im Entwicklungsmodus
-e ./module_interface
-e ./common
# Logging-Erweiterungen
python-json-logger>=3.3.0
# Spezifische Abhängigkeiten für das Preislisten-Modul
# (Fügen Sie hier weitere spezifische Abhängigkeiten hinzu)
# Performance-Optimierungen
psutil>=7.0.0 # Systemressourcen überwachen (optional)
# Sicherheits-Tools
bcrypt>=4.3.0 # Für sicheres Passwort-Hashing