fix(tools): Service Report laesst sich ohne OTRSConnect nicht mehr speichern

Der before_save-Hook am Service Report ruft save_backlinks auf, das auf den DocType
"OTRSConnect Article" zugreift. Seit dem Entfernen der App otrsconnect (26.08.2026)
existiert dieser DocType nicht mehr - jeder Speichervorgang warf dadurch einen
DoesNotExistError. Frappe 16.31 wandelt den fuer Benutzer ohne Leserecht auf den
DocType "DocType" zusaetzlich in einen PermissionError um ("Keine Berechtigung fuer
DocType"), was die Ursache vollstaendig verschleierte.

save_backlinks und clear_backlinks pruefen jetzt zuerst, ob der DocType ueberhaupt
vorhanden ist, und tun sonst nichts. Auf Sites mit OTRSConnect bleibt das Verhalten
unveraendert.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
David Malinowski
2026-08-26 10:18:44 +02:00
co-authored by Claude Opus 5
parent e498d14f3b
commit 0c7b05d696
+14
View File
@@ -544,7 +544,18 @@ def link_ERPNext_OTRS_Ticket(OTRSConnect_Ticket):
frappe.msgprint("Kundennummerzuweisung nicht eindeutig möglich für: " + str(OTRSConnect_Ticket.customer_id) + "<br>" + str(OTRSConnect_Ticket.title) + "<br>" + str(OTRSConnect_Ticket.id)) frappe.msgprint("Kundennummerzuweisung nicht eindeutig möglich für: " + str(OTRSConnect_Ticket.customer_id) + "<br>" + str(OTRSConnect_Ticket.title) + "<br>" + str(OTRSConnect_Ticket.id))
@frappe.whitelist() @frappe.whitelist()
def _otrs_articles_vorhanden():
"""OTRSConnect wurde am 26.08.2026 aus der Bench entfernt; auf Sites ohne diese
App existiert der DocType nicht mehr. Ohne diese Pruefung wirft jeder Zugriff einen
DoesNotExistError, den Frappe 16.31 fuer Benutzer ohne DocType-Leserecht in einen
irrefuehrenden PermissionError umwandelt - und der before_save-Hook am Service Report
laesst dann kein Speichern mehr zu."""
return bool(frappe.db.exists("DocType", "OTRSConnect Article"))
def save_backlinks(doc, method): def save_backlinks(doc, method):
if not _otrs_articles_vorhanden():
return
service_report = doc service_report = doc
if hasattr(service_report, 'work'): if hasattr(service_report, 'work'):
@@ -577,6 +588,9 @@ def handle_backlinks(doc, method):
clear_backlinks(doc) clear_backlinks(doc)
def clear_backlinks(doc): def clear_backlinks(doc):
if not _otrs_articles_vorhanden():
return
if hasattr(doc, 'work'): if hasattr(doc, 'work'):
for item in doc.work: for item in doc.work:
if hasattr(item, 'otrs_article'): if hasattr(item, 'otrs_article'):