diff options
| 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 |
| commit | 9090f6f58c9dddd7a01fc70c9e03e9481d151a48 (patch) | |
| tree | 62910b375e5bc21f2324639ce8b85c6e6c355ae0 | |
| parent | 8fa835b955c362b0c9fa00b66fdf39315f311315 (diff) | |
| download | Ishtar-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.py | 2 | ||||
| -rw-r--r-- | ishtar_common/admin.py | 25 | ||||
| -rw-r--r-- | ishtar_common/libreoffice.py | 16 |
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: |
