From e70562cbdc087c510ac1e6026cbcd49cd070b9ec Mon Sep 17 00:00:00 2001 From: Adam Skotarczak Date: Fri, 25 Apr 2025 08:56:35 +0200 Subject: [PATCH] 1.1.0 --- .vscode/extensions.json | 7 +++++ .vscode/settings.jsonc | 30 +++++++++++++++++++ .vscode/tasks.json | 17 +++++++++++ CHANGELOG.md | 64 ++++++++++++++++++++++++----------------- LICENSE | 26 ++++++++++------- README.md | 56 +++++++++++++++++++++++++++--------- VERSION | 2 +- app/main.py | 3 +- start.cmd | 8 +++++- start.pyw | 3 +- start.sh | 7 +++-- 11 files changed, 166 insertions(+), 57 deletions(-) create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.jsonc create mode 100644 .vscode/tasks.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..efcd059 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "ms-python.python", + "ms-python.vscode-pylance", + "ms-toolsai.jupyter" + ] + } diff --git a/.vscode/settings.jsonc b/.vscode/settings.jsonc new file mode 100644 index 0000000..8c46f9c --- /dev/null +++ b/.vscode/settings.jsonc @@ -0,0 +1,30 @@ +{ // Bitte daran denken das Kommentare eigentlich nicht von json unterstützt werden :-) + // Das funktioniert hier nur in Microsofts jsonc im VS-Code! + "python.linting.enabled": true, + "python.linting.pylintEnabled": true, + "python.linting.mypyEnabled": true, + "python.linting.pylintArgs": ["--disable=C0114,C0115,C0116"], + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit" + }, + "python.analysis.typeCheckingMode": "basic", + + // Abschliessende Leerzeichen entfernen: + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + + // Markdown für das Entfernen von abschliessenden Leerzeichen rausnehmen: + "[markdown]": { + "files.trimTrailingWhitespace": false, + "editor.wordWrap": "off" + }, + + // Für Pythonfiles Tababstand definieren und Tabs durch Leerzeichen ersetzen + "[python]": { + "editor.tabSize": 4, + "editor.insertSpaces": true + }, + + + } diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..388da81 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,17 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Linter (pylint)", + "type": "shell", + "command": "pylint beispiel.py", + "group": "build" + }, + { + "label": "Typprüfung (mypy)", + "type": "shell", + "command": "mypy beispiel.py", + "group": "build" + } + ] + } diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e7eabd..aeaaefb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,36 +2,48 @@ ## pyUpload (TKInter-Version 1.0) -- **2025-04-22 - v.1.0.2** +- **2025-04-25 - v1.1.0** + - **Geändert:** + - [x] Lizenz auf __MIT__ mit Namensnennung umgestellt, siehe [LICENSE](./LICENSE) -- Behoben - -- Wrapper-Skript `start.py` erkennt nun fehlende `.venv` und startet `main.py` beim Erststart korrekt mit System-Python, danach mit venv (`start.py`). - -- `main.py` verwendet unter Windows statt `os.execv()` nun `subprocess.Popen(..., CREATE_NEW_CONSOLE)` für einen sauberen Neustart mit sichtbarer Konsole (`main.py`). + - [x] `main.py` prüft nun zusätzlich, ob bereits mit `pythonw.exe` gestartet wurde, um doppelten Start mit neuem Fenster zu vermeiden + - [x] `main.py` ruft nach `subprocess.Popen(...)` nun zuverlässig `sys.exit(0)` auf, um „leere“ Ursprungsfenster zu beenden + - [x] `start.cmd` verwendet jetzt `python.exe` statt `pythonw.exe`, wodurch nur noch **ein** Konsolenfenster erscheint – auch beim Setup + - [x] `start.sh` erkennt fehlendes `python3` und bricht mit Hinweis ab; Pfade werden sauber relativ berechnet -- Entfernt - -- Nicht mehr benötigte Funktion `activate_venv()` entfernt (`main.py`). + - **Behoben:** + - [x] Mit diesen Änderungen behoben, dass unter Windows unnötige Consolenfenster gestartet werden und der Sprung nun sauber in die Virtuelle Umbebung `./app/.venv` erfolgt. -- **2025-04-21 - v.1.0.1** +- **2025-04-22 - v1.0.2** - - Geändert - - `main.py` übernimmt nun automatisch die Erstellung der virtuellen Umgebung `.venv` und die Installation der Abhängigkeiten aus `requirements.txt` - - Entfernt: `install.cmd` und `startUpload.cmd` wurden vollständig ersetzt durch neue Startlogik - - `start.cmd` wurde vereinfacht, prüft nun auf vorhandenes `python` und startet `main.py` über absoluten Pfad - - `main.py` setzt bei Start automatisch `os.chdir()` auf das eigene Verzeichnis, um relative Pfade sicher zu behandeln + - **Behoben:** + - [x] Wrapper-Skript `start.py` erkennt nun fehlende `.venv` und startet `main.py` beim Erststart korrekt mit System-Python, danach mit venv (`start.py`). + - [x] `main.py` verwendet unter Windows statt `os.execv()` nun `subprocess.Popen(..., CREATE_NEW_CONSOLE)` für einen sauberen Neustart mit sichtbarer Konsole (`main.py`). - - Hinzugefügt - - Neue plattformunabhängige `start.sh` für Linux/macOS - - Automatischer Restart nach Installation über `os.execv()` in `main.py` - - Neue Sicherheits- und Netzwerkinformationen in der `README.md` - - Erweiterung der `README.md` um Speicherort der Uploads und Projektstruktur - - Hinweis auf Projektstatus und neue Version unter - - Neue LICENSE-Datei (proprietär, nicht zur Weitergabe) - - start.py hinzugefügt wenn auf manchen Systemen die Ausführung von .cmd und .bat gesperrt sind. + - **Entfernt:** + -- [x] Nicht mehr benötigte Funktion `activate_venv()` entfernt (`main.py`). - - Fixes - - PowerShell-Inkompatibilitäten mit `set /p` entfernt - - `.cmd`-Startskripte reagieren jetzt korrekt auf STRG+C - - Mehrere Markdown-Korrekturen (Codeblöcke, Leerzeilen, Lesbarkeit) +- **2025-04-21 - v1.0.1** -- **2025-04-21 - v.1.0.0** - - release! + - **Geändert:** + - [x] `main.py` übernimmt nun automatisch die Erstellung der virtuellen Umgebung `.venv` und die Installation der Abhängigkeiten aus `requirements.txt` + - [x] Entfernt: `install.cmd` und `startUpload.cmd` wurden vollständig ersetzt durch neue Startlogik + - [x] `start.cmd` wurde vereinfacht, prüft nun auf vorhandenes `python` und startet `main.py` über absoluten Pfad + - [x] `main.py` setzt bei Start automatisch `os.chdir()` auf das eigene Verzeichnis, um relative Pfade sicher zu behandeln + + - **Hinzugefügt:** + - [x] Neue plattformunabhängige `start.sh` für Linux/macOS + - [x] Automatischer Restart nach Installation über `os.execv()` in `main.py` + - [x] Neue Sicherheits- und Netzwerkinformationen in der `README.md` + - [x] Erweiterung der `README.md` um Speicherort der Uploads und Projektstruktur + - [x] Hinweis auf Projektstatus und neue Version unter + - [x] Neue LICENSE-Datei (proprietär, nicht zur Weitergabe) + - [x] start.py hinzugefügt wenn auf manchen Systemen die Ausführung von .cmd und .bat gesperrt sind. + + - **Fixes:** + - [x] PowerShell-Inkompatibilitäten mit `set /p` entfernt + - [x] `.cmd`-Startskripte reagieren jetzt korrekt auf STRG+C + - [x] Mehrere Markdown-Korrekturen (Codeblöcke, Leerzeilen, Lesbarkeit) + +- **2025-04-21 - v1.0.0** + - [x] release! diff --git a/LICENSE b/LICENSE index 6094427..1989462 100644 --- a/LICENSE +++ b/LICENSE @@ -1,17 +1,23 @@ -# LICENSE +MIT License with Attribution Requirement Copyright (c) 2025 Adam Skotarczak -Alle Rechte vorbehalten. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, subject to the following conditions: -Diese Software ist urheberrechtlich geschützt. Die Verwendung, Vervielfältigung, Verbreitung oder Änderung -dieser Software oder von Teilen davon ist ohne vorherige schriftliche Genehmigung des Autors ausdrücklich untersagt. +1. The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. -Die Software darf ausschließlich für private, interne oder zu Prüf- und Testzwecken verwendet werden. -Eine kommerzielle Nutzung oder Weitergabe an Dritte ist nicht gestattet. +2. **Attribution Requirement**: Any public use or distribution of this Software, +modified or unmodified, must include a clear and visible attribution to the original author: -Die Bereitstellung dieser Software erfolgt OHNE JEGLICHE GARANTIE, -weder ausdrücklich noch stillschweigend, einschließlich, aber nicht beschränkt auf die Garantien -der Marktgängigkeit oder Eignung für einen bestimmten Zweck. +**Adam Skotarczak ** -Durch die Nutzung dieser Software erklärst du dich mit den oben genannten Bedingungen einverstanden. +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 7fd0d16..ffb3fef 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,21 @@ -# pyUpload (TKInter Version) +# pyUpload (TKinter-Version) ![pyUpload 1.0 Logo](./assets/logo-1.0-alpha.png) ## ⚠️ Projektstatus: Eingefroren – Nur noch Bugfixes Diese Version von **pyUpload** wird **nicht weiterentwickelt** und erhält nur noch Fehlerbehebungen. -Die neue Version mit Flask-Backend ist **BALD** verfügbar unter: +Die neue Version mit Flask-Backend wird **bald** verfügbar sein unter: 🔗 **** --- -- [pyUpload (TKInter Version)](#pyupload-tkinter-version) +## 📑 Inhalt der Readme + +- [pyUpload (TKinter-Version)](#pyupload-tkinter-version) - [⚠️ Projektstatus: Eingefroren – Nur noch Bugfixes](#️-projektstatus-eingefroren--nur-noch-bugfixes) + - [📑 Inhalt der Readme](#-inhalt-der-readme) - [pyUpload – Sicherer Datei-Upload-Server über HTTPS (lokal \& offline)](#pyupload--sicherer-datei-upload-server-über-https-lokal--offline) - [🛠 Features](#-features) - [🚀 Schnellstart](#-schnellstart) @@ -24,7 +27,7 @@ Die neue Version mit Flask-Backend ist **BALD** verfügbar unter: - [🔐 Hinweis zur SSL-Zertifikatswarnung](#-hinweis-zur-ssl-zertifikatswarnung) - [💡 Ideen für zukünftige Entwicklungen](#-ideen-für-zukünftige-entwicklungen) - [🐛 Bekannte Bugs](#-bekannte-bugs) - - [👨‍💻 Autor und alle beteiligte](#-autor-und-alle-beteiligte) + - [## 👨‍💻 Autor und Beteiligte](#--autor-und-beteiligte) - [📝 Lizenz](#-lizenz) --- @@ -34,6 +37,8 @@ Die neue Version mit Flask-Backend ist **BALD** verfügbar unter: Diese Version basiert auf **Tkinter (GUI + QR)** sowie einer optionalen **reinen CLI-Nutzung**. Sie ist vollständig lokal lauffähig – ganz ohne Installation von externen Tools oder komplexen Abhängigkeiten. +[🔝](#-inhalt-der-readme) + --- ## 🛠 Features @@ -46,6 +51,8 @@ Sie ist vollständig lokal lauffähig – ganz ohne Installation von externen To - **automatische Einrichtung von `.venv` und Abhängigkeiten** - **kein Installationsskript mehr nötig – alles passiert beim Start von `main.py`** +[🔝](#-inhalt-der-readme) + --- ## 🚀 Schnellstart @@ -60,7 +67,7 @@ Sie ist vollständig lokal lauffähig – ganz ohne Installation von externen To ``` Alternativ einfach eine bereinigte `.zip` bei den [Releases auf GitHub](https://github.com/realAscot/pyUpload/releases/) herrunterladen. - Diese enthällt kein `.git Archiv` und enthält nur das aller nötigste zum Betrieb des Programms. + Diese enthält kein `.git`-Archiv und nur das Allernötigste für den Betrieb des Programms. 2. Starte die App mit: @@ -76,12 +83,16 @@ Sie ist vollständig lokal lauffähig – ganz ohne Installation von externen To ⚠️ **Alternative 2 falls die Ausführung per Doppelklick auf .bat oder .cmd gesperrt ist:** - > Doppelklick auf -> `start.pyw` + Doppelklick auf `start.pyw` oder im Terminal mit: - Es ist möglich das beim ersten mal gefragt wird womit das Programm gestartet werden soll. + ```cmd + python start.pyw` + ``` + + Es ist möglich, dass beim ersten Mal gefragt wird, womit das Programm gestartet werden soll. Einfach die Python-Installation suchen und `python.exe` wählen. - - Ich empfehle einfach eine Verknüpfung der `start.pyw` zB auf den Desktop oder ins Startmenü zu legen. + + Ich empfehle, eine Verknüpfung der `start.pyw` z. B. auf dem Desktop zu erstellen ### 🐧 Für Linux / macOS: @@ -111,6 +122,8 @@ Beim ersten Start wird automatisch: - `requirements.txt` installiert - das Programm danach neu aus der Umgebung gestartet +[🔝](#-inhalt-der-readme) + --- ## 🧩 Kommandozeilenoptionen @@ -135,6 +148,8 @@ pythonw.exe start.pyw --port 9999 # Custom-Port verwenden Wenn Du die Dateierweiterung `.pyw` mit `pythonw.exe` verknüpfst, klappt es auch ohne mit Doppelklick im Explorer :-) +[🔝](#-inhalt-der-readme) + --- ## 🌐 Zugriff im Browser @@ -150,6 +165,8 @@ Dateien werden im `upload//` gespeichert. Wichtig dabei ist es darauf zu achten, das tatsächlich auch https verwendet wird, falls man die Adresse händisch eingibt statt mit QR-Code! Man könnte noch zusätzlich einen http-server in der App laufen lassen, der dann automatisch umleitet, aber wir möchten das Programm so klein wie möglich halten. +[🔝](#-inhalt-der-readme) + --- ## 📁 Logs & Uploads @@ -158,6 +175,8 @@ Wichtig dabei ist es darauf zu achten, das tatsächlich auch https verwendet wir - **Zentrale Logs**: `logs/pyupload.log` - **Pro-Client Logs**: `logs/.log` +[🔝](#-inhalt-der-readme) + --- ## 🔐 Hinweis zur SSL-Zertifikatswarnung @@ -172,7 +191,10 @@ Da das in lokalen oder testnahen Umgebungen in der Regel nicht der Fall ist, lä >💡 **Wichtig zu wissen:** Die Verbindung ist trotzdem Ende-zu-Ende verschlüsselt. Die Schlüssel werden bei jedem Start lokal neu generiert – direkt auf deinem Rechner. - Technisch ist die Verbindung also sicher. Dein Browser vertraut dem Zertifikat nur nicht, weil es nicht von einer offiziellen Zertifizierungsstelle stammt – sondern von dir selbst. + Technisch ist die Verbindung also sicher. + Dein Browser vertraut dem Zertifikat lediglich nicht, weil es nicht von einer offiziellen Zertifizierungsstelle stammt, sondern lokal erzeugt wurde. + +[🔝](#-inhalt-der-readme) --- @@ -186,6 +208,8 @@ Beiträge willkommen! - [ ] _____________________________________________________ - [ ] _____________________________________________________ +[🔝](#-inhalt-der-readme) + --- ## 🐛 Bekannte Bugs @@ -193,11 +217,14 @@ Beiträge willkommen! - **Frontend:** wenn im Browser der Button Hochladen gewählt wird, OHNE das Dateien ausgewählt wurden, kommt es zu einem *Error response - Error code: 400* im Browser. Lösungsansatz wäre den Button über JS zu sperren solange keine Datei ausgewählt ist. Lässt sich schnell im [template](./app/template.html) erledigen. -Wenn jemand Lust und Zeit hat sich diesem anzunehmen, nur zu. Ich Danke im Vorraus! +Wenn jemand Lust und Zeit hat sich diesem anzunehmen, nur zu. +Ich danke im Voraus! + +[🔝](#-inhalt-der-readme) --- -## 👨‍💻 Autor und alle beteiligte +## ## 👨‍💻 Autor und Beteiligte - **Adam Skotarczak** Kontakt: [adam@skotarczak.net](mailto:adam@skotarczak.net) @@ -205,9 +232,10 @@ Wenn jemand Lust und Zeit hat sich diesem anzunehmen, nur zu. Ich Danke im Vorra - **Du?** +[🔝](#-inhalt-der-readme) + --- ## 📝 Lizenz -- Proprietär, © 2025 Adam Skotarczak - **Keine Weitergabe ohne ausdrückliche Genehmigung** +MIT [LICENSE](./LICENSE) – frei verwendbar in eigenen Projekten bei Namensnennung. diff --git a/VERSION b/VERSION index e6d5cb8..9084fa2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0.2 \ No newline at end of file +1.1.0 diff --git a/app/main.py b/app/main.py index 5b4a6c5..176f3f6 100644 --- a/app/main.py +++ b/app/main.py @@ -19,7 +19,7 @@ VENV_PYTHON = os.path.join(VENV_DIR, "Scripts", "python.exe") if os.name == "nt" REQUIREMENTS_FILE = os.path.join(BASE_DIR, "requirements.txt") # Wenn wir NICHT in der venv sind -if sys.prefix == sys.base_prefix: +if sys.prefix == sys.base_prefix and sys.executable != VENV_PYTHON: # venv erstellen falls nötig if not os.path.exists(VENV_DIR): print("[Setup] Virtuelle Umgebung wird erstellt...") @@ -34,6 +34,7 @@ if sys.prefix == sys.base_prefix: if os.name == "nt": subprocess.Popen([VENV_PYTHON] + sys.argv, creationflags=subprocess.CREATE_NEW_CONSOLE) + sys.exit(0) else: os.execv(VENV_PYTHON, [VENV_PYTHON] + sys.argv) sys.exit(0) diff --git a/start.cmd b/start.cmd index c8bbfc3..1f8b52b 100644 --- a/start.cmd +++ b/start.cmd @@ -15,4 +15,10 @@ if errorlevel 1 ( set SCRIPT_DIR=%~dp0 :: Starte den Python-Wrapper, der .venv erkennt -pythonw.exe "%SCRIPT_DIR%start.pyw" %* +if exist app\.venv\Scripts\python.exe ( + python.exe "%SCRIPT_DIR%start.pyw" %* +) else ( + echo Erste Initialisierung erforderlich. + echo Starte Setup-Konsole... + start cmd /k python.exe "%SCRIPT_DIR%start.pyw" %* +) diff --git a/start.pyw b/start.pyw index 7af4058..7a46360 100644 --- a/start.pyw +++ b/start.pyw @@ -13,4 +13,5 @@ venv_python = os.path.join("app", ".venv", "Scripts", "python.exe") if os.name = python_exec = venv_python if os.path.exists(venv_python) else sys.executable # Starte main.py -subprocess.run([python_exec, "app/main.py"] + sys.argv[1:]) +main_script = os.path.abspath(os.path.join("app", "main.py")) +subprocess.run([python_exec, main_script] + sys.argv[1:]) diff --git a/start.sh b/start.sh index 95ff472..d548670 100644 --- a/start.sh +++ b/start.sh @@ -1,6 +1,7 @@ #!/bin/bash +set -e -# Verzeichnis dieser Datei bestimmen +# Absoluten Pfad zur start.pyw berechnen (falls per Symlink gestartet) SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Python-Interpreter prüfen @@ -10,5 +11,5 @@ if ! command -v python3 &> /dev/null; then exit 1 fi -# Starte das Hauptskript -python3 "$SCRIPT_DIR/app/main.py" "$@" +# Direkt ausführen +python3 "$SCRIPT_DIR/start.pyw" "$@"