|
17 | 17 | ***************************************************************************/ |
18 | 18 | """ |
19 | 19 |
|
20 | | -import re |
21 | | -import shutil |
22 | 20 | import tempfile |
23 | 21 | from enum import Enum |
24 | | -from glob import glob |
25 | 22 | from pathlib import Path |
26 | 23 | from typing import Dict, List, Optional, TypedDict, Union, cast |
27 | 24 |
|
|
52 | 49 | from .offliners import BaseOffliner |
53 | 50 | from .project import ProjectConfiguration, ProjectProperties |
54 | 51 | from .utils.file_utils import ( |
| 52 | + copy_additional_project_files, |
55 | 53 | copy_attachments, |
| 54 | + get_project_like_files, |
56 | 55 | set_relative_embed_layer_symbols_on_project, |
57 | 56 | ) |
58 | 57 | from .utils.logger import logger |
@@ -198,16 +197,14 @@ def _get_additional_project_files(self, project: QgsProject) -> List[str]: |
198 | 197 | ): |
199 | 198 | additional_project_files.append(str(image_decoration_path)) |
200 | 199 |
|
201 | | - # Check for project plugin asset |
202 | | - plugin_file = Path("{}.qml".format(str(self.original_filename)[:-4])) # noqa: UP032 |
203 | | - if plugin_file.exists(): |
204 | | - additional_project_files.append(str(plugin_file)) |
205 | | - |
206 | | - # Check for project translations asset |
207 | | - for translation_file in glob( |
208 | | - f"{str(self.original_filename)[:-4]}_[A-Za-z][A-Za-z].qm" |
209 | | - ): |
210 | | - additional_project_files.append(str(translation_file)) |
| 200 | + # Get project plugin asset |
| 201 | + additional_project_files += get_project_like_files( |
| 202 | + self.original_filename, ".qml" |
| 203 | + ) |
| 204 | + # Get project translations assets |
| 205 | + additional_project_files += get_project_like_files( |
| 206 | + self.original_filename, "_[A-Za-z][A-Za-z].qm" |
| 207 | + ) |
211 | 208 |
|
212 | 209 | return additional_project_files |
213 | 210 |
|
@@ -359,49 +356,11 @@ def _convert(self, project: QgsProject) -> None: # noqa: PLR0912, PLR0915 |
359 | 356 |
|
360 | 357 | # copy additional project files (e.g. layout images, symbology images, etc) |
361 | 358 | if additional_project_files: |
362 | | - project_path = Path(project.fileName()).parent |
363 | | - for additional_project_file in additional_project_files: |
364 | | - additional_project_file_path = Path(additional_project_file) |
365 | | - additional_project_file_name = additional_project_file_path.name |
366 | | - additional_project_file_relative_path = ( |
367 | | - additional_project_file_path.relative_to(project_path) |
368 | | - ) |
369 | | - |
370 | | - destination_file = self._export_filename.parent.joinpath( |
371 | | - additional_project_file_relative_path |
372 | | - ).resolve() |
373 | | - destination_file.parent.mkdir(parents=True, exist_ok=True) |
374 | | - |
375 | | - # Project plugins and translation files require for their file name |
376 | | - # to match that of their associated project file (e.g myproject.qgs, |
377 | | - # myproject_bg.qm for a translation file and myproject.qml for a |
378 | | - # project plugin). We must therefore adapt these file names to match |
379 | | - # the generated project file name |
380 | | - original_project_filename_without_extension = str( |
381 | | - self.original_filename |
382 | | - )[:-4] |
383 | | - export_project_filename_without_extension = str( |
384 | | - export_project_filename.name |
385 | | - )[:-4] |
386 | | - if ( |
387 | | - str(additional_project_file_path) |
388 | | - == f"{original_project_filename_without_extension}.qml" |
389 | | - ): |
390 | | - destination_file = destination_file.parent.joinpath( |
391 | | - f"{export_project_filename_without_extension}.qml" |
392 | | - ) |
393 | | - |
394 | | - elif additional_project_file_name.endswith(".qm"): |
395 | | - match = re.match( |
396 | | - rf"^{re.escape(original_project_filename_without_extension)}(_[A-Za-z]{{2}}\.qm)$", |
397 | | - str(additional_project_file_path), |
398 | | - ) |
399 | | - if match: |
400 | | - destination_file = destination_file.parent.joinpath( |
401 | | - f"{export_project_filename_without_extension}{match.group(1)}" |
402 | | - ) |
403 | | - |
404 | | - shutil.copy(additional_project_file, str(destination_file)) |
| 359 | + copy_additional_project_files( |
| 360 | + project.fileName(), |
| 361 | + self._export_filename, |
| 362 | + additional_project_files, |
| 363 | + ) |
405 | 364 |
|
406 | 365 | # save the offline project twice so that the offline plugin can "know" that it's a relative path |
407 | 366 | QgsProject.instance().write(str(export_project_filename)) |
|
0 commit comments