Improved file processing logic: added better checkout/upload error handling and more robust file lock detection.

This commit is contained in:
Martin Tranberg
2026-03-30 15:39:28 +02:00
parent 741a7ee489
commit 8def477647

View File

@@ -244,12 +244,17 @@ class SharePointApp(ctk.CTk):
try: try:
# 1. Checkout # 1. Checkout
self.set_status(f"Låser '{file_name}'...") self.set_status(f"Tjekker '{file_name}' ud...")
requests.post(f"{base_url}/checkout", headers=self.headers) checkout_res = requests.post(f"{base_url}/checkout", headers=self.headers)
if checkout_res.status_code not in [200, 204]:
print(f"Checkout info: {checkout_res.status_code} - {checkout_res.text}")
# 2. Download # 2. Download
self.set_status(f"Downloader '{file_name}'...") self.set_status(f"Downloader '{file_name}'...")
res = requests.get(f"{base_url}/content", headers=self.headers) res = requests.get(f"{base_url}/content", headers=self.headers)
if res.status_code != 200:
raise Exception(f"Download fejlede: {res.status_code}")
ext = os.path.splitext(file_name)[1] ext = os.path.splitext(file_name)[1]
local_path = os.path.join(TEMP_DIR, f"{hashlib.md5(item_id.encode()).hexdigest()[:8]}{ext}") local_path = os.path.join(TEMP_DIR, f"{hashlib.md5(item_id.encode()).hexdigest()[:8]}{ext}")
@@ -257,27 +262,56 @@ class SharePointApp(ctk.CTk):
f.write(res.content) f.write(res.content)
# 3. Åbn & Overvåg # 3. Åbn & Overvåg
self.set_status(f"Redigerer '{file_name}' - luk filen for at gemme...") self.set_status(f"Åbner '{file_name}'... Vent på programmet starter.")
os.startfile(local_path) os.startfile(local_path)
time.sleep(3)
while True: # Vent på at programmet rent faktisk låser filen
locked = False
self.set_status(f"Venter på at '{file_name}' åbnes i redigeringsprogram...")
for _ in range(10): # Vent op til 10 sekunder på at filen bliver låst
time.sleep(1)
try: try:
os.rename(local_path, local_path) os.rename(local_path, local_path)
break
except OSError: except OSError:
locked = True
break
if locked:
self.set_status(f"Redigerer '{file_name}' - Luk programmet for at gemme.")
# Nu venter vi på at den bliver låst OP igen
while True:
time.sleep(2) time.sleep(2)
try:
os.rename(local_path, local_path)
break # Filen er ikke længere låst
except OSError:
pass
else:
self.set_status("Kunne ikke detektere fillås. Tryk OK når du er færdig.")
messagebox.showinfo("Info", f"Vi kunne ikke detektere om '{file_name}' blev låst af dit program.\n\nTryk OK når du har gemt og LUKKET filen i dit redigeringsprogram.")
# 4. Upload & Checkin # 4. Upload
self.set_status(f"Uploader ændringer...") self.set_status(f"Uploader ændringer til SharePoint...")
with open(local_path, 'rb') as f: with open(local_path, 'rb') as f:
requests.put(f"{base_url}/content", headers=self.headers, data=f) upload_res = requests.put(f"{base_url}/content", headers=self.headers, data=f)
if upload_res.status_code not in [200, 201]:
raise Exception(f"Upload fejlede: {upload_res.status_code} - {upload_res.text}")
# 5. Checkin
self.set_status(f"Tjekker '{file_name}' ind...")
checkin_res = requests.post(f"{base_url}/checkin", headers=self.headers, json={"comment": "Opdateret via SP Explorer"})
if checkin_res.status_code not in [200, 204]:
print(f"Checkin info: {checkin_res.status_code} - {checkin_res.text}")
requests.post(f"{base_url}/checkin", headers=self.headers, json={"comment": "Opdateret via SP Explorer"})
os.remove(local_path) os.remove(local_path)
self.set_status(f"'{file_name}' er gemt og tjekket ind.") self.set_status(f"Succes! '{file_name}' er opdateret på SharePoint.")
messagebox.showinfo("Færdig", f"Filen '{file_name}' er gemt og tjekket ind korrekt.")
except Exception as e: except Exception as e:
self.set_status(f"Fejl: {str(e)}") self.set_status(f"Fejl: {str(e)}")
messagebox.showerror("Fejl", f"Der skete en fejl under håndtering af filen:\n{e}") print(f"DETALJERET FEJL: {e}")
messagebox.showerror("Fejl", f"Der skete en fejl:\n{e}")
if __name__ == "__main__": if __name__ == "__main__":
app = SharePointApp() app = SharePointApp()