Refactor database handler to dynamically set database path and create app data directory; add installer script and requirements file for packaging
This commit is contained in:
5
.gitignore
vendored
5
.gitignore
vendored
@@ -1,2 +1,5 @@
|
||||
.venv
|
||||
*.db
|
||||
*.db
|
||||
/dist
|
||||
/build
|
||||
__pycache__/
|
||||
38
UFF-Search.spec
Normal file
38
UFF-Search.spec
Normal file
@@ -0,0 +1,38 @@
|
||||
# -*- mode: python ; coding: utf-8 -*-
|
||||
|
||||
|
||||
a = Analysis(
|
||||
['uff_app.py'],
|
||||
pathex=[],
|
||||
binaries=[],
|
||||
datas=[],
|
||||
hiddenimports=['rapidfuzz', 'pypdf'],
|
||||
hookspath=[],
|
||||
hooksconfig={},
|
||||
runtime_hooks=[],
|
||||
excludes=[],
|
||||
noarchive=False,
|
||||
optimize=0,
|
||||
)
|
||||
pyz = PYZ(a.pure)
|
||||
|
||||
exe = EXE(
|
||||
pyz,
|
||||
a.scripts,
|
||||
a.binaries,
|
||||
a.datas,
|
||||
[],
|
||||
name='UFF-Search',
|
||||
debug=False,
|
||||
bootloader_ignore_signals=False,
|
||||
strip=False,
|
||||
upx=True,
|
||||
upx_exclude=[],
|
||||
runtime_tmpdir=None,
|
||||
console=False,
|
||||
disable_windowed_traceback=False,
|
||||
argv_emulation=False,
|
||||
target_arch=None,
|
||||
codesign_identity=None,
|
||||
entitlements_file=None,
|
||||
)
|
||||
BIN
UFF_Search_Installer_v3.exe
Normal file
BIN
UFF_Search_Installer_v3.exe
Normal file
Binary file not shown.
3
requirements.txt
Normal file
3
requirements.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
pypdf
|
||||
rapidfuzz
|
||||
PyQt6
|
||||
52
setup-file.iss
Normal file
52
setup-file.iss
Normal file
@@ -0,0 +1,52 @@
|
||||
; -- UFF-Search Installer Skript --
|
||||
|
||||
[Setup]
|
||||
; Der Name, der überall steht
|
||||
AppName=UFF Text Search
|
||||
AppVersion=3.0
|
||||
AppPublisher=Konstantin Roßmann
|
||||
AppPublisherURL=https://rossmann-it-solutions.de
|
||||
|
||||
; Wo soll standardmäßig installiert werden? {autopf} ist "Program Files"
|
||||
DefaultDirName={autopf}\UFF-Search
|
||||
; Name der Gruppe im Startmenü
|
||||
DefaultGroupName=UFF Search
|
||||
|
||||
; Speicherort der fertigen setup.exe (z.B. auf dem Desktop oder im Projektordner)
|
||||
OutputDir=.
|
||||
OutputBaseFilename=UFF_Search_Installer_v3
|
||||
Compression=lzma
|
||||
SolidCompression=yes
|
||||
|
||||
; Icon für den Installer selbst (optional, sonst weglassen)
|
||||
; SetupIconFile=app.ico
|
||||
|
||||
; Administrator-Rechte anfordern für Installation in Program Files
|
||||
PrivilegesRequired=admin
|
||||
|
||||
[Languages]
|
||||
Name: "german"; MessagesFile: "compiler:Languages\German.isl"
|
||||
|
||||
[Tasks]
|
||||
; Checkbox: "Desktop Verknüpfung erstellen"
|
||||
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
||||
|
||||
[Files]
|
||||
; !!! WICHTIG: HIER DEN PFAD ZU DEINER EXE ANPASSEN !!!
|
||||
; "Source" muss auf die Datei zeigen, die PyInstaller im "dist" Ordner erstellt hat.
|
||||
Source: "C:\Users\konst\Arbeit\unsorted-folder-full-text-search\dist\UFF-Search.exe"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
; Falls du ein Icon mitliefern willst (optional)
|
||||
; Source: "C:\Pfad\Zu\Deinem\Projekt\app.ico"; DestDir: "{app}"; Flags: ignoreversion
|
||||
|
||||
[Icons]
|
||||
; Verknüpfung im Startmenü
|
||||
Name: "{group}\UFF Text Search"; Filename: "{app}\UFF-Search.exe"
|
||||
; Verknüpfung zum Deinstallieren
|
||||
Name: "{group}\Uninstall UFF Search"; Filename: "{uninstallexe}"
|
||||
; Verknüpfung auf dem Desktop (wenn vom User ausgewählt)
|
||||
Name: "{commondesktop}\UFF Text Search"; Filename: "{app}\UFF-Search.exe"; Tasks: desktopicon
|
||||
|
||||
[Run]
|
||||
; Checkbox am Ende: "Programm jetzt starten"
|
||||
Description: "{cm:LaunchProgram,UFF Text Search}"; Filename: "{app}\UFF-Search.exe"; Flags: nowait postinstall skipifsilent
|
||||
31
uff_app.py
31
uff_app.py
@@ -16,8 +16,28 @@ from PyQt6.QtGui import QDesktopServices
|
||||
# --- 1. DATENBANK MANAGER (Mit Fuzzy-Ranking) ---
|
||||
|
||||
class DatabaseHandler:
|
||||
def __init__(self, db_name="uff_index.db"):
|
||||
self.db_name = db_name
|
||||
def __init__(self):
|
||||
# 1. Wir ermitteln den korrekten AppData Ordner für den User
|
||||
# Windows: C:\Users\Name\AppData\Local\UFF_Search
|
||||
if os.name == 'nt':
|
||||
base_dir = os.getenv('LOCALAPPDATA')
|
||||
else:
|
||||
# Mac/Linux: ~/.local/share/uff_search
|
||||
base_dir = os.path.join(os.path.expanduser("~"), ".local", "share")
|
||||
|
||||
# 2. Wir erstellen unseren eigenen Unterordner
|
||||
self.app_data_dir = os.path.join(base_dir, "UFF_Search")
|
||||
|
||||
# Falls der Ordner nicht existiert, erstellen wir ihn
|
||||
if not os.path.exists(self.app_data_dir):
|
||||
os.makedirs(self.app_data_dir)
|
||||
|
||||
# 3. Der Pfad zur Datenbank
|
||||
self.db_name = os.path.join(self.app_data_dir, "uff_index.db")
|
||||
|
||||
# Debug-Info (falls du es im Terminal testest)
|
||||
print(f"Datenbank Pfad: {self.db_name}")
|
||||
|
||||
self.init_db()
|
||||
|
||||
def init_db(self):
|
||||
@@ -324,7 +344,12 @@ class UffWindow(QMainWindow):
|
||||
def start_indexing(self, folder):
|
||||
self.set_ui_busy(True)
|
||||
self.lbl_status.setText(f"Starte... {os.path.basename(folder)}")
|
||||
self.indexer_thread = IndexerThread(folder)
|
||||
|
||||
# HIER WAR DER FEHLER:
|
||||
# Wir müssen dem Thread explizit sagen, wo die Datenbank liegt!
|
||||
# self.db.db_name enthält den korrekten Pfad (C:\Users\...\AppData\...)
|
||||
self.indexer_thread = IndexerThread(folder, db_name=self.db.db_name)
|
||||
|
||||
self.indexer_thread.progress_signal.connect(lambda msg: self.lbl_status.setText(msg))
|
||||
self.indexer_thread.finished_signal.connect(self.indexing_finished)
|
||||
self.indexer_thread.start()
|
||||
|
||||
Reference in New Issue
Block a user