feat: migrate to wxPython, add setup wizard, and update documentation
This commit is contained in:
76
README.md
76
README.md
@@ -1,50 +1,62 @@
|
||||
# SharePoint Explorer
|
||||
# SharePoint Browser
|
||||
|
||||
En moderne Python-baseret fil-browser til Microsoft SharePoint, designet til at omgå Windows' `MAX_PATH` (260 karakterer) begrænsning.
|
||||
En moderne Python-baseret fil-browser til Microsoft SharePoint, specielt designet til at omgå Windows' `MAX_PATH` (260 karakterer) begrænsning. Det opnås ved at integrere direkte med Microsoft Graph API ved hjælp af unikke ID'er og downloade/udtjekke filer til redigering via korte, midlertidige stier lokalt.
|
||||
|
||||
## Funktioner
|
||||
- **Søg og Browse:** Naviger dynamisk gennem SharePoint sites, dokumentbiblioteker og mapper.
|
||||
- **Sikker Redigering:** Automatisk Check-out/Check-in håndtering via Microsoft Graph API.
|
||||
- **Explorer Vibes:** Moderne brugerflade med sortering (mapper øverst) og brødkrummesti (breadcrumb).
|
||||
- **Ingen Sti-begrænsning:** Arbejder med unikke ID'er og korte midlertidige stier for at undgå MAX_PATH fejl.
|
||||
## 🚀 Funktioner
|
||||
|
||||
## Installation & Udvikling
|
||||
- **Ingen Sti-begrænsning (MAX_PATH):** Problemfri og pålidelig redigering uanset mappedybde i SharePoint.
|
||||
- **Sikker Redigering & Kollision-beskyttelse:** Automatisk Check-out/Check-in og intelligent overvågning af fil-låse lokalt.
|
||||
- **Professionel Brugerflade:** Bygget med `wxPython` (Native Windows UI) inklusiv indfødte OS-ikoner, brødkrummesti (breadcrumbs) og lazy-loading af hierarkisk træstruktur for markant hurtigere navigation.
|
||||
- **First-Run Setup Wizard:** Automatisk konfigurationsguide ved første opstart, der opsamler Client ID og Tenant ID (kræver ingen forudgående manuel `settings.json`).
|
||||
- **Avanceret Søgning:** Hurtig global søgefunktion der bygger på et lokalt, trinvist opdateret indeks, samt understøttelse af "OG"-logik (AND logic).
|
||||
- **Fuld Fil- og Mappestyring:** Understøtter upload, sletning og omdøbning, samt visning af udvidet fil-metadata (filstørrelse, redigeringsdato).
|
||||
- **Multisprog:** Indbygget og brugerstyret understøttelse af både Dansk og Engelsk-grænseflade.
|
||||
- **Multi-File Editing:** Robust understøttelse for lokalt at redigere flere forskellige filer uafhængigt af hinanden i baggrunden uden at interface fryser.
|
||||
|
||||
## 🛠️ Teknologier
|
||||
|
||||
- **Sprog:** Python 3.x
|
||||
- **GUI Framework:** wxPython
|
||||
- **Godkendelse:** MSAL (Microsoft Authentication Library)
|
||||
- **API Integration:** Microsoft Graph API via `requests`
|
||||
- **Fil-overvågning:** Polling via låse på lokalt filsystem
|
||||
|
||||
## 📦 Installation & Opstart
|
||||
|
||||
### Forudsætninger
|
||||
- Python 3.x
|
||||
- Microsoft 365 licens (Business Standard eller højere anbefales)
|
||||
Sørg for, at du har Python installeret sammen med afhængighederne. Det anbefales at have en Microsoft 365-licens klar.
|
||||
|
||||
### Setup
|
||||
1. Installer afhængigheder:
|
||||
```bash
|
||||
pip install customtkinter msal requests
|
||||
pip install wxPython msal requests
|
||||
```
|
||||
2. Konfigurer `settings.json` med din `client_id` og `tenant_id`.
|
||||
|
||||
### Kørsel
|
||||
### Kør applikationen
|
||||
Star op med:
|
||||
```bash
|
||||
python sharepoint_browser.py
|
||||
```
|
||||
|
||||
## Kompilering til EXE
|
||||
For at pakke programmet til en enkelt selvstændig `.exe` fil:
|
||||
Ved første kørsel uden en konfiguration vil applikationen præsentere en Setup Wizard, hvor man nemt kan indtaste Microsoft-loginoplysningerne. Indtastningerne gemmes i en lokal `settings.json` fil.
|
||||
|
||||
## 🏗️ Byg til EXE (Valgfrit)
|
||||
For at pakke programmet til en uafhængig, "kør-bar" `.exe` fil til Windows, kan dette gøres med PyInstaller:
|
||||
```bash
|
||||
pip install pyinstaller
|
||||
python -m PyInstaller --noconsole --onefile --collect-all customtkinter --name "SharePoint Explorer" sharepoint_browser.py
|
||||
python -m PyInstaller --windowed --onefile --icon=icon.ico --name "SharePoint Browser" sharepoint_browser.py
|
||||
```
|
||||
Den færdige fil findes i mappen `dist/`. Husk at placere `settings.json` i samme mappe som `.exe` filen.
|
||||
*(Husk at afhæningheder og ikoner skal inddrages formelt i dit build afhængigt af din PyInstaller spec-fil).*
|
||||
|
||||
## Konfiguration (`settings.json`)
|
||||
```json
|
||||
{
|
||||
"client_id": "DIN_CLIENT_ID",
|
||||
"tenant_id": "DIN_TENANT_ID",
|
||||
"temp_dir": "C:\\Temp_SP"
|
||||
}
|
||||
## 🧩 Arkitektur & Workflow
|
||||
1. **Godkendelse:** Det autentificerer brugeren via MSAL & MS Graph API.
|
||||
2. **Navigation:** Data hentes asynkront (lazy-loading). Alt håndteres med ID'er istedet for filstier, hvilket sikrer MAX_PATH-modstandsdygtighed.
|
||||
3. **Baggrundshåndtering af redigering:**
|
||||
- Filer tjekkes ud (`Checkout`) direkte i SharePoint.
|
||||
- Hentes ned til det lokale drev under korte stier under C-drevet eks. `C:\Temp_SP\[MD5-Hash].[ext]`.
|
||||
- Et baggrunds-thread overvåger derefter det lokale program (fx Word) kontinuerligt via `os.rename()` tricket.
|
||||
- Når filen lukkes fra dit office-program, uploades ændringerne op til SharePoint og modtager et `Checkin`.
|
||||
|
||||
## Feature Request
|
||||
1. Tilføj funktion til at gemme og administrere, flere tenants.
|
||||
2. Debug log til at se hvad der sker i baggrunden.
|
||||
3. Exteded log for 14 dage, som logger alle handlinger brugeren forateager sig i appen.
|
||||
4. Licens styring, så man kan licencere programmet til kunder. Der skal være mulighed for 1 år, 3 år og unlimited.
|
||||
```
|
||||
## 💡 Backlog / Kommende muligheder
|
||||
1. Integration for håndtering af flere tenants (lejemål)
|
||||
2. Et yderligere detaljeret log-system specielt til debugging af baggrundstråden.
|
||||
3. Udvidet aktivitetslog til sporing af handlinger for de seneste 14 dage.
|
||||
4. Styring af licenser til specifikke kunders varigheder (fx 1 år, 3 år, Lifetime).
|
||||
|
||||
4
requirements.txt
Normal file
4
requirements.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
wxPython>=4.2.1
|
||||
msal>=1.28.0
|
||||
requests>=2.31.0
|
||||
pyinstaller>=6.5.0
|
||||
@@ -467,13 +467,13 @@ class StartGuideDialog(wx.Dialog):
|
||||
"1. Gå til portal.azure.com og log ind med din administrator konto.\n"
|
||||
"2. Søg efter 'App registrations' og klik på 'New registration'.\n"
|
||||
"3. Giv den et navn (f.eks. 'SharePoint Explorer') og vælg 'Accounts in any organizational directory' (eller 'Accounts in this organizational directory only' hvis det kun er internt).\n"
|
||||
"4. Vælg 'Public client/native (mobile & desktop)' under Redirect URI og skriv:\n https://login.microsoftonline.com/common/oauth2/nativeclient\n"
|
||||
"4. Vælg 'Public client/native (mobile & desktop)' under Redirect URI og skriv:\n http://localhost\n"
|
||||
"5. Klik 'Register'.\n\n"
|
||||
"Giv tilladelser (API permissions):\n"
|
||||
"1. Klik på 'API permissions' i menuen til venstre.\n"
|
||||
"2. Klik 'Add a permission' -> 'Microsoft Graph' -> 'Delegated permissions'.\n"
|
||||
"3. Tilføj følgende: Files.ReadWrite.All, Sites.Read.All, og User.Read.\n"
|
||||
"4. Husk at klikke 'Grant admin consent' hvis nødvendigt.\n"
|
||||
"4. Husk at klikke 'Grant admin consent'.\n"
|
||||
"5. Under 'Authentication' i menuen til venstre, sørg for at 'Allow public client flows' er aktiveret (slået til) i bunden af siden.\n\n"
|
||||
"Kopier nu disse to værdier fra 'Overview' siden og sæt ind herunder:"
|
||||
)
|
||||
@@ -502,12 +502,12 @@ class StartGuideDialog(wx.Dialog):
|
||||
|
||||
# Gem/Annuller
|
||||
btn_box = wx.BoxSizer(wx.HORIZONTAL)
|
||||
save_btn = wx.Button(panel, label="Gem Indstillinger" if self.lang == "da" else "Save Settings", size=(150, 40))
|
||||
save_btn = wx.Button(panel, label=self.get_txt("settings_save"), size=(150, 40))
|
||||
save_btn.SetBackgroundColour(wx.Colour(0, 120, 215))
|
||||
save_btn.SetForegroundColour(wx.WHITE)
|
||||
save_btn.Bind(wx.EVT_BUTTON, self.on_save)
|
||||
|
||||
cancel_btn = wx.Button(panel, label="Afslut" if self.lang == "da" else "Exit", size=(100, 40))
|
||||
cancel_btn = wx.Button(panel, label=self.get_txt("settings_cancel"), size=(100, 40))
|
||||
cancel_btn.Bind(wx.EVT_BUTTON, self.on_cancel)
|
||||
|
||||
btn_box.Add(save_btn, 0, wx.RIGHT, 10)
|
||||
|
||||
Reference in New Issue
Block a user