diff --git a/README.md b/README.md index f101b95..0bb9842 100644 --- a/README.md +++ b/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 - ``` -2. Konfigurer `settings.json` med din `client_id` og `tenant_id`. +```bash +pip install wxPython msal requests +``` -### 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). diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..ffe967d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +wxPython>=4.2.1 +msal>=1.28.0 +requests>=2.31.0 +pyinstaller>=6.5.0 diff --git a/sharepoint_browser.py b/sharepoint_browser.py index 7619439..8bd37ed 100644 --- a/sharepoint_browser.py +++ b/sharepoint_browser.py @@ -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)