# SharePoint Browser 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 - **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, data-drevet brødkrummesti (breadcrumbs) og lazy-loading af hierarkisk træstruktur for markant hurtigere navigation. - **Paginering & Stor-tenant understøttelse:** Alle Graph API-kald følger `@odata.nextLink` automatisk, så mapper og sites med hundredvis af elementer indlæses korrekt uden tab. - **Statuslinje med fremgangsmåler:** En integreret statusmåler (gauge) i statuslinjen giver visuelt feedback under alle netværksoperationer. - **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. - **Netværkssikkerhed & Robusthed:** Automatisk retry med eksponentiel backoff ved HTTP 429 (rate limiting) og 503 (midlertidigt utilgængelig) samt timeout på alle netværkskald, så programmet aldrig hænger ved netværksproblemer. ## ⚙️ Indstillinger Indstillingsdialogen er organiseret i faner: | Fane | Indhold | |------|---------| | **Konto** | Azure Client ID og Tenant ID | | **Stier** | Midlertidig downloadmappe og app-placering | | **Licens** | Licensnøgle og aktiveringsstatus | | **System** | Sprog og log-output til fejlfinding | | **Om** | Versionsinformation og kontaktoplysninger | ## 🔒 Produktionssikkerhed Programmet er gennemgået og hærdet til produktionsbrug: | Område | Forbedring | |--------|-----------| | **Netværkstimeouts** | Alle `requests`-kald har `timeout=30 s` (API) / `timeout=120 s` (filuploads) — programmet hænger aldrig ved netværksproblemer | | **Automatisk retry** | `_graph_request`-hjælper håndterer HTTP 429 og 503 med op til 3 forsøg og eksponentiel backoff (maks. 60 s), respekterer `Retry-After`-header | | **Trådsikkerhed** | `threading.Lock` beskytter alle sammensatte operationer på `active_edits` (som tilgås fra både UI-tråd og baggrundstråde) | | **Fejlhåndtering** | Alle `except:`-blokke er erstattet med `except Exception:` så `SystemExit` og `KeyboardInterrupt` ikke sluges | | **Logging** | MSAL-initfejl og token-opdateringsfejl logges via `logger.error()` i stedet for `print()` | | **Stisikkerhed** | `os.path.basename()` anvendes på server-kontrollerede filnavne ved mappedownload | ## 🛠️ 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 Sørg for, at du har Python installeret sammen med afhængighederne. Det anbefales at have en Microsoft 365-licens klar. ```bash pip install wxPython msal requests ``` ### Kør applikationen Start op med: ```bash python sharepoint_browser.py ``` 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ørbar `.exe` fil til Windows bruges den medfølgende PyInstaller spec-fil: ```bash pip install pyinstaller python -m PyInstaller "SharePoint Explorer.spec" --noconfirm ``` Den færdige fil placeres i `dist/SharePoint Explorer.exe` med ikon indlejret. ## 🧩 Arkitektur & Workflow 1. **Godkendelse:** Autentificerer brugeren via MSAL & MS Graph API. 2. **Navigation:** Data hentes asynkront (lazy-loading) og chunked — de første resultater vises straks mens resten streames ind. Alt håndteres med ID'er i stedet for filstier, hvilket sikrer MAX_PATH-modstandsdygtighed. 3. **Navigationskontekst:** Brødkrummestien er data-drevet; hvert segment gemmer det fulde navigationsobjekt, så klik på en forælder altid navigerer korrekt uden at gennemsøge træet. 4. **Stale-result beskyttelse:** En navigations-tæller (`_nav_gen`) sikrer, at svar fra afbrudte netværkskald aldrig overskriver den aktive mappevisning. 5. **Baggrundshåndtering af redigering:** - Filer tjekkes ud (`Checkout`) direkte i SharePoint. - Hentes ned til det lokale drev under korte stier, eks. `C:\Temp_SP\[MD5-Hash].[ext]`. - Et baggrunds-thread overvåger det lokale program (fx Word) kontinuerligt via `os.rename()` tricket. - Når filen lukkes, uploades ændringerne til SharePoint og modtager et `Checkin`. ## 🧪 Tests En unit-test suite dækker de kritiske logik-komponenter: ```bash python -m unittest tests.test_review_fixes -v ``` Testene kører uden skærm/display (**45 tests**) og dækker: | Testklasse | Hvad der testes | |------------|----------------| | `TestStrings` | Oversættelses-nøgler og formatering | | `TestNavGenGuard` | Navigations-tæller og stale-result beskyttelse | | `TestUrlInitialization` | URL-initialisering i baggrundstråd | | `TestDeadSiteBranch` | Fjernede dead-code grene | | `TestIsBreakcrumbRemoved` | Ryddet signatur for `_navigate_to_item_data` | | `TestTask7BareExcept` | `except Exception`, `logger.error`, `os.path.basename` | | `TestNetworkTimeouts` | Alle `requests.*`-kald har `timeout=` | | `TestGraphRequest` | Retry-logik: 429/503, `Retry-After`, max-forsøg, timeout-injektion | | `TestActiveEditsLock` | `threading.Lock` på alle sammensatte `active_edits`-operationer | ## 💡 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). 5. Defensiv `try/except ValueError` i `_graph_request` ved parsing af `Retry-After`-header (for fremtidssikring mod HTTP-dato-format).