Martin Tranberg 7fd69a9c3f fix: task 10 + review fix #1 — thread safety and sleep bug
Fix #1: Don't sleep after the final exhausted retry attempt in
_graph_request(). The sleep on the last iteration was pure overhead —
the loop exits immediately after, so the caller just waited an extra
backoff period for no reason. Guard with attempt < _MAX_RETRIES - 1.

Task 10: Add threading.Lock (_edits_lock) for all compound operations
on active_edits, which is accessed from both the UI thread and
background edit threads:
- __init__: declare self._edits_lock = threading.Lock()
- open_file: snapshot already_editing and at_limit under the lock,
  then release before showing blocking UI dialogs
- process_file: wrap initial dict assignment, waiting=True, the
  in-check+waiting=False, and in-check+del under the lock
- on_done_editing_clicked: lock the items() snapshot used to build
  waiting_files, preventing iteration over a dict being mutated

Add 8 new unit tests (1 for Fix #1 sleep count, 7 for Task 10 lock).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 10:36:29 +02:00

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.

⚙️ 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

🛠️ 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

  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:

python -m unittest tests.test_review_fixes -v

Testene kører uden skærm/display og dækker: navigations-tæller, oversættelses-nøgler, URL-initialisering og signaturer.

💡 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).
Description
No description provided
Readme 1.2 MiB
2026-04-12 08:46:16 +00:00
Languages
Python 100%