- Add network robustness bullet to features list - Add new "Produktionssikkerhed" section covering timeouts, retry, thread safety, exception handling, logging and path sanitization - Expand test section with table of all 9 test classes and their scope - Add remaining Retry-After defensive parsing to backlog Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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.nextLinkautomatisk, 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.
pip install wxPython msal requests
Kør applikationen
Start op med:
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:
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
- Godkendelse: Autentificerer brugeren via MSAL & MS Graph API.
- 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.
- 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.
- Stale-result beskyttelse: En navigations-tæller (
_nav_gen) sikrer, at svar fra afbrudte netværkskald aldrig overskriver den aktive mappevisning. - 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.
- Filer tjekkes ud (
🧪 Tests
En unit-test suite dækker de kritiske logik-komponenter:
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
- Integration for håndtering af flere tenants (lejemål)
- Et yderligere detaljeret log-system specielt til debugging af baggrundstråden.
- Udvidet aktivitetslog til sporing af handlinger for de seneste 14 dage.
- Styring af licenser til specifikke kunders varigheder (fx 1 år, 3 år, Lifetime).
- Defensiv
try/except ValueErrori_graph_requestved parsing afRetry-After-header (for fremtidssikring mod HTTP-dato-format).