From f1525787c49a3022069902d67fd87032a5c26995 Mon Sep 17 00:00:00 2001 From: viseshrp Date: Wed, 11 Dec 2024 10:15:29 -0500 Subject: [PATCH 1/4] add options for media_url and static_url --- .../dynamicreporting/core/serverless/adr.py | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/src/ansys/dynamicreporting/core/serverless/adr.py b/src/ansys/dynamicreporting/core/serverless/adr.py index f314bc6b6..5edf57f9f 100644 --- a/src/ansys/dynamicreporting/core/serverless/adr.py +++ b/src/ansys/dynamicreporting/core/serverless/adr.py @@ -41,6 +41,8 @@ def __init__( databases: Optional[dict] = None, media_directory: Optional[str] = None, static_directory: Optional[str] = None, + media_url: Optional[str] = None, + static_url: Optional[str] = None, debug: Optional[bool] = None, opts: Optional[dict] = None, request: Optional[HttpRequest] = None, @@ -50,6 +52,8 @@ def __init__( self._databases = databases or {} self._media_directory = None self._static_directory = None + self._media_url = media_url + self._static_url = static_url self._debug = debug self._request = request # passed when used in the context of a webserver. self._session = None @@ -120,6 +124,14 @@ def __init__( elif "CEI_NEXUS_LOCAL_STATIC_DIR" in os.environ: self._static_directory = self._check_dir(os.environ["CEI_NEXUS_LOCAL_STATIC_DIR"]) + def _is_sqlite(self, database: str) -> bool: + return "sqlite" in self._databases[database]["ENGINE"] + + def _get_db_dir(self, database: str) -> str: + if self._is_sqlite(database): + return self._databases[database]["NAME"] + return "" + def _get_install_directory(self, ansys_installation: str) -> Path: dirs_to_check = [] if ansys_installation: @@ -209,6 +221,26 @@ def setup(self, collect_static: bool = False) -> None: if self._static_directory is not None: overrides["STATIC_ROOT"] = str(self._static_directory) + # relative URLs: By default, ADR serves static files from the URL /static/ + # and media files from the URL /media/. These can be changed using the + # static_url and media_url options. URLs must be relative and start and end with + # a forward slash. + if self._media_url is not None: + if not self._media_url.startswith("/") or not self._media_url.endswith("/"): + raise ImproperlyConfiguredError( + "The 'media_url' option must be a relative URL and start and end with a forward slash." + " Example: '/media/'" + ) + overrides["MEDIA_URL"] = self._media_url + + if self._static_url is not None: + if not self._static_url.startswith("/") or not self._static_url.endswith("/"): + raise ImproperlyConfiguredError( + "The 'static_url' option must be a relative URL and start and end with a forward slash." + " Example: '/static/'" + ) + overrides["STATIC_URL"] = self._static_url + if self._databases: if "default" not in self._databases: raise ImproperlyConfiguredError( @@ -462,14 +494,6 @@ def create_objects( count += 1 return count - def _is_sqlite(self, database: str) -> bool: - return "sqlite" in self._databases[database]["ENGINE"] - - def _get_db_dir(self, database: str) -> str: - if self._is_sqlite(database): - return self._databases[database]["NAME"] - return "" - def _copy_template(self, template: Template, **kwargs) -> Template: # depth-first walk down from the root, which is 'template', # and copy the children along the way. From 69252c46017c257d6938810330daa0921769e80f Mon Sep 17 00:00:00 2001 From: viseshrp Date: Wed, 11 Dec 2024 10:21:13 -0500 Subject: [PATCH 2/4] add fallbacks for self._databases checks --- src/ansys/dynamicreporting/core/serverless/adr.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ansys/dynamicreporting/core/serverless/adr.py b/src/ansys/dynamicreporting/core/serverless/adr.py index 5edf57f9f..daf809352 100644 --- a/src/ansys/dynamicreporting/core/serverless/adr.py +++ b/src/ansys/dynamicreporting/core/serverless/adr.py @@ -125,11 +125,11 @@ def __init__( self._static_directory = self._check_dir(os.environ["CEI_NEXUS_LOCAL_STATIC_DIR"]) def _is_sqlite(self, database: str) -> bool: - return "sqlite" in self._databases[database]["ENGINE"] + return "sqlite" in self._databases.get(database, {}).get("ENGINE", "") def _get_db_dir(self, database: str) -> str: if self._is_sqlite(database): - return self._databases[database]["NAME"] + return self._databases.get(database, {}).get("NAME", "") return "" def _get_install_directory(self, ansys_installation: str) -> Path: From 440327fdf9e5026713447515be600544c83832fe Mon Sep 17 00:00:00 2001 From: viseshrp Date: Wed, 11 Dec 2024 10:36:08 -0500 Subject: [PATCH 3/4] don't update content when saving files --- src/ansys/dynamicreporting/core/serverless/item.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ansys/dynamicreporting/core/serverless/item.py b/src/ansys/dynamicreporting/core/serverless/item.py index aec8dca2e..3b042bcb5 100644 --- a/src/ansys/dynamicreporting/core/serverless/item.py +++ b/src/ansys/dynamicreporting/core/serverless/item.py @@ -236,8 +236,7 @@ def save(self, **kwargs): # Save file to the target path target_path = self.get_file_path() self._save_file(target_path, self._file) - # Update content and save ORM instance - self.content = target_path + # save ORM instance super().save(**kwargs) def delete(self, **kwargs): From c108f165276c2cec81416d1669d34be1a906dd3b Mon Sep 17 00:00:00 2001 From: viseshrp Date: Wed, 11 Dec 2024 10:42:40 -0500 Subject: [PATCH 4/4] make get_file_path a property Update item.py --- .../dynamicreporting/core/serverless/item.py | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/ansys/dynamicreporting/core/serverless/item.py b/src/ansys/dynamicreporting/core/serverless/item.py index 3b042bcb5..b331232a0 100644 --- a/src/ansys/dynamicreporting/core/serverless/item.py +++ b/src/ansys/dynamicreporting/core/serverless/item.py @@ -209,7 +209,8 @@ def file_ext(self): def has_file(self): return self._file is not None - def get_file_path(self): + @property + def file_path(self): return self._orm_instance.payloadfile.path @classmethod @@ -234,8 +235,7 @@ def save(self, **kwargs): # todo: check backward compatibility: _movie is now _anim. self._orm_instance.payloadfile = f"{self.guid}_{self.type}.{self._file_ext}" # Save file to the target path - target_path = self.get_file_path() - self._save_file(target_path, self._file) + self._save_file(self.file_path, self._file) # save ORM instance super().save(**kwargs) @@ -419,14 +419,13 @@ def save(self, **kwargs): target_ext = "png" if not self._enhanced else self._file_ext self._orm_instance.payloadfile = f"{self.guid}_image.{target_ext}" # Save the image - target_path = self.get_file_path() if target_ext == "png" and self._file_ext != target_ext: try: - image.save(target_path, format="PNG") + image.save(self.file_path, format="PNG") except OSError as e: print(f"Error converting image to PNG: {e}") else: # save image as is (if enhanced or already PNG) - self._save_file(target_path, img_bytes) + self._save_file(self.file_path, img_bytes) image.close() super().save(**kwargs) @@ -442,9 +441,8 @@ class Scene(FilePayloadMixin, Item): def save(self, **kwargs): super().save(**kwargs) - file_name = self.get_file_path() - if not Path(get_avz_directory(file_name)).exists(): - rebuild_3d_geometry(file_name) + if not Path(get_avz_directory(self.file_path)).exists(): + rebuild_3d_geometry(self.file_path) class File(FilePayloadMixin, Item): @@ -453,6 +451,8 @@ class File(FilePayloadMixin, Item): def save(self, **kwargs): super().save(**kwargs) - file_name = self.get_file_path() - if file_is_3d_geometry(file_name) and not Path(get_avz_directory(file_name)).exists(): - rebuild_3d_geometry(file_name) + if ( + file_is_3d_geometry(self.file_path) + and not Path(get_avz_directory(self.file_path)).exists() + ): + rebuild_3d_geometry(self.file_path)