Improved file processing logic: added better checkout/upload error handling and more robust file lock detection.
This commit is contained in:
@@ -244,12 +244,17 @@ class SharePointApp(ctk.CTk):
|
||||
|
||||
try:
|
||||
# 1. Checkout
|
||||
self.set_status(f"Låser '{file_name}'...")
|
||||
requests.post(f"{base_url}/checkout", headers=self.headers)
|
||||
|
||||
self.set_status(f"Tjekker '{file_name}' ud...")
|
||||
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
|
||||
self.set_status(f"Downloader '{file_name}'...")
|
||||
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]
|
||||
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)
|
||||
|
||||
# 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)
|
||||
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:
|
||||
os.rename(local_path, local_path)
|
||||
break
|
||||
except OSError:
|
||||
time.sleep(2)
|
||||
|
||||
# 4. Upload & Checkin
|
||||
self.set_status(f"Uploader ændringer...")
|
||||
with open(local_path, 'rb') as f:
|
||||
requests.put(f"{base_url}/content", headers=self.headers, data=f)
|
||||
locked = True
|
||||
break
|
||||
|
||||
requests.post(f"{base_url}/checkin", headers=self.headers, json={"comment": "Opdateret via SP Explorer"})
|
||||
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)
|
||||
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
|
||||
self.set_status(f"Uploader ændringer til SharePoint...")
|
||||
with open(local_path, 'rb') as 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}")
|
||||
|
||||
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:
|
||||
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__":
|
||||
app = SharePointApp()
|
||||
|
||||
Reference in New Issue
Block a user