summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2026-05-01 14:05:36 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2026-05-01 14:07:17 +0200
commit9090f6f58c9dddd7a01fc70c9e03e9481d151a48 (patch)
tree62910b375e5bc21f2324639ce8b85c6e6c355ae0
parent8fa835b955c362b0c9fa00b66fdf39315f311315 (diff)
downloadIshtar-9090f6f58c9dddd7a01fc70c9e03e9481d151a48.tar.bz2
Ishtar-9090f6f58c9dddd7a01fc70c9e03e9481d151a48.zip
🐛 admin libreoffice export: instead of crash display error when libreoffice service is down or broken
-rw-r--r--example_project/settings.py2
-rw-r--r--ishtar_common/admin.py25
-rw-r--r--ishtar_common/libreoffice.py16
3 files changed, 26 insertions, 17 deletions
diff --git a/example_project/settings.py b/example_project/settings.py
index ba228d2f0..6fbff266e 100644
--- a/example_project/settings.py
+++ b/example_project/settings.py
@@ -273,7 +273,7 @@ LOGGING = {
USE_BACKGROUND_TASK = False
USE_LIBREOFFICE = False
LIBREOFFICE_PORT = 8101
-LIBREOFFICE_HOST = "localhost"
+LIBREOFFICE_HOST = "127.0.0.1"
# Ishtar custom
diff --git a/ishtar_common/admin.py b/ishtar_common/admin.py
index f3bdac97f..0b6765399 100644
--- a/ishtar_common/admin.py
+++ b/ishtar_common/admin.py
@@ -2124,22 +2124,31 @@ duplicate_importertype.short_description = _("Duplicate")
def generate_libreoffice_template(modeladmin, request, queryset):
+ c_url = (
+ reverse(
+ "admin:%s_%s_changelist"
+ % (modeladmin.model._meta.app_label, modeladmin.model._meta.model_name)
+ )
+ + "?"
+ + urllib.parse.urlencode(request.GET)
+ )
if queryset.count() != 1:
messages.add_message(
request, messages.ERROR, str(_("Select only one importer."))
)
- c_url = (
- reverse(
- "admin:%s_%s_changelist"
- % (modeladmin.model._meta.app_label, modeladmin.model._meta.model_name)
- )
- + "?"
- + urllib.parse.urlencode(request.GET)
- )
return HttpResponseRedirect(c_url)
importer_type = queryset.all()[0]
dest_filename = importer_type.get_libreoffice_template()
+ try:
+ dest_filename = importer_type.get_libreoffice_template()
+ except AttributeError:
+ messages.add_message(
+ request, messages.ERROR,
+ str(_("Error on libreoffice daemon. Contact your server administrator."))
+ )
+ return HttpResponseRedirect(c_url)
+
in_memory = BytesIO()
with open(dest_filename, "rb") as fle:
in_memory.write(fle.read())
diff --git a/ishtar_common/libreoffice.py b/ishtar_common/libreoffice.py
index 97437bd9a..2007bf895 100644
--- a/ishtar_common/libreoffice.py
+++ b/ishtar_common/libreoffice.py
@@ -9,6 +9,7 @@ from com.sun.star.beans import PropertyValue
from com.sun.star.connection import NoConnectException
from com.sun.star.sheet.ValidationType import LIST
from com.sun.star.table import BorderLineStyle
+from com.sun.star.uno import RuntimeException
# nosec: filename used is generated and sanitized
import subprocess # nosec
@@ -52,16 +53,15 @@ class UnoClient:
def connect(self):
local_context = uno.getComponentContext()
-
- resolver = local_context.ServiceManager.createInstanceWithContext(
- "com.sun.star.bridge.UnoUrlResolver", local_context)
- connection = get_connection()
+ connection_str = f"uno:socket,host={settings.LIBREOFFICE_HOST},port={settings.LIBREOFFICE_PORT};urp;StarOffice.ComponentContext"
try:
- self.service_manager = resolver.resolve(
- "uno:{};StarOffice.ServiceManager".format(connection))
- except NoConnectException:
+ self.context = local_context.ServiceManager.createInstanceWithContext(
+ "com.sun.star.bridge.UnoUrlResolver", local_context
+ ).resolve(connection_str)
+ except (NoConnectException, RuntimeException) as e:
self.service_manager = None
- # self.service_manager = self.service_manager.ServiceManager
+ return
+ self.service_manager = self.context.ServiceManager
def create_context(self):
if self.remote_context and self.desktop: