Add support for downloading all document libraries on a site

- New get_all_drives() fetches all drives from a SharePoint site
- main() loops over all drives when DOCUMENT_LIBRARY is empty, placing
  each library in its own subfolder under LOCAL_PATH
- MSAL force_refresh now catches TypeError/ValueError for compatibility
  with older MSAL versions that don't support the parameter
- GUI: "Download alle biblioteker" checkbox disables Library Navn and
  Mapper fields; load_settings restores checkbox state from config

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Martin Tranberg
2026-05-04 13:41:41 +02:00
parent d15b9afc03
commit 24665c5797
2 changed files with 81 additions and 20 deletions
+48 -8
View File
@@ -47,19 +47,15 @@ class SharepointApp(ctk.CTk):
self.logo_label.grid(row=0, column=0, padx=20, pady=(20, 10))
self.entries = {}
fields = [
# Felter før DOCUMENT_LIBRARY
fields_before = [
("TENANT_ID", "Tenant ID"),
("CLIENT_ID", "Client ID"),
("CLIENT_SECRET", "Client Secret"),
("SITE_URL", "Site URL"),
("DOCUMENT_LIBRARY", "Library Navn"),
("FOLDERS_TO_DOWNLOAD", "Mapper (komma-sep)"),
("LOCAL_PATH", "Lokal Sti"),
("ENABLE_HASH_VALIDATION", "Valider Hash (True/False)"),
("HASH_THRESHOLD_MB", "Hash Grænse (MB)")
]
for i, (key, label) in enumerate(fields):
for i, (key, label) in enumerate(fields_before):
lbl = ctk.CTkLabel(self.sidebar_frame, text=label)
lbl.grid(row=i*2+1, column=0, padx=20, pady=(5, 0), sticky="w")
entry = ctk.CTkEntry(self.sidebar_frame, width=280)
@@ -67,6 +63,36 @@ class SharepointApp(ctk.CTk):
entry.grid(row=i*2+2, column=0, padx=20, pady=(0, 5))
self.entries[key] = entry
# DOCUMENT_LIBRARY med "Alle biblioteker"-afkrydsningsfelt
lbl_lib = ctk.CTkLabel(self.sidebar_frame, text="Library Navn")
lbl_lib.grid(row=9, column=0, padx=20, pady=(5, 0), sticky="w")
self.library_entry = ctk.CTkEntry(self.sidebar_frame, width=280)
self.library_entry.grid(row=10, column=0, padx=20, pady=(0, 2))
self.entries["DOCUMENT_LIBRARY"] = self.library_entry
self.all_libraries_var = ctk.BooleanVar(value=False)
self.all_libraries_cb = ctk.CTkCheckBox(
self.sidebar_frame, text="Download alle biblioteker",
variable=self.all_libraries_var,
command=self.toggle_library_entry
)
self.all_libraries_cb.grid(row=11, column=0, padx=20, pady=(0, 5), sticky="w")
# Felter efter DOCUMENT_LIBRARY
fields_after = [
("FOLDERS_TO_DOWNLOAD", "Mapper (komma-sep)"),
("LOCAL_PATH", "Lokal Sti"),
("ENABLE_HASH_VALIDATION", "Valider Hash (True/False)"),
("HASH_THRESHOLD_MB", "Hash Grænse (MB)")
]
for i, (key, label) in enumerate(fields_after):
base_row = 12 + i * 2
lbl = ctk.CTkLabel(self.sidebar_frame, text=label)
lbl.grid(row=base_row, column=0, padx=20, pady=(5, 0), sticky="w")
entry = ctk.CTkEntry(self.sidebar_frame, width=280)
entry.grid(row=base_row+1, column=0, padx=20, pady=(0, 5))
self.entries[key] = entry
self.browse_button = ctk.CTkButton(self.sidebar_frame, text="Vælg Mappe", command=self.browse_folder, height=32)
self.browse_button.grid(row=20, column=0, padx=20, pady=10)
@@ -104,6 +130,16 @@ class SharepointApp(ctk.CTk):
handler.setFormatter(logging.Formatter('%(asctime)s: %(message)s', datefmt='%H:%M:%S'))
download_sharepoint.logger.addHandler(handler)
def toggle_library_entry(self):
if self.all_libraries_var.get():
self.library_entry.configure(state="normal")
self.library_entry.delete(0, "end")
self.library_entry.configure(state="disabled")
self.entries["FOLDERS_TO_DOWNLOAD"].configure(state="disabled")
else:
self.library_entry.configure(state="normal")
self.entries["FOLDERS_TO_DOWNLOAD"].configure(state="normal")
def browse_folder(self):
path = filedialog.askdirectory()
if path:
@@ -116,6 +152,10 @@ class SharepointApp(ctk.CTk):
for key, entry in self.entries.items():
val = config.get(key, "")
entry.insert(0, val)
if not config.get("DOCUMENT_LIBRARY", ""):
self.all_libraries_cb.select()
self.library_entry.configure(state="disabled")
self.entries["FOLDERS_TO_DOWNLOAD"].configure(state="disabled")
def save_settings(self):
config_lines = [f'{k} = "{v.get()}"' for k, v in self.entries.items()]