Browse Source

[12.0][FIX] - report_py3o: run libreoffice in an isolated user installation

Bug when more than one conversion print is launched within the same libreoffice instance.

The standard behavior of libreoffice when a user open it while another instance is
running is to show a new window and throw an error if a new instance is forced within
the same user installation [see](https://bugs.documentfoundation.org/show_bug.cgi?id=37531).

This implies a bug in report_py3o module when we call libreoffice at the same time for
different documents.

To reproduce this bug:

**Case 1:**
1.  Simultaneously print two documents.

**Case 2:**
1.  Run print jobs using job_queue module
2.  Manually print another document

**Case 3:**
2.  Open libreoffice
3.  Print a py3o report

This PR creates a temporary user installation for each libreoffice conversion to bypass this limitation.
14.0-report-py3o-pr-506
sbejaoui 5 years ago
committed by default
parent
commit
5f8c22eb20
  1. 45
      report_py3o/models/py3o_report.py

45
report_py3o/models/py3o_report.py

@ -226,23 +226,33 @@ class Py3oReport(models.TransientModel):
def _convert_single_report(self, result_path, model_instance, data):
"""Run a command to convert to our target format"""
if not self.ir_actions_report_id.is_py3o_native_format:
command = self._convert_single_report_cmd(result_path, model_instance, data)
logger.debug("Running command %s", command)
output = subprocess.check_output(command, cwd=os.path.dirname(result_path))
logger.debug("Output was %s", output)
self._cleanup_tempfiles([result_path])
result_path, result_filename = os.path.split(result_path)
result_path = os.path.join(
result_path,
"%s.%s"
% (
os.path.splitext(result_filename)[0],
self.ir_actions_report_id.py3o_filetype,
),
)
with tempfile.TemporaryDirectory() as tmp_user_installation:
command = self._convert_single_report_cmd(
result_path,
model_instance,
data,
user_installation=tmp_user_installation,
)
logger.debug("Running command %s", command)
output = subprocess.check_output(
command, cwd=os.path.dirname(result_path)
)
logger.debug("Output was %s", output)
self._cleanup_tempfiles([result_path])
result_path, result_filename = os.path.split(result_path)
result_path = os.path.join(
result_path,
"%s.%s"
% (
os.path.splitext(result_filename)[0],
self.ir_actions_report_id.py3o_filetype,
),
)
return result_path
def _convert_single_report_cmd(self, result_path, model_instance, data):
def _convert_single_report_cmd(
self, result_path, model_instance, data, user_installation=None
):
"""Return a command list suitable for use in subprocess.call"""
lo_bin = self.ir_actions_report_id.lo_bin_path
if not lo_bin:
@ -252,13 +262,16 @@ class Py3oReport(models.TransientModel):
"Please contact your administrator."
)
)
return [
cmd = [
lo_bin,
"--headless",
"--convert-to",
self.ir_actions_report_id.py3o_filetype,
result_path,
]
if user_installation:
cmd.append("-env:UserInstallation=file:%s" % user_installation)
return cmd
def _get_or_create_single_report(
self, model_instance, data, existing_reports_attachment

Loading…
Cancel
Save